X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface.c;h=5cbbbf96055ba5e71c837961c902adf48eea6c84;hb=b474380f;hp=a9346a2b072c0cf1a492fb16c4796bb19f1d61e4;hpb=17ff3c1fa5687255a118c53223fa2cd49132d929;p=vpp.git diff --git a/src/vnet/interface.c b/src/vnet/interface.c index a9346a2b072..5cbbbf96055 100644 --- a/src/vnet/interface.c +++ b/src/vnet/interface.c @@ -42,6 +42,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) @@ -424,7 +425,7 @@ vnet_sw_interface_set_flags_helper (vnet_main_t * vnm, u32 sw_if_index, } } - /* Donot change state for slave link of bonded interfaces */ + /* Do not change state for slave link of bonded interfaces */ if (si->flags & VNET_SW_INTERFACE_FLAG_BOND_SLAVE) { error = clib_error_return @@ -649,10 +650,11 @@ vnet_delete_sw_interface (vnet_main_t * vnm, u32 sw_if_index) { 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); + set_int_l2_mode (vm, vnm, MODE_L3, config->output_sw_if_index, 0, + L2_BD_PORT_TYPE_NORMAL, 0, 0); if (config->xconnect || config->bridge) - set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0, 0, 0, 0); + set_int_l2_mode (vm, vnm, MODE_L3, sw_if_index, 0, + L2_BD_PORT_TYPE_NORMAL, 0, 0); } vnet_clear_sw_interface_tag (vnm, sw_if_index); @@ -705,6 +707,22 @@ vnet_sw_interface_set_protocol_mtu (vnet_main_t * vnm, u32 sw_if_index, call_sw_interface_mtu_change_callbacks (vnm, sw_if_index); } +void +vnet_sw_interface_ip_directed_broadcast (vnet_main_t * vnm, + u32 sw_if_index, u8 enable) +{ + vnet_sw_interface_t *si; + + si = vnet_get_sw_interface (vnm, sw_if_index); + + if (enable) + si->flags |= VNET_SW_INTERFACE_FLAG_DIRECTED_BCAST; + else + si->flags &= ~VNET_SW_INTERFACE_FLAG_DIRECTED_BCAST; + + ip4_directed_broadcast (sw_if_index, enable); +} + /* * Reflect a change in hardware MTU on protocol MTUs */ @@ -1343,6 +1361,27 @@ vnet_interface_init (vlib_main_t * vm) { c->index = vec_len (im->device_classes); hash_set_mem (im->device_class_by_name, c->name, c->index); + + if (c->tx_fn_registrations) + { + vlib_node_fn_registration_t *fnr = c->tx_fn_registrations; + int priority = -1; + + /* to avoid confusion, please remove ".tx_function" statement + from VNET_DEVICE_CLASS() if using function candidates */ + ASSERT (c->tx_function == 0); + + while (fnr) + { + if (fnr->priority > priority) + { + priority = fnr->priority; + c->tx_function = fnr->function; + } + fnr = fnr->next_registration; + } + } + vec_add1 (im->device_classes, c[0]); c = c->next_class_registration; } @@ -1464,12 +1503,14 @@ vnet_hw_interface_change_mac_address_helper (vnet_main_t * vnm, if (hi->hw_address) { + u8 *old_address = vec_dup (hi->hw_address); vnet_device_class_t *dev_class = vnet_get_device_class (vnm, hi->dev_class_index); if (dev_class->mac_addr_change_function) { error = - dev_class->mac_addr_change_function (hi, (char *) mac_address); + dev_class->mac_addr_change_function (hi, old_address, + mac_address); } if (!error) { @@ -1478,7 +1519,7 @@ vnet_hw_interface_change_mac_address_helper (vnet_main_t * vnm, hw_class = vnet_get_hw_interface_class (vnm, hi->hw_class_index); if (NULL != hw_class->mac_addr_change_function) - hw_class->mac_addr_change_function (hi, (char *) mac_address); + hw_class->mac_addr_change_function (hi, old_address, mac_address); } else { @@ -1486,6 +1527,7 @@ vnet_hw_interface_change_mac_address_helper (vnet_main_t * vnm, clib_error_return (0, "MAC Address Change is not supported on this interface"); } + vec_free (old_address); } else { @@ -1609,8 +1651,9 @@ default_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) adj_glean_update_rewrite (ai); break; case IP_LOOKUP_NEXT_ARP: + case IP_LOOKUP_NEXT_BCAST: /* - * default rewirte in neighbour adj + * default rewrite in neighbour adj */ adj_nbr_update_rewrite (ai,