+
+ 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, "%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 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
+ {
+ random_mac = 0;
+ }
+ else if (unformat (i, "random-mac"))
+ random_mac = 1;
+ else if (unformat (i, "tapname %s", &tap_name))
+ name_set = 1;
+ else
+ break;
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing vpp interface name");
+ return -99;
+ }
+ if (name_set == 0)
+ {
+ errmsg ("missing tap name");
+ return -99;
+ }
+ if (vec_len (tap_name) > 63)
+ {
+ errmsg ("tap name too long");
+ }
+ vec_add1 (tap_name, 0);
+
+ /* Construct the API message */
+ M (TAP_MODIFY, mp);
+
+ mp->use_random_mac = random_mac;
+ mp->sw_if_index = ntohl (sw_if_index);
+ clib_memcpy (mp->mac_address, mac_address, 6);
+ clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
+ vec_free (tap_name);
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_tap_delete (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_tap_delete_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, mp);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ 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;
+ ip4_address_t host_ip4_gw;
+ u8 host_ip4_gw_set = 0;
+ u32 host_ip4_prefix_len = 0;
+ ip6_address_t host_ip6_addr;
+ ip6_address_t host_ip6_gw;
+ u8 host_ip6_gw_set = 0;
+ u32 host_ip6_prefix_len = 0;
+ int ret;
+ u32 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 %u", &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, "host-ip4-gw %U", unformat_ip4_address,
+ &host_ip4_gw))
+ host_ip4_gw_set = 1;
+ else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
+ &host_ip6_gw))
+ host_ip6_gw_set = 1;
+ 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 = ntohl (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 = ntohs (rx_ring_sz);
+ mp->tx_ring_sz = ntohs (tx_ring_sz);
+
+ if (random_mac == 0)
+ 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);
+ if (host_ip4_gw_set)
+ clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
+ if (host_ip6_gw_set)
+ clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 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_bond_create (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_bond_create_t *mp;
+ u8 mac_address[6];
+ u8 custom_mac = 0;
+ int ret;
+ u8 mode;
+ u8 lb;
+ u8 mode_is_set = 0;
+
+ memset (mac_address, 0, sizeof (mac_address));
+ lb = BOND_LB_L2;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "mode %U", unformat_bond_mode, &mode))
+ mode_is_set = 1;
+ else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
+ && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
+ ;
+ else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
+ mac_address))
+ custom_mac = 1;
+ else
+ break;
+ }
+
+ if (mode_is_set == 0)
+ {
+ errmsg ("Missing bond mode. ");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (BOND_CREATE, mp);
+
+ mp->use_custom_mac = custom_mac;
+
+ mp->mode = mode;
+ mp->lb = lb;
+
+ if (custom_mac)
+ clib_memcpy (mp->mac_address, mac_address, 6);
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_bond_delete (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_bond_delete_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 (BOND_DELETE, mp);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_bond_enslave (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_bond_enslave_t *mp;
+ u32 bond_sw_if_index;
+ int ret;
+ u8 is_passive;
+ u8 is_long_timeout;
+ u32 bond_sw_if_index_is_set = 0;
+ u32 sw_if_index;
+ u8 sw_if_index_is_set = 0;