+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 = 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)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_memfd_segment_create_t *mp;
+ u64 size = 64 << 20;
+ int ret;
+
+#if VPP_API_TEST_BUILTIN == 1
+ errmsg ("memfd_segment_create (builtin) not supported");
+ return -99;
+#endif
+
+ 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;
+}