X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_api.c;h=b75ec574d1c593333825445d5f1df85937363453;hb=fd0b399ff;hp=f8056c28bfe7a7caeb6dd92be3a93100874f684d;hpb=e30f1e92ebb7fb42a2a06fe7ee50415eef6add1c;p=vpp.git diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index f8056c28bfe..b75ec574d1c 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -53,38 +54,37 @@ #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) \ -_(SW_INTERFACE_ADDRESS_REPLACE_BEGIN, \ - sw_interface_address_replace_begin) \ -_(SW_INTERFACE_ADDRESS_REPLACE_END, \ - sw_interface_address_replace_end) +#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) @@ -112,6 +112,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) { @@ -262,8 +293,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) { @@ -367,8 +398,8 @@ vl_api_sw_interface_dump_t_handler (vl_api_sw_interface_dump_t * mp) 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); @@ -379,7 +410,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); @@ -789,12 +820,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); @@ -993,7 +1024,7 @@ static void vl_api_sw_interface_get_mac_address_t_handler 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); } @@ -1006,7 +1037,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_interface_rx_mode rx_mode; + vnet_hw_if_rx_mode rx_mode; VALIDATE_SW_IF_INDEX (mp); @@ -1017,12 +1048,11 @@ static void vl_api_sw_interface_set_rx_mode_t_handler goto bad_sw_if_index; } - rx_mode = (vnet_hw_interface_rx_mode) ntohl (mp->mode); + 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) - rx_mode); + (vnet_hw_if_rx_mode) rx_mode); if (error) { @@ -1070,29 +1100,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; + vec_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 { @@ -1115,13 +1140,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); } }