X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.c;h=159ce8c64942194c82c59d774b74afcf5a787bed;hb=c87c91d8b0e85997debaf575f2e30cc2702edf25;hp=78610ed460bd3911d3abfce662187e06e73e1ca2;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/interface.c b/src/vnet/interface.c index 78610ed460b..159ce8c6494 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -41,6 +41,7 @@ #include #include #include +#include #define VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE (1 << 0) #define VNET_INTERFACE_SET_FLAGS_HELPER_WANT_REDISTRIBUTE (1 << 1) @@ -482,6 +483,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; @@ -631,15 +639,18 @@ vnet_delete_sw_interface (vnet_main_t * vnm, u32 sw_if_index) vnet_sw_interface_t *sw = pool_elt_at_index (im->sw_interfaces, sw_if_index); - /* Make sure the interface is in L3 mode (removed from L2 BD or XConnect) */ + /* Check if the interface has config and is removed from L2 BD or XConnect */ vlib_main_t *vm = vlib_get_main (); l2_input_config_t *config; - config = vec_elt_at_index (l2input_main.configs, sw_if_index); - if (config->xconnect) - set_int_l2_mode (vm, vnm, MODE_L3, config->output_sw_if_index, 0, 0, 0, - 0); - if (config->xconnect || config->bridge) - set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0, 0, 0, 0); + if (sw_if_index < vec_len (l2input_main.configs)) + { + config = vec_elt_at_index (l2input_main.configs, sw_if_index); + if (config->xconnect) + set_int_l2_mode (vm, vnm, MODE_L3, config->output_sw_if_index, 0, 0, + 0, 0); + if (config->xconnect || config->bridge) + set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0, 0, 0, 0); + } /* Bring down interface in case it is up. */ if (sw->flags != 0) @@ -696,6 +707,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); @@ -740,7 +752,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; @@ -752,35 +763,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 (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 (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->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 @@ -812,9 +834,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; { @@ -899,11 +919,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); @@ -916,6 +942,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); } @@ -1124,6 +1152,10 @@ vnet_hw_interface_compare (vnet_main_t * vnm, int vnet_sw_interface_is_p2p (vnet_main_t * vnm, u32 sw_if_index) { + vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); + if (si->type == VNET_SW_INTERFACE_TYPE_P2P) + return 1; + vnet_hw_interface_t *hw = vnet_get_sup_hw_interface (vnm, sw_if_index); vnet_hw_interface_class_t *hc = vnet_get_hw_interface_class (vnm, hw->hw_class_index); @@ -1357,10 +1389,11 @@ vnet_link_to_l3_proto (vnet_link_t link) case VNET_LINK_IP6: return (VNET_L3_PACKET_TYPE_IP6); case VNET_LINK_MPLS: - return (VNET_L3_PACKET_TYPE_MPLS_UNICAST); + return (VNET_L3_PACKET_TYPE_MPLS); case VNET_LINK_ARP: return (VNET_L3_PACKET_TYPE_ARP); case VNET_LINK_ETHERNET: + case VNET_LINK_NSH: ASSERT (0); break; } @@ -1379,16 +1412,49 @@ default_build_rewrite (vnet_main_t * vnm, void default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) { - u8 *rewrite; + ip_adjacency_t *adj; - rewrite = vnet_build_rewrite_for_sw_interface (vnm, sw_if_index, - adj_get_link_type (ai), - NULL); + adj = adj_get (ai); - adj_nbr_update_rewrite (ai, ADJ_NBR_REWRITE_FLAG_COMPLETE, rewrite); + switch (adj->lookup_next_index) + { + case IP_LOOKUP_NEXT_ARP: + case IP_LOOKUP_NEXT_GLEAN: + /* + * default rewirte in neighbour adj + */ + adj_nbr_update_rewrite + (ai, + ADJ_NBR_REWRITE_FLAG_COMPLETE, + vnet_build_rewrite_for_sw_interface (vnm, + sw_if_index, + adj_get_link_type (ai), NULL)); + break; + case IP_LOOKUP_NEXT_MCAST: + /* + * mcast traffic also uses default rewrite string with no mcast + * switch time updates. + */ + adj_mcast_update_rewrite + (ai, + vnet_build_rewrite_for_sw_interface (vnm, + sw_if_index, + adj_get_link_type (ai), + NULL), 0, 0); + break; + case IP_LOOKUP_NEXT_DROP: + case IP_LOOKUP_NEXT_PUNT: + case IP_LOOKUP_NEXT_LOCAL: + case IP_LOOKUP_NEXT_REWRITE: + case IP_LOOKUP_NEXT_MCAST_MIDCHAIN: + case IP_LOOKUP_NEXT_MIDCHAIN: + case IP_LOOKUP_NEXT_ICMP_ERROR: + case IP_LOOKUP_N_NEXT: + ASSERT (0); + break; + } } - /* * fd.io coding-style-patch-verification: ON *