X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_api.c;h=03434eab6719126784b6519e3b99b2964d9fb29a;hb=54f7c51fd5a1ea927a4df3a989f62afdf9d6c0c5;hp=3d9bb30f1424959aade2cf72fe65dc78b2dc3d33;hpb=6f4a6be8f222dd8caa94d19a7e4d87cb864ba7f4;p=vpp.git diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 3d9bb30f142..03434eab671 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -50,11 +50,13 @@ 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_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) \ @@ -69,7 +71,9 @@ _(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) +_(COLLECT_DETAILED_INTERFACE_STATS, collect_detailed_interface_stats) \ +_(SW_INTERFACE_SET_IP_DIRECTED_BROADCAST, \ + sw_interface_set_ip_directed_broadcast) static void vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp) @@ -96,9 +100,9 @@ vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp) } static void -vl_api_sw_interface_set_mtu_t_handler (vl_api_sw_interface_set_mtu_t * mp) +vl_api_hw_interface_set_mtu_t_handler (vl_api_hw_interface_set_mtu_t * mp) { - vl_api_sw_interface_set_mtu_reply_t *rmp; + vl_api_hw_interface_set_mtu_reply_t *rmp; vnet_main_t *vnm = vnet_get_main (); u32 sw_if_index = ntohl (mp->sw_if_index); u16 mtu = ntohs (mp->mtu); @@ -137,10 +141,48 @@ vl_api_sw_interface_set_mtu_t_handler (vl_api_sw_interface_set_mtu_t * mp) vnet_hw_interface_set_mtu (vnm, si->hw_if_index, mtu); + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO (VL_API_HW_INTERFACE_SET_MTU_REPLY); +} + +static void +vl_api_sw_interface_set_mtu_t_handler (vl_api_sw_interface_set_mtu_t * mp) +{ + vl_api_sw_interface_set_mtu_reply_t *rmp; + vnet_main_t *vnm = vnet_get_main (); + u32 sw_if_index = ntohl (mp->sw_if_index); + int rv = 0; + int i; + u32 per_protocol_mtu[VNET_N_MTU]; + + VALIDATE_SW_IF_INDEX (mp); + + for (i = 0; i < VNET_N_MTU; i++) + per_protocol_mtu[i] = ntohl (mp->mtu[i]); + + vnet_sw_interface_set_protocol_mtu (vnm, sw_if_index, per_protocol_mtu); + BAD_SW_IF_INDEX_LABEL; REPLY_MACRO (VL_API_SW_INTERFACE_SET_MTU_REPLY); } +static void + vl_api_sw_interface_set_ip_directed_broadcast_t_handler + (vl_api_sw_interface_set_ip_directed_broadcast_t * mp) +{ + vl_api_sw_interface_set_ip_directed_broadcast_reply_t *rmp; + u32 sw_if_index = ntohl (mp->sw_if_index); + int rv = 0; + + VALIDATE_SW_IF_INDEX (mp); + + vnet_sw_interface_ip_directed_broadcast (vnet_get_main (), + sw_if_index, mp->enable); + + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO (VL_API_SW_INTERFACE_SET_IP_DIRECTED_BROADCAST_REPLY); +} + static void send_sw_interface_details (vpe_api_main_t * am, vl_api_registration_t * rp, @@ -162,6 +204,11 @@ send_sw_interface_details (vpe_api_main_t * am, mp->link_speed = ((hi->flags & VNET_HW_INTERFACE_FLAG_SPEED_MASK) >> VNET_HW_INTERFACE_FLAG_SPEED_SHIFT); mp->link_mtu = ntohs (hi->max_packet_bytes); + mp->mtu[VNET_MTU_L3] = ntohl (swif->mtu[VNET_MTU_L3]); + mp->mtu[VNET_MTU_IP4] = ntohl (swif->mtu[VNET_MTU_IP4]); + mp->mtu[VNET_MTU_IP6] = ntohl (swif->mtu[VNET_MTU_IP6]); + mp->mtu[VNET_MTU_MPLS] = ntohl (swif->mtu[VNET_MTU_MPLS]); + mp->context = context; strncpy ((char *) mp->interface_name, @@ -381,31 +428,16 @@ ip_table_bind (fib_protocol_t fproto, msrc = MFIB_SOURCE_CLI; } - /* - * This is temporary whilst I do the song and dance with the CSIT version - */ - if (0 != table_id) - { - fib_index = fib_table_find_or_create_and_lock (fproto, table_id, src); - mfib_index = - mfib_table_find_or_create_and_lock (fproto, table_id, msrc); - } - else - { - fib_index = 0; - mfib_index = 0; - } - /* * This if table does not exist = error is what we want in the end. */ - /* fib_index = fib_table_find (fproto, table_id); */ - /* mfib_index = mfib_table_find (fproto, table_id); */ + fib_index = fib_table_find (fproto, table_id); + mfib_index = mfib_table_find (fproto, table_id); - /* if (~0 == fib_index || ~0 == mfib_index) */ - /* { */ - /* return (VNET_API_ERROR_NO_SUCH_FIB); */ - /* } */ + if (~0 == fib_index || ~0 == mfib_index) + { + return (VNET_API_ERROR_NO_SUCH_FIB); + } if (FIB_PROTOCOL_IP6 == fproto) { @@ -513,15 +545,6 @@ ip_table_bind (fib_protocol_t fproto, ip4_main.mfib_index_by_sw_if_index[sw_if_index] = mfib_index; } - /* - * Temporary. undo the locks from the find and create at the staart - */ - if (0 != table_id) - { - fib_table_unlock (fib_index, fproto, src); - mfib_table_unlock (mfib_index, fproto, msrc); - } - return (0); } @@ -914,6 +937,12 @@ static void vl_api_sw_interface_set_rx_mode_t_handler VALIDATE_SW_IF_INDEX (mp); si = vnet_get_sw_interface (vnm, sw_if_index); + if (si->type != VNET_SW_INTERFACE_TYPE_HARDWARE) + { + rv = VNET_API_ERROR_INVALID_VALUE; + goto bad_sw_if_index; + } + error = set_hw_interface_change_rx_mode (vnm, si->hw_if_index, mp->queue_id_valid, ntohl (mp->queue_id), mp->mode); @@ -929,6 +958,40 @@ out: REPLY_MACRO (VL_API_SW_INTERFACE_SET_RX_MODE_REPLY); } +static void vl_api_sw_interface_set_rx_placement_t_handler + (vl_api_sw_interface_set_rx_placement_t * mp) +{ + vl_api_sw_interface_set_rx_placement_reply_t *rmp; + vnet_main_t *vnm = vnet_get_main (); + u32 sw_if_index = ntohl (mp->sw_if_index); + vnet_sw_interface_t *si; + clib_error_t *error = 0; + int rv = 0; + + VALIDATE_SW_IF_INDEX (mp); + + si = vnet_get_sw_interface (vnm, sw_if_index); + if (si->type != VNET_SW_INTERFACE_TYPE_HARDWARE) + { + rv = VNET_API_ERROR_INVALID_VALUE; + goto bad_sw_if_index; + } + + error = set_hw_interface_rx_placement (si->hw_if_index, + ntohl (mp->queue_id), + ntohl (mp->worker_id), mp->is_main); + if (error) + { + rv = VNET_API_ERROR_UNIMPLEMENTED; + clib_error_report (error); + goto out; + } + + BAD_SW_IF_INDEX_LABEL; +out: + REPLY_MACRO (VL_API_SW_INTERFACE_SET_RX_PLACEMENT_REPLY); +} + static void vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp) { @@ -1177,14 +1240,9 @@ static void vl_api_collect_detailed_interface_stats_reply_t *rmp; int rv = 0; - if (mp->enable_disable) - { - collect_detailed_interface_stats_flag_set (); - } - else - { - collect_detailed_interface_stats_flag_clear (); - } + rv = + vnet_sw_interface_stats_collect_enable_disable (ntohl (mp->sw_if_index), + mp->enable_disable); REPLY_MACRO (VL_API_COLLECT_DETAILED_INTERFACE_STATS_REPLY); }