1 package org.opendaylight.lispflowmapping.implementation.serializer;
3 import java.nio.ByteBuffer;
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;
10 public class LocatorRecordSerializer {
12 private static final LocatorRecordSerializer INSTANCE = new LocatorRecordSerializer();
14 // Private constructor prevents instantiation from other classes
15 private LocatorRecordSerializer() {
18 public static LocatorRecordSerializer getInstance() {
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));
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());
49 public int getSerializationSize(LocatorRecord record) {
50 LispAddressSerializer serializer = LispAddressSerializerFactory.getSerializer(record.getLocator().getAfi());
51 return Length.HEADER_SIZE + serializer.getAddressSize(record.getLocator());
54 private interface Flags {
55 int LOCAL_LOCATOR = 0x04;
56 int RLOC_PROBED = 0x02;
60 private interface Length {