Fix interface reuse when running multithreaded
[vpp.git] / src / vnet / interface.c
index e9042ae..dad1f31 100644 (file)
@@ -706,6 +706,7 @@ vnet_register_interface (vnet_main_t * vnm,
 
   hw_index = hw - im->hw_interfaces;
   hw->hw_if_index = hw_index;
+  hw->default_rx_mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
 
   if (dev_class->format_device_name)
     hw->name = format (0, "%U", dev_class->format_device_name, dev_instance);
@@ -782,18 +783,24 @@ vnet_register_interface (vnet_main_t * vnm,
       /* The new class may differ from the old one.
        * Functions have to be updated. */
       node = vlib_get_node (vm, hw->output_node_index);
-      node->function = dev_class->flatten_output_chains ?
-       vnet_interface_output_node_flatten_multiarch_select () :
-       vnet_interface_output_node_multiarch_select ();
+      node->function = vnet_interface_output_node_multiarch_select ();
       node->format_trace = format_vnet_interface_output_trace;
-      nrt = vlib_node_get_runtime (vm, hw->output_node_index);
-      nrt->function = node->function;
+      /* *INDENT-OFF* */
+      foreach_vlib_main ({
+        nrt = vlib_node_get_runtime (this_vlib_main, hw->output_node_index);
+        nrt->function = node->function;
+      });
+      /* *INDENT-ON* */
 
       node = vlib_get_node (vm, hw->tx_node_index);
       node->function = dev_class->tx_function;
       node->format_trace = dev_class->format_tx_trace;
-      nrt = vlib_node_get_runtime (vm, hw->tx_node_index);
-      nrt->function = node->function;
+      /* *INDENT-OFF* */
+      foreach_vlib_main ({
+        nrt = vlib_node_get_runtime (this_vlib_main, hw->tx_node_index);
+        nrt->function = node->function;
+      });
+      /* *INDENT-ON* */
 
       _vec_len (im->deleted_hw_interface_nodes) -= 1;
     }
@@ -826,9 +833,7 @@ vnet_register_interface (vnet_main_t * vnm,
 
       r.flags = 0;
       r.name = output_node_name;
-      r.function = dev_class->flatten_output_chains ?
-       vnet_interface_output_node_flatten_multiarch_select () :
-       vnet_interface_output_node_multiarch_select ();
+      r.function = vnet_interface_output_node_multiarch_select ();
       r.format_trace = format_vnet_interface_output_trace;
 
       {