Fix interface reuse when running multithreaded
[vpp.git] / src / vnet / interface.c
index 41e2186..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);
@@ -750,7 +751,6 @@ vnet_register_interface (vnet_main_t * vnm,
   if (vec_len (im->deleted_hw_interface_nodes) > 0)
     {
       vnet_hw_interface_nodes_t *hn;
-      vnet_interface_output_runtime_t *rt;
       vlib_node_t *node;
       vlib_node_runtime_t *nrt;
 
@@ -762,35 +762,46 @@ vnet_register_interface (vnet_main_t * vnm,
       vlib_node_rename (vm, hw->tx_node_index, "%v", tx_node_name);
       vlib_node_rename (vm, hw->output_node_index, "%v", output_node_name);
 
-      rt = vlib_node_get_runtime_data (vm, hw->output_node_index);
-      ASSERT (rt->is_deleted == 1);
-      rt->is_deleted = 0;
-      rt->hw_if_index = hw_index;
-      rt->sw_if_index = hw->sw_if_index;
-      rt->dev_instance = hw->dev_instance;
+      /* *INDENT-OFF* */
+      foreach_vlib_main ({
+        vnet_interface_output_runtime_t *rt;
 
-      rt = vlib_node_get_runtime_data (vm, hw->tx_node_index);
-      rt->hw_if_index = hw_index;
-      rt->sw_if_index = hw->sw_if_index;
-      rt->dev_instance = hw->dev_instance;
+       rt = vlib_node_get_runtime_data (this_vlib_main, hw->output_node_index);
+       ASSERT (rt->is_deleted == 1);
+       rt->is_deleted = 0;
+       rt->hw_if_index = hw_index;
+       rt->sw_if_index = hw->sw_if_index;
+       rt->dev_instance = hw->dev_instance;
+
+       rt = vlib_node_get_runtime_data (this_vlib_main, hw->tx_node_index);
+       rt->hw_if_index = hw_index;
+       rt->sw_if_index = hw->sw_if_index;
+       rt->dev_instance = hw->dev_instance;
+      });
+      /* *INDENT-ON* */
 
       /* 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* */
 
-      vlib_worker_thread_node_runtime_update ();
       _vec_len (im->deleted_hw_interface_nodes) -= 1;
     }
   else
@@ -822,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;
 
       {
@@ -909,11 +918,17 @@ vnet_delete_hw_interface (vnet_main_t * vnm, u32 hw_if_index)
 
   {
     vnet_hw_interface_nodes_t *dn;
-    vnet_interface_output_runtime_t *rt =
-      vlib_node_get_runtime_data (vm, hw->output_node_index);
 
-    /* Mark node runtime as deleted so output node (if called) will drop packets. */
-    rt->is_deleted = 1;
+    /* *INDENT-OFF* */
+    foreach_vlib_main ({
+      vnet_interface_output_runtime_t *rt =
+        vlib_node_get_runtime_data (this_vlib_main, hw->output_node_index);
+
+      /* Mark node runtime as deleted so output node (if called)
+       * will drop packets. */
+      rt->is_deleted = 1;
+    });
+    /* *INDENT-ON* */
 
     vlib_node_rename (vm, hw->output_node_index,
                      "interface-%d-output-deleted", hw_if_index);