BUG-4381: flowspec next_hop length 42/27642/6
authorIveta Halanova <ihalanov@cisco.com>
Wed, 30 Sep 2015 11:40:17 +0000 (13:40 +0200)
committerIveta Halanova <ihalanov@cisco.com>
Tue, 6 Oct 2015 05:46:32 +0000 (05:46 +0000)
zero-length next_hop in mp_reach made acceptable.

Change-Id: I6287228a058631685da34e0bf6bddb92f88f1e1d
Signed-off-by: Iveta Halanova <ihalanov@cisco.com>
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java
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

index dea47e4e38f77a8f05a7374b22a72aa1c8cdeb18..9249c3aa2f8bde8cb2e2fdd20a5c645192775817 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 final class SimpleNlriRegistry implements NlriRegistry {
 
     private static final int RESERVED = 1;
+    private static final int NEXT_HOP_LENGHT = 1;
 
     private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
     private final ConcurrentMap<Class<? extends DataObject>, NlriSerializer> serializers = new ConcurrentHashMap<>();
@@ -121,11 +122,14 @@ final class SimpleNlriRegistry implements NlriRegistry {
         byteAggregator.writeShort(this.afiReg.numberForClass(mpReachNlri.getAfi()));
         byteAggregator.writeByte(this.safiReg.numberForClass(mpReachNlri.getSafi()));
 
-        final ByteBuf nextHopBuffer = Unpooled.buffer();
-        NextHopUtil.serializeNextHop(mpReachNlri.getCNextHop(), nextHopBuffer);
-
-        byteAggregator.writeByte(nextHopBuffer.writerIndex());
-        byteAggregator.writeBytes(nextHopBuffer);
+        if (mpReachNlri.getCNextHop() != null) {
+            final ByteBuf nextHopBuffer = Unpooled.buffer();
+            NextHopUtil.serializeNextHop(mpReachNlri.getCNextHop(), nextHopBuffer);
+            byteAggregator.writeByte(nextHopBuffer.writerIndex());
+            byteAggregator.writeBytes(nextHopBuffer);
+        } else {
+            byteAggregator.writeZero(NEXT_HOP_LENGHT);
+        }
         byteAggregator.writeZero(RESERVED);
     }
 
@@ -149,7 +153,9 @@ final class SimpleNlriRegistry implements NlriRegistry {
         final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi()));
 
         final int nextHopLength = buffer.readUnsignedByte();
-        builder.setCNextHop(NextHopUtil.parseNextHop(buffer.readSlice(nextHopLength)));
+        if (nextHopLength != 0) {
+            builder.setCNextHop(NextHopUtil.parseNextHop(buffer.readSlice(nextHopLength)));
+        }
         buffer.skipBytes(RESERVED);
 
         final ByteBuf nlri = buffer.slice();
index 5624cccdb04daf8dc3e8eca1084fe4e2759b049f..a2241d99d97c4035bb438ab9c13c9fe956bb6486 100644 (file)
@@ -35,6 +35,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.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;
+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.UnicastSubsequentAddressFamily;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Notification;
@@ -86,9 +87,11 @@ public class BgpTestActivator extends AbstractBGPExtensionProviderActivator {
         regs.add(context.registerMessageSerializer(Notification.class, this.msgSerializer));
 
         regs.add(context.registerAddressFamily(Ipv4AddressFamily.class, 1));
+        regs.add(context.registerAddressFamily(Ipv6AddressFamily.class, 2));
         regs.add(context.registerSubsequentAddressFamily(UnicastSubsequentAddressFamily.class, 1));
 
         regs.add(context.registerNlriParser(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, this.nlriParser));
+        regs.add(context.registerNlriParser(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, this.nlriParser));
         regs.add(context.registerNlriSerializer(DataObject.class, this.nlriSerializer));
 
         return regs;
index 6b9f92902393e7b23007ffc1b4386a28bfac947b..8eeb0a9d80a00f1ecd071d2afaec5eaa10bebddd 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 org.junit.After;
@@ -39,6 +38,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.attributes.MpUnreachNlri;
 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;
+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.UnicastSubsequentAddressFamily;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
@@ -153,6 +153,38 @@ public class SimpleRegistryTest {
         verify(this.activator.nlriParser, times(1)).parseNlri(Mockito.any(ByteBuf.class), Mockito.any(MpReachNlriBuilder.class));
     }
 
+    @Test
+    public void testMpReachWithZeroNextHop() throws BGPParsingException {
+        final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
+        final byte[] mpReachBytes = {
+            0x00, 0x01, 0x01, 0x00, 0x00
+        };
+        final MpReachNlri mpReach = new MpReachNlriBuilder()
+            .setAfi(Ipv4AddressFamily.class)
+            .setSafi(UnicastSubsequentAddressFamily.class)
+            .build();
+        final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
+        nlriReg.serializeMpReach(mpReach, buffer);
+        assertArrayEquals(mpReachBytes, buffer.array());
+        assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes)));
+    }
+
+    @Test
+    public void testMpReachIpv6() throws BGPParsingException {
+        final NlriRegistry nlriReg = this.ctx.getNlriRegistry();
+        final byte[] mpReachBytes = {
+            0x00, 0x02, 0x01, 0x00, 0x00
+        };
+        final MpReachNlri mpReach = new MpReachNlriBuilder()
+            .setAfi(Ipv6AddressFamily.class)
+            .setSafi(UnicastSubsequentAddressFamily.class)
+            .build();
+        final ByteBuf buffer = Unpooled.buffer(mpReachBytes.length);
+        nlriReg.serializeMpReach(mpReach, buffer);
+        assertArrayEquals(mpReachBytes, buffer.array());
+        assertEquals(mpReach, nlriReg.parseMpReach(Unpooled.wrappedBuffer(mpReachBytes)));
+    }
+
     @Test
     public void testMpUnReachParser() throws BGPParsingException {
         final NlriRegistry nlriReg = this.ctx.getNlriRegistry();