added authentication to map notify and map reply, and moved the serialization process...
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / serializer / LocatorRecordSerializer.java
1 package org.opendaylight.lispflowmapping.implementation.serializer;
2
3 import java.nio.ByteBuffer;
4
5 import org.opendaylight.lispflowmapping.implementation.serializer.address.LispAddressSerializer;
6 import org.opendaylight.lispflowmapping.implementation.serializer.address.LispAddressSerializerFactory;
7 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
8 import org.opendaylight.lispflowmapping.type.lisp.LocatorRecord;
9
10 public class LocatorRecordSerializer {
11         
12         private static final LocatorRecordSerializer INSTANCE = new LocatorRecordSerializer();
13
14         // Private constructor prevents instantiation from other classes
15         private LocatorRecordSerializer() {
16         }
17
18         public static LocatorRecordSerializer getInstance() {
19                 return INSTANCE;
20         }
21         
22         protected LocatorRecord deserialize(ByteBuffer buffer) {
23         LocatorRecord record = new LocatorRecord();
24         record.setPriority(buffer.get());
25         record.setWeight(buffer.get());
26         record.setMulticastPriority(buffer.get());
27         record.setMulticastWeight(buffer.get());
28         byte flags = (byte) buffer.getShort();
29         record.setLocalLocator(ByteUtil.extractBit(flags, Flags.LOCAL_LOCATOR));
30         record.setRlocProbed(ByteUtil.extractBit(flags, Flags.RLOC_PROBED));
31         record.setRouted(ByteUtil.extractBit(flags, Flags.ROUTED));
32         record.setLocator(LispAddressSerializer.getInstance().deserialize(buffer));
33         return record;
34     }
35
36     public void serialize(ByteBuffer replyBuffer, LocatorRecord record) {
37         replyBuffer.put(record.getPriority());
38         replyBuffer.put(record.getWeight());
39         replyBuffer.put(record.getMulticastPriority());
40         replyBuffer.put(record.getMulticastWeight());
41         replyBuffer.position(replyBuffer.position() + Length.UNUSED_FLAGS);
42         replyBuffer.put((byte) (ByteUtil.boolToBit(record.isLocalLocator(), Flags.LOCAL_LOCATOR) | //
43                 ByteUtil.boolToBit(record.isRlocProbed(), Flags.RLOC_PROBED) | //
44                 ByteUtil.boolToBit(record.isRouted(), Flags.ROUTED)));
45         LispAddressSerializer serializer = LispAddressSerializerFactory.getSerializer(record.getLocator().getAfi());
46         serializer.serialize(replyBuffer, record.getLocator());
47     }
48
49     public int getSerializationSize(LocatorRecord record) {
50         LispAddressSerializer serializer = LispAddressSerializerFactory.getSerializer(record.getLocator().getAfi());
51         return Length.HEADER_SIZE + serializer.getAddressSize(record.getLocator());
52     }
53     
54     private interface Flags {
55         int LOCAL_LOCATOR = 0x04;
56         int RLOC_PROBED = 0x02;
57         int ROUTED = 0x01;
58     }
59
60     private interface Length {
61         int HEADER_SIZE = 6;
62         int UNUSED_FLAGS = 1;
63     }
64 }