default update adjacency function deos not return multicast adjacency 07/8007/4
authorNeale Ranns <nranns@cisco.com>
Sat, 12 Aug 2017 19:52:54 +0000 (12:52 -0700)
committerNeale Ranns <nranns@cisco.com>
Sun, 13 Aug 2017 09:08:38 +0000 (09:08 +0000)
by not returning a multicast adjacency type when requested, but instead returning a nbr type, the mcast adj was never correctly deleted. hence when reused the adjacency object was not realocated from the pool and when it was freed a second time a crash occured.

Change-Id: Ia74ae3e889db0dfba8ec3c6a0cccfef215587ff6
Signed-off-by: Neale Ranns <nranns@cisco.com>
src/vnet/interface.c

index 721259a..159ce8c 100644 (file)
@@ -41,6 +41,7 @@
 #include <vnet/plugin/plugin.h>
 #include <vnet/fib/ip6_fib.h>
 #include <vnet/adj/adj.h>
+#include <vnet/adj/adj_mcast.h>
 
 #define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0)
 #define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1)
@@ -1411,16 +1412,49 @@ default_build_rewrite (vnet_main_t * vnm,
 void
 default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai)
 {
-  u8 *rewrite;
+  ip_adjacency_t *adj;
 
-  rewrite = vnet_build_rewrite_for_sw_interface (vnm, sw_if_index,
-                                                adj_get_link_type (ai),
-                                                NULL);
+  adj = adj_get (ai);
 
-  adj_nbr_update_rewrite (ai, ADJ_NBR_REWRITE_FLAG_COMPLETE, rewrite);
+  switch (adj->lookup_next_index)
+    {
+    case IP_LOOKUP_NEXT_ARP:
+    case IP_LOOKUP_NEXT_GLEAN:
+      /*
+       * default rewirte in neighbour adj
+       */
+      adj_nbr_update_rewrite
+       (ai,
+        ADJ_NBR_REWRITE_FLAG_COMPLETE,
+        vnet_build_rewrite_for_sw_interface (vnm,
+                                             sw_if_index,
+                                             adj_get_link_type (ai), NULL));
+      break;
+    case IP_LOOKUP_NEXT_MCAST:
+      /*
+       * mcast traffic also uses default rewrite string with no mcast
+       * switch time updates.
+       */
+      adj_mcast_update_rewrite
+       (ai,
+        vnet_build_rewrite_for_sw_interface (vnm,
+                                             sw_if_index,
+                                             adj_get_link_type (ai),
+                                             NULL), 0, 0);
+      break;
+    case IP_LOOKUP_NEXT_DROP:
+    case IP_LOOKUP_NEXT_PUNT:
+    case IP_LOOKUP_NEXT_LOCAL:
+    case IP_LOOKUP_NEXT_REWRITE:
+    case IP_LOOKUP_NEXT_MCAST_MIDCHAIN:
+    case IP_LOOKUP_NEXT_MIDCHAIN:
+    case IP_LOOKUP_NEXT_ICMP_ERROR:
+    case IP_LOOKUP_N_NEXT:
+      ASSERT (0);
+      break;
+    }
 }
 
-
 /*
  * fd.io coding-style-patch-verification: ON
  *