X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_api.c;h=0b4fa81a767e38e46b9401826c878aedef95529e;hb=f15866146adcf3273da6f29f05d42193c7af4b07;hp=bfd2af31a58253c915b284a4d705a8a46e2fb21c;hpb=358425b86cb231efd2330e5aeb077cad38c2efad;p=vpp.git diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index bfd2af31a58..0b4fa81a767 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -46,6 +46,7 @@ #undef vl_printfun #include +vpe_api_main_t vpe_api_main; #define foreach_vpe_api_msg \ _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ @@ -133,14 +134,10 @@ send_sw_interface_details (vpe_api_main_t * am, vnet_sw_interface_t * swif, u8 * interface_name, u32 context) { - vl_api_sw_interface_details_t *mp; - vnet_main_t *vnm = vnet_get_main (); - vnet_hw_interface_t *hi; - u8 *tag; - - hi = vnet_get_sup_hw_interface (am->vnet_main, swif->sw_if_index); + vnet_hw_interface_t *hi = + vnet_get_sup_hw_interface (am->vnet_main, swif->sw_if_index); - mp = vl_msg_api_alloc (sizeof (*mp)); + vl_api_sw_interface_details_t *mp = vl_msg_api_alloc (sizeof (*mp)); memset (mp, 0, sizeof (*mp)); mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_DETAILS); mp->sw_if_index = ntohl (swif->sw_if_index); @@ -205,26 +202,26 @@ send_sw_interface_details (vpe_api_main_t * am, } /* pbb tag rewrite data */ + ethernet_header_t eth_hdr; u32 vtr_op = L2_VTR_DISABLED; u16 outer_tag = 0; - u8 b_dmac[6]; - u8 b_smac[6]; u16 b_vlanid = 0; u32 i_sid = 0; - memset (b_dmac, 0, sizeof (b_dmac)); - memset (b_smac, 0, sizeof (b_smac)); + memset (ð_hdr, 0, sizeof (eth_hdr)); if (!l2pbb_get (am->vlib_main, am->vnet_main, swif->sw_if_index, - &vtr_op, &outer_tag, b_dmac, b_smac, &b_vlanid, &i_sid)) + &vtr_op, &outer_tag, ð_hdr, &b_vlanid, &i_sid)) { mp->sub_dot1ah = 1; - clib_memcpy (mp->b_dmac, b_dmac, sizeof (b_dmac)); - clib_memcpy (mp->b_smac, b_smac, sizeof (b_smac)); + clib_memcpy (mp->b_dmac, eth_hdr.dst_address, + sizeof (eth_hdr.dst_address)); + clib_memcpy (mp->b_smac, eth_hdr.src_address, + sizeof (eth_hdr.src_address)); mp->b_vlanid = b_vlanid; mp->i_sid = i_sid; } - tag = vnet_get_sw_interface_tag (vnm, swif->sw_if_index); + u8 *tag = vnet_get_sw_interface_tag (vnet_get_main (), swif->sw_if_index); if (tag) strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1); @@ -237,39 +234,38 @@ vl_api_sw_interface_dump_t_handler (vl_api_sw_interface_dump_t * mp) vpe_api_main_t *am = &vpe_api_main; vnet_sw_interface_t *swif; vnet_interface_main_t *im = &am->vnet_main->interface_main; - u8 *filter_string = 0, *name_string = 0; - unix_shared_memory_queue_t *q; - char *strcasestr (char *, char *); /* lnx hdr file botch */ - - q = vl_api_client_index_to_input_queue (mp->client_index); + unix_shared_memory_queue_t *q = + vl_api_client_index_to_input_queue (mp->client_index); if (q == 0) return; + u8 *filter = 0, *name = 0; if (mp->name_filter_valid) { mp->name_filter[ARRAY_LEN (mp->name_filter) - 1] = 0; - filter_string = format (0, "%s%c", mp->name_filter, 0); + filter = format (0, "%s%c", mp->name_filter, 0); } + char *strcasestr (char *, char *); /* lnx hdr file botch */ /* *INDENT-OFF* */ pool_foreach (swif, im->sw_interfaces, ({ - name_string = format (name_string, "%U%c", - format_vnet_sw_interface_name, - am->vnet_main, swif, 0); + if (!vnet_swif_is_api_visible (swif)) + continue; + vec_reset_length(name); + name = format (name, "%U%c", format_vnet_sw_interface_name, am->vnet_main, + swif, 0); - if (mp->name_filter_valid == 0 || - strcasestr((char *) name_string, (char *) filter_string)) { + if (filter && !strcasestr((char *) name, (char *) filter)) + continue; - send_sw_interface_details (am, q, swif, name_string, mp->context); - } - _vec_len (name_string) = 0; + send_sw_interface_details (am, q, swif, name, mp->context); })); /* *INDENT-ON* */ - vec_free (name_string); - vec_free (filter_string); + vec_free (name); + vec_free (filter); } static void @@ -435,48 +431,63 @@ static void vl_api_sw_interface_set_unnumbered_t_handler { vl_api_sw_interface_set_unnumbered_reply_t *rmp; int rv = 0; - vnet_sw_interface_t *si; vnet_main_t *vnm = vnet_get_main (); - u32 sw_if_index, unnumbered_sw_if_index; - - sw_if_index = ntohl (mp->sw_if_index); - unnumbered_sw_if_index = ntohl (mp->unnumbered_sw_if_index); + u32 sw_if_index = ntohl (mp->sw_if_index); + u32 unnumbered_sw_if_index = ntohl (mp->unnumbered_sw_if_index); + u32 was_unnum; /* * The API message field names are backwards from * the underlying data structure names. * It's not worth changing them now. */ - if (pool_is_free_index (vnm->interface_main.sw_interfaces, - unnumbered_sw_if_index)) + if (!vnet_sw_interface_is_api_valid (vnm, unnumbered_sw_if_index)) { rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; goto done; } /* Only check the "use loop0" field when setting the binding */ - if (mp->is_add && - pool_is_free_index (vnm->interface_main.sw_interfaces, sw_if_index)) + if (mp->is_add && !vnet_sw_interface_is_api_valid (vnm, sw_if_index)) { rv = VNET_API_ERROR_INVALID_SW_IF_INDEX_2; goto done; } - si = vnet_get_sw_interface (vnm, unnumbered_sw_if_index); + vnet_sw_interface_t *si = + vnet_get_sw_interface (vnm, unnumbered_sw_if_index); + was_unnum = (si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED); if (mp->is_add) { si->flags |= VNET_SW_INTERFACE_FLAG_UNNUMBERED; si->unnumbered_sw_if_index = sw_if_index; - ip4_sw_interface_enable_disable (unnumbered_sw_if_index, 1); - ip6_sw_interface_enable_disable (unnumbered_sw_if_index, 1); + + ip4_main.lookup_main.if_address_pool_index_by_sw_if_index + [unnumbered_sw_if_index] = + ip4_main. + lookup_main.if_address_pool_index_by_sw_if_index[sw_if_index]; + ip6_main. + lookup_main.if_address_pool_index_by_sw_if_index + [unnumbered_sw_if_index] = + ip6_main. + lookup_main.if_address_pool_index_by_sw_if_index[sw_if_index]; } else { si->flags &= ~(VNET_SW_INTERFACE_FLAG_UNNUMBERED); si->unnumbered_sw_if_index = (u32) ~ 0; - ip4_sw_interface_enable_disable (unnumbered_sw_if_index, 0); - ip6_sw_interface_enable_disable (unnumbered_sw_if_index, 0); + + ip4_main.lookup_main.if_address_pool_index_by_sw_if_index + [unnumbered_sw_if_index] = ~0; + ip6_main.lookup_main.if_address_pool_index_by_sw_if_index + [unnumbered_sw_if_index] = ~0; + } + + if (was_unnum != (si->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)) + { + ip4_sw_interface_enable_disable (unnumbered_sw_if_index, mp->is_add); + ip6_sw_interface_enable_disable (unnumbered_sw_if_index, mp->is_add); } done: