Fix buffer read for unsupported LLGR Safi 93/87193/2 stable/neon
authorVikram Singh Kalakoti <vikramskalakoti@gmail.com>
Tue, 28 Jan 2020 07:18:12 +0000 (12:48 +0530)
committerVikram Singh Kalakoti <vikramskalakoti@gmail.com>
Wed, 29 Jan 2020 10:03:05 +0000 (15:33 +0530)
In LlGracefulCapabilityHandler, once an unsupported safi is encountered
we should skip all unread bytes in buffer for that Table

JIRA:BGPCEP-893

Signed-off-by: Vikram Singh Kalakoti <vikramskalakoti@gmail.com>
Change-Id: Ic37eeb2dfaec8ac411815bc9c1105e6baad197be

bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/LlGracefulCapabilityHandler.java
bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/LlGracefulCapabilityHandlerTest.java

index d86aa26ce9bd302993c998e68f5ed6b8fe34e78f..596d96950e7d4d6e45d5b52b07b06f4d77e6a99d 100644 (file)
@@ -74,7 +74,7 @@ public final class LlGracefulCapabilityHandler implements CapabilityParser, Capa
             final Class<? extends SubsequentAddressFamily> safi = this.safiReg.classForFamily(safival);
             if (safi == null) {
                 LOG.debug("Ignoring GR capability for unknown subsequent address family {}", safival);
-                buffer.skipBytes(1);
+                buffer.skipBytes(PER_TABLE_SIZE - 3);
                 continue;
             }
 
index b0567e040703e5c427c7cc42fe5184ee73b1c4f4..4fd67b1b30daa84b3283ccbcaf39facae8150f9b 100644 (file)
@@ -13,10 +13,15 @@ import java.util.Arrays;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
 import org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler;
+import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
+import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
@@ -33,11 +38,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily;
 
 public class LlGracefulCapabilityHandlerTest {
-
     private LlGracefulCapabilityHandler handler;
 
+    @Mock
+    private AddressFamilyRegistry afir;
+    @Mock
+    private SubsequentAddressFamilyRegistry safir;
+
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        Mockito.doReturn(Ipv4AddressFamily.class).when(this.afir).classForFamily(1);
+        Mockito.doReturn(Ipv6AddressFamily.class).when(this.afir).classForFamily(2);
+        Mockito.doReturn(null).when(this.afir).classForFamily(256);
+        Mockito.doReturn(UnicastSubsequentAddressFamily.class).when(this.safir).classForFamily(1);
+        Mockito.doReturn(null).when(this.safir).classForFamily(-123);
         final BGPExtensionProviderContext ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
         this.handler = new LlGracefulCapabilityHandler(
                 ctx.getAddressFamilyRegistry(), ctx.getSubsequentAddressFamilyRegistry());
@@ -98,6 +113,43 @@ public class LlGracefulCapabilityHandlerTest {
         this.handler.serializeCapability(cParameters, buffer);
     }
 
+    @Test
+    public void testRecvdUnsupportedAfi() {
+        final byte[] capaBytes = {
+            //header
+            (byte) 0x47, (byte) 0x15,
+            // Ipv4 Unicast, afiFlags = false, timer = 10
+            (byte) 0x00, (byte) 0x01, (byte) 0x01,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a,
+            // Unsupported afi, afiFlags = true, timer = 160
+            (byte) 0x01, (byte) 0x00, (byte) 0x01,
+            (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0,
+            //Ipv6  Unicast afiFlags = false, timer = 160
+            (byte) 0x00, (byte) 0x02, (byte) 0x01,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xa0
+        };
+        final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
+                .setTables(Arrays.asList(new TablesBuilder()
+                        .setAfi(Ipv4AddressFamily.class)
+                        .setSafi(UnicastSubsequentAddressFamily.class)
+                        .setAfiFlags(new Tables.AfiFlags(false))
+                        .setLongLivedStaleTime(10L)
+                        .build(),
+                        new TablesBuilder()
+                                .setAfi(Ipv6AddressFamily.class)
+                                .setSafi(UnicastSubsequentAddressFamily.class)
+                                .setAfiFlags(new Tables.AfiFlags(false))
+                                .setLongLivedStaleTime(160L)
+                                .build())).build();
+
+        final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
+                new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
+        LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
+                afir, safir);
+        Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
+                .slice(2, capaBytes.length - 2)));
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void testUnsupportedSafi() {
         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
@@ -114,6 +166,44 @@ public class LlGracefulCapabilityHandlerTest {
         this.handler.serializeCapability(cParameters, buffer);
     }
 
+    @Test
+    public void testRecvdUnsupportedSafi() {
+        final byte[] capaBytes = {
+            //header
+            (byte) 0x47, (byte) 0x15,
+            // Ipv4 Unicast, afiFlags = false, timer = 10
+            (byte) 0x00, (byte) 0x01, (byte) 0x01,
+            (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a,
+            // Unsupported safi, afiFlags = true, timer = 160
+            (byte) 0x00, (byte) 0x01, (byte) 0x85,
+            (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0,
+            //Ipv6  Unicast afiFlags = false, timer = 160
+            (byte) 0x00, (byte) 0x02, (byte) 0x01,
+            (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0
+        };
+
+        final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
+                .setTables(Arrays.asList(new TablesBuilder()
+                        .setAfi(Ipv4AddressFamily.class)
+                        .setSafi(UnicastSubsequentAddressFamily.class)
+                        .setAfiFlags(new Tables.AfiFlags(false))
+                        .setLongLivedStaleTime(10L)
+                        .build(),
+                        new TablesBuilder()
+                                .setAfi(Ipv6AddressFamily.class)
+                                .setSafi(UnicastSubsequentAddressFamily.class)
+                                .setAfiFlags(new Tables.AfiFlags(true))
+                                .setLongLivedStaleTime(160L)
+                                .build())).build();
+
+        final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
+                new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
+        LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
+                afir, safir);
+        Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
+                .slice(2, capaBytes.length - 2)));
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void testMinStaleTime() {
         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()