X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvnet%2Finterface.c;h=1370d048b0bed348564f09cb78bcb3f146cf9b83;hb=4729b1ec83855268adcea3e00a3462c06a631075;hp=24f216f63b9adbc4ac42e0fc5030925dbdc3cdea;hpb=153646e89c3be70c68348bdd497f8edd2b212a9c;p=vpp.git diff --git a/src/vnet/interface.c b/src/vnet/interface.c index 24f216f63b9..1370d048b0b 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -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; @@ -699,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); @@ -743,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; @@ -755,17 +762,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 +796,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 +914,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);