added source/dest lookup lcaf TELSDN-176: #close
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / serializer / MapReplySerializer.java
1 package org.opendaylight.lispflowmapping.implementation.serializer;
2
3 import java.nio.ByteBuffer;
4
5 import org.opendaylight.lispflowmapping.type.lisp.EidToLocatorRecord;
6 import org.opendaylight.lispflowmapping.type.lisp.MapReply;
7
8
9 /**
10  * This class deals with serializing map reply from the java object to udp.
11  */
12 public class MapReplySerializer {
13         
14         private static final MapReplySerializer INSTANCE = new MapReplySerializer();
15
16         // Private constructor prevents instantiation from other classes
17         private MapReplySerializer() {
18         }
19
20         public static MapReplySerializer getInstance() {
21                 return INSTANCE;
22         }
23         
24         public ByteBuffer serialize(MapReply mapReply) {
25         int size = Length.HEADER_SIZE;
26         for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecords()) {
27             size += EidToLocatorRecordSerializer.getInstance().getSerializationSize(eidToLocatorRecord);
28         }
29
30         ByteBuffer replyBuffer = ByteBuffer.allocate(size);
31
32         replyBuffer.put((byte) ((LispMessageEnum.MapReply.getValue() << 4) | //
33                 (mapReply.isProbe() ? Flags.PROBE : 0x00) | //
34                 (mapReply.isEchoNonceEnabled() ? Flags.ECHO_NONCE_ENABLED : 0x00)));
35
36         replyBuffer.position(replyBuffer.position() + Length.RES);
37         replyBuffer.put((byte) mapReply.getEidToLocatorRecords().size());
38         replyBuffer.putLong(mapReply.getNonce());
39         for (EidToLocatorRecord eidToLocatorRecord : mapReply.getEidToLocatorRecords()) {
40                 EidToLocatorRecordSerializer.getInstance().serialize(replyBuffer, eidToLocatorRecord);
41         }
42         return replyBuffer;
43     }
44         
45         private interface Length {
46         int RES = 2;
47         int HEADER_SIZE = 12;
48     }
49
50     private interface Flags {
51         int PROBE = 0x08;
52         int ECHO_NONCE_ENABLED = 0x04;
53     }
54         
55 }