Bug-2848: BGP-LS EPE extension: Peer Sid 96/23396/6
authorIveta Halanova <iveta.halanova@pantheon.sk>
Fri, 26 Jun 2015 09:31:41 +0000 (11:31 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 30 Jun 2015 09:11:12 +0000 (09:11 +0000)
Parsering/serializing for Peer-SID, Peer-Set-SID
Added parsering/serializing of type and length of (Lan)AdjacencySegmentIdentifier

Change-Id: I56b4c2c131c205fa727f4261fc9cd06d4b39dd63
Signed-off-by: Iveta Halanova <iveta.halanova@pantheon.sk>
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java

index 1bffae012f10b2eee415f599d4b8899431c89ef0..df551647aa89692e6a3623c1b7f838a3abe7b36b 100644 (file)
@@ -28,7 +28,12 @@ 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.PeerSetSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSidBuilder;
 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.SrAdjIdBuilder;
 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;
@@ -79,6 +84,8 @@ public final class LinkAttributesParser {
     private static final int LINK_NAME = 1098;
     private static final int SR_ADJ_ID = 1099;
     private static final int SR_LAN_ADJ_ID = 1100;
+    private static final int PEER_SID_CODE = 1036;
+    private static final int PEER_SET_SID_CODE = 1037;
 
     /**
      * Parse Link Attributes.
@@ -175,7 +182,7 @@ public final class LinkAttributesParser {
                 LOG.debug("Parsed Link Name : {}", name);
                 break;
             case SR_ADJ_ID:
-                final SrAdjId srAdjId = SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value);
+                final SrAdjId srAdjId = new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
                 builder.setSrAdjId(srAdjId);
                 LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjId);
                 break;
@@ -184,6 +191,16 @@ public final class LinkAttributesParser {
                 builder.setSrLanAdjId(srLanAdjId);
                 LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjId);
                 break;
+            case PEER_SID_CODE:
+                final PeerSid peerSid = new PeerSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
+                builder.setPeerSid(peerSid);
+                LOG.debug("Parsed Peer Segment Identifier :{}", peerSid);
+                break;
+            case PEER_SET_SID_CODE:
+                final PeerSetSid peerSetSid = new PeerSetSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build();
+                builder.setPeerSetSid(peerSetSid);
+                LOG.debug("Parsed Peer Set Sid :{}", peerSetSid);
+                break;
             default:
                 LOG.warn("TLV {} is not a valid link attribute, ignoring it", key);
             }
@@ -253,6 +270,12 @@ public final class LinkAttributesParser {
         if (linkAttributes.getSrLanAdjId() != null) {
             TlvUtil.writeTLV(SR_LAN_ADJ_ID, SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(linkAttributes.getSrLanAdjId()), byteAggregator);
         }
+        if (linkAttributes.getPeerSid() != null) {
+            TlvUtil.writeTLV(PEER_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSid()), byteAggregator);
+        }
+        if (linkAttributes.getPeerSetSid() != null) {
+            TlvUtil.writeTLV(PEER_SET_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSetSid()), byteAggregator);
+        }
         LOG.trace("Finished serializing Link Attributes");
     }
 
index 18845e5d4ba8ad9c1152c3cc551280353954dc70..955fe6205ce2e984bde878d0a083d93c8adf76a7 100644 (file)
@@ -9,18 +9,22 @@ package org.opendaylight.protocol.bgp.linkstate.attribute.sr;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
 import org.opendaylight.protocol.util.BitArray;
 import org.opendaylight.protocol.util.ByteArray;
-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.SrAdjIdBuilder;
 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.SrLanAdjIdBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencyFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencySegmentIdentifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.Weight;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class SrLinkAttributesParser {
+    private static final Logger LOG = LoggerFactory.getLogger(SrLinkAttributesParser.class);
 
     private static final int ISO_SYSTEM_ID_SIZE = 6;
 
@@ -31,24 +35,51 @@ public final class SrLinkAttributesParser {
     private static final int LOCAL_FLAG = 3;
     private static final int SET_FLAG = 4;
     private static final int FLAGS_SIZE = 8;
+    private static final int SID_TYPE = 1;
 
     private SrLinkAttributesParser() {
         throw new UnsupportedOperationException();
     }
 
-    public static SrAdjId parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
-        if (!buffer.isReadable()) {
-            return new SrAdjIdBuilder().build();
+    public static AdjacencySegmentIdentifier parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
+        final AdjacencyFlags adjFlags;
+        final Weight weight;
+        final SidLabel sidValue;
+        if (buffer.isReadable()) {
+            final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
+            adjFlags = new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG));
+            weight = new Weight(buffer.readUnsignedByte());
+            sidValue = parseSidSubTlv(buffer);
+        } else {
+            adjFlags = null;
+            weight = null;
+            sidValue = null;
         }
-        final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder();
-        final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
-        srAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
-        srAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
-        srAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
-        return srAdjIdBuilder.build();
+        return new AdjacencySegmentIdentifier() {
+
+            @Override
+            public Class<? extends DataContainer> getImplementedInterface() {
+                return AdjacencySegmentIdentifier.class;
+            }
+
+            @Override
+            public Weight getWeight() {
+                return weight;
+            }
+
+            @Override
+            public SidLabel getSid() {
+                return sidValue;
+            }
+
+            @Override
+            public AdjacencyFlags getFlags() {
+                return adjFlags;
+            }
+        };
     }
 
-    public static ByteBuf serializeAdjacencySegmentIdentifier(final SrAdjId srAdjId) {
+    public static ByteBuf serializeAdjacencySegmentIdentifier(final AdjacencySegmentIdentifier srAdjId) {
         final ByteBuf value = Unpooled.buffer();
         final AdjacencyFlags srAdjIdFlags = srAdjId.getFlags();
         final BitArray flags = new BitArray(FLAGS_SIZE);
@@ -59,7 +90,7 @@ public final class SrLinkAttributesParser {
         flags.set(SET_FLAG, srAdjIdFlags.isSetFlag());
         flags.toByteBuf(value);
         value.writeByte(srAdjId.getWeight().getValue());
-        value.writeBytes(srAdjId.getSid().getValue());
+        TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srAdjId.getSid().getValue()), value);
         return value;
     }
 
@@ -72,10 +103,22 @@ public final class SrLinkAttributesParser {
         srLanAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
         srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
         srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE)));
-        srLanAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
+        srLanAdjIdBuilder.setSid(new SidLabel(parseSidSubTlv(buffer)));
         return srLanAdjIdBuilder.build();
     }
 
+    private static SidLabel parseSidSubTlv(final ByteBuf buffer) {
+        final SidLabel sidValue;
+        final int type = buffer.readUnsignedByte();
+        final int length = buffer.readUnsignedByte();
+        sidValue = new SidLabel(ByteArray.readAllBytes(buffer.readSlice(length)));
+        if (type != SID_TYPE) {
+            LOG.warn("Unexpected type in SID/label Sub-TLV, expected {}, actual {}, ignoring it", SID_TYPE, type);
+            return null;
+        }
+        return sidValue;
+    }
+
     public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) {
         final ByteBuf value = Unpooled.buffer();
         final AdjacencyFlags srAdjIdFlags = srLanAdjId.getFlags();
@@ -88,7 +131,7 @@ public final class SrLinkAttributesParser {
         flags.toByteBuf(value);
         value.writeByte(srLanAdjId.getWeight().getValue());
         value.writeBytes(srLanAdjId.getIsoSystemId().getValue());
-        value.writeBytes(srLanAdjId.getSid().getValue());
+        TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srLanAdjId.getSid().getValue()), value);
         return value;
     }
 }
index 3e74b98e0fd6b5068b5eb2ec9e07c3babdc0ecde..bf5088e947fc2630f3ed88d5d3bbce187aad33be 100644 (file)
@@ -12,7 +12,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -63,7 +62,10 @@ public class LinkstateAttributeParserTest {
         0x46, 0x43, 0x50, 0, 0x04, 0x43, 0, 0x20, 0x46, 0x43, 0x50, 0, 0x46, 0x43, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x44, 0, 0x08, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x45, 0, 0x02, 0, 0x08, 0x04, 0x46, 0, 0x01,
         (byte) 0xc0, 0x04, 0x47, 0, 0x03, 0, 0, 0x0a, 0x04, 0x48, 0, 0x08, 0x12, 0x34, 0x56, 0x78, 0x10, 0x30, 0x50, 0x70, 0x04, 0x4a,
-        0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, (byte) 0x88, 0, 0x01, 0x0a };
+        0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32,
+        0x04, 0x0c, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0d,
+        0x04, 0x0d, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0e,
+        0x04, (byte) 0x88, 0, 0x01, 0x0a };
 
     private static final byte[] NODE_ATTR = { 0x01, 0x07, 0, 0x04, 0, 0x2a, 0, 0x2b, 0x04, 0, 0, 0x01, (byte) 0xb0, 0x04, 0x02, 0,
         0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, 0x03, 0, 0x01, 0x72, 0x04, 0x03, 0, 0x01, 0x73, 0x04, 0x04, 0, 0x04,
@@ -155,6 +157,14 @@ public class LinkstateAttributeParserTest {
         assertEquals(2, ls.getSharedRiskLinkGroups().size());
         assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue());
         assertEquals("12K-2", ls.getLinkName());
+        assertTrue(ls.getPeerSid().getFlags().isAddressFamily());
+        assertFalse(ls.getPeerSid().getFlags().isBackup());
+        assertTrue(ls.getPeerSetSid().getFlags().isAddressFamily());
+        assertFalse(ls.getPeerSetSid().getFlags().isBackup());
+        assertArrayEquals(new byte[] {10, 11, 12, 13}, ls.getPeerSid().getSid().getValue());
+        assertEquals(new Short("5"), ls.getPeerSid().getWeight().getValue());
+        assertArrayEquals(new byte[] {10, 11, 12, 14}, ls.getPeerSetSid().getSid().getValue());
+        assertEquals(new Short("5"), ls.getPeerSetSid().getWeight().getValue());
 
         //serialization
         final ByteBuf buff = Unpooled.buffer();
index 162b243ae79eb94f8d4703effa04108cfed83ace..448551c9222b27ba232785b3b4a51f35e4773890 100644 (file)
@@ -179,17 +179,17 @@ public class SrAttributeParserTest {
 
     @Test
     public void testSrAdjId() {
-        final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
+        final byte[] tested = { (byte)-80, 10, 1, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
         final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
         final SrAdjId srAdjId = new SrAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short) 10)).setSid(new SidLabel(sidLabel)).build();
         final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
-        assertEquals(srAdjId, SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested)));
+        assertEquals(srAdjId, new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested))).build());
         assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
     }
 
     @Test
     public void testSrLanAdjId() {
-        final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
+        final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 24, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
         final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
         final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
         final SrLanAdjId srLanAdjId = new SrLanAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short)10)).setIsoSystemId(new IsoSystemIdentifier(systemId)).setSid(new SidLabel(sidLabel)).build();