BUG-5441: BGP SR prefix SID extension 14/37714/18
authorIveta Halanova <ihalanov@cisco.com>
Mon, 18 Apr 2016 08:26:20 +0000 (10:26 +0200)
committerIveta Halanova <ihalanov@cisco.com>
Tue, 26 Apr 2016 11:16:59 +0000 (11:16 +0000)
ref.: https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02

Updated and added yang modules in parser, LU and inet projects.
Implemented individual handlers and registered.
Created parser, serialized and registry interfaces.
Updated and add unit tests.

Change-Id: If39bfc6c06bf65687d20caa800e9a891ce11a12e
Signed-off-by: Iveta Halanova <ihalanov@cisco.com>
26 files changed:
bgp/inet/pom.xml
bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/BGPActivator.java [new file with mode: 0644]
bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParser.java [new file with mode: 0644]
bgp/inet/src/main/yang/bgp-inet.yang
bgp/inet/src/test/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParserTest.java [new file with mode: 0644]
bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/BGPActivator.java
bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabelIndexTlvParser.java [new file with mode: 0644]
bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/OriginatorSrgbTlvParser.java [new file with mode: 0644]
bgp/labeled-unicast/src/main/yang/bgp-labeled-unicast.yang
bgp/labeled-unicast/src/test/java/org/opendaylight/protocol/bgp/labeled/unicast/BgpPrefixSidTlvsTest.java [new file with mode: 0644]
bgp/parser-api/src/main/yang/bgp-message.yang
bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java
bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParser.java [new file with mode: 0644]
bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParserTest.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerContext.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderContext.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvParser.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvRegistry.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvSerializer.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvUtil.java [new file with mode: 0644]
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionConsumerContext.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBgpPrefixSidTlvRegistry.java [new file with mode: 0644]
bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/pojo/BgpTestActivator.java
bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleRegistryTest.java
features/bgp/src/main/features/features.xml

index d09e09bbaf1f3a68dbe4b6d3553e15ed653bb5e0..4a3f9e5fbab92e3a72ac4d328c4c3055de16d910 100644 (file)
             <groupId>${project.groupId}</groupId>
             <artifactId>bgp-parser-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>bgp-parser-spi</artifactId>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>bgp-rib-api</artifactId>
             <groupId>${project.groupId}</groupId>
             <artifactId>bgp-bmp-api</artifactId>
         </dependency>
+
+        <!-- test scope dependencies -->
+         <dependency>
+             <groupId>junit</groupId>
+             <artifactId>junit</artifactId>
+         </dependency>
     </dependencies>
 
     <build>
diff --git a/bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/BGPActivator.java b/bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/BGPActivator.java
new file mode 100644 (file)
index 0000000..026e673
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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.inet;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
+import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlv;
+
+public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
+
+    @Override
+    protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
+        final List<AutoCloseable> regs = new ArrayList<>(2);
+        final Ipv6BgpPrefixSidParser tlvHandler = new Ipv6BgpPrefixSidParser();
+        regs.add(context.registerBgpPrefixSidTlvParser(tlvHandler.getType(), tlvHandler));
+        regs.add(context.registerBgpPrefixSidTlvSerializer(Ipv6SidTlv.class, tlvHandler));
+        return regs;
+    }
+
+}
diff --git a/bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParser.java b/bgp/inet/src/main/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParser.java
new file mode 100644 (file)
index 0000000..f806665
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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.inet;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.protocol.util.BitArray;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class Ipv6BgpPrefixSidParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+    private static final int IPV6_SID_TYPE = 2;
+    private static final int RESERVED = 1;
+    private static final int FLAGS_SIZE = 2 * Byte.SIZE;
+    private static final int PROCESS_IPV6_HEADER_FLAG = 0;
+
+    @Override
+    public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf bytes) {
+        Preconditions.checkArgument(tlv instanceof Ipv6SidTlv, "Incoming TLV is not Ipv6SidTlv");
+        final Ipv6SidTlv ipv6Tlv = (Ipv6SidTlv) tlv;
+        bytes.writeZero(RESERVED);
+        final BitArray flags = new BitArray(FLAGS_SIZE);
+        flags.set(PROCESS_IPV6_HEADER_FLAG, ipv6Tlv.isProcessIpv6HeadAbility());
+        flags.toByteBuf(bytes);
+    }
+
+    @Override
+    public Ipv6SidTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+        buffer.readBytes(RESERVED);
+        final boolean canProcessIpv6Header = BitArray.valueOf(buffer, FLAGS_SIZE).get(PROCESS_IPV6_HEADER_FLAG);
+        return new Ipv6SidTlvBuilder().setProcessIpv6HeadAbility(canProcessIpv6Header).build();
+    }
+
+    @Override
+    public int getType() {
+        return IPV6_SID_TYPE;
+    }
+}
index a5fa2455c11944e51c4b4fc4b200863d193cef63..a6c1207e21c7ad841107caeb17ed08e2c9d9d463 100644 (file)
@@ -69,6 +69,16 @@ module bgp-inet {
         }
     }
 
+    grouping ipv6-bgp-prefix-sid-tlv {
+        reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.2";
+        leaf process-ipv6-head-ability {
+            description "S flag position 0. If set then it means that the BGP speaker is capable of processing the
+                IPv6 Segment Routing Header.";
+            type boolean;
+            default "true";
+        }
+    }
+
     grouping ipv6-routes {
         container ipv6-routes {
             list ipv6-route {
@@ -76,7 +86,13 @@ module bgp-inet {
 
                 key prefix;
 
-                uses bgp-rib:route;
+                uses bgp-rib:route {
+                    augment "attributes/bgp-prefix-sid/bgp-prefix-sid-tlvs/bgp-prefix-sid-tlv" {
+                        case ipv6-sid-tlv {
+                            uses ipv6-bgp-prefix-sid-tlv;
+                        }
+                    }
+                }
             }
         }
     }
@@ -172,5 +188,11 @@ module bgp-inet {
             uses ipv6-routes;
         }
     }
+
+    augment "/bgp-msg:update/bgp-msg:attributes/bgp-msg:bgp-prefix-sid/bgp-msg:bgp-prefix-sid-tlvs/bgp-msg:bgp-prefix-sid-tlv" {
+        case ipv6-sid-tlv {
+            uses ipv6-bgp-prefix-sid-tlv;
+        }
+    }
 }
 
diff --git a/bgp/inet/src/test/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParserTest.java b/bgp/inet/src/test/java/org/opendaylight/protocol/bgp/inet/Ipv6BgpPrefixSidParserTest.java
new file mode 100644 (file)
index 0000000..7457676
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * 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.inet;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.Ipv6SidTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public final class Ipv6BgpPrefixSidParserTest {
+
+    private final Ipv6BgpPrefixSidParser handler = new Ipv6BgpPrefixSidParser();
+
+    private final byte[] expected = new byte[] {0, (byte)0x80, 0};
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testWrongTlvType() {
+        this.handler.serializeBgpPrefixSidTlv(new BgpPrefixSidTlv() {
+            @Override
+            public Class<? extends DataContainer> getImplementedInterface() {
+                return BgpPrefixSidTlv.class;
+            }
+        }, Unpooled.EMPTY_BUFFER);
+    }
+
+    @Test
+    public void testHandling() {
+        final Ipv6SidTlvBuilder tlv = new Ipv6SidTlvBuilder();
+        tlv.setProcessIpv6HeadAbility(Boolean.TRUE);
+        final ByteBuf serialized = Unpooled.buffer(3);
+        this.handler.serializeBgpPrefixSidTlv(tlv.build(), serialized);
+        assertArrayEquals(this.expected, serialized.array());
+        assertTrue(this.handler.parseBgpPrefixSidTlv(serialized).isProcessIpv6HeadAbility());
+    }
+
+    @Test
+    public void testType() {
+        assertEquals(2, this.handler.getType());
+    }
+}
index 19ffd894d187f7a7dcf3508dba9dd41ef5dfabac..bbf36b34e076599e854436b8c6b74fbdfcfa639e 100644 (file)
@@ -15,6 +15,8 @@ import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActi
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.LabeledUnicastSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.labeled.unicast.routes.LabeledUnicastRoutes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
@@ -26,13 +28,13 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
 
     @Override
     protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
-        final List<AutoCloseable> regs = new ArrayList<>(4);
+        final List<AutoCloseable> regs = new ArrayList<>(8);
         final LUNlriParser luNlriParser = new LUNlriParser();
 
         regs.add(context.registerSubsequentAddressFamily(LabeledUnicastSubsequentAddressFamily.class, LABELED_UNICAST_SAFI));
 
-        Ipv4NextHopParserSerializer ipv4NextHopParser = new Ipv4NextHopParserSerializer();
-        Ipv6NextHopParserSerializer ipv6NextHopParser = new Ipv6NextHopParserSerializer();
+        final Ipv4NextHopParserSerializer ipv4NextHopParser = new Ipv4NextHopParserSerializer();
+        final Ipv6NextHopParserSerializer ipv6NextHopParser = new Ipv6NextHopParserSerializer();
         regs.add(context.registerNlriParser(Ipv4AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class,
             luNlriParser, ipv4NextHopParser, Ipv4NextHopCase.class));
         regs.add(context.registerNlriParser(Ipv6AddressFamily.class, LabeledUnicastSubsequentAddressFamily.class,
@@ -40,6 +42,13 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
 
         regs.add(context.registerNlriSerializer(LabeledUnicastRoutes.class, luNlriParser));
 
+        final LabelIndexTlvParser labelHandler = new LabelIndexTlvParser();
+        final OriginatorSrgbTlvParser originatorHandler = new OriginatorSrgbTlvParser();
+        regs.add(context.registerBgpPrefixSidTlvParser(labelHandler.getType(), labelHandler));
+        regs.add(context.registerBgpPrefixSidTlvParser(labelHandler.getType(), originatorHandler));
+        regs.add(context.registerBgpPrefixSidTlvSerializer(LuLabelIndexTlv.class, labelHandler));
+        regs.add(context.registerBgpPrefixSidTlvSerializer(LuOriginatorSrgbTlv.class, originatorHandler));
+
         return regs;
     }
 
diff --git a/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabelIndexTlvParser.java b/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/LabelIndexTlvParser.java
new file mode 100644 (file)
index 0000000..82bf2a8
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.labeled.unicast;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class LabelIndexTlvParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+    private static final int LABEL_INDEX_TYPE = 1;
+    private static final int RESERVED = 1;
+    private static final int LABEL_INDEX_FLAGS_BYTES = 2;
+
+    @Override
+    public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf valueBuf) {
+        Preconditions.checkArgument(tlv instanceof LuLabelIndexTlv, "Incoming TLV is not LuLabelIndexTlv");
+        valueBuf.writeZero(RESERVED);
+        valueBuf.writeZero(LABEL_INDEX_FLAGS_BYTES);
+        valueBuf.writeInt(((LuLabelIndexTlv) tlv).getLabelIndexTlv().intValue());
+    }
+
+    @Override
+    public LuLabelIndexTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+        buffer.readBytes(RESERVED);
+        buffer.readBytes(LABEL_INDEX_FLAGS_BYTES);
+        final Long value = buffer.readUnsignedInt();
+        return new LuLabelIndexTlvBuilder().setLabelIndexTlv(value).build();
+    }
+
+    @Override
+    public int getType() {
+        return LABEL_INDEX_TYPE;
+    }
+}
diff --git a/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/OriginatorSrgbTlvParser.java b/bgp/labeled-unicast/src/main/java/org/opendaylight/protocol/bgp/labeled/unicast/OriginatorSrgbTlvParser.java
new file mode 100644 (file)
index 0000000..39f2cf2
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * 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.labeled.unicast;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.Srgb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class OriginatorSrgbTlvParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
+
+    private static final int ORIGINATOR_SRGB_TYPE = 3;
+    private static final int ORIGINATOR_FLAGS_BYTES = 2;
+    private static final int SRGB_LENGTH = 6;
+
+    @Override
+    public LuOriginatorSrgbTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
+        buffer.readBytes(ORIGINATOR_FLAGS_BYTES);
+        final List<SrgbValue> srgbList = parseSrgbs(buffer);
+        return new LuOriginatorSrgbTlvBuilder().setSrgbValue(srgbList).build();
+    }
+
+    private static List<SrgbValue> parseSrgbs(final ByteBuf buffer) {
+        Preconditions.checkState(buffer.readableBytes() % SRGB_LENGTH == 0, "Number of SRGBs doesn't fit available bytes.");
+        final List<SrgbValue> ret = new ArrayList<SrgbValue>();
+        while (buffer.isReadable()) {
+            ret.add(new SrgbValueBuilder().setBase(new Srgb((long) buffer.readUnsignedMedium())).setRange(new Srgb((long) buffer.readUnsignedMedium())).build());
+        }
+        return ret;
+    }
+
+    @Override
+    public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf valueBuf) {
+        Preconditions.checkArgument(tlv instanceof LuOriginatorSrgbTlv, "Incoming TLV is not LuOriginatorSrgbTlv");
+        final LuOriginatorSrgbTlv luTlv = (LuOriginatorSrgbTlv) tlv;
+        valueBuf.writeZero(ORIGINATOR_FLAGS_BYTES);
+        for (final SrgbValue val : luTlv.getSrgbValue()) {
+            valueBuf.writeMedium(val.getBase().getValue().intValue());
+            valueBuf.writeMedium(val.getRange().getValue().intValue());
+        }
+    }
+
+    @Override
+    public int getType() {
+        return ORIGINATOR_SRGB_TYPE;
+    }
+}
index 96d919e349c93081ecb9f36da7869dac96666963..22ded4bba3035c90d501cc03b7d536a5a3e00eee 100644 (file)
@@ -36,6 +36,12 @@ module bgp-labeled-unicast {
         base bgp-t:subsequent-address-family;
     }
 
+    typedef srgb {
+        type uint32 {
+            range "0..16777215";
+        }
+    }
+
     grouping label {
         reference "https://tools.ietf.org/html/rfc3032#section-2.1";
         description
@@ -75,7 +81,16 @@ module bgp-labeled-unicast {
                 }
                 key "route-key";
                 uses labeled-unicast;
-                uses bgp-rib:route;
+                uses bgp-rib:route {
+                    augment "attributes/bgp-prefix-sid/bgp-prefix-sid-tlvs/bgp-prefix-sid-tlv" {
+                        case lu-label-index-tlv {
+                            uses label-index-tlv;
+                        }
+                        case lu-originator-srgb-tlv {
+                            uses originator-srgb-tlv;
+                        }
+                    }
+                }
             }
         }
     }
@@ -137,4 +152,38 @@ module bgp-labeled-unicast {
             uses labeled-unicast-routes;
         }
     }
+
+    grouping label-index-tlv {
+        reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.1";
+        leaf label-index-tlv {
+            description "Value representing the index value in the SRGB space.";
+            type uint32;
+            mandatory true;
+        }
+    }
+
+    grouping originator-srgb-tlv {
+        reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02#section-4.3";
+        list srgb-value {
+            description "Originator SRGB: 3 octets of base followed by 3 octets of range.";
+            leaf base {
+                type srgb;
+                mandatory true;
+            }
+            leaf range {
+                type srgb;
+                mandatory true;
+            }
+        }
+    }
+
+    augment "/bgp-msg:update/bgp-msg:attributes/bgp-msg:bgp-prefix-sid/bgp-msg:bgp-prefix-sid-tlvs/bgp-msg:bgp-prefix-sid-tlv" {
+        reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02";
+        case lu-label-index-tlv {
+            uses label-index-tlv;
+        }
+        case lu-originator-srgb-tlv {
+            uses originator-srgb-tlv;
+        }
+    }
 }
diff --git a/bgp/labeled-unicast/src/test/java/org/opendaylight/protocol/bgp/labeled/unicast/BgpPrefixSidTlvsTest.java b/bgp/labeled-unicast/src/test/java/org/opendaylight/protocol/bgp/labeled/unicast/BgpPrefixSidTlvsTest.java
new file mode 100644 (file)
index 0000000..e0be13d
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * 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.labeled.unicast;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.Srgb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuLabelIndexTlvBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlvBuilder;
+
+public final class BgpPrefixSidTlvsTest {
+
+    @Test
+    public void testLabelIndexParser() {
+        final LabelIndexTlvParser parser = new LabelIndexTlvParser();
+        final LuLabelIndexTlv tlv = new LuLabelIndexTlvBuilder().setLabelIndexTlv(333L).build();
+        final ByteBuf serialized = Unpooled.buffer(7);
+        final byte[] expected = new byte[] {0, 0, 0, 0, 0, 1, (byte)0x4d};
+        parser.serializeBgpPrefixSidTlv(tlv, serialized);
+        assertArrayEquals(expected, serialized.array());
+
+        assertEquals(tlv.getLabelIndexTlv(), parser.parseBgpPrefixSidTlv(serialized).getLabelIndexTlv());
+
+        assertEquals(1, parser.getType());
+    }
+
+    @Test
+    public void testOriginatorParser() {
+        final OriginatorSrgbTlvParser parser = new OriginatorSrgbTlvParser();
+        final List<SrgbValue> list = new ArrayList<SrgbValue>();
+
+        final Srgb srgb1 = new Srgb(1L);
+        final Srgb srgb2 = new Srgb(2L);
+        list.add(new SrgbValueBuilder().setBase(srgb1).setRange(srgb2).build());
+        list.add(new SrgbValueBuilder().setBase(srgb2).setRange(srgb1).build());
+
+        final LuOriginatorSrgbTlv tlv = new LuOriginatorSrgbTlvBuilder().setSrgbValue(list).build();
+        final ByteBuf serialized = Unpooled.buffer(14);
+        parser.serializeBgpPrefixSidTlv(tlv, serialized);
+        final byte[] expected = new byte[] {0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1};
+        assertArrayEquals(expected, serialized.array());
+
+        final LuOriginatorSrgbTlv parsed = parser.parseBgpPrefixSidTlv(serialized);
+        assertEquals(tlv.getSrgbValue().size(), parsed.getSrgbValue().size());
+        assertTrue(tlv.getSrgbValue().get(0).getBase().equals(srgb1));
+        assertTrue(tlv.getSrgbValue().get(0).getRange().equals(srgb2));
+        assertTrue(tlv.getSrgbValue().get(1).getBase().equals(srgb2));
+        assertTrue(tlv.getSrgbValue().get(1).getRange().equals(srgb1));
+
+        assertEquals(3, parser.getType());
+    }
+}
index 917001e53d1dc00fc4011a965296de69ae9b29c5..1dba5ad85ee97d95747f135db8dc5d9949a36641 100644 (file)
@@ -184,6 +184,14 @@ module bgp-message {
                     mandatory true;
                 }
             }
+            container bgp-prefix-sid {
+                list bgp-prefix-sid-tlvs {
+                    choice bgp-prefix-sid-tlv {
+                        reference "https://tools.ietf.org/html/draft-ietf-idr-bgp-prefix-sid-02";
+                        // to be augmented
+                    }
+                }
+            }
         }
     }
 
index e8ee5cec69e3c5799bf845e1b01ad2d160bd5bfa..2066ab07ddf37dd0f53011ec1144dbde2f5ff6fd 100644 (file)
@@ -28,6 +28,7 @@ import org.opendaylight.protocol.bgp.parser.impl.message.update.AggregatorAttrib
 import org.opendaylight.protocol.bgp.parser.impl.message.update.AigpAttributeParser;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathAttributeParser;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.AtomicAggregateAttributeParser;
+import org.opendaylight.protocol.bgp.parser.impl.message.update.BgpPrefixSidAttributeParser;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.ClusterIdAttributeParser;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.CommunitiesAttributeParser;
 import org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser;
@@ -67,6 +68,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Aigp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AsPath;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.AtomicAggregate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ClusterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.Communities;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.ExtendedCommunities;
@@ -169,6 +171,10 @@ public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
     }
 
     private void registerAttributeParsers(final List<AutoCloseable> regs, final BGPExtensionProviderContext context) {
+        final BgpPrefixSidAttributeParser prefixSidAttributeParser = new BgpPrefixSidAttributeParser(context.getBgpPrefixSidTlvRegistry());
+        regs.add(context.registerAttributeSerializer(BgpPrefixSid.class, prefixSidAttributeParser));
+        regs.add(context.registerAttributeParser(BgpPrefixSidAttributeParser.TYPE, prefixSidAttributeParser));
+
         final OriginAttributeParser originAttributeParser = new OriginAttributeParser();
         regs.add(context.registerAttributeSerializer(Origin.class, originAttributeParser));
         regs.add(context.registerAttributeParser(OriginAttributeParser.TYPE, originAttributeParser));
diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParser.java
new file mode 100644 (file)
index 0000000..f932325
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * 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.parser.impl.message.update;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
+import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Attributes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.BgpPrefixSidBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.BgpPrefixSidTlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.BgpPrefixSidTlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+public final class BgpPrefixSidAttributeParser implements AttributeParser, AttributeSerializer {
+
+    public static final int TYPE = 40;
+
+    private final BgpPrefixSidTlvRegistry reg;
+
+    public BgpPrefixSidAttributeParser(final BgpPrefixSidTlvRegistry registry) {
+        this.reg = Preconditions.checkNotNull(registry);
+    }
+
+    @Override
+    public void serializeAttribute(final DataObject attribute, final ByteBuf byteAggregator) {
+        Preconditions.checkArgument(attribute instanceof Attributes, "Attribute parameter is not a PathAttribute object.");
+        final Attributes pathAttributes = (Attributes) attribute;
+        final BgpPrefixSid prefixSid = pathAttributes.getBgpPrefixSid();
+        if (prefixSid == null) {
+            return;
+        }
+        for (final BgpPrefixSidTlvs tlv : prefixSid.getBgpPrefixSidTlvs()) {
+            this.reg.serializeBgpPrefixSidTlv(tlv.getBgpPrefixSidTlv(), byteAggregator);
+        }
+    }
+
+    @Override
+    public void parseAttribute(final ByteBuf buffer, final AttributesBuilder builder) throws BGPDocumentedException, BGPParsingException {
+        final BgpPrefixSidBuilder sid = new BgpPrefixSidBuilder();
+        final List<BgpPrefixSidTlvs> tlvList = new ArrayList<BgpPrefixSidTlvs>();
+        while (buffer.isReadable()) {
+            final BgpPrefixSidTlv tlv = this.reg.parseBgpPrefixSidTlv(buffer.readUnsignedByte(), buffer);
+            tlvList.add(new BgpPrefixSidTlvsBuilder().setBgpPrefixSidTlv(tlv).build());
+        }
+        builder.setBgpPrefixSid(sid.setBgpPrefixSidTlvs(tlvList).build());
+    }
+
+}
diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParserTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/message/update/BgpPrefixSidAttributeParserTest.java
new file mode 100644 (file)
index 0000000..9a764b2
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * 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.parser.impl.message.update;
+
+import static org.junit.Assert.assertEquals;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
+import org.opendaylight.protocol.bgp.parser.BGPParsingException;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+public final class BgpPrefixSidAttributeParserTest {
+
+    private final BgpPrefixSidTlvRegistry reg = Mockito.mock(BgpPrefixSidTlvRegistry.class);
+    private final BgpPrefixSidTlv tlv = Mockito.mock(BgpPrefixSidTlv.class);
+    private final BgpPrefixSidAttributeParser parser = new BgpPrefixSidAttributeParser(this.reg);
+    private final byte[] bytes = new byte[] {1, 2, 3};
+
+    @Before
+    public void setUp() {
+        Mockito.doReturn(this.tlv).when(this.reg).parseBgpPrefixSidTlv(Mockito.anyInt(), Mockito.any(ByteBuf.class));
+        Mockito.doNothing().when(this.reg).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+    }
+
+    @Test
+    public void testHandling() throws BGPDocumentedException, BGPParsingException {
+        final AttributesBuilder builder = new AttributesBuilder();
+        this.parser.parseAttribute(Unpooled.copiedBuffer(this.bytes), builder);
+        assertEquals(3, builder.getBgpPrefixSid().getBgpPrefixSidTlvs().size());
+
+        this.parser.serializeAttribute(builder.build(), Unpooled.EMPTY_BUFFER);
+        Mockito.verify(this.reg, Mockito.times(3)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+    }
+}
index ee8b58b7756423e699d54339913284d1ba316c72..f9f2c6da7f5b802a1cfcf1f6cf4546d5d45679c7 100644 (file)
@@ -29,4 +29,6 @@ public interface BGPExtensionConsumerContext {
     SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry();
 
     ExtendedCommunityRegistry getExtendedCommunityReistry();
+
+    BgpPrefixSidTlvRegistry getBgpPrefixSidTlvRegistry();
 }
index 2f998c61be7f88e7ca936f440a3205bc07004cbd..646b8dd7db9d8b9c9a6498bba2cd6decc38d6742 100644 (file)
@@ -9,9 +9,9 @@ package org.opendaylight.protocol.bgp.parser.spi;
 
 import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunityParser;
 import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunitySerializer;
-
 import org.opendaylight.protocol.util.ReferenceCache;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity;
@@ -41,6 +41,10 @@ public interface BGPExtensionProviderContext extends BGPExtensionConsumerContext
 
     AutoCloseable registerMessageSerializer(Class<? extends Notification> messageClass, MessageSerializer serializer);
 
+    AutoCloseable registerBgpPrefixSidTlvParser(int tlvType, BgpPrefixSidTlvParser parser);
+
+    AutoCloseable registerBgpPrefixSidTlvSerializer(Class<? extends BgpPrefixSidTlv> tlvClass, BgpPrefixSidTlvSerializer serializer);
+
     /**
      * Each extension requires a specific NextHop handler. Therefore this method has been deprecated  for
      * the method which enforce user to register it.
@@ -48,9 +52,9 @@ public interface BGPExtensionProviderContext extends BGPExtensionConsumerContext
     @Deprecated
     AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily> safi, NlriParser parser);
 
-    AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily>
-        safi, NlriParser parser, final NextHopParserSerializer nextHopHandler, final Class<? extends CNextHop> cNextHopClass,
-                                     final Class<? extends CNextHop>... cNextHopClassList);
+    AutoCloseable registerNlriParser(Class<? extends AddressFamily> afi, Class<? extends SubsequentAddressFamily> safi,
+        NlriParser parser, final NextHopParserSerializer nextHopHandler, final Class<? extends CNextHop> cNextHopClass,
+        final Class<? extends CNextHop>... cNextHopClassList);
 
     AutoCloseable registerNlriSerializer(Class<? extends DataObject> nlriClass, NlriSerializer serializer);
 
@@ -59,7 +63,7 @@ public interface BGPExtensionProviderContext extends BGPExtensionConsumerContext
     AutoCloseable registerParameterSerializer(Class<? extends BgpParameters> paramClass, ParameterSerializer serializer);
 
     AutoCloseable registerExtendedCommunitySerializer(final Class<? extends ExtendedCommunity> extendedCommunityClass,
-            final ExtendedCommunitySerializer serializer);
+        final ExtendedCommunitySerializer serializer);
 
     AutoCloseable registerExtendedCommunityParser(final int type, final int subtype, final ExtendedCommunityParser parser);
 
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvParser.java
new file mode 100644 (file)
index 0000000..5f5cb0d
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * Common interface for BGP prefix SID TLVs parser implementations.
+ */
+public interface BgpPrefixSidTlvParser {
+    /**
+     * Method for parsing specific types of TLVs from incoming buffer
+     *
+     * @param buffer with TLV bytes
+     * @return instance of specific TLV
+     */
+    BgpPrefixSidTlv parseBgpPrefixSidTlv(ByteBuf buffer);
+}
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvRegistry.java
new file mode 100644 (file)
index 0000000..8880b72
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * 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.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * BGP prefix SID TLVs registry for encoding/decoding
+ */
+public interface BgpPrefixSidTlvRegistry {
+    /**
+     * Decode incoming TLV
+     * @param type number of TLV
+     * @param buffer contains bytes of TLV
+     * @return instance of specific TLV
+     */
+    BgpPrefixSidTlv parseBgpPrefixSidTlv(int type, ByteBuf buffer);
+
+    /**
+     * Encode TLV instance
+     * @param tlv instance
+     * @param bytes encoded TLV outcome
+     */
+    void serializeBgpPrefixSidTlv(BgpPrefixSidTlv tlv, ByteBuf bytes);
+}
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvSerializer.java
new file mode 100644 (file)
index 0000000..70c2d84
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * 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.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+
+/**
+ * Interface for BGP prefix SID TLVs serializers implementations.
+ */
+public interface BgpPrefixSidTlvSerializer {
+    /**
+     * Method for serializing specific types of TLVs from incoming buffer
+     *
+     * @param tlv instance
+     * @param bytes outcome serialized TLV
+     */
+    void serializeBgpPrefixSidTlv(BgpPrefixSidTlv tlv, ByteBuf bytes);
+
+    int getType();
+}
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvUtil.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BgpPrefixSidTlvUtil.java
new file mode 100644 (file)
index 0000000..c9b81e6
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * 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.parser.spi;
+
+import io.netty.buffer.ByteBuf;
+
+public final class BgpPrefixSidTlvUtil {
+
+    private BgpPrefixSidTlvUtil() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Utilized method for serialization of BGP prefix SID TLV
+     *
+     * @param type of TLV
+     * @param value of TLV
+     * @param buffer output aggregator
+     */
+    public static void formatBgpPrefixSidTlv(final int type, final ByteBuf value, final ByteBuf buffer) {
+        buffer.writeByte(type);
+        buffer.writeShort(value.writerIndex());
+        buffer.writeBytes(value);
+    }
+}
index 8da7008bdc6dbd7e01d895af76c1b8d1c6ee6da0..3b550f6ca4df5d0433b492c7e46ea90f53b68aac 100644 (file)
@@ -18,6 +18,7 @@ class SimpleBGPExtensionConsumerContext implements BGPExtensionConsumerContext {
     private final SimpleParameterRegistry paramReg = new SimpleParameterRegistry();
     private final SimpleNlriRegistry nlriReg = new SimpleNlriRegistry(this.afiReg, this.safiReg);
     private final SimpleExtendedCommunityRegistry ecReg = new SimpleExtendedCommunityRegistry();
+    private final SimpleBgpPrefixSidTlvRegistry prefixSidTlvReg = new SimpleBgpPrefixSidTlvRegistry();
 
     @Override
     public final SimpleAddressFamilyRegistry getAddressFamilyRegistry() {
@@ -58,4 +59,9 @@ class SimpleBGPExtensionConsumerContext implements BGPExtensionConsumerContext {
     public SimpleExtendedCommunityRegistry getExtendedCommunityReistry() {
         return this.ecReg;
     }
+
+    @Override
+    public SimpleBgpPrefixSidTlvRegistry getBgpPrefixSidTlvRegistry() {
+        return this.prefixSidTlvReg;
+    }
 }
index d1d503cc38c4305e004e7af024c8bb2bbb1e7543..eaf3ee8b46f6511315b891fad63d838e2dd1027f 100644 (file)
@@ -14,6 +14,8 @@ import java.util.concurrent.atomic.AtomicReference;
 import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
 import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
 import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
 import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
@@ -27,6 +29,7 @@ import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommu
 import org.opendaylight.protocol.bgp.parser.spi.extended.community.ExtendedCommunitySerializer;
 import org.opendaylight.protocol.util.ReferenceCache;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.ExtendedCommunity;
@@ -114,8 +117,8 @@ public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsume
 
     @Override
     public AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi, final Class<? extends SubsequentAddressFamily> safi,
-            final NlriParser parser, final NextHopParserSerializer nextHopParserSerializer, final Class<? extends
-        CNextHop> cNextHopClass, final Class<? extends CNextHop>... cNextHopClassList) {
+        final NlriParser parser, final NextHopParserSerializer nextHopParserSerializer, final Class<? extends
+            CNextHop> cNextHopClass, final Class<? extends CNextHop>... cNextHopClassList) {
         return this.getNlriRegistry().registerNlriParser(afi, safi, parser, nextHopParserSerializer, cNextHopClass);
     }
 
@@ -158,7 +161,7 @@ public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsume
 
     @Override
     public AutoCloseable registerExtendedCommunitySerializer(final Class<? extends ExtendedCommunity> extendedCommunityClass,
-            final ExtendedCommunitySerializer serializer) {
+        final ExtendedCommunitySerializer serializer) {
         return this.getExtendedCommunityReistry().registerExtendedCommunitySerializer(extendedCommunityClass, serializer);
     }
 
@@ -166,4 +169,14 @@ public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsume
     public AutoCloseable registerExtendedCommunityParser(final int type, final int subtype, final ExtendedCommunityParser parser) {
         return this.getExtendedCommunityReistry().registerExtendedCommunityParser(type, subtype, parser);
     }
+
+    @Override
+    public AutoCloseable registerBgpPrefixSidTlvParser(final int tlvType, final BgpPrefixSidTlvParser parser) {
+        return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvParser(tlvType, parser);
+    }
+
+    @Override
+    public AutoCloseable registerBgpPrefixSidTlvSerializer(final Class<? extends BgpPrefixSidTlv> tlvClass, final BgpPrefixSidTlvSerializer serializer) {
+        return this.getBgpPrefixSidTlvRegistry().registerBgpPrefixSidTlvSerializer(tlvClass, serializer);
+    }
 }
diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBgpPrefixSidTlvRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBgpPrefixSidTlvRegistry.java
new file mode 100644 (file)
index 0000000..730df25
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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.parser.spi.pojo;
+
+import com.google.common.base.Preconditions;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvUtil;
+import org.opendaylight.protocol.concepts.HandlerRegistry;
+import org.opendaylight.protocol.util.Values;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+
+public final class SimpleBgpPrefixSidTlvRegistry implements BgpPrefixSidTlvRegistry {
+
+    private final HandlerRegistry<DataContainer, BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer> handlers = new HandlerRegistry<>();
+
+    AutoCloseable registerBgpPrefixSidTlvParser(final int tlvType, final BgpPrefixSidTlvParser parser) {
+        Preconditions.checkArgument(tlvType >= 0 && tlvType <= Values.UNSIGNED_BYTE_MAX_VALUE);
+        return this.handlers.registerParser(tlvType, parser);
+    }
+
+    AutoCloseable registerBgpPrefixSidTlvSerializer(final Class<? extends BgpPrefixSidTlv> tlvClass, final BgpPrefixSidTlvSerializer serializer) {
+        return this.handlers.registerSerializer(tlvClass, serializer);
+    }
+
+    @Override
+    public BgpPrefixSidTlv parseBgpPrefixSidTlv(final int type, final ByteBuf buffer) {
+        final BgpPrefixSidTlvParser parser = this.handlers.getParser(type);
+        if (parser == null) {
+            return null;
+        }
+        final int length = buffer.readUnsignedShort();
+        Preconditions.checkState(length <= buffer.readableBytes(), "Length of BGP prefix SID TLV exceeds readable bytes of income.");
+        return parser.parseBgpPrefixSidTlv(buffer.readBytes(length));
+    }
+
+    @Override
+    public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf bytes) {
+        final BgpPrefixSidTlvSerializer serializer = this.handlers.getSerializer(tlv.getImplementedInterface());
+        if (serializer == null) {
+            return;
+        }
+        final ByteBuf valueBuf = Unpooled.buffer();
+        serializer.serializeBgpPrefixSidTlv(tlv, valueBuf);
+        BgpPrefixSidTlvUtil.formatBgpPrefixSidTlv(serializer.getType(), valueBuf, bytes);
+    }
+
+}
index e8c38958a8f970fd1d5af18606c999b7cc0cfbb8..17a67612f8c5d3a2be61070f835d6afaf79ea44d 100644 (file)
@@ -21,6 +21,8 @@ import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActi
 import org.opendaylight.protocol.bgp.parser.spi.AttributeParser;
 import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
 import org.opendaylight.protocol.bgp.parser.spi.CapabilityParser;
 import org.opendaylight.protocol.bgp.parser.spi.CapabilitySerializer;
 import org.opendaylight.protocol.bgp.parser.spi.MessageParser;
@@ -37,6 +39,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.bgp.parameters.optional.capabilities.CParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlriBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
@@ -88,6 +91,11 @@ public class BgpTestActivator extends AbstractBGPExtensionProviderActivator {
 
     protected NextHopParserSerializer nextHopParserSerializer;
 
+    @Mock
+    protected BgpPrefixSidTlvParser sidTlvParser;
+    @Mock
+    protected BgpPrefixSidTlvSerializer sidTlvSerializer;
+
     @Override
     protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
         initMock();
@@ -101,6 +109,9 @@ public class BgpTestActivator extends AbstractBGPExtensionProviderActivator {
         regs.add(context.registerCapabilityParser(TYPE, this.capaParser));
         regs.add(context.registerCapabilitySerializer(CParameters.class, this.capaSerializer));
 
+        regs.add(context.registerBgpPrefixSidTlvParser(TYPE, this.sidTlvParser));
+        regs.add(context.registerBgpPrefixSidTlvSerializer(BgpPrefixSidTlv.class, this.sidTlvSerializer));
+
         regs.add(context.registerMessageParser(TYPE, this.msgParser));
         regs.add(context.registerMessageSerializer(Notification.class, this.msgSerializer));
 
@@ -138,7 +149,7 @@ public class BgpTestActivator extends AbstractBGPExtensionProviderActivator {
         MockitoAnnotations.initMocks(this);
         try {
             Mockito.doNothing().when(this.attrParser).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
-                    Mockito.any(PeerSpecificParserConstraint.class));
+                Mockito.any(PeerSpecificParserConstraint.class));
             Mockito.doReturn(EMPTY).when(this.attrParser).toString();
             Mockito.doNothing().when(this.attrSerializer).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
             Mockito.doReturn(EMPTY).when(this.attrSerializer).toString();
@@ -153,8 +164,14 @@ public class BgpTestActivator extends AbstractBGPExtensionProviderActivator {
             Mockito.doNothing().when(this.capaSerializer).serializeCapability(Mockito.any(CParameters.class), Mockito.any(ByteBuf.class));
             Mockito.doReturn(EMPTY).when(this.capaSerializer).toString();
 
+            Mockito.doReturn(null).when(this.sidTlvParser).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
+            Mockito.doReturn(EMPTY).when(this.sidTlvParser).toString();
+            Mockito.doNothing().when(this.sidTlvSerializer).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+            Mockito.doReturn(EMPTY).when(this.sidTlvSerializer).toString();
+            Mockito.doReturn(0).when(this.sidTlvSerializer).getType();
+
             Mockito.doReturn(Mockito.mock(Notification.class)).when(this.msgParser).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
-                    Mockito.any(PeerSpecificParserConstraint.class));
+                Mockito.any(PeerSpecificParserConstraint.class));
             Mockito.doReturn(EMPTY).when(this.msgParser).toString();
             Mockito.doNothing().when(this.msgSerializer).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
             Mockito.doReturn(EMPTY).when(this.msgSerializer).toString();
index 3947fa833ce320ee9ef21309aa0d91690015f764..e76d969421a702432c9b550cf30bdeee55c5e4fa 100644 (file)
@@ -14,7 +14,6 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
-
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import java.util.Optional;
@@ -27,6 +26,7 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException;
 import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.AttributeRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.CapabilityRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.MultiPathSupport;
@@ -38,6 +38,7 @@ import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.message.BgpParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpReachNlriBuilder;
@@ -92,7 +93,7 @@ public class SimpleRegistryTest {
         attrReg.serializeAttribute(Mockito.mock(DataObject.class), byteAggregator);
         attrReg.parseAttributes(Unpooled.wrappedBuffer(attributeBytes), CONSTRAINT);
         verify(this.activator.attrParser, times(1)).parseAttribute(Mockito.any(ByteBuf.class), Mockito.any(AttributesBuilder.class),
-                Mockito.any(PeerSpecificParserConstraint.class));
+            Mockito.any(PeerSpecificParserConstraint.class));
         verify(this.activator.attrSerializer, times(1)).serializeAttribute(Mockito.any(DataObject.class), Mockito.any(ByteBuf.class));
     }
 
@@ -121,6 +122,24 @@ public class SimpleRegistryTest {
         verify(this.activator.capaParser, times(1)).parseCapability(Mockito.any(ByteBuf.class));
     }
 
+    @Test
+    public void testSimpleBgpPrefixSidTlvRegistry() {
+        final BgpPrefixSidTlvRegistry sidTlvReg = this.ctx.getBgpPrefixSidTlvRegistry();
+        final byte[] tlvBytes = {
+            0x00, 0x03, 0x00, 0x00, 0x00
+        };
+
+        final BgpPrefixSidTlv tlv = mock(BgpPrefixSidTlv.class);
+        doReturn(BgpPrefixSidTlv.class).when(tlv).getImplementedInterface();
+
+        final ByteBuf buffer = Unpooled.buffer(tlvBytes.length);
+        sidTlvReg.serializeBgpPrefixSidTlv(tlv, buffer);
+        verify(this.activator.sidTlvSerializer, times(1)).serializeBgpPrefixSidTlv(Mockito.any(BgpPrefixSidTlv.class), Mockito.any(ByteBuf.class));
+
+        sidTlvReg.parseBgpPrefixSidTlv(BgpTestActivator.TYPE, Unpooled.wrappedBuffer(tlvBytes));
+        verify(this.activator.sidTlvParser, times(1)).parseBgpPrefixSidTlv(Mockito.any(ByteBuf.class));
+    }
+
     @Test
     public void testSimpleMessageRegistry() throws Exception {
         final MessageRegistry msgRegistry = this.ctx.getMessageRegistry();
@@ -139,7 +158,7 @@ public class SimpleRegistryTest {
         msgRegistry.serializeMessage(msg, buffer);
         msgRegistry.parseMessage(Unpooled.wrappedBuffer(msgBytes), CONSTRAINT);
         verify(this.activator.msgParser, times(1)).parseMessageBody(Mockito.any(ByteBuf.class), Mockito.anyInt(),
-                Mockito.any(PeerSpecificParserConstraint.class));
+            Mockito.any(PeerSpecificParserConstraint.class));
         verify(this.activator.msgSerializer, times(1)).serializeMessage(Mockito.any(Notification.class), Mockito.any(ByteBuf.class));
     }
 
index 585968fc13cb4964e019b4b411d86524ea4051e4..a4e6b01e840df557f555eeec732cc00070240c30 100644 (file)
@@ -69,7 +69,9 @@
     <feature name='odl-bgpcep-bgp-inet' version='${project.version}'>
         <feature version='${project.version}'>odl-bgpcep-bgp-dependencies</feature>
         <feature version='${config.version}'>odl-config-api</feature>
+        <feature version='${yangtools.version}'>odl-yangtools-yang-data</feature>
         <bundle>mvn:org.opendaylight.bgpcep/bgp-parser-api/{{VERSION}}</bundle>
+        <bundle>mvn:org.opendaylight.bgpcep/bgp-parser-spi/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.bgpcep/bgp-rib-api/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.bgpcep/bgp-inet/{{VERSION}}</bundle>
         <bundle>mvn:org.opendaylight.bgpcep/bgp-bmp-api/{{VERSION}}</bundle>