Clean up the L2 interface configs when creating the interfaces 43/5543/2
authorAndrew Yourtchenko <ayourtch@gmail.com>
Mon, 27 Feb 2017 20:00:02 +0000 (21:00 +0100)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Mon, 27 Feb 2017 20:06:20 +0000 (21:06 +0100)
Without the cleanup in the L2 input/output configs,
the creation of an interface with sw_if_index belonging
to a previously deleted interface will use the stale
vlan tag push-pop configuration from that interface,
resulting in loss of connectivity when the host receives
tagged packets but expects untagged ones.

Change-Id: Ic186390ef3a41277f57847ed2962848b98379092
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
vnet/vnet/interface.c

index 78610ed..0ed4cf6 100644 (file)
@@ -41,6 +41,7 @@
 #include <vnet/plugin/plugin.h>
 #include <vnet/fib/ip6_fib.h>
 #include <vnet/adj/adj.h>
+#include <vnet/l2/l2_output.h>
 
 #define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0)
 #define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1)
@@ -582,6 +583,15 @@ vnet_create_sw_interface_no_callbacks (vnet_main_t * vnm,
 
     vnet_interface_counter_unlock (im);
   }
+  /* Wipe any stale l2 input config data. */
+  if (sw_if_index < vec_len (l2input_main.configs))
+    memset (vec_elt_at_index (l2input_main.configs, sw_if_index),
+           0, sizeof (l2_input_config_t));
+
+  /* Wipe any stale l2 output config data. */
+  if (sw_if_index < vec_len (l2output_main.configs))
+    memset (vec_elt_at_index (l2output_main.configs, sw_if_index),
+           0, sizeof (l2_output_config_t));
 
   return sw_if_index;
 }