X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvat%2Fapi_format.c;h=e8d6bd5b1c18970d7cc6fd28ef4ce7eb1dcd461a;hb=c42fc05bfbb26fd11fe92ac9d11587660a817ac1;hp=cfdce0bec2e9ae0d28e437f8001a88fb699b27f8;hpb=70bfcaf47779340951c1e6f169b1cedcabe708d1;p=vpp.git diff --git a/src/vat/api_format.c b/src/vat/api_format.c index cfdce0bec2e..e8d6bd5b1c1 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -1694,6 +1694,74 @@ static void vl_api_tap_delete_reply_t_handler_json vam->result_ready = 1; } +static void +vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + if (vam->async_mode) + { + vam->async_errors += (retval < 0); + } + else + { + vam->retval = retval; + vam->sw_if_index = ntohl (mp->sw_if_index); + vam->result_ready = 1; + } + +} + +static void vl_api_tap_create_v2_reply_t_handler_json + (vl_api_tap_create_v2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + + vat_json_init_object (&node); + vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); + vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index)); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; + +} + +static void +vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + if (vam->async_mode) + { + vam->async_errors += (retval < 0); + } + else + { + vam->retval = retval; + vam->result_ready = 1; + } +} + +static void vl_api_tap_delete_v2_reply_t_handler_json + (vl_api_tap_delete_v2_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + + vat_json_init_object (&node); + vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + static void vl_api_mpls_tunnel_add_del_reply_t_handler (vl_api_mpls_tunnel_add_del_reply_t * mp) { @@ -5378,6 +5446,9 @@ _(TAP_CONNECT_REPLY, tap_connect_reply) \ _(TAP_MODIFY_REPLY, tap_modify_reply) \ _(TAP_DELETE_REPLY, tap_delete_reply) \ _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \ +_(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \ +_(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \ +_(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \ _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \ _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \ _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \ @@ -7732,6 +7803,186 @@ api_tap_delete (vat_main_t * vam) return ret; } +static int +api_tap_create_v2 (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_tap_create_v2_t *mp; + u8 mac_address[6]; + u8 random_mac = 1; + u32 id = ~0; + u8 *host_if_name = 0; + u8 *host_ns = 0; + u8 host_mac_addr[6]; + u8 host_mac_addr_set = 0; + u8 *host_bridge = 0; + ip4_address_t host_ip4_addr; + u32 host_ip4_prefix_len = 0; + ip6_address_t host_ip6_addr; + u32 host_ip6_prefix_len = 0; + int ret; + int rx_ring_sz = 0, tx_ring_sz = 0; + + memset (mac_address, 0, sizeof (mac_address)); + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address)) + { + random_mac = 0; + } + else if (unformat (i, "id %s", &id)) + ; + else if (unformat (i, "host-if-name %s", &host_if_name)) + ; + else if (unformat (i, "host-ns %s", &host_ns)) + ; + else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address, + host_mac_addr)) + host_mac_addr_set = 1; + else if (unformat (i, "host-bridge %s", &host_bridge)) + ; + else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address, + &host_ip4_addr, &host_ip4_prefix_len)) + ; + else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address, + &host_ip6_addr, &host_ip6_prefix_len)) + ; + else if (unformat (i, "rx-ring-size %d", &rx_ring_sz)) + ; + else if (unformat (i, "tx-ring-size %d", &tx_ring_sz)) + ; + else + break; + } + + if (vec_len (host_if_name) > 63) + { + errmsg ("tap name too long. "); + return -99; + } + if (vec_len (host_ns) > 63) + { + errmsg ("host name space too long. "); + return -99; + } + if (vec_len (host_bridge) > 63) + { + errmsg ("host bridge name too long. "); + return -99; + } + if (host_ip4_prefix_len > 32) + { + errmsg ("host ip4 prefix length not valid. "); + return -99; + } + if (host_ip6_prefix_len > 128) + { + errmsg ("host ip6 prefix length not valid. "); + return -99; + } + if (!is_pow2 (rx_ring_sz)) + { + errmsg ("rx ring size must be power of 2. "); + return -99; + } + if (rx_ring_sz > 32768) + { + errmsg ("rx ring size must be 32768 or lower. "); + return -99; + } + if (!is_pow2 (tx_ring_sz)) + { + errmsg ("tx ring size must be power of 2. "); + return -99; + } + if (tx_ring_sz > 32768) + { + errmsg ("tx ring size must be 32768 or lower. "); + return -99; + } + + /* Construct the API message */ + M (TAP_CREATE_V2, mp); + + mp->use_random_mac = random_mac; + + mp->id = id; + mp->host_namespace_set = host_ns != 0; + mp->host_bridge_set = host_bridge != 0; + mp->host_ip4_addr_set = host_ip4_prefix_len != 0; + mp->host_ip6_addr_set = host_ip6_prefix_len != 0; + mp->rx_ring_sz = rx_ring_sz; + mp->tx_ring_sz = tx_ring_sz; + + if (random_mac) + clib_memcpy (mp->mac_address, mac_address, 6); + if (host_mac_addr_set) + clib_memcpy (mp->host_mac_addr, host_mac_addr, 6); + if (host_if_name) + clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name)); + if (host_ns) + clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns)); + if (host_bridge) + clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge)); + if (host_ip4_prefix_len) + clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4); + if (host_ip4_prefix_len) + clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16); + + + vec_free (host_ns); + vec_free (host_if_name); + vec_free (host_bridge); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static int +api_tap_delete_v2 (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_tap_delete_v2_t *mp; + u32 sw_if_index = ~0; + u8 sw_if_index_set = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else + break; + } + + if (sw_if_index_set == 0) + { + errmsg ("missing vpp interface name. "); + return -99; + } + + /* Construct the API message */ + M (TAP_DELETE_V2, mp); + + mp->sw_if_index = ntohl (sw_if_index); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + static int api_ip_table_add_del (vat_main_t * vam) { @@ -7791,7 +8042,6 @@ api_ip_add_del_route (vat_main_t * vam) u8 is_ipv6 = 0; u8 is_local = 0, is_drop = 0; u8 is_unreach = 0, is_prohibit = 0; - u8 create_vrf_if_needed = 0; u8 is_add = 1; u32 next_hop_weight = 1; u8 is_multipath = 0; @@ -7885,8 +8135,6 @@ api_ip_add_del_route (vat_main_t * vam) is_multipath = 1; else if (unformat (i, "vrf %d", &vrf_id)) ; - else if (unformat (i, "create-vrf")) - create_vrf_if_needed = 1; else if (unformat (i, "count %d", &count)) ; else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id)) @@ -7973,7 +8221,6 @@ api_ip_add_del_route (vat_main_t * vam) mp->next_hop_sw_if_index = ntohl (sw_if_index); mp->table_id = ntohl (vrf_id); - mp->create_vrf_if_needed = create_vrf_if_needed; mp->is_add = is_add; mp->is_drop = is_drop; @@ -8086,7 +8333,6 @@ api_ip_mroute_add_del (vat_main_t * vam) u32 sw_if_index = ~0, vrf_id = 0; u8 is_ipv6 = 0; u8 is_local = 0; - u8 create_vrf_if_needed = 0; u8 is_add = 1; u8 address_set = 0; u32 grp_address_length = 0; @@ -8143,8 +8389,6 @@ api_ip_mroute_add_del (vat_main_t * vam) is_add = 1; else if (unformat (i, "vrf %d", &vrf_id)) ; - else if (unformat (i, "create-vrf")) - create_vrf_if_needed = 1; else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags)) ; else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags)) @@ -8167,7 +8411,6 @@ api_ip_mroute_add_del (vat_main_t * vam) mp->next_hop_sw_if_index = ntohl (sw_if_index); mp->table_id = ntohl (vrf_id); - mp->create_vrf_if_needed = create_vrf_if_needed; mp->is_add = is_add; mp->is_ipv6 = is_ipv6; @@ -8248,7 +8491,6 @@ api_mpls_route_add_del (vat_main_t * vam) unformat_input_t *i = vam->input; vl_api_mpls_route_add_del_t *mp; u32 sw_if_index = ~0, table_id = 0; - u8 create_table_if_needed = 0; u8 is_add = 1; u32 next_hop_weight = 1; u8 is_multipath = 0; @@ -8298,8 +8540,6 @@ api_mpls_route_add_del (vat_main_t * vam) } else if (unformat (i, "weight %d", &next_hop_weight)) ; - else if (unformat (i, "create-table")) - create_table_if_needed = 1; else if (unformat (i, "classify %d", &classify_table_index)) { is_classify = 1; @@ -8367,7 +8607,6 @@ api_mpls_route_add_del (vat_main_t * vam) mp->mr_next_hop_sw_if_index = ntohl (sw_if_index); mp->mr_table_id = ntohl (table_id); - mp->mr_create_table_if_needed = create_table_if_needed; mp->mr_is_add = is_add; mp->mr_next_hop_proto = next_hop_proto; @@ -8473,7 +8712,6 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) unformat_input_t *i = vam->input; vl_api_mpls_ip_bind_unbind_t *mp; u32 ip_table_id = 0; - u8 create_table_if_needed = 0; u8 is_bind = 1; u8 is_ip4 = 1; ip4_address_t v4_address; @@ -8500,8 +8738,6 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) } else if (unformat (i, "%d", &local_label)) ; - else if (unformat (i, "create-table")) - create_table_if_needed = 1; else if (unformat (i, "table-id %d", &ip_table_id)) ; else if (unformat (i, "unbind")) @@ -8530,7 +8766,6 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) /* Construct the API message */ M (MPLS_IP_BIND_UNBIND, mp); - mp->mb_create_table_if_needed = create_table_if_needed; mp->mb_is_bind = is_bind; mp->mb_is_ip4 = is_ip4; mp->mb_ip_table_id = ntohl (ip_table_id); @@ -12199,6 +12434,53 @@ api_sw_interface_tap_dump (vat_main_t * vam) return ret; } +static void vl_api_sw_interface_tap_v2_details_t_handler + (vl_api_sw_interface_tap_v2_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + print (vam->ofp, "%-16s %d", + mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index)); +} + +static void vl_api_sw_interface_tap_v2_details_t_handler_json + (vl_api_sw_interface_tap_v2_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + + if (VAT_JSON_ARRAY != vam->json_tree.type) + { + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); + } + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_string_copy (node, "dev_name", mp->dev_name); +} + +static int +api_sw_interface_tap_v2_dump (vat_main_t * vam) +{ + vl_api_sw_interface_tap_v2_dump_t *mp; + vl_api_control_ping_t *mp_ping; + int ret; + + print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index"); + /* Get list of tap interfaces */ + M (SW_INTERFACE_TAP_V2_DUMP, mp); + S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + W (ret); + return ret; +} + static uword unformat_vxlan_decap_next (unformat_input_t * input, va_list * args) { @@ -22375,6 +22657,11 @@ _(tap_modify, \ _(tap_delete, \ " | sw_if_index ") \ _(sw_interface_tap_dump, "") \ +_(tap_create_v2, \ + "name [hw-addr ] [host-ns ] [rx-ring-size [tx-ring-size ]") \ +_(tap_delete_v2, \ + " | sw_if_index ") \ +_(sw_interface_tap_v2_dump, "") \ _(ip_table_add_del, \ "table-id [ipv6]\n") \ _(ip_add_del_route, \