vlib: make runtime_data handling thread-local
[vpp.git] / src / vnet / interface.c
index 45417b2..e9042ae 100644 (file)
@@ -482,6 +482,13 @@ vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index,
          vnet_device_class_t *dev_class =
            vnet_get_device_class (vnm, hi->dev_class_index);
 
+         if ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) &&
+             (si->flags & VNET_SW_INTERFACE_FLAG_ERROR))
+           {
+             error = clib_error_return (0, "Interface in the error state");
+             goto done;
+           }
+
          /* save the si admin up flag */
          old_flags = si->flags;
 
@@ -743,7 +750,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;
 
@@ -755,17 +761,23 @@ 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. */
@@ -783,7 +795,6 @@ vnet_register_interface (vnet_main_t * vnm,
       nrt = vlib_node_get_runtime (vm, hw->tx_node_index);
       nrt->function = node->function;
 
-      vlib_worker_thread_node_runtime_update ();
       _vec_len (im->deleted_hw_interface_nodes) -= 1;
     }
   else
@@ -902,11 +913,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);
@@ -919,6 +936,8 @@ vnet_delete_hw_interface (vnet_main_t * vnm, u32 hw_if_index)
 
   hash_unset_mem (im->hw_interface_by_name, hw->name);
   vec_free (hw->name);
+  vec_free (hw->input_node_thread_index_by_queue);
+  vec_free (hw->dq_runtime_index_by_queue);
 
   pool_put (im->hw_interfaces, hw);
 }