Merge "Support proper route redistribution"
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / attribute / LinkAttributesParser.java
index ee9d727557b8a1dd17abd855cde8a1c168628d07..04eb63de455df428769940a040c23458a7c03781 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.protocol.bgp.linkstate.attribute;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Charsets;
 import com.google.common.collect.Multimap;
 import io.netty.buffer.ByteBuf;
@@ -14,10 +15,11 @@ import io.netty.buffer.ByteBufUtil;
 import io.netty.buffer.Unpooled;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.BitSet;
 import java.util.List;
 import java.util.Map.Entry;
-import org.opendaylight.protocol.bgp.linkstate.TlvUtil;
+import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrLinkAttributesParser;
+import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
+import org.opendaylight.protocol.util.BitArray;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.protocol.util.Ipv6Util;
@@ -26,6 +28,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv6RouterIdentifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkProtectionType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.MplsProtocolMask;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidthBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.LinkStateAttribute;
@@ -40,17 +44,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-final class LinkAttributesParser {
+@VisibleForTesting
+public final class LinkAttributesParser {
 
     private static final Logger LOG = LoggerFactory.getLogger(LinkAttributesParser.class);
 
+    private LinkAttributesParser() {
+        throw new UnsupportedOperationException();
+    }
+
     private static final int UNRESERVED_BW_COUNT = 8;
 
     private static final int BANDWIDTH_LENGTH = 4;
 
     // MPLS protection mask bits
-    private static final int LDP_BIT = 7;
-    private static final int RSVP_BIT = 6;
+    private static final int FLAGS_SIZE = 8;
+
+    private static final int LDP_BIT = 0;
+    private static final int RSVP_BIT = 1;
 
     /* Link Attribute TLVs */
     private static final int REMOTE_IPV4_ROUTER_ID = 1030;
@@ -66,6 +77,8 @@ final class LinkAttributesParser {
     private static final int SHARED_RISK_LINK_GROUP = 1096;
     private static final int LINK_OPAQUE = 1097;
     private static final int LINK_NAME = 1098;
+    private static final int SR_ADJ_ID = 1099;
+    private static final int SR_LAN_ADJ_ID = 1100;
 
     /**
      * Parse Link Attributes.
@@ -136,7 +149,7 @@ final class LinkAttributesParser {
                 LOG.debug("Parsed Link Protection Type {}", lpt);
                 break;
             case MPLS_PROTOCOL:
-                final BitSet bits = BitSet.valueOf(ByteArray.readAllBytes(value));
+                final BitArray bits = BitArray.valueOf(value, FLAGS_SIZE);
                 builder.setMplsProtocol(new MplsProtocolMask(bits.get(LDP_BIT), bits.get(RSVP_BIT)));
                 LOG.debug("Parsed MPLS Protocols: {}", builder.getMplsProtocol());
                 break;
@@ -161,6 +174,14 @@ final class LinkAttributesParser {
                 builder.setLinkName(name);
                 LOG.debug("Parsed Link Name : {}", name);
                 break;
+            case SR_ADJ_ID:
+                final SrAdjId srAdjId = SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value);
+                builder.setSrAdjId(srAdjId);
+                LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjId);
+            case SR_LAN_ADJ_ID:
+                final SrLanAdjId srLanAdjId = SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(value);
+                builder.setSrLanAdjId(srLanAdjId);
+                LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjId);
             default:
                 LOG.warn("TLV {} is not a valid link attribute, ignoring it", key);
             }
@@ -195,7 +216,7 @@ final class LinkAttributesParser {
         }
         // this sub-TLV contains eight 32-bit IEEE floating point numbers
         final List<UnreservedBandwidth> ubList = linkAttributes.getUnreservedBandwidth();
-        if (ubList != null && !ubList.isEmpty()) {
+        if (ubList != null) {
             final ByteBuf unreservedBandwithBuf = Unpooled.buffer();
             for (final UnreservedBandwidth unreservedBandwidth : ubList) {
                 unreservedBandwithBuf.writeBytes(unreservedBandwidth.getBandwidth().getValue());
@@ -214,7 +235,7 @@ final class LinkAttributesParser {
             TlvUtil.writeTLV(METRIC, Unpooled.copyMedium(linkAttributes.getMetric().getValue().intValue()), byteAggregator);
         }
         final List<SrlgId> srlgList = linkAttributes.getSharedRiskLinkGroups();
-        if (srlgList != null && !srlgList.isEmpty()) {
+        if (srlgList != null) {
             final ByteBuf sharedRLGBuf = Unpooled.buffer();
             for (final SrlgId srlgId : srlgList) {
                 sharedRLGBuf.writeInt(srlgId.getValue().intValue());
@@ -224,20 +245,22 @@ final class LinkAttributesParser {
         if (linkAttributes.getLinkName() != null) {
             TlvUtil.writeTLV(LINK_NAME, Unpooled.wrappedBuffer(Charsets.UTF_8.encode(linkAttributes.getLinkName())), byteAggregator);
         }
+        if (linkAttributes.getSrAdjId() != null) {
+            TlvUtil.writeTLV(SR_ADJ_ID, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getSrAdjId()), byteAggregator);
+        }
+        if (linkAttributes.getSrLanAdjId() != null) {
+            TlvUtil.writeTLV(SR_LAN_ADJ_ID, SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(linkAttributes.getSrLanAdjId()), byteAggregator);
+        }
         LOG.trace("Finished serializing Link Attributes");
     }
 
     private static void serializeMplsProtocolMask(final MplsProtocolMask mplsProtocolMask, final ByteBuf byteAggregator ) {
         if (mplsProtocolMask != null) {
             final ByteBuf mplsProtocolMaskBuf = Unpooled.buffer(1);
-            final BitSet mask = new BitSet(Byte.SIZE);
-            if (mplsProtocolMask.isLdp() != null) {
-                mask.set(LDP_BIT, mplsProtocolMask.isLdp());
-            }
-            if (mplsProtocolMask.isRsvpte() != null) {
-                mask.set(RSVP_BIT, mplsProtocolMask.isRsvpte());
-            }
-            mplsProtocolMaskBuf.writeBytes(mask.toByteArray());
+            final BitArray mask = new BitArray(FLAGS_SIZE);
+            mask.set(LDP_BIT, mplsProtocolMask.isLdp());
+            mask.set(RSVP_BIT, mplsProtocolMask.isRsvpte());
+            mask.toByteBuf(mplsProtocolMaskBuf);
             TlvUtil.writeTLV(MPLS_PROTOCOL, mplsProtocolMaskBuf, byteAggregator);
         }
     }