+ if (!vam->json_output)
+ {
+ print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
+ }
+
+ M (FLOW_CLASSIFY_DUMP, mp);
+ mp->type = type;
+ /* 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_feature_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_feature_enable_disable_t *mp;
+ u8 *arc_name = 0;
+ u8 *feature_name = 0;
+ u32 sw_if_index = ~0;
+ u8 enable = 1;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "arc_name %s", &arc_name))
+ ;
+ else if (unformat (i, "feature_name %s", &feature_name))
+ ;
+ else
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "disable"))
+ enable = 0;
+ else
+ break;
+ }
+
+ if (arc_name == 0)
+ {
+ errmsg ("missing arc name");
+ return -99;
+ }
+ if (vec_len (arc_name) > 63)
+ {
+ errmsg ("arc name too long");
+ }
+
+ if (feature_name == 0)
+ {
+ errmsg ("missing feature name");
+ return -99;
+ }
+ if (vec_len (feature_name) > 63)
+ {
+ errmsg ("feature name too long");
+ }
+
+ if (sw_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (FEATURE_ENABLE_DISABLE, mp);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = enable;
+ clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
+ clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
+ vec_free (arc_name);
+ vec_free (feature_name);
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_sw_interface_tag_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_tag_add_del_t *mp;
+ u32 sw_if_index = ~0;
+ u8 *tag = 0;
+ u8 enable = 1;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "tag %s", &tag))
+ ;
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "del"))
+ enable = 0;
+ else
+ break;
+ }
+
+ if (sw_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+
+ if (enable && (tag == 0))
+ {
+ errmsg ("no tag specified");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (SW_INTERFACE_TAG_ADD_DEL, mp);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_add = enable;
+ if (enable)
+ strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
+ vec_free (tag);
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static void vl_api_l2_xconnect_details_t_handler
+ (vl_api_l2_xconnect_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ print (vam->ofp, "%15d%15d",
+ ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
+}
+
+static void vl_api_l2_xconnect_details_t_handler_json
+ (vl_api_l2_xconnect_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, "rx_sw_if_index",
+ ntohl (mp->rx_sw_if_index));
+ vat_json_object_add_uint (node, "tx_sw_if_index",
+ ntohl (mp->tx_sw_if_index));
+}
+
+static int
+api_l2_xconnect_dump (vat_main_t * vam)
+{
+ vl_api_l2_xconnect_dump_t *mp;
+ vl_api_control_ping_t *mp_ping;
+ int ret;
+
+ if (!vam->json_output)
+ {
+ print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
+ }
+
+ M (L2_XCONNECT_DUMP, mp);
+
+ S (mp);
+
+ /* Use a control ping for synchronization */
+ MPING (CONTROL_PING, mp_ping);
+ S (mp_ping);
+
+ W (ret);
+ return ret;
+}
+
+static int
+api_sw_interface_set_mtu (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_set_mtu_t *mp;
+ u32 sw_if_index = ~0;
+ u32 mtu = 0;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "mtu %d", &mtu))
+ ;
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else
+ break;
+ }
+
+ if (sw_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+
+ if (mtu == 0)
+ {
+ errmsg ("no mtu specified");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_MTU, mp);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->mtu = ntohs ((u16) mtu);
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_p2p_ethernet_add (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_p2p_ethernet_add_t *mp;
+ u32 parent_if_index = ~0;
+ u32 sub_id = ~0;
+ u8 remote_mac[6];
+ u8 mac_set = 0;
+ int ret;
+
+ memset (remote_mac, 0, sizeof (remote_mac));
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &parent_if_index))
+ ;
+ else
+ if (unformat
+ (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
+ mac_set++;
+ else if (unformat (i, "sub_id %d", &sub_id))
+ ;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (parent_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+ if (mac_set == 0)
+ {
+ errmsg ("missing remote mac address");
+ return -99;
+ }
+ if (sub_id == ~0)
+ {
+ errmsg ("missing sub-interface id");
+ return -99;
+ }
+
+ M (P2P_ETHERNET_ADD, mp);
+ mp->parent_if_index = ntohl (parent_if_index);
+ mp->subif_id = ntohl (sub_id);
+ clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_p2p_ethernet_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_p2p_ethernet_del_t *mp;
+ u32 parent_if_index = ~0;
+ u8 remote_mac[6];
+ u8 mac_set = 0;
+ int ret;
+
+ memset (remote_mac, 0, sizeof (remote_mac));
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &parent_if_index))
+ ;
+ else
+ if (unformat
+ (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
+ mac_set++;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (parent_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+ if (mac_set == 0)
+ {
+ errmsg ("missing remote mac address");
+ return -99;
+ }
+
+ M (P2P_ETHERNET_DEL, mp);
+ mp->parent_if_index = ntohl (parent_if_index);
+ clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_lldp_config (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_lldp_config_t *mp;
+ int tx_hold = 0;
+ int tx_interval = 0;
+ u8 *sys_name = NULL;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "system-name %s", &sys_name))
+ ;
+ else if (unformat (i, "tx-hold %d", &tx_hold))
+ ;
+ else if (unformat (i, "tx-interval %d", &tx_interval))
+ ;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ vec_add1 (sys_name, 0);
+
+ M (LLDP_CONFIG, mp);
+ mp->tx_hold = htonl (tx_hold);
+ mp->tx_interval = htonl (tx_interval);
+ clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
+ vec_free (sys_name);
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_sw_interface_set_lldp (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_set_lldp_t *mp;
+ u32 sw_if_index = ~0;
+ u32 enable = 1;
+ u8 *port_desc = NULL, *mgmt_oid = NULL;
+ ip4_address_t ip4_addr;
+ ip6_address_t ip6_addr;
+ int ret;
+
+ memset (&ip4_addr, 0, sizeof (ip4_addr));
+ memset (&ip6_addr, 0, sizeof (ip6_addr));
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "disable"))
+ enable = 0;
+ else
+ if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "port-desc %s", &port_desc))
+ ;
+ else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
+ ;
+ else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
+ ;
+ else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
+ ;
+ else
+ break;
+ }
+
+ if (sw_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+
+ /* Construct the API message */
+ vec_add1 (port_desc, 0);
+ vec_add1 (mgmt_oid, 0);
+ M (SW_INTERFACE_SET_LLDP, mp);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = enable;
+ clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
+ clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
+ clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
+ clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
+ vec_free (port_desc);
+ vec_free (mgmt_oid);
+
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_tcp_configure_src_addresses (vat_main_t * vam)
+{
+ vl_api_tcp_configure_src_addresses_t *mp;
+ unformat_input_t *i = vam->input;
+ ip4_address_t v4first, v4last;
+ ip6_address_t v6first, v6last;
+ u8 range_set = 0;
+ u32 vrf_id = 0;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U - %U",
+ unformat_ip4_address, &v4first,
+ unformat_ip4_address, &v4last))
+ {
+ if (range_set)
+ {
+ errmsg ("one range per message (range already set)");
+ return -99;
+ }
+ range_set = 1;
+ }
+ else if (unformat (i, "%U - %U",
+ unformat_ip6_address, &v6first,
+ unformat_ip6_address, &v6last))
+ {
+ if (range_set)
+ {
+ errmsg ("one range per message (range already set)");
+ return -99;
+ }
+ range_set = 2;
+ }
+ else if (unformat (i, "vrf %d", &vrf_id))
+ ;
+ else
+ break;
+ }
+
+ if (range_set == 0)
+ {
+ errmsg ("address range not set");
+ return -99;
+ }
+
+ M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
+ mp->vrf_id = ntohl (vrf_id);
+ /* ipv6? */
+ if (range_set == 2)
+ {
+ mp->is_ipv6 = 1;
+ clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
+ clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
+ }
+ else
+ {
+ mp->is_ipv6 = 0;
+ clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
+ clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
+ }
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_app_namespace_add_del (vat_main_t * vam)
+{
+ vl_api_app_namespace_add_del_t *mp;
+ unformat_input_t *i = vam->input;
+ u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
+ u32 sw_if_index, ip4_fib_id, ip6_fib_id;
+ u64 secret;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "id %_%v%_", &ns_id))
+ ;
+ else if (unformat (i, "secret %lu", &secret))
+ secret_set = 1;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ sw_if_index_set = 1;
+ else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
+ ;
+ else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
+ ;
+ else
+ break;
+ }
+ if (!ns_id || !secret_set || !sw_if_index_set)
+ {
+ errmsg ("namespace id, secret and sw_if_index must be set");
+ return -99;
+ }
+ if (vec_len (ns_id) > 64)
+ {
+ errmsg ("namespace id too long");
+ return -99;
+ }
+ M (APP_NAMESPACE_ADD_DEL, mp);
+
+ clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
+ mp->namespace_id_len = vec_len (ns_id);
+ 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);
+ vec_free (ns_id);
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_memfd_segment_create (vat_main_t * vam)
+{
+#if VPP_API_TEST_BUILTIN == 0
+ unformat_input_t *i = vam->input;
+ vl_api_memfd_segment_create_t *mp;
+ u64 size = 64 << 20;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "size %U", unformat_memory_size, &size))
+ ;
+ else
+ break;
+ }
+
+ M (MEMFD_SEGMENT_CREATE, mp);
+ mp->requested_size = size;
+ S (mp);
+ W (ret);
+ return ret;
+
+#else
+ errmsg ("memfd_segment_create (builtin) not supported");
+ return -99;
+#endif
+}
+
+static int
+api_dns_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t *line_input = vam->input;
+ vl_api_dns_enable_disable_t *mp;
+ u8 enable_disable = 1;
+ int ret;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "disable"))
+ enable_disable = 0;
+ if (unformat (line_input, "enable"))
+ enable_disable = 1;
+ else
+ break;
+ }
+
+ /* Construct the API message */
+ M (DNS_ENABLE_DISABLE, mp);
+ mp->enable = enable_disable;