X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.c;h=d3ad896be12564109bbc0e346d80f41899b07900;hb=fd542f1085d3a06066168c2d38e7f328b5b26ee3;hp=28c46110851aeaea9e5ba361cf016bbe6883f2b5;hpb=70083ee74c3141bbefb185525315f1b34497dcaa;p=vpp.git diff --git a/src/vnet/interface.c b/src/vnet/interface.c index 28c46110851..d3ad896be12 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -122,55 +122,20 @@ unserialize_vnet_sw_interface_set_flags (serialize_main_t * m, va_list * va) /* helper_flags no redistribution */ 0); } -static void -vnet_sw_interface_set_mtu_cb (vnet_main_t * vnm, u32 sw_if_index, void *ctx) -{ - u32 *mtu = ctx; - vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); - ASSERT (si); - - si->max_l3_packet_bytes[VLIB_TX] = si->max_l3_packet_bytes[VLIB_RX] = *mtu; - adj_mtu_update (sw_if_index); -} - -/* - * MTU is set per software interface. Setting MTU on a parent - * interface will override the MTU setting on sub-interfaces. - * TODO: If sub-interface MTU is ~0 inherit from parent? - */ -int -vnet_sw_interface_set_mtu (vnet_main_t * vnm, u32 sw_if_index, u32 mtu) +void +vnet_hw_interface_set_mtu (vnet_main_t * vnm, u32 hw_if_index, u32 mtu) { - vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); - vnet_hw_interface_t *hi = vnet_get_sw_hw_interface (vnm, sw_if_index); - - if (mtu < hi->min_packet_bytes) - return VNET_API_ERROR_INVALID_VALUE; - if (mtu > hi->max_packet_bytes) - return VNET_API_ERROR_INVALID_VALUE; + vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index); - /* If done on a parent interface */ - if (si->sw_if_index == si->sup_sw_if_index) + if (hi->max_packet_bytes != mtu) { - if (hi->hw_class_index == ethernet_hw_interface_class.index) - { - ethernet_set_flags (vnm, hi->hw_if_index, - ETHERNET_INTERFACE_FLAG_MTU); - } - - /* Override MTU on any sub-interface */ - vnet_hw_interface_walk_sw (vnm, - hi->hw_if_index, - vnet_sw_interface_set_mtu_cb, &mtu); + u16 l3_pad = hi->max_packet_bytes - hi->max_l3_packet_bytes[VLIB_TX]; + hi->max_packet_bytes = mtu; + hi->max_l3_packet_bytes[VLIB_TX] = + hi->max_l3_packet_bytes[VLIB_RX] = mtu - l3_pad; + ethernet_set_flags (vnm, hw_if_index, ETHERNET_INTERFACE_FLAG_MTU); + adj_mtu_update (hw_if_index); } - else - { - si->max_l3_packet_bytes[VLIB_TX] = si->max_l3_packet_bytes[VLIB_RX] = - mtu; - adj_mtu_update (sw_if_index); - } - - return 0; } static void @@ -619,9 +584,6 @@ vnet_create_sw_interface_no_callbacks (vnet_main_t * vnm, if (sw->type == VNET_SW_INTERFACE_TYPE_HARDWARE) sw->sup_sw_if_index = sw->sw_if_index; - sw->max_l3_packet_bytes[VLIB_RX] = ~0; - sw->max_l3_packet_bytes[VLIB_TX] = ~0; - /* Allocate counters for this interface. */ { u32 i; @@ -755,7 +717,7 @@ vnet_register_interface (vnet_main_t * vnm, vnet_feature_config_main_t *fcm; vnet_config_main_t *cm; u32 hw_index, i; - char *tx_node_name, *output_node_name; + char *tx_node_name = NULL, *output_node_name = NULL; pool_get (im->hw_interfaces, hw); memset (hw, 0, sizeof (*hw)); @@ -796,7 +758,9 @@ vnet_register_interface (vnet_main_t * vnm, hw->max_rate_bits_per_sec = 0; hw->min_packet_bytes = 0; - hw->max_packet_bytes = 9000; /* default */ + hw->per_packet_overhead_bytes = 0; + hw->max_l3_packet_bytes[VLIB_RX] = ~0; + hw->max_l3_packet_bytes[VLIB_TX] = ~0; if (dev_class->tx_function == 0) goto no_output_nodes; /* No output/tx nodes to create */ @@ -943,6 +907,8 @@ no_output_nodes: VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE); vnet_hw_interface_set_flags_helper (vnm, hw_index, /* flags */ 0, VNET_INTERFACE_SET_FLAGS_HELPER_IS_CREATE); + vec_free (tx_node_name); + vec_free (output_node_name); return hw_index; } @@ -1009,6 +975,7 @@ 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->hw_address); vec_free (hw->input_node_thread_index_by_queue); vec_free (hw->dq_runtime_index_by_queue); @@ -1570,7 +1537,7 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) vnet_build_rewrite_for_sw_interface (vnm, sw_if_index, adj_get_link_type (ai), - NULL), 0, 0); + NULL), 0); break; case IP_LOOKUP_NEXT_DROP: case IP_LOOKUP_NEXT_PUNT: