1 package org.opendaylight.lispflowmapping.implementation.serializer.address;
3 import java.nio.ByteBuffer;
4 import java.util.ArrayList;
7 import org.apache.commons.lang3.BooleanUtils;
8 import org.opendaylight.lispflowmapping.implementation.serializer.address.factory.LispAFIAddressSerializerFactory;
9 import org.opendaylight.lispflowmapping.implementation.util.ByteUtil;
10 import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor;
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;
21 public class LispTrafficEngineeringLCAFAddressSerializer extends LispLCAFAddressSerializer {
23 private static final LispTrafficEngineeringLCAFAddressSerializer INSTANCE = new LispTrafficEngineeringLCAFAddressSerializer();
25 // Private constructor prevents instantiation from other classes
26 private LispTrafficEngineeringLCAFAddressSerializer() {
29 public static LispTrafficEngineeringLCAFAddressSerializer getInstance() {
34 protected short getLcafLength(LispAFIAddress lispAddress) {
36 if (((LcafTrafficEngineeringAddress) lispAddress).getHops() != null) {
37 for (Hops hop : ((LcafTrafficEngineeringAddress) lispAddress).getHops()) {
38 totalSize += LispAddressSerializer.getInstance().getAddressSize((LispAFIAddress) hop.getHop().getPrimitiveAddress()) + 2;
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());
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());
61 protected LcafTrafficEngineeringAddress deserializeData(ByteBuffer buffer, byte res2, short length) {
62 List<Hops> hops = new ArrayList<Hops>();
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());
79 return new LcafTrafficEngineeringBuilder().setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
80 .setLcafType((short) LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING.getLispCode()).setHops(hops).build();
83 private interface Flags {
85 int RLOC_PROBE = 0x02;