BUG-5024: Update BGP LS to conform RFC 7752 II 87/40287/3
authorClaudio D. Gasparini <cgaspari@cisco.com>
Tue, 14 Jun 2016 08:55:08 +0000 (10:55 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Thu, 16 Jun 2016 09:22:33 +0000 (11:22 +0200)
-Implementation of new IPv6 Prefix SID
-apply changes required for new protocol-id ospfV3

Change-Id: Ia55508ec657269e8d2cc981486857a5d3c223103
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/BindingSidLabelParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/Ipv6SrPrefixAttributesParser.java [new file with mode: 0644]
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/RangeTlvParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java
bgp/linkstate/src/main/yang/bgp-linkstate.yang
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java

index 3250f3c3d249c2e860d1636bfb22ac0fd3432887..bf63919bf60e28702fb45a45dd4d2e5b87341480 100644 (file)
@@ -16,6 +16,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map.Entry;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.BindingSidLabelParser;
+import org.opendaylight.protocol.bgp.linkstate.attribute.sr.Ipv6SrPrefixAttributesParser;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.RangeTlvParser;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser;
 import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
@@ -35,6 +36,7 @@ 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.linkstate.path.attribute.link.state.attribute.prefix.attributes._case.PrefixAttributesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.IgpBits;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.IgpBitsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.Ipv6SrPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrBindingSidLabels;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrRange;
@@ -70,6 +72,7 @@ public final class PrefixAttributesParser {
 
     /* Segment routing TLV */
     public static final int PREFIX_SID = 1158;
+    public static final int IPV6_PREFIX_SID = 1169;
     public static final int RANGE = 1159;
     public static final int BINDING_SID = 1160;
 
@@ -138,6 +141,11 @@ public final class PrefixAttributesParser {
             builder.setSrPrefix(prefix);
             LOG.debug("Parsed SR Prefix: {}", prefix);
             break;
+        case IPV6_PREFIX_SID:
+            final Ipv6SrPrefix ipv6Prefix = Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(value);
+            builder.setIpv6SrPrefix(ipv6Prefix);
+            LOG.debug("Parsed Ipv6 SR Prefix: {}", ipv6Prefix);
+            break;
         case RANGE:
             final SrRange range = RangeTlvParser.parseSrRange(value, protocolId);
             builder.setSrRange(range);
@@ -212,6 +220,11 @@ public final class PrefixAttributesParser {
             SrPrefixAttributesParser.serializeSrPrefix(prefixAtrributes.getSrPrefix(), buffer);
             TlvUtil.writeTLV(PREFIX_SID, buffer, byteAggregator);
         }
+        if (prefixAtrributes.getIpv6SrPrefix() != null) {
+            final ByteBuf buffer = Unpooled.buffer();
+            Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefixAtrributes.getIpv6SrPrefix(), buffer);
+            TlvUtil.writeTLV(IPV6_PREFIX_SID, buffer, byteAggregator);
+        }
         if (prefixAtrributes.getSrRange() != null) {
             final ByteBuf sidBuffer = Unpooled.buffer();
             RangeTlvParser.serializeSrRange(prefixAtrributes.getSrRange(), sidBuffer);
index 645717f88ef1cc0984720a738309d76e71222adc..40de24434aaa614688a15f8ede2bb36773a680af 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.protocol.util.Ipv6Util;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
 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.prefix.state.Ipv6SrPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrBindingSidLabels;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrBindingSidLabelsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix;
@@ -42,6 +43,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segm
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.PrefixSidCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.PrefixSidCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.SidLabelCase;
@@ -96,18 +99,17 @@ public final class BindingSidLabelParser {
     }
 
     private static Flags parseBindingSidFlags(final BitArray flags, final ProtocolId protocol) {
-        if (protocol.equals(ProtocolId.IsisLevel1) || protocol.equals(ProtocolId.IsisLevel2)) {
-            return new IsisBindingFlagsCaseBuilder()
-                .setAddressFamily(flags.get(AFI))
-                .setMirrorContext(flags.get(MIRROR_CONTEXT))
-                .setSpreadTlv(flags.get(SPREAD_TLV))
-                .setLeakedFromLevel2(flags.get(LEAKED))
-                .setAttachedFlag(flags.get(ATTACHED)).build();
-        } else if (protocol.equals(ProtocolId.Ospf)) {
-            return new OspfBindingFlagsCaseBuilder()
-            .setMirroring(flags.get(MIRROR_CONTEXT_OSPF)).build();
+        switch (protocol) {
+        case IsisLevel1:
+        case IsisLevel2:
+            return new IsisBindingFlagsCaseBuilder().setAddressFamily(flags.get(AFI)).setMirrorContext(flags.get(MIRROR_CONTEXT))
+                .setSpreadTlv(flags.get(SPREAD_TLV)).setLeakedFromLevel2(flags.get(LEAKED)).setAttachedFlag(flags.get(ATTACHED)).build();
+        case Ospf:
+        case OspfV3:
+            return new OspfBindingFlagsCaseBuilder().setMirroring(flags.get(MIRROR_CONTEXT_OSPF)).build();
+        default:
+            return null;
         }
-        return null;
     }
 
     private static List<BindingSubTlvs> parseBindingSubTlvs(final ByteBuf buffer, final ProtocolId protocolId) {
@@ -137,6 +139,10 @@ public final class BindingSidLabelParser {
                 .setFlags(prefix.getFlags())
                 .setSidLabelIndex(prefix.getSidLabelIndex()).build());
             break;
+        case PrefixAttributesParser.IPV6_PREFIX_SID:
+            final Ipv6SrPrefix ipv6Prefix = Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(slice);
+            builder.setBindingSubTlv(new Ipv6PrefixSidCaseBuilder().setAlgorithm(ipv6Prefix.getAlgorithm()).build());
+            break;
         case ERO_METRIC:
             builder.setBindingSubTlv(new EroMetricCaseBuilder()
                 .setEroMetric(new TeMetric(slice.readUnsignedInt())).build());
@@ -221,7 +227,7 @@ public final class BindingSidLabelParser {
         }
     }
 
-    public static void serializeBindingSidAttributes(final Weight weight, final Flags flags, final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
+    static void serializeBindingSidAttributes(final Weight weight, final Flags flags, final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
         aggregator.writeByte(weight.getValue());
         final BitArray bitFlags = serializeBindingSidFlags(flags);
         bitFlags.toByteBuf(aggregator);
@@ -256,6 +262,10 @@ public final class BindingSidLabelParser {
                 final PrefixSidCase prefix = (PrefixSidCase) bindingSubTlv;
                 SrPrefixAttributesParser.serializePrefixAttributes(prefix.getFlags(), prefix.getAlgorithm(), prefix.getSidLabelIndex(), buffer);
                 TlvUtil.writeTLV(PrefixAttributesParser.PREFIX_SID, buffer, aggregator);
+            } else if (bindingSubTlv instanceof Ipv6PrefixSidCase) {
+                final Ipv6PrefixSidCase prefix = (Ipv6PrefixSidCase) bindingSubTlv;
+                Ipv6SrPrefixAttributesParser.serializePrefixAttributes(prefix.getAlgorithm(), buffer);
+                TlvUtil.writeTLV(PrefixAttributesParser.IPV6_PREFIX_SID, buffer, aggregator);
             } else if (bindingSubTlv instanceof EroMetricCase) {
                 buffer.writeInt(((EroMetricCase) bindingSubTlv).getEroMetric().getValue().intValue());
                 TlvUtil.writeTLV(ERO_METRIC, buffer, aggregator);
diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/Ipv6SrPrefixAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/Ipv6SrPrefixAttributesParser.java
new file mode 100644 (file)
index 0000000..1d19c20
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.linkstate.attribute.sr;
+
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.Ipv6SrPrefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.Ipv6SrPrefixBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Algorithm;
+
+public final class Ipv6SrPrefixAttributesParser {
+    private static final int FLAGS_SIZE = 2;
+
+    private Ipv6SrPrefixAttributesParser() {
+        throw new UnsupportedOperationException();
+    }
+
+    public static Ipv6SrPrefix parseSrIpv6Prefix(final ByteBuf buffer) {
+        final Ipv6SrPrefixBuilder builder = new Ipv6SrPrefixBuilder();
+        buffer.skipBytes(FLAGS_SIZE);
+        builder.setAlgorithm(Algorithm.forValue(buffer.readUnsignedByte()));
+        return builder.build();
+    }
+
+    public static void serializePrefixAttributes(final Algorithm algorithm, final ByteBuf buffer) {
+        buffer.writeZero(FLAGS_SIZE);
+        buffer.writeByte(algorithm.getIntValue());
+    }
+
+    public static void serializeIpv6SrPrefix(final Ipv6SrPrefix ipv6SrPrefix, final ByteBuf buffer) {
+        serializePrefixAttributes(ipv6SrPrefix.getAlgorithm(), buffer);
+    }
+}
index 42828961c54c75f82d20f74dfd2bff5aab5c5694..c5d9e16e72bca097cc9281d596ed937cb73fe891 100644 (file)
@@ -21,6 +21,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.segment.routing.ext.rev151014.range.sub.tlvs.RangeSubTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.BindingSidTlvCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.BindingSidTlvCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.Ipv6PrefixSidTlvCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.Ipv6PrefixSidTlvCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.SidLabelTlvCase;
@@ -69,6 +71,9 @@ public final class RangeTlvParser {
             case PrefixAttributesParser.PREFIX_SID:
                 subTlvCase = new PrefixSidTlvCaseBuilder(SrPrefixAttributesParser.parseSrPrefix(buffer.readSlice(length), protocolId)).build();
                 break;
+            case PrefixAttributesParser.IPV6_PREFIX_SID:
+                subTlvCase = new Ipv6PrefixSidTlvCaseBuilder(Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(buffer.readSlice(length))).build();
+                break;
             case PrefixAttributesParser.BINDING_SID:
                 subTlvCase = new BindingSidTlvCaseBuilder(BindingSidLabelParser.parseBindingSidLabel(buffer.readSlice(length), protocolId)).build();
                 break;
@@ -106,6 +111,10 @@ public final class RangeTlvParser {
                     prefixSidTlv.getSidLabelIndex(),
                     buffer);
                 TlvUtil.writeTLV(PrefixAttributesParser.PREFIX_SID, buffer, aggregator);
+            } else if (rangeSubTlv instanceof Ipv6PrefixSidTlvCase) {
+                final Ipv6PrefixSidTlvCase prefixSidTlv = (Ipv6PrefixSidTlvCase) rangeSubTlv;
+                Ipv6SrPrefixAttributesParser.serializePrefixAttributes(prefixSidTlv.getAlgorithm(), buffer);
+                TlvUtil.writeTLV(PrefixAttributesParser.IPV6_PREFIX_SID, buffer, aggregator);
             } else if (rangeSubTlv instanceof BindingSidTlvCase) {
                 final BindingSidTlvCase rangeTlv = (BindingSidTlvCase) rangeSubTlv;
                 BindingSidLabelParser.serializeBindingSidAttributes(
index 947135f204c1a41ac6ac0fa4cf81377aa32d4083..83e547cf79f261aa39cc38fb8be36ff56550a2e0 100644 (file)
@@ -7,6 +7,9 @@
  */
 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;
@@ -109,10 +112,15 @@ public final class SrLinkAttributesParser {
         srLanAdjIdBuilder.setFlags(parseFlags(flags, protocolId));
         srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
         buffer.skipBytes(RESERVED);
-        if (protocolId.equals(ProtocolId.IsisLevel1) || protocolId.equals(ProtocolId.IsisLevel2)) {
+        switch (protocolId) {
+        case IsisLevel1:
+        case IsisLevel2:
             srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE)));
-        } else if (protocolId.equals(ProtocolId.Ospf)) {
+            break;
+        case Ospf:
+        case OspfV3:
             srLanAdjIdBuilder.setNeighborId(Ipv4Util.addressForByteBuf(buffer));
+            break;
         }
         // length determines a type of next field, which is used for parsing
         srLanAdjIdBuilder.setSidLabelIndex(SidLabelIndexParser.parseSidLabelIndex(Size.forValue(buffer.readableBytes()), buffer));
@@ -123,17 +131,17 @@ public final class SrLinkAttributesParser {
         if (protocol == null) {
             return null;
         }
-        if (protocol.equals(ProtocolId.IsisLevel1) || protocol.equals(ProtocolId.IsisLevel2)) {
-            return new IsisAdjFlagsCaseBuilder()
-                .setAddressFamily(flags.get(ADDRESS_FAMILY_FLAG))
-                .setBackup(flags.get(BACKUP_ISIS))
+        switch (protocol) {
+        case IsisLevel1:
+        case IsisLevel2:
+            return new IsisAdjFlagsCaseBuilder().setAddressFamily(flags.get(ADDRESS_FAMILY_FLAG)).setBackup(flags.get(BACKUP_ISIS))
                 .setSet(flags.get(SET_ISIS)).build();
-        } else if (protocol.equals(ProtocolId.Ospf)) {
-            return new OspfAdjFlagsCaseBuilder()
-                .setBackup(flags.get(BACKUP_OSPF))
-                .setSet(flags.get(SET_OSPF)).build();
+        case Ospf:
+        case OspfV3:
+            return new OspfAdjFlagsCaseBuilder().setBackup(flags.get(BACKUP_OSPF)).setSet(flags.get(SET_OSPF)).build();
+        default:
+            return null;
         }
-        return null;
     }
 
     public static <T extends AdjSidTlv> void serializeAdjacencySegmentIdentifiers(final List<T> adjSids, final int type, final ByteBuf byteAggregator) {
index fd0eb10b8e145493084120224abaf47a4953d6f2..db7db809569a5f7c1ff99dd79f9bae9a9ed2a1dc 100644 (file)
@@ -50,27 +50,25 @@ public final class SrPrefixAttributesParser {
     }
 
     private static Flags parsePrefixFlags(final BitArray flags, final ProtocolId protocol) {
-        if (protocol.equals(ProtocolId.IsisLevel1) || protocol.equals(ProtocolId.IsisLevel2)) {
-            return new IsisPrefixFlagsCaseBuilder()
-                .setReadvertisement(flags.get(RE_ADVERTISEMENT))
-                .setNodeSid(flags.get(NODE_SID))
-                .setNoPhp(flags.get(NO_PHP))
-                .setExplicitNull(flags.get(EXPLICIT_NULL)).build();
+        switch (protocol) {
+        case IsisLevel1:
+        case IsisLevel2:
+            return new IsisPrefixFlagsCaseBuilder().setReadvertisement(flags.get(RE_ADVERTISEMENT))
+                .setNodeSid(flags.get(NODE_SID)).setNoPhp(flags.get(NO_PHP)).setExplicitNull(flags.get(EXPLICIT_NULL)).build();
+        case Ospf:
+        case OspfV3:
+            return new OspfPrefixFlagsCaseBuilder().setExplicitNull(flags.get(EXPLICIT_NULL))
+                .setMappingServer(flags.get(MAPPING_SERVER)).setNoPhp(flags.get(NO_PHP_OSPF)).build();
+        default:
+            return null;
         }
-        if (protocol.equals(ProtocolId.Ospf)) {
-            return new OspfPrefixFlagsCaseBuilder()
-                .setExplicitNull(flags.get(EXPLICIT_NULL))
-                .setMappingServer(flags.get(MAPPING_SERVER))
-                .setNoPhp(flags.get(NO_PHP_OSPF)).build();
-        }
-        return null;
     }
 
     public static void serializeSrPrefix(final SrPrefix srPrefix, final ByteBuf aggregator) {
         serializePrefixAttributes(srPrefix.getFlags(), srPrefix.getAlgorithm(), srPrefix.getSidLabelIndex(), aggregator);
     }
 
-    public static void serializePrefixAttributes(final Flags flags, final Algorithm algorithm, final SidLabelIndex sidLabelIndex, final ByteBuf buffer) {
+    static void serializePrefixAttributes(final Flags flags, final Algorithm algorithm, final SidLabelIndex sidLabelIndex, final ByteBuf buffer) {
         final BitArray bitFlags = serializePrefixFlags(flags, sidLabelIndex);
         bitFlags.toByteBuf(buffer);
         buffer.writeByte(algorithm.getIntValue());
index 3260ac4297c7b09495f5508f3abc53c9d68b09fb..dbe926a98489c591c5425b2059df7296f6b1f5ed 100644 (file)
@@ -579,17 +579,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-01#section-4.3";
+            reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
             uses bgp-sr: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-01#section-4.3";
+            reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
             uses bgp-sr: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-01#section-4.3";
+            reference "https://tools.ietf.org/html/draft-ietf-idr-bgpls-segment-routing-epe-05#section-4.3";
             uses bgp-sr:adj-sid-tlv;
         }
     }
index 893560fffbaed0a8d83b98c5d6ac4bbaf09c4b49..178a089cdda7692662e2b0a9992f548dd5cee9e4 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.BindingSidLabelParser;
+import org.opendaylight.protocol.bgp.linkstate.attribute.sr.Ipv6SrPrefixAttributesParser;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.RangeTlvParser;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SidLabelIndexParser;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrLinkAttributesParser;
@@ -38,6 +39,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.node.state.SrAlgorithmBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrCapabilities;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrCapabilitiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.Ipv6SrPrefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.Ipv6SrPrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefixBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrRange;
@@ -158,6 +161,17 @@ public class SrAttributeParserTest {
         assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
     }
 
+    // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
+    @Test
+    public void testIpv6SrPrefix() {
+        final byte[] bytes = { 0, 0, 0};
+        final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
+        assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
+        final ByteBuf serializedPrefix = Unpooled.buffer();
+        Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
+        assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
+    }
+
     // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
     @Test
     public void testRangeTlv() {
@@ -343,6 +357,17 @@ public class SrAttributeParserTest {
         }
     }
 
+    @Test(expected=UnsupportedOperationException.class)
+    public void testIpv6SrPrefixAttributesPrivateConstructor() throws Throwable {
+        final Constructor<Ipv6SrPrefixAttributesParser> c = Ipv6SrPrefixAttributesParser.class.getDeclaredConstructor();
+        c.setAccessible(true);
+        try {
+            c.newInstance();
+        } catch (final InvocationTargetException e) {
+            throw e.getCause();
+        }
+    }
+
     @Test(expected=UnsupportedOperationException.class)
     public void testBindingParserPrivateConstructor() throws Throwable {
         final Constructor<BindingSidLabelParser> c = BindingSidLabelParser.class.getDeclaredConstructor();