BUG-5024: Fix BGP LS EPE model 34/40434/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Thu, 16 Jun 2016 10:46:59 +0000 (12:46 +0200)
committerMilos Fabian <milfabia@cisco.com>
Thu, 16 Jun 2016 17:12:55 +0000 (17:12 +0000)
Fix flags model for Peer-Node-SID, Peer-Adj-SID, Peer-Set-SID based on draft
ref. https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05.

Change-Id: Iccb36e8631dc821106aec5a4307213f51366443b
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
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/main/yang/bgp-epe.yang
bgp/linkstate/src/main/yang/bgp-linkstate.yang
bgp/linkstate/src/main/yang/bgp-segment-routing.yang
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java

index dccf924786fe9b1f4623728ed84b380a80941048..7c2bdd394cebe894e0f8b87c58b0397f71ca0564 100644 (file)
@@ -33,7 +33,6 @@ 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.link.state.PeerSetSids;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIds;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIds;
 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;
@@ -165,7 +164,7 @@ public final class LinkAttributesParser {
                 LOG.debug("Parsed Link Name : {}", builder.getLinkName());
                 break;
             case SR_ADJ_ID:
-                srAdjIds.add(new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value, protocolId)).build());
+                srAdjIds.add(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value, protocolId));
                 LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjIds.get(srAdjIds.size()-1));
                 break;
             case SR_LAN_ADJ_ID:
@@ -173,15 +172,15 @@ public final class LinkAttributesParser {
                 LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjIds.get(srLanAdjIds.size()-1));
                 break;
             case PEER_NODE_SID_CODE:
-                builder.setPeerNodeSid(new PeerNodeSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value, null)).build());
+                builder.setPeerNodeSid(new PeerNodeSidBuilder(SrLinkAttributesParser.parseEpeAdjacencySegmentIdentifier(value)).build());
                 LOG.debug("Parsed Peer Segment Identifier :{}", builder.getPeerNodeSid());
                 break;
             case PEER_ADJ_SID_CODE:
-                builder.setPeerAdjSid(new PeerAdjSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value, null)).build());
+                builder.setPeerAdjSid(new PeerAdjSidBuilder(SrLinkAttributesParser.parseEpeAdjacencySegmentIdentifier(value)).build());
                 LOG.debug("Parsed Peer Segment Identifier :{}", builder.getPeerAdjSid());
                 break;
             case PEER_SET_SID_CODE:
-                peerSetSids.add(new PeerSetSidsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value, null)).build());
+                peerSetSids.add(new PeerSetSidsBuilder(SrLinkAttributesParser.parseEpeAdjacencySegmentIdentifier(value)).build());
                 LOG.debug("Parsed Peer Set Sid :{}", peerSetSids.get(peerSetSids.size()-1));
                 break;
             default:
index 83e547cf79f261aa39cc38fb8be36ff56550a2e0..cd34b5e2dba101f5dfc4b18323752c84bebd533c 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.linkstate.attribute.sr;
 
-import static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId.Ospf;
-import static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId.OspfV3;
-
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.List;
@@ -19,9 +16,11 @@ import org.opendaylight.protocol.util.BitArray;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIds;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIds;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIdsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.AdjSidTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.EpeAdjSidTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Weight;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.Flags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCase;
@@ -49,7 +48,8 @@ public final class SrLinkAttributesParser {
     private static final int LOCAL_EPE = 1;
     private static final int SET_ISIS = 4;
     private static final int SET_OSPF = 3;
-    private static final int FLAGS_SIZE = 8;
+    private static final int FLAGS_BITS_SIZE = 8;
+    private static final int FLAGS_BYTE_SIZE = 1;
 
     /** OSPF flags
        0 1 2 3 4 5 6 7
@@ -68,12 +68,12 @@ public final class SrLinkAttributesParser {
         throw new UnsupportedOperationException();
     }
 
-    public static AdjSidTlv parseAdjacencySegmentIdentifier(final ByteBuf buffer, final ProtocolId protocolId) {
+    public static SrAdjIds parseAdjacencySegmentIdentifier(final ByteBuf buffer, final ProtocolId protocolId) {
         final Flags adjFlags;
         final Weight weight;
         final SidLabelIndex sidValue;
         if (buffer.isReadable()) {
-            final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
+            final BitArray flags = BitArray.valueOf(buffer, FLAGS_BITS_SIZE);
             adjFlags = parseFlags(flags, protocolId);
             weight = new Weight(buffer.readUnsignedByte());
             buffer.skipBytes(RESERVED);
@@ -83,10 +83,25 @@ public final class SrLinkAttributesParser {
             weight = null;
             sidValue = null;
         }
-        return new AdjSidTlv() {
+        return new SrAdjIdsBuilder().setFlags(adjFlags).setSidLabelIndex(sidValue).setWeight(weight).build();
+    }
+
+    public static EpeAdjSidTlv parseEpeAdjacencySegmentIdentifier(final ByteBuf buffer) {
+        final Weight weight;
+        final SidLabelIndex sidValue;
+        if (buffer.isReadable()) {
+            buffer.skipBytes(FLAGS_BYTE_SIZE);
+            weight = new Weight(buffer.readUnsignedByte());
+            buffer.skipBytes(RESERVED);
+            sidValue = SidLabelIndexParser.parseSidLabelIndex(Size.forValue(buffer.readableBytes()), buffer);
+        } else {
+            weight = null;
+            sidValue = null;
+        }
+        return new EpeAdjSidTlv() {
             @Override
             public Class<? extends DataContainer> getImplementedInterface() {
-                return AdjSidTlv.class;
+                return EpeAdjSidTlv.class;
             }
             @Override
             public Weight getWeight() {
@@ -96,10 +111,6 @@ public final class SrLinkAttributesParser {
             public SidLabelIndex getSidLabelIndex() {
                 return sidValue;
             }
-            @Override
-            public Flags getFlags() {
-                return adjFlags;
-            }
         };
     }
 
@@ -108,7 +119,7 @@ public final class SrLinkAttributesParser {
             return new SrLanAdjIdsBuilder().build();
         }
         final SrLanAdjIdsBuilder srLanAdjIdBuilder = new SrLanAdjIdsBuilder();
-        final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
+        final BitArray flags = BitArray.valueOf(buffer, FLAGS_BITS_SIZE);
         srLanAdjIdBuilder.setFlags(parseFlags(flags, protocolId));
         srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
         buffer.skipBytes(RESERVED);
@@ -144,16 +155,18 @@ public final class SrLinkAttributesParser {
         }
     }
 
-    public static <T extends AdjSidTlv> void serializeAdjacencySegmentIdentifiers(final List<T> adjSids, final int type, final ByteBuf byteAggregator) {
-        for (final T id : adjSids) {
-            TlvUtil.writeTLV(type, serializeAdjacencySegmentIdentifier(id), byteAggregator);
-        }
+    public static <T extends EpeAdjSidTlv> void serializeAdjacencySegmentIdentifiers(final List<T> adjSids, final int type, final ByteBuf byteAggregator) {
+        adjSids.forEach(id -> TlvUtil.writeTLV(type, serializeAdjacencySegmentIdentifier(id), byteAggregator));
     }
 
-    public static ByteBuf serializeAdjacencySegmentIdentifier(final AdjSidTlv adjSid) {
+    public static <T extends EpeAdjSidTlv> ByteBuf serializeAdjacencySegmentIdentifier(final T adjSid) {
         final ByteBuf value = Unpooled.buffer();
-        final BitArray flags = serializeAdjFlags(adjSid.getFlags(), adjSid.getSidLabelIndex());
-        flags.toByteBuf(value);
+        if(adjSid instanceof SrAdjIds) {
+            final BitArray flags = serializeAdjFlags(((SrAdjIds) adjSid).getFlags(), adjSid.getSidLabelIndex());
+            flags.toByteBuf(value);
+        }else {
+            value.writeZero(FLAGS_BYTE_SIZE);
+        }
         value.writeByte(adjSid.getWeight().getValue());
         value.writeZero(RESERVED);
         value.writeBytes(SidLabelIndexParser.serializeSidValue(adjSid.getSidLabelIndex()));
@@ -182,7 +195,7 @@ public final class SrLinkAttributesParser {
     }
 
     private static BitArray serializeAdjFlags(final Flags flags, final SidLabelIndex sidLabelIndex) {
-        final BitArray bitFlags = new BitArray(FLAGS_SIZE);
+        final BitArray bitFlags = new BitArray(FLAGS_BITS_SIZE);
         if (flags instanceof OspfAdjFlagsCase) {
             final OspfAdjFlagsCase ospfFlags = (OspfAdjFlagsCase) flags;
             bitFlags.set(BACKUP_OSPF, ospfFlags.isBackup());
index 560fef1b5b5798722b8ee0644c08016cee8a2828..dfc34ce59e5362d3ed5a6a66ebb2450144f9420f 100644 (file)
@@ -25,7 +25,7 @@ module bgp-epe {
     }
 
     grouping epe-node-descriptors {
-        reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-00#section-4.1";
+        reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.1";
         leaf bgp-router-id {
             description "BGP Router Identifier.";
             type inet:ipv4-address;
index dbe926a98489c591c5425b2059df7296f6b1f5ed..5bce64c8969fe425a2a061a14a4adec970326674 100644 (file)
@@ -580,17 +580,17 @@ module bgp-linkstate {
         container peer-node-sid {
             description "The SID representing the peer of the BGP session.";
             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
-            uses bgp-sr:adj-sid-tlv;
+            uses bgp-sr:epe-adj-sid-tlv;
         }
         container peer-adj-sid {
             description "The SID representing the peer of the BGP session.";
             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
-            uses bgp-sr:adj-sid-tlv;
+            uses bgp-sr:epe-adj-sid-tlv;
         }
         list peer-set-sids {
             description "The SID representing the group the peer is part of.";
             reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
-            uses bgp-sr:adj-sid-tlv;
+            uses bgp-sr:epe-adj-sid-tlv;
         }
     }
 
index 223a4fbc6f697ee3c934dc5703216083e0372b36..c117d0eb1dea1ab1b4909e2b53dae074632a9d92 100644 (file)
@@ -116,6 +116,10 @@ module bgp-segment-routing {
     grouping adj-sid-tlv {
         reference "https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.2.1";
         uses adj-flags;
+        uses epe-adj-sid-tlv;
+    }
+
+    grouping epe-adj-sid-tlv {
         leaf weight {
             type weight;
         }
index ebf2b5093f838c24ca654747efa72c98f1287c54..6dd0e829c08d0c031daa30a849e547a57f3a6a9a 100644 (file)
@@ -11,7 +11,6 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import com.google.common.collect.Lists;
 import io.netty.buffer.ByteBuf;
@@ -40,8 +39,6 @@ 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.LinkstateAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkstateSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSids;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestinationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.LinkCaseBuilder;
@@ -223,9 +220,6 @@ public class LinkstateAttributeParserTest {
         final IsisAdjFlagsCase flags = new IsisAdjFlagsCaseBuilder().setAddressFamily(Boolean.TRUE).setBackup(Boolean.FALSE).setSet(Boolean.FALSE).build();
         assertEquals(flags, ls.getSrAdjIds().get(0).getFlags());
         assertEquals(flags, ls.getSrAdjIds().get(1).getFlags());
-        assertNull(ls.getPeerNodeSid().getFlags());
-        assertNull(ls.getPeerSetSids().get(0).getFlags());
-        assertNull(ls.getPeerAdjSid().getFlags());
         assertEquals(new Long(1048575L), ((LocalLabelCase)ls.getSrAdjIds().get(0).getSidLabelIndex()).getLocalLabel().getValue());
         assertEquals(new Long(1048559L), ((LocalLabelCase)ls.getSrAdjIds().get(1).getSidLabelIndex()).getLocalLabel().getValue());
         assertEquals(new Long(168496141L), ((SidCase) ls.getPeerNodeSid().getSidLabelIndex()).getSid());
@@ -244,13 +238,6 @@ public class LinkstateAttributeParserTest {
         assertArrayEquals(ByteArray.subByte(LINK_ATTR, 0, LINK_ATTR.length -5), ByteArray.getAllBytes(buff));
     }
 
-    private PeerSetSids buildPeerSetSid(final Flags flags, final long sid, final short weight) {
-        return new PeerSetSidsBuilder()
-            .setFlags(flags)
-            .setWeight(new Weight(new Short(weight)))
-            .setSidLabelIndex(new SidCaseBuilder().setSid(new Long(sid)).build()).build();
-    }
-
     @Test
     public void testPositiveNodes() throws BGPParsingException {
         final AttributesBuilder builder = createBuilder(new NodeCaseBuilder().build());