As interface is set to L3 mode, reset its output_node_index for l2-output 49/2049/2
authorJohn Lo <loj@cisco.com>
Thu, 21 Jul 2016 18:54:05 +0000 (14:54 -0400)
committerDave Barach <openvpp@barachs.net>
Thu, 21 Jul 2016 20:08:40 +0000 (20:08 +0000)
As an interface is changed from L2 bridging/xconenct to L3 mode, reset the
output_node_index for l2-output for the interface's sw_if_index. The reset
needs to be done in case the sw_if_index of this interface is freed and
reused for another interface type afterwards. Otherwise, the stale output
node may be used by l2-output for this sw_if_index and result in undesirable
behavior including the possibility of VPP crash.

Change-Id: Idd91d288c7643f0a1975a6787fcc330d03a7fac7
Signed-off-by: John Lo <loj@cisco.com>
vnet/vnet/l2/l2_input.c

index dd3a8b7..532caf9 100644 (file)
@@ -518,6 +518,7 @@ u32 set_int_l2_mode (vlib_main_t * vm,
                      u32 xc_sw_if_index) // peer interface for xconnect
 {
   l2input_main_t * mp = &l2input_main;
+  l2output_main_t * l2om = &l2output_main;
   vnet_main_t * vnm = vnet_get_main();
   vnet_hw_interface_t * hi;
   l2_output_config_t * out_config;
@@ -567,6 +568,12 @@ u32 set_int_l2_mode (vlib_main_t * vm,
     config->shg = 0;
     config->bd_index = 0;
     config->feature_bitmap = L2INPUT_FEAT_DROP;
+    // Directs the l2 output path to work out the interface
+    // output next-arc itself. Needed when recycling a sw_if_index.
+    vec_validate_init_empty(l2om->next_nodes.output_node_index_vec, 
+                           sw_if_index, ~0);
+    l2om->next_nodes.output_node_index_vec[sw_if_index] = ~0;
+
   } else if (mode == MODE_L2_CLASSIFY) {
       config->xconnect = 1;
       config->bridge = 0;