X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_api.c;h=bbb6168df9e98065368e311067aab9c595a71a14;hb=6d7dfcbfa4bc05f1308fc677f19ade44ea699da1;hp=3b0c515f01394108e8361677a964d40e16fa0620;hpb=c12eae73f925169597e20a8f8139c462e317404d;p=vpp.git diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 3b0c515f013..bbb6168df9e 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -21,66 +21,62 @@ #include #include +#include #include #include #include #include #include #include -#include #include #include - #include +#include #include #include -#define vl_typedefs /* define message structures */ -#include -#undef vl_typedefs +#include +#include -#define vl_endianfun /* define message structures */ -#include -#undef vl_endianfun +#define REPLY_MSG_ID_BASE msg_id_base +#include -/* instantiate all the print functions we know about */ -#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) -#define vl_printfun -#include -#undef vl_printfun +static u16 msg_id_base; -#include vpe_api_main_t vpe_api_main; -#define foreach_vpe_api_msg \ -_(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ -_(HW_INTERFACE_SET_MTU, hw_interface_set_mtu) \ -_(SW_INTERFACE_SET_MTU, sw_interface_set_mtu) \ -_(WANT_INTERFACE_EVENTS, want_interface_events) \ -_(SW_INTERFACE_DUMP, sw_interface_dump) \ -_(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address) \ -_(SW_INTERFACE_SET_RX_MODE, sw_interface_set_rx_mode) \ -_(SW_INTERFACE_RX_PLACEMENT_DUMP, sw_interface_rx_placement_dump) \ -_(SW_INTERFACE_SET_RX_PLACEMENT, sw_interface_set_rx_placement) \ -_(SW_INTERFACE_SET_TABLE, sw_interface_set_table) \ -_(SW_INTERFACE_GET_TABLE, sw_interface_get_table) \ -_(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered) \ -_(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats) \ -_(SW_INTERFACE_TAG_ADD_DEL, sw_interface_tag_add_del) \ -_(SW_INTERFACE_ADD_DEL_MAC_ADDRESS, sw_interface_add_del_mac_address) \ -_(SW_INTERFACE_SET_MAC_ADDRESS, sw_interface_set_mac_address) \ -_(SW_INTERFACE_GET_MAC_ADDRESS, sw_interface_get_mac_address) \ -_(CREATE_VLAN_SUBIF, create_vlan_subif) \ -_(CREATE_SUBIF, create_subif) \ -_(DELETE_SUBIF, delete_subif) \ -_(CREATE_LOOPBACK, create_loopback) \ -_(CREATE_LOOPBACK_INSTANCE, create_loopback_instance) \ -_(DELETE_LOOPBACK, delete_loopback) \ -_(INTERFACE_NAME_RENUMBER, interface_name_renumber) \ -_(COLLECT_DETAILED_INTERFACE_STATS, collect_detailed_interface_stats) \ -_(SW_INTERFACE_SET_IP_DIRECTED_BROADCAST, \ - sw_interface_set_ip_directed_broadcast) +#define foreach_vpe_api_msg \ + _ (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ + _ (SW_INTERFACE_SET_PROMISC, sw_interface_set_promisc) \ + _ (HW_INTERFACE_SET_MTU, hw_interface_set_mtu) \ + _ (SW_INTERFACE_SET_MTU, sw_interface_set_mtu) \ + _ (WANT_INTERFACE_EVENTS, want_interface_events) \ + _ (SW_INTERFACE_DUMP, sw_interface_dump) \ + _ (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address) \ + _ (SW_INTERFACE_SET_RX_MODE, sw_interface_set_rx_mode) \ + _ (SW_INTERFACE_RX_PLACEMENT_DUMP, sw_interface_rx_placement_dump) \ + _ (SW_INTERFACE_SET_RX_PLACEMENT, sw_interface_set_rx_placement) \ + _ (SW_INTERFACE_SET_TABLE, sw_interface_set_table) \ + _ (SW_INTERFACE_GET_TABLE, sw_interface_get_table) \ + _ (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered) \ + _ (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats) \ + _ (SW_INTERFACE_TAG_ADD_DEL, sw_interface_tag_add_del) \ + _ (SW_INTERFACE_ADD_DEL_MAC_ADDRESS, sw_interface_add_del_mac_address) \ + _ (SW_INTERFACE_SET_MAC_ADDRESS, sw_interface_set_mac_address) \ + _ (SW_INTERFACE_GET_MAC_ADDRESS, sw_interface_get_mac_address) \ + _ (CREATE_VLAN_SUBIF, create_vlan_subif) \ + _ (CREATE_SUBIF, create_subif) \ + _ (DELETE_SUBIF, delete_subif) \ + _ (CREATE_LOOPBACK, create_loopback) \ + _ (CREATE_LOOPBACK_INSTANCE, create_loopback_instance) \ + _ (DELETE_LOOPBACK, delete_loopback) \ + _ (INTERFACE_NAME_RENUMBER, interface_name_renumber) \ + _ (COLLECT_DETAILED_INTERFACE_STATS, collect_detailed_interface_stats) \ + _ (SW_INTERFACE_SET_IP_DIRECTED_BROADCAST, \ + sw_interface_set_ip_directed_broadcast) \ + _ (SW_INTERFACE_ADDRESS_REPLACE_BEGIN, sw_interface_address_replace_begin) \ + _ (SW_INTERFACE_ADDRESS_REPLACE_END, sw_interface_address_replace_end) static void vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp) @@ -108,6 +104,37 @@ vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp) REPLY_MACRO (VL_API_SW_INTERFACE_SET_FLAGS_REPLY); } +static void +vl_api_sw_interface_set_promisc_t_handler ( + vl_api_sw_interface_set_promisc_t *mp) +{ + vl_api_sw_interface_set_promisc_reply_t *rmp; + vnet_main_t *vnm = vnet_get_main (); + ethernet_main_t *em = ðernet_main; + int rv = 0; + ethernet_interface_t *eif; + vnet_sw_interface_t *swif; + u32 flags, sw_if_index; + + VALIDATE_SW_IF_INDEX (mp); + + sw_if_index = ntohl (mp->sw_if_index); + swif = vnet_get_sw_interface (vnm, sw_if_index); + eif = ethernet_get_interface (em, swif->hw_if_index); + if (!eif) + { + rv = VNET_API_ERROR_INVALID_VALUE; + goto done; + } + + flags = mp->promisc_on ? ETHERNET_INTERFACE_FLAG_ACCEPT_ALL : 0; + rv = ethernet_set_flags (vnm, swif->hw_if_index, flags); + +done: + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO (VL_API_SW_INTERFACE_SET_PROMISC_REPLY); +} + static void vl_api_hw_interface_set_mtu_t_handler (vl_api_hw_interface_set_mtu_t * mp) { @@ -169,7 +196,6 @@ vl_api_sw_interface_set_mtu_t_handler (vl_api_sw_interface_set_mtu_t * mp) for (i = 0; i < VNET_N_MTU; i++) { per_protocol_mtu[i] = ntohl (mp->mtu[i]); - clib_warning ("MTU %u", per_protocol_mtu[i]); } vnet_sw_interface_set_protocol_mtu (vnm, sw_if_index, per_protocol_mtu); @@ -207,7 +233,7 @@ send_sw_interface_details (vpe_api_main_t * am, vl_api_sw_interface_details_t *mp = vl_msg_api_alloc (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_DETAILS); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_SW_INTERFACE_DETAILS); mp->sw_if_index = ntohl (swif->sw_if_index); mp->sup_sw_if_index = ntohl (swif->sup_sw_if_index); @@ -233,8 +259,8 @@ send_sw_interface_details (vpe_api_main_t * am, } mp->type = ntohl (mp->type); - mp->link_duplex = ((hi->flags & VNET_HW_INTERFACE_FLAG_DUPLEX_MASK) >> - VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT); + mp->link_duplex = ntohl (((hi->flags & VNET_HW_INTERFACE_FLAG_DUPLEX_MASK) >> + VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT)); mp->link_speed = ntohl (hi->link_speed); mp->link_mtu = ntohs (hi->max_packet_bytes); mp->mtu[VNET_MTU_L3] = ntohl (swif->mtu[VNET_MTU_L3]); @@ -259,8 +285,8 @@ send_sw_interface_details (vpe_api_main_t * am, ethernet_interface_t *ei; ei = pool_elt_at_index (em->interfaces, hi->hw_instance); - ASSERT (sizeof (mp->l2_address) >= sizeof (ei->address)); - mac_address_encode ((mac_address_t *) ei->address, mp->l2_address); + ASSERT (sizeof (mp->l2_address) >= sizeof (ei->address.mac)); + mac_address_encode (&ei->address.mac, mp->l2_address); } else if (swif->sup_sw_if_index != swif->sw_if_index) { @@ -272,26 +298,26 @@ send_sw_interface_details (vpe_api_main_t * am, mp->sub_inner_vlan_id = ntohs (sub->eth.inner_vlan_id); mp->sub_if_flags = ntohl (sub->eth.raw_flags & SUB_IF_API_FLAG_MASK_VNET); + } - /* vlan tag rewrite data */ - u32 vtr_op = L2_VTR_DISABLED; - u32 vtr_push_dot1q = 0, vtr_tag1 = 0, vtr_tag2 = 0; + /* vlan tag rewrite data */ + u32 vtr_op = L2_VTR_DISABLED; + u32 vtr_push_dot1q = 0, vtr_tag1 = 0, vtr_tag2 = 0; - if (l2vtr_get (am->vlib_main, am->vnet_main, swif->sw_if_index, - &vtr_op, &vtr_push_dot1q, &vtr_tag1, &vtr_tag2) != 0) - { - // error - default to disabled - mp->vtr_op = ntohl (L2_VTR_DISABLED); - clib_warning ("cannot get vlan tag rewrite for sw_if_index %d", - swif->sw_if_index); - } - else - { - mp->vtr_op = ntohl (vtr_op); - mp->vtr_push_dot1q = ntohl (vtr_push_dot1q); - mp->vtr_tag1 = ntohl (vtr_tag1); - mp->vtr_tag2 = ntohl (vtr_tag2); - } + if (l2vtr_get (am->vlib_main, am->vnet_main, swif->sw_if_index, + &vtr_op, &vtr_push_dot1q, &vtr_tag1, &vtr_tag2) != 0) + { + // error - default to disabled + mp->vtr_op = ntohl (L2_VTR_DISABLED); + clib_warning ("cannot get vlan tag rewrite for sw_if_index %d", + swif->sw_if_index); + } + else + { + mp->vtr_op = ntohl (vtr_op); + mp->vtr_push_dot1q = ntohl (vtr_push_dot1q); + mp->vtr_tag1 = ntohl (vtr_tag1); + mp->vtr_tag2 = ntohl (vtr_tag2); } /* pbb tag rewrite data */ @@ -358,14 +384,14 @@ vl_api_sw_interface_dump_t_handler (vl_api_sw_interface_dump_t * mp) if (mp->name_filter_valid) { - filter = vl_api_from_api_to_vec (&mp->name_filter); + filter = vl_api_from_api_to_new_vec (mp, &mp->name_filter); vec_add1 (filter, 0); /* Ensure it's a C string for strcasecmp() */ } char *strcasestr (char *, char *); /* lnx hdr file botch */ /* *INDENT-OFF* */ - pool_foreach (swif, im->sw_interfaces, - ({ + pool_foreach (swif, im->sw_interfaces) + { if (!vnet_swif_is_api_visible (swif)) continue; vec_reset_length(name); @@ -376,7 +402,7 @@ vl_api_sw_interface_dump_t_handler (vl_api_sw_interface_dump_t * mp) continue; send_sw_interface_details (am, rp, swif, name, mp->context); - })); + } /* *INDENT-ON* */ vec_free (name); @@ -435,9 +461,9 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) VALIDATE_SW_IF_INDEX (mp); if (mp->is_ipv6) - rv = ip_table_bind (FIB_PROTOCOL_IP6, sw_if_index, table_id, 1); + rv = ip_table_bind (FIB_PROTOCOL_IP6, sw_if_index, table_id); else - rv = ip_table_bind (FIB_PROTOCOL_IP4, sw_if_index, table_id, 1); + rv = ip_table_bind (FIB_PROTOCOL_IP4, sw_if_index, table_id); BAD_SW_IF_INDEX_LABEL; @@ -445,24 +471,10 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) } int -ip_table_bind (fib_protocol_t fproto, - u32 sw_if_index, u32 table_id, u8 is_api) +ip_table_bind (fib_protocol_t fproto, u32 sw_if_index, u32 table_id) { CLIB_UNUSED (ip_interface_address_t * ia); u32 fib_index, mfib_index; - fib_source_t src; - mfib_source_t msrc; - - if (is_api) - { - src = FIB_SOURCE_API; - msrc = MFIB_SOURCE_API; - } - else - { - src = FIB_SOURCE_CLI; - msrc = MFIB_SOURCE_CLI; - } /* * This if table does not exist = error is what we want in the end. @@ -492,9 +504,6 @@ ip_table_bind (fib_protocol_t fproto, })); /* *INDENT-ON* */ - vec_validate (ip6_main.fib_index_by_sw_if_index, sw_if_index); - vec_validate (ip6_main.mfib_index_by_sw_if_index, sw_if_index); - /* * tell those that are interested that the binding is changing. */ @@ -505,22 +514,20 @@ ip_table_bind (fib_protocol_t fproto, fib_index, ip6_main.fib_index_by_sw_if_index[sw_if_index]); - if (0 == table_id) - { - /* reset back to default */ - if (0 != ip6_main.fib_index_by_sw_if_index[sw_if_index]) - fib_table_unlock (ip6_main.fib_index_by_sw_if_index[sw_if_index], - FIB_PROTOCOL_IP6, src); - if (0 != ip6_main.mfib_index_by_sw_if_index[sw_if_index]) - mfib_table_unlock (ip6_main.mfib_index_by_sw_if_index - [sw_if_index], FIB_PROTOCOL_IP6, msrc); + /* unlock currently assigned tables */ + if (0 != ip6_main.fib_index_by_sw_if_index[sw_if_index]) + fib_table_unlock (ip6_main.fib_index_by_sw_if_index[sw_if_index], + FIB_PROTOCOL_IP6, FIB_SOURCE_INTERFACE); + if (0 != ip6_main.mfib_index_by_sw_if_index[sw_if_index]) + mfib_table_unlock (ip6_main.mfib_index_by_sw_if_index[sw_if_index], + FIB_PROTOCOL_IP6, MFIB_SOURCE_INTERFACE); - } - else + if (0 != table_id) { /* we need to lock the table now it's inuse */ - fib_table_lock (fib_index, FIB_PROTOCOL_IP6, src); - mfib_table_lock (mfib_index, FIB_PROTOCOL_IP6, msrc); + fib_table_lock (fib_index, FIB_PROTOCOL_IP6, FIB_SOURCE_INTERFACE); + mfib_table_lock (mfib_index, FIB_PROTOCOL_IP6, + MFIB_SOURCE_INTERFACE); } ip6_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; @@ -543,9 +550,6 @@ ip_table_bind (fib_protocol_t fproto, })); /* *INDENT-ON* */ - vec_validate (ip4_main.fib_index_by_sw_if_index, sw_if_index); - vec_validate (ip4_main.mfib_index_by_sw_if_index, sw_if_index); - /* * tell those that are interested that the binding is changing. */ @@ -556,25 +560,22 @@ ip_table_bind (fib_protocol_t fproto, fib_index, ip4_main.fib_index_by_sw_if_index[sw_if_index]); - if (0 == table_id) - { - /* reset back to default */ - if (0 != ip4_main.fib_index_by_sw_if_index[sw_if_index]) - fib_table_unlock (ip4_main.fib_index_by_sw_if_index[sw_if_index], - FIB_PROTOCOL_IP4, src); - if (0 != ip4_main.mfib_index_by_sw_if_index[sw_if_index]) - mfib_table_unlock (ip4_main.mfib_index_by_sw_if_index - [sw_if_index], FIB_PROTOCOL_IP4, msrc); + /* unlock currently assigned tables */ + if (0 != ip4_main.fib_index_by_sw_if_index[sw_if_index]) + fib_table_unlock (ip4_main.fib_index_by_sw_if_index[sw_if_index], + FIB_PROTOCOL_IP4, FIB_SOURCE_INTERFACE); + if (0 != ip4_main.mfib_index_by_sw_if_index[sw_if_index]) + mfib_table_unlock (ip4_main.mfib_index_by_sw_if_index[sw_if_index], + FIB_PROTOCOL_IP4, MFIB_SOURCE_INTERFACE); - } - else + if (0 != table_id) { /* we need to lock the table now it's inuse */ - fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, - table_id, src); + fib_index = fib_table_find_or_create_and_lock ( + FIB_PROTOCOL_IP4, table_id, FIB_SOURCE_INTERFACE); - mfib_index = mfib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, - table_id, msrc); + mfib_index = mfib_table_find_or_create_and_lock ( + FIB_PROTOCOL_IP4, table_id, MFIB_SOURCE_INTERFACE); } ip4_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; @@ -592,7 +593,8 @@ send_sw_interface_get_table_reply (vl_api_registration_t * reg, mp = vl_msg_api_alloc (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_GET_TABLE_REPLY); + mp->_vl_msg_id = + ntohs (REPLY_MSG_ID_BASE + VL_API_SW_INTERFACE_GET_TABLE_REPLY); mp->context = context; mp->retval = htonl (retval); mp->vrf_id = htonl (vrf_id); @@ -661,8 +663,8 @@ static void vl_api_sw_interface_set_unnumbered_t_handler goto done; } - vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index, - sw_if_index, mp->is_add); + rv = vnet_sw_interface_update_unnumbered (unnumbered_sw_if_index, + sw_if_index, mp->is_add); done: REPLY_MACRO (VL_API_SW_INTERFACE_SET_UNNUMBERED_REPLY); } @@ -735,7 +737,7 @@ send_sw_interface_event (vpe_api_main_t * am, mp = vl_msg_api_alloc (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_EVENT); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + VL_API_SW_INTERFACE_EVENT); mp->sw_if_index = ntohl (sw_if_index); mp->client_index = reg->client_index; mp->pid = reg->client_pid; @@ -786,12 +788,12 @@ link_state_process (vlib_main_t * vm, continue; /* *INDENT-OFF* */ - pool_foreach(reg, vam->interface_events_registrations, - ({ + pool_foreach (reg, vam->interface_events_registrations) + { vl_reg = vl_api_client_index_to_registration (reg->client_index); if (vl_reg) send_sw_interface_event (vam, reg, vl_reg, i, event_by_sw_if_index[i]); - })); + } /* *INDENT-ON* */ } vec_reset_length (event_by_sw_if_index); @@ -828,8 +830,9 @@ link_up_down_function (vnet_main_t * vm, u32 hw_if_index, u32 flags) if (vam->link_state_process_up) { - enum api_events event = - flags ? API_LINK_STATE_UP_EVENT : API_LINK_STATE_DOWN_EVENT; + enum api_events event = ((flags & VNET_HW_INTERFACE_FLAG_LINK_UP) ? + API_LINK_STATE_UP_EVENT : + API_LINK_STATE_DOWN_EVENT); vlib_process_signal_event (vam->vlib_main, link_state_process_node.index, event, hi->sw_if_index); @@ -849,8 +852,8 @@ admin_up_down_function (vnet_main_t * vm, u32 sw_if_index, u32 flags) */ if (vam->link_state_process_up) { - enum api_events event = - flags ? API_ADMIN_UP_EVENT : API_ADMIN_DOWN_EVENT; + enum api_events event = ((flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) ? + API_ADMIN_UP_EVENT : API_ADMIN_DOWN_EVENT); vlib_process_signal_event (vam->vlib_main, link_state_process_node.index, event, sw_if_index); @@ -985,14 +988,48 @@ static void vl_api_sw_interface_get_mac_address_t_handler if (!reg) return; rmp = vl_msg_api_alloc (sizeof (*rmp)); - rmp->_vl_msg_id = htons (VL_API_SW_INTERFACE_GET_MAC_ADDRESS_REPLY); + rmp->_vl_msg_id = + htons (REPLY_MSG_ID_BASE + VL_API_SW_INTERFACE_GET_MAC_ADDRESS_REPLY); rmp->context = mp->context; rmp->retval = htonl (rv); if (!rv && eth_if) - mac_address_encode ((mac_address_t *) eth_if->address, rmp->mac_address); + mac_address_encode (ð_if->address.mac, rmp->mac_address); vl_api_send_msg (reg, (u8 *) rmp); } +static void +vl_api_sw_interface_set_interface_name_t_handler ( + vl_api_sw_interface_set_interface_name_t *mp) +{ + vl_api_sw_interface_set_interface_name_reply_t *rmp; + vnet_main_t *vnm = vnet_get_main (); + u32 sw_if_index = ntohl (mp->sw_if_index); + vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); + clib_error_t *error; + int rv = 0; + + if (mp->name[0] == 0) + { + rv = VNET_API_ERROR_INVALID_VALUE; + goto out; + } + if (si == 0) + { + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; + goto out; + } + + error = vnet_rename_interface (vnm, si->hw_if_index, (char *) mp->name); + if (error) + { + clib_error_free (error); + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; + } + +out: + REPLY_MACRO (VL_API_SW_INTERFACE_SET_INTERFACE_NAME_REPLY); +} + static void vl_api_sw_interface_set_rx_mode_t_handler (vl_api_sw_interface_set_rx_mode_t * mp) { @@ -1002,6 +1039,7 @@ static void vl_api_sw_interface_set_rx_mode_t_handler vnet_sw_interface_t *si; clib_error_t *error; int rv = 0; + vnet_hw_if_rx_mode rx_mode; VALIDATE_SW_IF_INDEX (mp); @@ -1012,11 +1050,11 @@ static void vl_api_sw_interface_set_rx_mode_t_handler goto bad_sw_if_index; } + rx_mode = (vnet_hw_if_rx_mode) ntohl (mp->mode); error = set_hw_interface_change_rx_mode (vnm, si->hw_if_index, mp->queue_id_valid, ntohl (mp->queue_id), - (vnet_hw_interface_rx_mode) - mp->mode); + (vnet_hw_if_rx_mode) rx_mode); if (error) { @@ -1040,11 +1078,12 @@ send_interface_rx_placement_details (vpe_api_main_t * am, mp = vl_msg_api_alloc (sizeof (*mp)); clib_memset (mp, 0, sizeof (*mp)); - mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_RX_PLACEMENT_DETAILS); + mp->_vl_msg_id = + htons (REPLY_MSG_ID_BASE + VL_API_SW_INTERFACE_RX_PLACEMENT_DETAILS); mp->sw_if_index = htonl (sw_if_index); mp->queue_id = htonl (queue_id); mp->worker_id = htonl (worker_id); - mp->mode = mode; + mp->mode = htonl (mode); mp->context = context; vl_api_send_msg (rp, (u8 *) mp); @@ -1064,29 +1103,24 @@ static void vl_api_sw_interface_rx_placement_dump_t_handler if (sw_if_index == ~0) { - vnet_device_input_runtime_t *rt; - vnet_device_and_queue_t *dq; - vlib_node_t *pn = vlib_get_node_by_name (am->vlib_main, - (u8 *) "device-input"); - uword si; - int index = 0; - - /* *INDENT-OFF* */ - foreach_vlib_main (({ - clib_bitmap_foreach (si, pn->sibling_bitmap, - ({ - rt = vlib_node_get_runtime_data (this_vlib_main, si); - vec_foreach (dq, rt->devices_and_queues) - { - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, - dq->hw_if_index); - send_interface_rx_placement_details (am, reg, hw->sw_if_index, index, - dq->queue_id, dq->mode, mp->context); - } - })); - index++; - })); - /* *INDENT-ON* */ + vnet_hw_if_rx_queue_t **all_queues = 0; + vnet_hw_if_rx_queue_t **qptr; + vnet_hw_if_rx_queue_t *q; + pool_foreach (q, vnm->interface_main.hw_if_rx_queues) + vec_add1 (all_queues, q); + vec_sort_with_function (all_queues, vnet_hw_if_rxq_cmp_cli_api); + + vec_foreach (qptr, all_queues) + { + u32 current_thread = qptr[0]->thread_index; + u32 hw_if_index = qptr[0]->hw_if_index; + vnet_hw_interface_t *hw_if = + vnet_get_hw_interface (vnm, hw_if_index); + send_interface_rx_placement_details ( + am, reg, hw_if->sw_if_index, current_thread, qptr[0]->queue_id, + qptr[0]->mode, mp->context); + } + vec_free (all_queues); } else { @@ -1109,13 +1143,13 @@ static void vl_api_sw_interface_rx_placement_dump_t_handler vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, si->hw_if_index); - for (i = 0; i < vec_len (hw->dq_runtime_index_by_queue); i++) + for (i = 0; i < vec_len (hw->rx_queue_indices); i++) { - send_interface_rx_placement_details (am, reg, hw->sw_if_index, - hw->input_node_thread_index_by_queue - [i], i, - hw->rx_mode_by_queue[i], - mp->context); + vnet_hw_if_rx_queue_t *rxq = + vnet_hw_if_get_rx_queue (vnm, hw->rx_queue_indices[i]); + send_interface_rx_placement_details ( + am, reg, hw->sw_if_index, rxq->thread_index, rxq->queue_id, + rxq->mode, mp->context); } } @@ -1230,7 +1264,7 @@ out: return; rmp = vl_msg_api_alloc (sizeof (*rmp)); - rmp->_vl_msg_id = htons (VL_API_CREATE_VLAN_SUBIF_REPLY); + rmp->_vl_msg_id = htons (REPLY_MSG_ID_BASE + VL_API_CREATE_VLAN_SUBIF_REPLY); rmp->context = mp->context; rmp->retval = htonl (rv); rmp->sw_if_index = htonl (sw_if_index); @@ -1366,6 +1400,30 @@ static void REPLY_MACRO (VL_API_COLLECT_DETAILED_INTERFACE_STATS_REPLY); } +static void + vl_api_sw_interface_address_replace_begin_t_handler + (vl_api_sw_interface_address_replace_begin_t * mp) +{ + vl_api_sw_interface_address_replace_begin_reply_t *rmp; + int rv = 0; + + ip_interface_address_mark (); + + REPLY_MACRO (VL_API_SW_INTERFACE_ADDRESS_REPLACE_BEGIN_REPLY); +} + +static void + vl_api_sw_interface_address_replace_end_t_handler + (vl_api_sw_interface_address_replace_end_t * mp) +{ + vl_api_sw_interface_address_replace_end_reply_t *rmp; + int rv = 0; + + ip_interface_address_sweep (); + + REPLY_MACRO (VL_API_SW_INTERFACE_ADDRESS_REPLACE_END_REPLY); +} + /* * vpe_api_hookup * Add vpe's API message handlers to the table. @@ -1373,39 +1431,20 @@ static void * added the client registration handlers. * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() */ -#define vl_msg_name_crc_list -#include -#undef vl_msg_name_crc_list - -static void -setup_message_id_table (api_main_t * am) -{ -#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); - foreach_vl_msg_name_crc_interface; -#undef _ -} pub_sub_handler (interface_events, INTERFACE_EVENTS); +#include static clib_error_t * interface_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; - -#define _(N,n) \ - vl_msg_api_set_handlers(VL_API_##N, #n, \ - vl_api_##n##_t_handler, \ - vl_noop_handler, \ - vl_api_##n##_t_endian, \ - vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); - foreach_vpe_api_msg; -#undef _ + api_main_t *am = vlibapi_get_main (); /* Mark these APIs as mp safe */ am->is_mp_safe[VL_API_SW_INTERFACE_DUMP] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_DETAILS] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_TAG_ADD_DEL] = 1; + am->is_mp_safe[VL_API_SW_INTERFACE_SET_INTERFACE_NAME] = 1; /* Do not replay VL_API_SW_INTERFACE_DUMP messages */ am->api_trace_cfg[VL_API_SW_INTERFACE_DUMP].replay_enable = 0; @@ -1413,7 +1452,7 @@ interface_api_hookup (vlib_main_t * vm) /* * Set up the (msg_name, crc, message-id) table */ - setup_message_id_table (am); + REPLY_MSG_ID_BASE = setup_message_id_table (); return 0; }