X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvat%2Fapi_format.c;h=d39a61a813ae4af82f41a234dd0986642461a776;hb=91c6ef7cae2d20ca17a69003a44090614412c63f;hp=d6af698446726372d2cb310ec70609519eca3e3e;hpb=cf5e848d69a4f14464c1e2d56896bc9f7e586951;p=vpp.git diff --git a/src/vat/api_format.c b/src/vat/api_format.c index d6af6984467..d39a61a813a 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "vat/json_format.h" @@ -718,14 +719,14 @@ increment_v6_address (ip6_address_t * a) } static void -increment_mac_address (u64 * mac) +increment_mac_address (u8 * mac) { - u64 tmp = *mac; - + u64 tmp = *((u64 *) mac); tmp = clib_net_to_host_u64 (tmp); tmp += 1 << 16; /* skip unused (least significant) octets */ tmp = clib_host_to_net_u64 (tmp); - *mac = tmp; + + clib_memcpy (mac, &tmp, 6); } static void vl_api_create_loopback_reply_t_handler @@ -1693,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) { @@ -2209,9 +2278,39 @@ static void vl_api_dns_resolve_name_reply_t_handler static void vl_api_dns_resolve_name_reply_t_handler_json (vl_api_dns_resolve_name_reply_t * mp) { - clib_warning ("no"); + clib_warning ("not implemented"); +} + +static void vl_api_dns_resolve_ip_reply_t_handler + (vl_api_dns_resolve_ip_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; + + if (retval == 0) + { + clib_warning ("canonical name %s", mp->name); + } + else + clib_warning ("retval %d", retval); + } +} + +static void vl_api_dns_resolve_ip_reply_t_handler_json + (vl_api_dns_resolve_ip_reply_t * mp) +{ + clib_warning ("not implemented"); } + static void vl_api_ip_address_details_t_handler (vl_api_ip_address_details_t * mp) { @@ -4208,6 +4307,123 @@ static void vam->result_ready = 1; } +static void + vl_api_one_show_xtr_mode_reply_t_handler + (vl_api_one_show_xtr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + + if (0 <= retval) + { + print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled"); + } + + vam->retval = retval; + vam->result_ready = 1; +} + +static void + vl_api_one_show_xtr_mode_reply_t_handler_json + (vl_api_one_show_xtr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + u8 *status = 0; + + status = format (0, "%s", mp->is_en ? "enabled" : "disabled"); + vec_add1 (status, 0); + + vat_json_init_object (&node); + vat_json_object_add_string_copy (&node, "status", status); + + vec_free (status); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + +static void + vl_api_one_show_pitr_mode_reply_t_handler + (vl_api_one_show_pitr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + + if (0 <= retval) + { + print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled"); + } + + vam->retval = retval; + vam->result_ready = 1; +} + +static void + vl_api_one_show_pitr_mode_reply_t_handler_json + (vl_api_one_show_pitr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + u8 *status = 0; + + status = format (0, "%s", mp->is_en ? "enabled" : "disabled"); + vec_add1 (status, 0); + + vat_json_init_object (&node); + vat_json_object_add_string_copy (&node, "status", status); + + vec_free (status); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + +static void + vl_api_one_show_petr_mode_reply_t_handler + (vl_api_one_show_petr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); + + if (0 <= retval) + { + print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled"); + } + + vam->retval = retval; + vam->result_ready = 1; +} + +static void + vl_api_one_show_petr_mode_reply_t_handler_json + (vl_api_one_show_petr_mode_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t node; + u8 *status = 0; + + status = format (0, "%s", mp->is_en ? "enabled" : "disabled"); + vec_add1 (status, 0); + + vat_json_init_object (&node); + vat_json_object_add_string_copy (&node, "status", status); + + vec_free (status); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + static void vl_api_show_one_use_petr_reply_t_handler (vl_api_show_one_use_petr_reply_t * mp) @@ -5014,6 +5230,7 @@ static void vl_api_flow_classify_details_t_handler_json #define foreach_standard_reply_retval_handler \ _(sw_interface_set_flags_reply) \ _(sw_interface_add_del_address_reply) \ +_(sw_interface_set_rx_mode_reply) \ _(sw_interface_set_table_reply) \ _(sw_interface_set_mpls_enable_reply) \ _(sw_interface_set_vpath_reply) \ @@ -5032,11 +5249,12 @@ _(ip_mroute_add_del_reply) \ _(mpls_route_add_del_reply) \ _(mpls_table_add_del_reply) \ _(mpls_ip_bind_unbind_reply) \ +_(bier_route_add_del_reply) \ +_(bier_table_add_del_reply) \ _(proxy_arp_add_del_reply) \ _(proxy_arp_intfc_enable_disable_reply) \ _(sw_interface_set_unnumbered_reply) \ _(ip_neighbor_add_del_reply) \ -_(reset_vrf_reply) \ _(oam_add_del_reply) \ _(reset_fib_reply) \ _(dhcp_proxy_config_reply) \ @@ -5077,6 +5295,7 @@ _(ipsec_sad_add_del_entry_reply) \ _(ipsec_sa_set_key_reply) \ _(ipsec_tunnel_if_add_del_reply) \ _(ipsec_tunnel_if_set_key_reply) \ +_(ipsec_tunnel_if_set_sa_reply) \ _(ikev2_profile_add_del_reply) \ _(ikev2_profile_set_auth_reply) \ _(ikev2_profile_set_id_reply) \ @@ -5122,6 +5341,9 @@ _(one_stats_enable_disable_reply) \ _(one_add_del_l2_arp_entry_reply) \ _(one_add_del_ndp_entry_reply) \ _(one_stats_flush_reply) \ +_(one_enable_disable_xtr_mode_reply) \ +_(one_enable_disable_pitr_mode_reply) \ +_(one_enable_disable_petr_mode_reply) \ _(gpe_enable_disable_reply) \ _(gpe_set_encap_mode_reply) \ _(gpe_add_del_iface_reply) \ @@ -5150,9 +5372,10 @@ _(p2p_ethernet_del_reply) \ _(lldp_config_reply) \ _(sw_interface_set_lldp_reply) \ _(tcp_configure_src_addresses_reply) \ -_(app_namespace_add_del_reply) \ _(dns_enable_disable_reply) \ -_(dns_name_server_add_del_reply) +_(dns_name_server_add_del_reply) \ +_(session_rule_add_del_reply) \ +_(ip_container_proxy_add_del_reply) #define _(n) \ static void vl_api_##n##_t_handler \ @@ -5200,6 +5423,7 @@ _(CLI_REPLY, cli_reply) \ _(CLI_INBAND_REPLY, cli_inband_reply) \ _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \ sw_interface_add_del_address_reply) \ +_(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \ _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \ _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \ _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \ @@ -5222,12 +5446,17 @@ _(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) \ _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \ _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \ _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \ +_(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \ +_(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \ _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \ _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \ proxy_arp_intfc_enable_disable_reply) \ @@ -5235,7 +5464,6 @@ _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \ _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \ sw_interface_set_unnumbered_reply) \ _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \ -_(RESET_VRF_REPLY, reset_vrf_reply) \ _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \ _(CREATE_SUBIF_REPLY, create_subif_reply) \ _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \ @@ -5311,6 +5539,7 @@ _(IPSEC_SA_DETAILS, ipsec_sa_details) \ _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \ _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \ _(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \ +_(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \ _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \ _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \ _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \ @@ -5381,6 +5610,14 @@ _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \ _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \ _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \ _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \ +_(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \ +_(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \ + one_enable_disable_pitr_mode_reply) \ +_(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \ + one_enable_disable_petr_mode_reply) \ +_(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \ +_(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \ +_(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \ _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \ _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \ _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \ @@ -5461,7 +5698,11 @@ _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \ _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \ _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \ _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \ -_(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) +_(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \ +_(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \ +_(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \ +_(SESSION_RULES_DETAILS, session_rules_details) \ +_(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \ #define foreach_standalone_reply_msg \ _(SW_INTERFACE_EVENT, sw_interface_event) \ @@ -6197,6 +6438,64 @@ api_sw_interface_set_flags (vat_main_t * vam) return ret; } +static int +api_sw_interface_set_rx_mode (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_sw_interface_set_rx_mode_t *mp; + u32 sw_if_index; + u8 sw_if_index_set = 0; + int ret; + u8 queue_id_valid = 0; + u32 queue_id; + vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "queue %d", &queue_id)) + queue_id_valid = 1; + else if (unformat (i, "polling")) + mode = VNET_HW_INTERFACE_RX_MODE_POLLING; + else if (unformat (i, "interrupt")) + mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT; + else if (unformat (i, "adaptive")) + mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE; + else + 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 interface name or sw_if_index"); + return -99; + } + if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN) + { + errmsg ("missing rx-mode"); + return -99; + } + + /* Construct the API message */ + M (SW_INTERFACE_SET_RX_MODE, mp); + mp->sw_if_index = ntohl (sw_if_index); + mp->mode = mode; + mp->queue_id_valid = queue_id_valid; + mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0; + + /* send it... */ + S (mp); + + /* Wait for a reply, return the good/bad news... */ + W (ret); + return ret; +} + static int api_sw_interface_clear_stats (vat_main_t * vam) { @@ -6833,7 +7132,7 @@ api_bridge_domain_add_del (vat_main_t * vam) goto done; } - if ((bd_tag) && (strlen ((char *) bd_tag) > 63)) + if ((bd_tag) && (vec_len (bd_tag) > 63)) { errmsg ("bd-tag cannot be longer than 63"); ret = -99; @@ -6851,8 +7150,10 @@ api_bridge_domain_add_del (vat_main_t * vam) mp->is_add = is_add; mp->mac_age = (u8) mac_age; if (bd_tag) - strcpy ((char *) mp->bd_tag, (char *) bd_tag); - + { + clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag)); + mp->bd_tag[vec_len (bd_tag)] = 0; + } S (mp); W (ret); @@ -6931,7 +7232,7 @@ api_l2fib_add_del (vat_main_t * vam) unformat_input_t *i = vam->input; vl_api_l2fib_add_del_t *mp; f64 timeout; - u64 mac = 0; + u8 mac[6] = { 0 }; u8 mac_set = 0; u32 bd_id; u8 bd_id_set = 0; @@ -6948,7 +7249,7 @@ api_l2fib_add_del (vat_main_t * vam) /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "mac %U", unformat_ethernet_address, &mac)) + if (unformat (i, "mac %U", unformat_ethernet_address, mac)) mac_set = 1; else if (unformat (i, "bd_id %d", &bd_id)) bd_id_set = 1; @@ -7015,7 +7316,7 @@ api_l2fib_add_del (vat_main_t * vam) { M (L2FIB_ADD_DEL, mp); - mp->mac = mac; + clib_memcpy (mp->mac, mac, 6); mp->bd_id = ntohl (bd_id); mp->is_add = is_add; @@ -7026,7 +7327,7 @@ api_l2fib_add_del (vat_main_t * vam) mp->filter_mac = filter_mac; mp->bvi_mac = bvi_mac; } - increment_mac_address (&mac); + increment_mac_address (mac); /* send it... */ S (mp); } @@ -7503,33 +7804,204 @@ api_tap_delete (vat_main_t * vam) } static int -api_ip_table_add_del (vat_main_t * vam) +api_tap_create_v2 (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ip_table_add_del_t *mp; - u32 table_id = ~0; - u8 is_ipv6 = 0; - u8 is_add = 1; - int ret = 0; + vl_api_tap_create_v2_t *mp; + u8 mac_address[6]; + u8 random_mac = 1; + u8 *tap_name = 0; + u8 *host_namespace = 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, "ipv6")) - is_ipv6 = 1; - else if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "add")) - is_add = 1; - else if (unformat (i, "table %d", &table_id)) - ; - else + if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address)) { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; + random_mac = 0; } - } - + else if (unformat (i, "name %s", &tap_name)) + ; + else if (unformat (i, "host-ns %s", &host_namespace)) + ; + 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 (tap_name == 0) + { + errmsg ("missing tap name. "); + return -99; + } + if (vec_len (tap_name) > 63) + { + errmsg ("tap name too long. "); + return -99; + } + if (vec_len (host_namespace) > 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; + } + + vec_add1 (tap_name, 0); + + /* Construct the API message */ + M (TAP_CREATE_V2, mp); + + mp->use_random_mac = random_mac; + clib_memcpy (mp->mac_address, mac_address, 6); + clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name)); + mp->host_namespace_set = host_namespace != 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 (host_namespace) + clib_memcpy (mp->host_namespace, host_namespace, + vec_len (host_namespace)); + 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 (tap_name); + + /* 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) +{ + unformat_input_t *i = vam->input; + vl_api_ip_table_add_del_t *mp; + u32 table_id = ~0; + u8 is_ipv6 = 0; + u8 is_add = 1; + int ret = 0; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "ipv6")) + is_ipv6 = 1; + else if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "add")) + is_add = 1; + else if (unformat (i, "table %d", &table_id)) + ; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } + } + if (~0 == table_id) { errmsg ("missing table-ID"); @@ -7564,7 +8036,6 @@ api_ip_add_del_route (vat_main_t * vam) u8 create_vrf_if_needed = 0; u8 is_add = 1; u32 next_hop_weight = 1; - u8 not_last = 0; u8 is_multipath = 0; u8 address_set = 0; u8 address_length_set = 0; @@ -7648,8 +8119,6 @@ api_ip_add_del_route (vat_main_t * vam) is_add = 0; else if (unformat (i, "add")) is_add = 1; - else if (unformat (i, "not-last")) - not_last = 1; else if (unformat (i, "resolve-via-host")) resolve_host = 1; else if (unformat (i, "resolve-via-attached")) @@ -7758,7 +8227,6 @@ api_ip_add_del_route (vat_main_t * vam) mp->is_multipath = is_multipath; mp->is_resolve_host = resolve_host; mp->is_resolve_attached = resolve_attached; - mp->not_last = not_last; mp->next_hop_weight = next_hop_weight; mp->dst_address_length = dst_address_length; mp->next_hop_table_id = ntohl (next_hop_table_id); @@ -8325,6 +8793,154 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) return ret; } +static int +api_bier_table_add_del (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_bier_table_add_del_t *mp; + u8 is_add = 1; + u32 set = 0, sub_domain = 0, hdr_len = 3; + mpls_label_t local_label = MPLS_LABEL_INVALID; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "sub-domain %d", &sub_domain)) + ; + else if (unformat (i, "set %d", &set)) + ; + else if (unformat (i, "label %d", &local_label)) + ; + else if (unformat (i, "hdr-len %d", &hdr_len)) + ; + else if (unformat (i, "add")) + is_add = 1; + else if (unformat (i, "del")) + is_add = 0; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } + } + + if (MPLS_LABEL_INVALID == local_label) + { + errmsg ("missing label\n"); + return -99; + } + + /* Construct the API message */ + M (BIER_TABLE_ADD_DEL, mp); + + mp->bt_is_add = is_add; + mp->bt_label = ntohl (local_label); + mp->bt_tbl_id.bt_set = set; + mp->bt_tbl_id.bt_sub_domain = sub_domain; + mp->bt_tbl_id.bt_hdr_len_id = hdr_len; + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + + return (ret); +} + +static int +api_bier_route_add_del (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_bier_route_add_del_t *mp; + u8 is_add = 1; + u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0; + ip4_address_t v4_next_hop_address; + ip6_address_t v6_next_hop_address; + u8 next_hop_set = 0; + u8 next_hop_proto_is_ip4 = 1; + mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address)) + { + next_hop_proto_is_ip4 = 1; + next_hop_set = 1; + } + else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address)) + { + next_hop_proto_is_ip4 = 0; + next_hop_set = 1; + } + if (unformat (i, "sub-domain %d", &sub_domain)) + ; + else if (unformat (i, "set %d", &set)) + ; + else if (unformat (i, "hdr-len %d", &hdr_len)) + ; + else if (unformat (i, "bp %d", &bp)) + ; + else if (unformat (i, "add")) + is_add = 1; + else if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "out-label %d", &next_hop_out_label)) + ; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } + } + + if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label)) + { + errmsg ("next hop / label set\n"); + return -99; + } + if (0 == bp) + { + errmsg ("bit=position not set\n"); + return -99; + } + + /* Construct the API message */ + M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path3_t)); + + mp->br_is_add = is_add; + mp->br_tbl_id.bt_set = set; + mp->br_tbl_id.bt_sub_domain = sub_domain; + mp->br_tbl_id.bt_hdr_len_id = hdr_len; + mp->br_bp = ntohs (bp); + mp->br_n_paths = 1; + mp->br_paths[0].n_labels = 1; + mp->br_paths[0].label_stack[0] = ntohl (next_hop_out_label); + mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1); + + if (next_hop_proto_is_ip4) + { + clib_memcpy (mp->br_paths[0].next_hop, + &v4_next_hop_address, sizeof (v4_next_hop_address)); + } + else + { + clib_memcpy (mp->br_paths[0].next_hop, + &v6_next_hop_address, sizeof (v6_next_hop_address)); + } + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + + return (ret); +} + static int api_proxy_arp_add_del (vat_main_t * vam) { @@ -8626,51 +9242,12 @@ api_ip_neighbor_add_del (vat_main_t * vam) { /* mp->is_ipv6 = 0; via memset in M macro above */ clib_memcpy (mp->dst_address, &v4address, sizeof (v4address)); - } - - /* send it... */ - S (mp); - - /* Wait for a reply, return good/bad news */ - W (ret); - return ret; -} - -static int -api_reset_vrf (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_reset_vrf_t *mp; - u32 vrf_id = 0; - u8 is_ipv6 = 0; - u8 vrf_id_set = 0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "vrf %d", &vrf_id)) - vrf_id_set = 1; - else if (unformat (i, "ipv6")) - is_ipv6 = 1; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (vrf_id_set == 0) - { - errmsg ("missing vrf id"); - return -99; - } - - M (RESET_VRF, mp); - - mp->vrf_id = ntohl (vrf_id); - mp->is_ipv6 = is_ipv6; + } + /* send it... */ S (mp); + + /* Wait for a reply, return good/bad news */ W (ret); return ret; } @@ -9005,15 +9582,19 @@ vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp) if (mp->is_ipv6) print (vam->ofp, - "RX Table-ID %d, Source Address %U, VSS FIB-ID %d, VSS OUI %d", + "RX Table-ID %d, Source Address %U, VSS Type %d, " + "VSS VPN-ID '%s', VSS FIB-ID %d, VSS OUI %d", ntohl (mp->rx_vrf_id), format_ip6_address, mp->dhcp_src_address, + mp->vss_type, mp->vss_vpn_ascii_id, ntohl (mp->vss_oui), ntohl (mp->vss_fib_id)); else print (vam->ofp, - "RX Table-ID %d, Source Address %U, VSS FIB-ID %d, VSS OUI %d", + "RX Table-ID %d, Source Address %U, VSS Type %d, " + "VSS VPN-ID '%s', VSS FIB-ID %d, VSS OUI %d", ntohl (mp->rx_vrf_id), format_ip4_address, mp->dhcp_src_address, + mp->vss_type, mp->vss_vpn_ascii_id, ntohl (mp->vss_oui), ntohl (mp->vss_fib_id)); for (i = 0; i < count; i++) @@ -9050,6 +9631,10 @@ static void vl_api_dhcp_proxy_details_t_handler_json vat_json_init_object (node); vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id)); + vat_json_object_add_bytes (node, "vss-type", &mp->vss_type, + sizeof (mp->vss_type)); + vat_json_object_add_string_copy (node, "vss-vpn-ascii-id", + mp->vss_vpn_ascii_id); vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id)); vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui)); @@ -9124,59 +9709,62 @@ api_dhcp_proxy_set_vss (vat_main_t * vam) vl_api_dhcp_proxy_set_vss_t *mp; u8 is_ipv6 = 0; u8 is_add = 1; - u32 tbl_id; - u8 tbl_id_set = 0; - u32 oui; - u8 oui_set = 0; - u32 fib_id; - u8 fib_id_set = 0; + u32 tbl_id = ~0; + u8 vss_type = VSS_TYPE_DEFAULT; + u8 *vpn_ascii_id = 0; + u32 oui = 0; + u32 fib_id = 0; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "tbl_id %d", &tbl_id)) - tbl_id_set = 1; - if (unformat (i, "fib_id %d", &fib_id)) - fib_id_set = 1; - if (unformat (i, "oui %d", &oui)) - oui_set = 1; + ; + else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id)) + vss_type = VSS_TYPE_ASCII; + else if (unformat (i, "fib_id %d", &fib_id)) + vss_type = VSS_TYPE_VPN_ID; + else if (unformat (i, "oui %d", &oui)) + vss_type = VSS_TYPE_VPN_ID; else if (unformat (i, "ipv6")) is_ipv6 = 1; else if (unformat (i, "del")) is_add = 0; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; } - if (tbl_id_set == 0) + if (tbl_id == ~0) { - errmsg ("missing tbl id"); + errmsg ("missing tbl_id "); + vec_free (vpn_ascii_id); return -99; } - if (fib_id_set == 0) - { - errmsg ("missing fib id"); - return -99; - } - if (oui_set == 0) + if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128)) { - errmsg ("missing oui"); + errmsg ("vpn_ascii_id cannot be longer than 128 "); + vec_free (vpn_ascii_id); return -99; } M (DHCP_PROXY_SET_VSS, mp); mp->tbl_id = ntohl (tbl_id); - mp->fib_id = ntohl (fib_id); + mp->vss_type = vss_type; + if (vpn_ascii_id) + { + clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id)); + mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0; + } + mp->vpn_index = ntohl (fib_id); mp->oui = ntohl (oui); mp->is_ipv6 = is_ipv6; mp->is_add = is_add; S (mp); W (ret); + + vec_free (vpn_ascii_id); return ret; } @@ -11853,6 +12441,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) { @@ -13225,16 +13860,6 @@ api_vxlan_gpe_tunnel_dump (vat_main_t * vam) return ret; } - -u8 * -format_l2_fib_mac_address (u8 * s, va_list * args) -{ - u8 *a = va_arg (*args, u8 *); - - return format (s, "%02x:%02x:%02x:%02x:%02x:%02x", - a[2], a[3], a[4], a[5], a[6], a[7]); -} - static void vl_api_l2_fib_table_details_t_handler (vl_api_l2_fib_table_details_t * mp) { @@ -13242,7 +13867,7 @@ static void vl_api_l2_fib_table_details_t_handler print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32 " %d %d %d", - ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac, + ntohl (mp->bd_id), format_ethernet_address, mp->mac, ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac, mp->bvi_mac); } @@ -13262,7 +13887,7 @@ static void vl_api_l2_fib_table_details_t_handler_json vat_json_init_object (node); vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id)); - vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac)); + vat_json_object_add_bytes (node, "mac", mp->mac, 6); vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); vat_json_object_add_uint (node, "static_mac", mp->static_mac); vat_json_object_add_uint (node, "filter_mac", mp->filter_mac); @@ -14374,6 +14999,57 @@ api_ipsec_tunnel_if_set_key (vat_main_t * vam) return ret; } +static int +api_ipsec_tunnel_if_set_sa (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_ipsec_tunnel_if_set_sa_t *mp; + u32 sw_if_index = ~0; + u32 sa_id = ~0; + u8 is_outbound = (u8) ~ 0; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sa_id %d", &sa_id)) + ; + else if (unformat (i, "outbound")) + is_outbound = 1; + else if (unformat (i, "inbound")) + is_outbound = 0; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } + } + + if (sw_if_index == ~0) + { + errmsg ("interface must be specified"); + return -99; + } + + if (sa_id == ~0) + { + errmsg ("SA ID must be specified"); + return -99; + } + + M (IPSEC_TUNNEL_IF_SET_SA, mp); + + mp->sw_if_index = htonl (sw_if_index); + mp->sa_id = htonl (sa_id); + mp->is_outbound = is_outbound; + + S (mp); + W (ret); + + return ret; +} + static int api_ikev2_profile_add_del (vat_main_t * vam) { @@ -16167,9 +16843,162 @@ api_one_rloc_probe_enable_disable (vat_main_t * vam) } /* Construct the API message */ - M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp); - - mp->is_enabled = is_en; + M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp); + + mp->is_enabled = is_en; + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +#define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable + +static int +api_one_map_register_enable_disable (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_one_map_register_enable_disable_t *mp; + u8 is_set = 0; + u8 is_en = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable")) + { + is_set = 1; + is_en = 1; + } + else if (unformat (input, "disable")) + is_set = 1; + else + break; + } + + if (!is_set) + { + errmsg ("Value not set"); + return -99; + } + + /* Construct the API message */ + M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp); + + mp->is_enabled = is_en; + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +#define api_lisp_map_register_enable_disable api_one_map_register_enable_disable + +static int +api_one_enable_disable (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_one_enable_disable_t *mp; + u8 is_set = 0; + u8 is_en = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable")) + { + is_set = 1; + is_en = 1; + } + else if (unformat (input, "disable")) + { + is_set = 1; + } + else + break; + } + + if (!is_set) + { + errmsg ("Value not set"); + return -99; + } + + /* Construct the API message */ + M (ONE_ENABLE_DISABLE, mp); + + mp->is_en = is_en; + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +#define api_lisp_enable_disable api_one_enable_disable + +static int +api_one_enable_disable_xtr_mode (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_one_enable_disable_xtr_mode_t *mp; + u8 is_set = 0; + u8 is_en = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable")) + { + is_set = 1; + is_en = 1; + } + else if (unformat (input, "disable")) + { + is_set = 1; + } + else + break; + } + + if (!is_set) + { + errmsg ("Value not set"); + return -99; + } + + /* Construct the API message */ + M (ONE_ENABLE_DISABLE_XTR_MODE, mp); + + mp->is_en = is_en; + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static int +api_one_show_xtr_mode (vat_main_t * vam) +{ + vl_api_one_show_xtr_mode_t *mp; + int ret; + + /* Construct the API message */ + M (ONE_SHOW_XTR_MODE, mp); /* send it... */ S (mp); @@ -16179,13 +17008,11 @@ api_one_rloc_probe_enable_disable (vat_main_t * vam) return ret; } -#define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable - static int -api_one_map_register_enable_disable (vat_main_t * vam) +api_one_enable_disable_pitr_mode (vat_main_t * vam) { unformat_input_t *input = vam->input; - vl_api_one_map_register_enable_disable_t *mp; + vl_api_one_enable_disable_pitr_mode_t *mp; u8 is_set = 0; u8 is_en = 0; int ret; @@ -16199,7 +17026,9 @@ api_one_map_register_enable_disable (vat_main_t * vam) is_en = 1; } else if (unformat (input, "disable")) - is_set = 1; + { + is_set = 1; + } else break; } @@ -16211,9 +17040,9 @@ api_one_map_register_enable_disable (vat_main_t * vam) } /* Construct the API message */ - M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp); + M (ONE_ENABLE_DISABLE_PITR_MODE, mp); - mp->is_enabled = is_en; + mp->is_en = is_en; /* send it... */ S (mp); @@ -16223,13 +17052,28 @@ api_one_map_register_enable_disable (vat_main_t * vam) return ret; } -#define api_lisp_map_register_enable_disable api_one_map_register_enable_disable +static int +api_one_show_pitr_mode (vat_main_t * vam) +{ + vl_api_one_show_pitr_mode_t *mp; + int ret; + + /* Construct the API message */ + M (ONE_SHOW_PITR_MODE, mp); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} static int -api_one_enable_disable (vat_main_t * vam) +api_one_enable_disable_petr_mode (vat_main_t * vam) { unformat_input_t *input = vam->input; - vl_api_one_enable_disable_t *mp; + vl_api_one_enable_disable_petr_mode_t *mp; u8 is_set = 0; u8 is_en = 0; int ret; @@ -16257,7 +17101,7 @@ api_one_enable_disable (vat_main_t * vam) } /* Construct the API message */ - M (ONE_ENABLE_DISABLE, mp); + M (ONE_ENABLE_DISABLE_PETR_MODE, mp); mp->is_en = is_en; @@ -16269,7 +17113,22 @@ api_one_enable_disable (vat_main_t * vam) return ret; } -#define api_lisp_enable_disable api_one_enable_disable +static int +api_one_show_petr_mode (vat_main_t * vam) +{ + vl_api_one_show_petr_mode_t *mp; + int ret; + + /* Construct the API message */ + M (ONE_SHOW_PETR_MODE, mp); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} static int api_show_one_map_register_state (vat_main_t * vam) @@ -20865,6 +21724,41 @@ api_tcp_configure_src_addresses (vat_main_t * vam) return ret; } +static void vl_api_app_namespace_add_del_reply_t_handler + (vl_api_app_namespace_add_del_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; + if (retval == 0) + errmsg ("app ns index %d\n", ntohl (mp->appns_index)); + vam->result_ready = 1; + } +} + +static void vl_api_app_namespace_add_del_reply_t_handler_json + (vl_api_app_namespace_add_del_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, "appns_index", ntohl (mp->appns_index)); + + vat_json_print (vam->ofp, &node); + vat_json_free (&node); + + vam->retval = ntohl (mp->retval); + vam->result_ready = 1; +} + static int api_app_namespace_add_del (vat_main_t * vam) { @@ -20904,7 +21798,7 @@ api_app_namespace_add_del (vat_main_t * vam) clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id)); mp->namespace_id_len = vec_len (ns_id); - mp->secret = secret; + mp->secret = clib_host_to_net_u64 (secret); mp->sw_if_index = clib_host_to_net_u32 (sw_if_index); mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id); mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id); @@ -21006,6 +21900,47 @@ api_dns_resolve_name (vat_main_t * vam) return ret; } +static int +api_dns_resolve_ip (vat_main_t * vam) +{ + unformat_input_t *line_input = vam->input; + vl_api_dns_resolve_ip_t *mp; + int is_ip6 = -1; + ip4_address_t addr4; + ip6_address_t addr6; + int ret; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "%U", unformat_ip6_address, &addr6)) + is_ip6 = 1; + else if (unformat (line_input, "%U", unformat_ip4_address, &addr4)) + is_ip6 = 0; + else + break; + } + + if (is_ip6 == -1) + { + errmsg ("missing address"); + return -99; + } + + /* Construct the API message */ + M (DNS_RESOLVE_IP, mp); + mp->is_ip6 = is_ip6; + if (is_ip6) + memcpy (mp->address, &addr6, sizeof (addr6)); + else + memcpy (mp->address, &addr4, sizeof (addr4)); + + /* send it... */ + S (mp); + /* Wait for the reply */ + W (ret); + return ret; +} + static int api_dns_name_server_add_del (vat_main_t * vam) { @@ -21068,6 +22003,256 @@ api_dns_name_server_add_del (vat_main_t * vam) return ret; } +static void +vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + if (mp->is_ip4) + { + print (vam->ofp, + "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s", + clib_net_to_host_u32 (mp->appns_index), mp->transport_proto, + mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen, + clib_net_to_host_u16 (mp->lcl_port), format_ip4_address, + &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port), + clib_net_to_host_u32 (mp->action_index), mp->tag); + } + else + { + print (vam->ofp, + "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s", + clib_net_to_host_u32 (mp->appns_index), mp->transport_proto, + mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen, + clib_net_to_host_u16 (mp->lcl_port), format_ip6_address, + &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port), + clib_net_to_host_u32 (mp->action_index), mp->tag); + } +} + +static void +vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t * + mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + struct in6_addr ip6; + struct in_addr ip4; + + 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, "is_ip4", mp->is_ip4 ? 1 : 0); + vat_json_object_add_uint (node, "appns_index", + clib_net_to_host_u32 (mp->appns_index)); + vat_json_object_add_uint (node, "transport_proto", mp->transport_proto); + vat_json_object_add_uint (node, "scope", mp->scope); + vat_json_object_add_uint (node, "action_index", + clib_net_to_host_u32 (mp->action_index)); + vat_json_object_add_uint (node, "lcl_port", + clib_net_to_host_u16 (mp->lcl_port)); + vat_json_object_add_uint (node, "rmt_port", + clib_net_to_host_u16 (mp->rmt_port)); + vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen); + vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen); + vat_json_object_add_string_copy (node, "tag", mp->tag); + if (mp->is_ip4) + { + clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4)); + vat_json_object_add_ip4 (node, "lcl_ip", ip4); + clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4)); + vat_json_object_add_ip4 (node, "rmt_ip", ip4); + } + else + { + clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6)); + vat_json_object_add_ip6 (node, "lcl_ip", ip6); + clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6)); + vat_json_object_add_ip6 (node, "rmt_ip", ip6); + } +} + +static int +api_session_rule_add_del (vat_main_t * vam) +{ + vl_api_session_rule_add_del_t *mp; + unformat_input_t *i = vam->input; + u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen; + u32 appns_index = 0, scope = 0; + ip4_address_t lcl_ip4, rmt_ip4; + ip6_address_t lcl_ip6, rmt_ip6; + u8 is_ip4 = 1, conn_set = 0; + u8 is_add = 1, *tag = 0; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "add")) + ; + else if (unformat (i, "proto tcp")) + proto = 0; + else if (unformat (i, "proto udp")) + proto = 1; + else if (unformat (i, "appns %d", &appns_index)) + ; + else if (unformat (i, "scope %d", &scope)) + ; + else if (unformat (i, "tag %_%v%_", &tag)) + ; + else + if (unformat + (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4, + &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen, + &rmt_port)) + { + is_ip4 = 1; + conn_set = 1; + } + else + if (unformat + (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6, + &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen, + &rmt_port)) + { + is_ip4 = 0; + conn_set = 1; + } + else if (unformat (i, "action %d", &action)) + ; + else + break; + } + if (proto == ~0 || !conn_set || action == ~0) + { + errmsg ("transport proto, connection and action must be set"); + return -99; + } + + if (scope > 3) + { + errmsg ("scope should be 0-3"); + return -99; + } + + M (SESSION_RULE_ADD_DEL, mp); + + mp->is_ip4 = is_ip4; + mp->transport_proto = proto; + mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port); + mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port); + mp->lcl_plen = lcl_plen; + mp->rmt_plen = rmt_plen; + mp->action_index = clib_host_to_net_u32 (action); + mp->appns_index = clib_host_to_net_u32 (appns_index); + mp->scope = scope; + mp->is_add = is_add; + if (is_ip4) + { + clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4)); + clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4)); + } + else + { + clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6)); + clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6)); + } + if (tag) + { + clib_memcpy (mp->tag, tag, vec_len (tag)); + vec_free (tag); + } + + S (mp); + W (ret); + return ret; +} + +static int +api_session_rules_dump (vat_main_t * vam) +{ + vl_api_session_rules_dump_t *mp; + vl_api_control_ping_t *mp_ping; + int ret; + + if (!vam->json_output) + { + print (vam->ofp, "%=20s", "Session Rules"); + } + + M (SESSION_RULES_DUMP, mp); + /* send it... */ + S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static int +api_ip_container_proxy_add_del (vat_main_t * vam) +{ + vl_api_ip_container_proxy_add_del_t *mp; + unformat_input_t *i = vam->input; + u32 plen = ~0, sw_if_index = ~0; + ip4_address_t ip4; + ip6_address_t ip6; + u8 is_ip4 = 1; + u8 is_add = 1; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "add")) + ; + if (unformat (i, "%U", unformat_ip4_address, &ip4)) + { + is_ip4 = 1; + plen = 32; + } + else if (unformat (i, "%U", unformat_ip6_address, &ip6)) + { + is_ip4 = 0; + plen = 128; + } + else if (unformat (i, "sw_if_index %u", &sw_if_index)) + ; + else + break; + } + if (sw_if_index == ~0 || plen == ~0) + { + errmsg ("address and sw_if_index must be set"); + return -99; + } + + M (IP_CONTAINER_PROXY_ADD_DEL, mp); + + mp->is_ip4 = is_ip4; + mp->sw_if_index = clib_host_to_net_u32 (sw_if_index); + mp->plen = plen; + mp->is_add = is_add; + if (is_ip4) + clib_memcpy (mp->ip, &ip4, sizeof (ip4)); + else + clib_memcpy (mp->ip, &ip6, sizeof (ip6)); + + S (mp); + W (ret); + return ret; +} static int q_or_quit (vat_main_t * vam) @@ -21441,6 +22626,8 @@ _(sw_interface_set_flags, \ " | sw_if_index admin-up | admin-down link-up | link down") \ _(sw_interface_add_del_address, \ " | sw_if_index | [del] [del-all] ") \ +_(sw_interface_set_rx_mode, \ + " | sw_if_index [queue ] ") \ _(sw_interface_set_table, \ " | sw_if_index vrf [ipv6]") \ _(sw_interface_set_mpls_enable, \ @@ -21460,7 +22647,7 @@ _(sw_interface_set_l2_bridge, \ "enable | disable") \ _(bridge_domain_set_mac_age, "bd_id mac-age 0-255") \ _(bridge_domain_add_del, \ - "bd_id [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag ] [del]\n") \ + "bd_id [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag ] [del]\n") \ _(bridge_domain_dump, "[bd_id ]\n") \ _(l2fib_add_del, \ "mac bd_id [del] | sw_if | sw_if_index [static] [filter] [bvi] [count ]\n") \ @@ -21477,6 +22664,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, \ @@ -21499,6 +22691,12 @@ _(mpls_ip_bind_unbind, \ _(mpls_tunnel_add_del, \ " via [table-id ]\n" \ "sw_if_index ] [l2] [del]") \ +_(bier_table_add_del, \ + "