Fix buffer read for unsupported LLGR Safi 96/87196/1
authorVikram Singh Kalakoti <vikramskalakoti@gmail.com>
Tue, 28 Jan 2020 15:40:52 +0000 (21:10 +0530)
committerVikram Singh Kalakoti <vikramskalakoti@gmail.com>
Tue, 28 Jan 2020 15:40:52 +0000 (21:10 +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: Ib4479f75d70631fff92b8af62f6bd20486a66c2a

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 098d940e966ff9fc1527333af509597b09aba4e7..24ca462fd9de72cc67cff980f24bc36b3cc1dd77 100644 (file)
@@ -76,7 +76,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 2b2b2ae3ffd10e62fa9ce5b42aa6ba5fdc86aa32..99c040d4aaad6c61680583227023c198deabf77c 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;
@@ -39,8 +44,21 @@ 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());
@@ -101,6 +119,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(Boolean.FALSE))
+                                .setLongLivedStaleTime(TEN)
+                                .build(),
+                        new TablesBuilder()
+                                .setAfi(Ipv6AddressFamily.class)
+                                .setSafi(UnicastSubsequentAddressFamily.class)
+                                .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
+                                .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
+                                .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()
@@ -116,4 +171,42 @@ public class LlGracefulCapabilityHandlerTest {
         final ByteBuf buffer = Unpooled.buffer();
         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(Boolean.FALSE))
+                                .setLongLivedStaleTime(TEN)
+                                .build(),
+                        new TablesBuilder()
+                                .setAfi(Ipv6AddressFamily.class)
+                                .setSafi(UnicastSubsequentAddressFamily.class)
+                                .setAfiFlags(new Tables.AfiFlags(Boolean.TRUE))
+                                .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
+                                .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)));
+    }
 }