420b975a92060cd0d6af90a3ba032848de9ff857
[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.apache.commons.lang3.BooleanUtils;
8 import org.opendaylight.lispflowmapping.implementation.serializer.LispAFIConvertor;
9 import org.opendaylight.lispflowmapping.implementation.serializer.address.factory.LispAFIAddressSerializerFactory;
10 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
11 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
12 import org.opendaylight.lispflowmapping.type.LispCanonicalAddressFormatEnum;
13 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafTrafficEngineeringAddress;
14 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
15 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.Hops;
16 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.HopsBuilder;
17 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafTrafficEngineeringBuilder;
18 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.PrimitiveAddress;
19 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.reencaphop.HopBuilder;
20
21 public class LispTrafficEngineeringLCAFAddressSerializer extends LispLCAFAddressSerializer {
22
23     private static final LispTrafficEngineeringLCAFAddressSerializer INSTANCE = new LispTrafficEngineeringLCAFAddressSerializer();
24
25     // Private constructor prevents instantiation from other classes
26     private LispTrafficEngineeringLCAFAddressSerializer() {
27     }
28
29     public static LispTrafficEngineeringLCAFAddressSerializer getInstance() {
30         return INSTANCE;
31     }
32
33     @Override
34     protected short getLcafLength(LispAFIAddress lispAddress) {
35         short totalSize = 0;
36         if (((LcafTrafficEngineeringAddress) lispAddress).getHops() != null) {
37             for (Hops hop : ((LcafTrafficEngineeringAddress) lispAddress).getHops()) {
38                 totalSize += LispAddressSerializer.getInstance().getAddressSize((LispAFIAddress) hop.getHop().getPrimitiveAddress()) + 2;
39             }
40         }
41         return totalSize;
42     }
43
44     @Override
45     protected void serializeData(ByteBuffer buffer, LispAFIAddress lispAddress) {
46         if (((LcafTrafficEngineeringAddress) lispAddress).getHops() != null) {
47             for (Hops hop : ((LcafTrafficEngineeringAddress) lispAddress).getHops()) {
48                 serializeAFIAddressHeader(buffer, (LispAFIAddress) hop.getHop().getPrimitiveAddress());
49                 buffer.put((byte) 0);
50                 buffer.put((byte) (ByteUtil.boolToBit(BooleanUtils.isTrue(hop.isLookup()), Flags.LOOKUP) | //
51                         ByteUtil.boolToBit(BooleanUtils.isTrue(hop.isRLOCProbe()), Flags.RLOC_PROBE) | //
52                 ByteUtil.boolToBit(BooleanUtils.isTrue(hop.isStrict()), Flags.STRICT)));
53                 LispAddressSerializer serializer = LispAFIAddressSerializerFactory.getSerializer(AddressFamilyNumberEnum
54                         .valueOf(((LispAFIAddress) hop.getHop().getPrimitiveAddress()).getAfi()));
55                 serializer.serializeData(buffer, (LispAFIAddress) hop.getHop().getPrimitiveAddress());
56             }
57         }
58     }
59
60     @Override
61     protected LcafTrafficEngineeringAddress deserializeData(ByteBuffer buffer, byte res2, short length) {
62         List<Hops> hops = new ArrayList<Hops>();
63         while (length > 0) {
64             short afi = buffer.getShort();
65             LispAddressSerializer serializer = LispAFIAddressSerializerFactory.getSerializer(AddressFamilyNumberEnum.valueOf(afi));
66             byte flags = (byte) buffer.getShort();
67             boolean lookup = ByteUtil.extractBit(flags, Flags.LOOKUP);
68             boolean RLOCProbe = ByteUtil.extractBit(flags, Flags.RLOC_PROBE);
69             boolean strict = ByteUtil.extractBit(flags, Flags.STRICT);
70             LispAFIAddress address = serializer.deserializeData(buffer);
71             HopsBuilder builder = new HopsBuilder();
72             builder.setLookup(lookup);
73             builder.setRLOCProbe(RLOCProbe);
74             builder.setStrict(strict);
75             builder.setHop(new HopBuilder().setPrimitiveAddress((PrimitiveAddress) LispAFIConvertor.toPrimitive(address)).build());
76             length -= LispAddressSerializer.getInstance().getAddressSize((LispAFIAddress) builder.getHop().getPrimitiveAddress()) + 2;
77             hops.add(builder.build());
78         }
79         return new LcafTrafficEngineeringBuilder().setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
80                 .setLcafType((short) LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING.getLispCode()).setHops(hops).build();
81     }
82
83     private interface Flags {
84         int LOOKUP = 0x04;
85         int RLOC_PROBE = 0x02;
86         int STRICT = 0x01;
87     }
88
89 }