BUG-5548: Wrong NH handler picked up 53/39353/1
authorIveta Halanova <ihalanov@cisco.com>
Mon, 21 Mar 2016 08:21:04 +0000 (09:21 +0100)
committerMilos Fabian <milfabia@cisco.com>
Tue, 24 May 2016 13:34:40 +0000 (13:34 +0000)
Adjusted NH handlers map to hold also afi/safi information
so IPv4 NH handler is not overwritten by VPN IPv4 NH handler.

Change-Id: If076355d5200bc161d23b261cbf6e2049453ccb1
Signed-off-by: Iveta Halanova <ihalanov@cisco.com>
(cherry picked from commit f6e5452c06a51c50efb59c9ae59560c6a8eb3596)

bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java

index bb7e046ca48b180da8a74b267091c6c42af0c283..31d87102b2279d5865a3c138a2a1b195a91134ab 100644 (file)
@@ -11,6 +11,8 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
+import java.util.AbstractMap;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import org.opendaylight.bgp.concepts.NextHopUtil;
@@ -44,7 +46,7 @@ final class SimpleNlriRegistry implements NlriRegistry {
     private final ConcurrentMap<BgpTableType, NlriParser> handlers = new ConcurrentHashMap<>();
     private final ConcurrentMap<Class<? extends DataObject>, NlriSerializer> serializers = new ConcurrentHashMap<>();
     private final ConcurrentMap<BgpTableType, NextHopParserSerializer> nextHopParsers = new ConcurrentHashMap<>();
-    private final ConcurrentMap<Class<? extends CNextHop>, NextHopParserSerializer> nextHopSerializers = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Map.Entry<Class<? extends CNextHop>, BgpTableType>, NextHopParserSerializer> nextHopSerializers = new ConcurrentHashMap<>();
     private final SubsequentAddressFamilyRegistry safiReg;
     private final AddressFamilyRegistry afiReg;
 
@@ -54,7 +56,7 @@ final class SimpleNlriRegistry implements NlriRegistry {
     }
 
     private static BgpTableType createKey(final Class<? extends AddressFamily> afi,
-            final Class<? extends SubsequentAddressFamily> safi) {
+        final Class<? extends SubsequentAddressFamily> safi) {
         Preconditions.checkNotNull(afi);
         Preconditions.checkNotNull(safi);
         return new BgpTableTypeImpl(afi, safi);
@@ -79,9 +81,9 @@ final class SimpleNlriRegistry implements NlriRegistry {
     }
 
     synchronized AutoCloseable registerNlriParser(final Class<? extends AddressFamily> afi,
-                                                         final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser,
-                                                         final NextHopParserSerializer nextHopSerializer, final Class<? extends CNextHop> cNextHopClass,
-                                                         final Class<? extends CNextHop>... cNextHopClassList) {
+        final Class<? extends SubsequentAddressFamily> safi, final NlriParser parser,
+        final NextHopParserSerializer nextHopSerializer, final Class<? extends CNextHop> cNextHopClass,
+        final Class<? extends CNextHop>... cNextHopClassList) {
         final BgpTableType key = createKey(afi, safi);
         final NlriParser prev = this.handlers.get(key);
         Preconditions.checkState(prev == null, "AFI/SAFI is already bound to parser " + prev);
@@ -90,9 +92,11 @@ final class SimpleNlriRegistry implements NlriRegistry {
         this.nextHopParsers.put(key,nextHopSerializer);
 
         if (cNextHopClass != null) {
-            this.nextHopSerializers.put(cNextHopClass, nextHopSerializer);
-            for (Class<? extends CNextHop> cNextHop : cNextHopClassList) {
-                this.nextHopSerializers.put(cNextHop, nextHopSerializer);
+            final Map.Entry<Class<? extends CNextHop>, BgpTableType> nhKey = new AbstractMap.SimpleEntry(cNextHopClass, key);
+            this.nextHopSerializers.put(nhKey, nextHopSerializer);
+            for (final Class<? extends CNextHop> cNextHop : cNextHopClassList) {
+                final Map.Entry<Class<? extends CNextHop>, BgpTableType> nhKeys = new AbstractMap.SimpleEntry(cNextHop, key);
+                this.nextHopSerializers.put(nhKeys, nextHopSerializer);
             }
         }
 
@@ -105,7 +109,7 @@ final class SimpleNlriRegistry implements NlriRegistry {
                     SimpleNlriRegistry.this.nextHopParsers.remove(key);
                     if (cNextHopClass != null) {
                         SimpleNlriRegistry.this.nextHopSerializers.remove(cNextHopClass);
-                        for (Class<? extends CNextHop> cNextHop : cNextHopClassList) {
+                        for (final Class<? extends CNextHop> cNextHop : cNextHopClassList) {
                             SimpleNlriRegistry.this.nextHopSerializers.remove(cNextHop);
                         }
                     }
@@ -153,7 +157,9 @@ final class SimpleNlriRegistry implements NlriRegistry {
 
         final CNextHop cNextHop = mpReachNlri.getCNextHop();
         if (cNextHop != null) {
-            final NextHopParserSerializer nextHopSerializer = this.nextHopSerializers.get(cNextHop.getImplementedInterface());
+            final Map.Entry<Class<? extends CNextHop>, BgpTableType> key = new AbstractMap.SimpleEntry(cNextHop.getImplementedInterface(),
+                new BgpTableTypeImpl(afi, safi));
+            final NextHopParserSerializer nextHopSerializer = this.nextHopSerializers.get(key);
             final ByteBuf nextHopBuffer = Unpooled.buffer();
             if (nextHopSerializer == null) {
                 //TODO Remove once deprecated registerNlriParser is removed