support lcaf traffic engineering TELSDN-178: #close
[lispflowmapping.git] / mappingservice / implementation / src / main / java / org / opendaylight / lispflowmapping / implementation / serializer / address / LispTrafficEngineeringLCAFAddressSerializer.java
1 package org.opendaylight.lispflowmapping.implementation.serializer.address;
2
3 import java.nio.ByteBuffer;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import org.opendaylight.lispflowmapping.implementation.serializer.address.factory.LispAFIAddressSerializerFactory;
8 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
9 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
10 import org.opendaylight.lispflowmapping.type.lisp.address.LispAddress;
11 import org.opendaylight.lispflowmapping.type.lisp.address.LispTrafficEngineeringLCAFAddress;
12 import org.opendaylight.lispflowmapping.type.lisp.address.ReencapHop;
13
14 public class LispTrafficEngineeringLCAFAddressSerializer extends LispLCAFAddressSerializer {
15
16     private static final LispTrafficEngineeringLCAFAddressSerializer INSTANCE = new LispTrafficEngineeringLCAFAddressSerializer();
17
18     // Private constructor prevents instantiation from other classes
19     private LispTrafficEngineeringLCAFAddressSerializer() {
20     }
21
22     public static LispTrafficEngineeringLCAFAddressSerializer getInstance() {
23         return INSTANCE;
24     }
25
26     @Override
27     protected short getLcafLength(LispAddress lispAddress) {
28         short totalSize = 0;
29         for (ReencapHop hop : ((LispTrafficEngineeringLCAFAddress) lispAddress).getHops()) {
30             totalSize += LispAddressSerializer.getInstance().getAddressSize(hop) + 2;
31         }
32         return totalSize;
33     }
34
35     @Override
36     protected void serializeData(ByteBuffer buffer, LispAddress lispAddress) {
37         for (ReencapHop hop : ((LispTrafficEngineeringLCAFAddress) lispAddress).getHops()) {
38             serializeAFIAddressHeader(buffer, hop);
39             buffer.put((byte) 0);
40             buffer.put((byte) (ByteUtil.boolToBit(hop.isLookup(), Flags.LOOKUP) | //
41                     ByteUtil.boolToBit(hop.isRLOCProbe(), Flags.RLOC_PROBE) | //
42             ByteUtil.boolToBit(hop.isStrict(), Flags.STRICT)));
43             LispAddressSerializer serializer = LispAFIAddressSerializerFactory.getSerializer(hop.getAfi());
44             serializer.serializeData(buffer, hop.getHop());
45         }
46     }
47
48     @Override
49     protected LispTrafficEngineeringLCAFAddress deserializeData(ByteBuffer buffer, byte res2, short length) {
50         List<ReencapHop> hops = new ArrayList<ReencapHop>();
51         while (length > 0) {
52             short afi = buffer.getShort();
53             LispAddressSerializer serializer = LispAFIAddressSerializerFactory.getSerializer(AddressFamilyNumberEnum.valueOf(afi));
54             byte flags = (byte) buffer.getShort();
55             boolean lookup = ByteUtil.extractBit(flags, Flags.LOOKUP);
56             boolean RLOCProbe = ByteUtil.extractBit(flags, Flags.RLOC_PROBE);
57             boolean strict = ByteUtil.extractBit(flags, Flags.STRICT);
58             LispAddress address = serializer.deserializeData(buffer);
59             ReencapHop hop = new ReencapHop(address, (short) 0, lookup, RLOCProbe, strict);
60             length -= LispAddressSerializer.getInstance().getAddressSize(hop) + 2;
61             hops.add(hop);
62         }
63         return new LispTrafficEngineeringLCAFAddress(res2, hops);
64     }
65
66     private interface Flags {
67         int LOOKUP = 0x04;
68         int RLOC_PROBE = 0x02;
69         int STRICT = 0x01;
70     }
71
72 }