#include <vat/vat.h>
#include <vppinfra/socket.h>
-#include <svm/memfd.h>
#include <vlibapi/api.h>
#include <vlibmemory/api.h>
#include <vnet/ip/ip.h>
#include <vpp/api/vpe_msg_enum.h>
#include <vnet/l2/l2_classify.h>
#include <vnet/l2/l2_vtr.h>
-#include <vnet/classify/input_acl.h>
+#include <vnet/classify/in_out_acl.h>
#include <vnet/classify/policer_classify.h>
#include <vnet/classify/flow_classify.h>
#include <vnet/mpls/mpls.h>
#include <vnet/policer/policer.h>
#include <vnet/policer/police.h>
#include <vnet/mfib/mfib_types.h>
-
+#include <vnet/dhcp/dhcp_proxy.h>
+#include <vnet/bonding/node.h>
#include "vat/json_format.h"
#include <inttypes.h>
int
vat_socket_connect (vat_main_t * vam)
{
- return vl_socket_client_connect
- (&vam->socket_client_main, (char *) vam->socket_name,
- "vpp_api_test(s)", 0 /* default socket rx, tx buffer */ );
+ vam->socket_client_main = &socket_client_main;
+ return vl_socket_client_connect ((char *) vam->socket_name, "vpp_api_test",
+ 0 /* default socket rx, tx buffer */ );
}
#else /* vpp built-in case, we don't do sockets... */
int
return 0;
}
-void
-vl_socket_client_read_reply (socket_client_main_t * scm)
+int
+vl_socket_client_read (int wait)
+{
+ return -1;
+};
+
+int
+vl_socket_client_write ()
{
+ return -1;
};
+
+void *
+vl_socket_client_msg_alloc (int nbytes)
+{
+ return 0;
+}
#endif
}
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
vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
vat_json_object_add_uint (node, "link_speed", mp->link_speed);
- vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
+ vat_json_object_add_uint (node, "mtu", ntohs (mp->mtu));
vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
vat_json_object_add_uint (node, "sub_number_of_tags",
for (i = 0; i < n_macs; i++)
{
vl_api_mac_entry_t *mac = &mp->mac[i];
- errmsg (" [%d] sw_if_index %d mac_addr %U is_del %d \n",
+ errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
i + 1, ntohl (mac->sw_if_index),
- format_ethernet_address, mac->mac_addr, mac->is_del);
+ format_ethernet_address, mac->mac_addr, mac->action);
if (i == 1000)
break;
}
vam->retval = retval;
vam->result_ready = 1;
}
- vam->socket_client_main.control_pings_outstanding--;
+ if (vam->socket_client_main)
+ vam->socket_client_main->control_pings_outstanding--;
}
static void vl_api_control_ping_reply_t_handler_json
vam->result_ready = 1;
}
-static void vl_api_mpls_tunnel_add_del_reply_t_handler
- (vl_api_mpls_tunnel_add_del_reply_t * mp)
+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);
else
{
vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
+
}
-static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
- (vl_api_mpls_tunnel_add_del_reply_t * mp)
+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, "tunnel_sw_if_index",
- ntohl (mp->sw_if_index));
+ 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_l2tpv3_create_tunnel_reply_t_handler
- (vl_api_l2tpv3_create_tunnel_reply_t * mp)
+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);
else
{
vam->retval = retval;
- vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
-static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
- (vl_api_l2tpv3_create_tunnel_reply_t * mp)
+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_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->result_ready = 1;
}
-static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
- (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
+static void
+vl_api_bond_create_reply_t_handler (vl_api_bond_create_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_gpe_add_del_fwd_entry_reply_t_handler_json
- (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
+static void vl_api_bond_create_reply_t_handler_json
+ (vl_api_bond_create_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, "fwd_entry_index",
- clib_net_to_host_u32 (mp->fwd_entry_index));
+ 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->result_ready = 1;
}
-u8 *
-format_lisp_transport_protocol (u8 * s, va_list * args)
-{
- u32 proto = va_arg (*args, u32);
-
- switch (proto)
- {
- case 1:
- return format (s, "udp");
- case 2:
- return format (s, "api");
- default:
- return 0;
- }
- return 0;
-}
-
-static void vl_api_one_get_transport_protocol_reply_t_handler
- (vl_api_one_get_transport_protocol_reply_t * mp)
+static void
+vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
+
if (vam->async_mode)
{
vam->async_errors += (retval < 0);
}
else
{
- u32 proto = mp->protocol;
- print (vam->ofp, "Transport protocol: %U",
- format_lisp_transport_protocol, proto);
vam->retval = retval;
vam->result_ready = 1;
}
}
-static void vl_api_one_get_transport_protocol_reply_t_handler_json
- (vl_api_one_get_transport_protocol_reply_t * mp)
+static void vl_api_bond_delete_reply_t_handler_json
+ (vl_api_bond_delete_reply_t * mp)
{
vat_main_t *vam = &vat_main;
vat_json_node_t node;
- u8 *s;
-
- s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
- vec_add1 (s, 0);
vat_json_init_object (&node);
vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
- vat_json_object_add_string_copy (&node, "transport-protocol", s);
- vec_free (s);
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->result_ready = 1;
}
-static void vl_api_one_add_del_locator_set_reply_t_handler
- (vl_api_one_add_del_locator_set_reply_t * mp)
+static void
+vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
+
if (vam->async_mode)
{
vam->async_errors += (retval < 0);
}
}
-static void vl_api_one_add_del_locator_set_reply_t_handler_json
- (vl_api_one_add_del_locator_set_reply_t * mp)
+static void vl_api_bond_enslave_reply_t_handler_json
+ (vl_api_bond_enslave_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, "locator_set_index", ntohl (mp->ls_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->result_ready = 1;
}
-static void vl_api_vxlan_add_del_tunnel_reply_t_handler
- (vl_api_vxlan_add_del_tunnel_reply_t * mp)
+static void
+vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_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_vxlan_add_del_tunnel_reply_t_handler_json
- (vl_api_vxlan_add_del_tunnel_reply_t * mp)
+static void vl_api_bond_detach_slave_reply_t_handler_json
+ (vl_api_bond_detach_slave_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->result_ready = 1;
}
-static void vl_api_geneve_add_del_tunnel_reply_t_handler
- (vl_api_geneve_add_del_tunnel_reply_t * mp)
+static void vl_api_sw_interface_bond_details_t_handler
+ (vl_api_sw_interface_bond_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ print (vam->ofp,
+ "%-16s %-12d %-12U %-13U %-14u %-14u",
+ mp->interface_name, ntohl (mp->sw_if_index),
+ format_bond_mode, mp->mode, format_bond_load_balance, mp->lb,
+ ntohl (mp->active_slaves), ntohl (mp->slaves));
+}
+
+static void vl_api_sw_interface_bond_details_t_handler_json
+ (vl_api_sw_interface_bond_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, "interface_name",
+ mp->interface_name);
+ vat_json_object_add_uint (node, "mode", mp->mode);
+ vat_json_object_add_uint (node, "load_balance", mp->lb);
+ vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
+ vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
+}
+
+static int
+api_sw_interface_bond_dump (vat_main_t * vam)
+{
+ vl_api_sw_interface_bond_dump_t *mp;
+ vl_api_control_ping_t *mp_ping;
+ int ret;
+
+ print (vam->ofp,
+ "\n%-16s %-12s %-12s %-13s %-14s %-14s",
+ "interface name", "sw_if_index", "mode", "load balance",
+ "active slaves", "slaves");
+
+ /* Get list of bond interfaces */
+ M (SW_INTERFACE_BOND_DUMP, mp);
+ S (mp);
+
+ /* Use a control ping for synchronization */
+ MPING (CONTROL_PING, mp_ping);
+ S (mp_ping);
+
+ W (ret);
+ return ret;
+}
+
+static void vl_api_sw_interface_slave_details_t_handler
+ (vl_api_sw_interface_slave_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ print (vam->ofp,
+ "%-25s %-12d %-12d %d", mp->interface_name,
+ ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout);
+}
+
+static void vl_api_sw_interface_slave_details_t_handler_json
+ (vl_api_sw_interface_slave_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, "interface_name",
+ mp->interface_name);
+ vat_json_object_add_uint (node, "passive", mp->is_passive);
+ vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout);
+}
+
+static int
+api_sw_interface_slave_dump (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_slave_dump_t *mp;
+ vl_api_control_ping_t *mp_ping;
+ 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;
+ }
+
+ print (vam->ofp,
+ "\n%-25s %-12s %-12s %s",
+ "slave interface name", "sw_if_index", "passive", "long_timeout");
+
+ /* Get list of bond interfaces */
+ M (SW_INTERFACE_SLAVE_DUMP, mp);
+ mp->sw_if_index = ntohl (sw_if_index);
+ S (mp);
+
+ /* Use a control ping for synchronization */
+ MPING (CONTROL_PING, mp_ping);
+ S (mp_ping);
+
+ W (ret);
+ return ret;
+}
+
+static void vl_api_mpls_tunnel_add_del_reply_t_handler
+ (vl_api_mpls_tunnel_add_del_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
else
{
vam->retval = retval;
- vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
-static void vl_api_geneve_add_del_tunnel_reply_t_handler_json
- (vl_api_geneve_add_del_tunnel_reply_t * mp)
+static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
+ (vl_api_mpls_tunnel_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, "sw_if_index", ntohl (mp->sw_if_index));
+ vat_json_object_add_uint (&node, "tunnel_sw_if_index",
+ ntohl (mp->sw_if_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->result_ready = 1;
}
-static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
- (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
+static void vl_api_l2tpv3_create_tunnel_reply_t_handler
+ (vl_api_l2tpv3_create_tunnel_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
}
}
-static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
- (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
+static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
+ (vl_api_l2tpv3_create_tunnel_reply_t * mp)
{
vat_main_t *vam = &vat_main;
vat_json_node_t node;
vam->result_ready = 1;
}
-static void vl_api_gre_add_del_tunnel_reply_t_handler
- (vl_api_gre_add_del_tunnel_reply_t * mp)
+static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
+ (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
else
{
vam->retval = retval;
- vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
-static void vl_api_gre_add_del_tunnel_reply_t_handler_json
- (vl_api_gre_add_del_tunnel_reply_t * mp)
+static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
+ (vl_api_gpe_add_del_fwd_entry_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_object_add_uint (&node, "fwd_entry_index",
+ clib_net_to_host_u32 (mp->fwd_entry_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->result_ready = 1;
}
-static void vl_api_create_vhost_user_if_reply_t_handler
- (vl_api_create_vhost_user_if_reply_t * mp)
+u8 *
+format_lisp_transport_protocol (u8 * s, va_list * args)
+{
+ u32 proto = va_arg (*args, u32);
+
+ switch (proto)
+ {
+ case 1:
+ return format (s, "udp");
+ case 2:
+ return format (s, "api");
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+static void vl_api_one_get_transport_protocol_reply_t_handler
+ (vl_api_one_get_transport_protocol_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
}
else
{
+ u32 proto = mp->protocol;
+ print (vam->ofp, "Transport protocol: %U",
+ format_lisp_transport_protocol, proto);
vam->retval = retval;
- vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
-static void vl_api_create_vhost_user_if_reply_t_handler_json
- (vl_api_create_vhost_user_if_reply_t * mp)
+static void vl_api_one_get_transport_protocol_reply_t_handler_json
+ (vl_api_one_get_transport_protocol_reply_t * mp)
{
vat_main_t *vam = &vat_main;
vat_json_node_t node;
+ u8 *s;
+
+ s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
+ vec_add1 (s, 0);
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_object_add_string_copy (&node, "transport-protocol", s);
+
+ vec_free (s);
+ vat_json_print (vam->ofp, &node);
+ vat_json_free (&node);
+
+ vam->retval = ntohl (mp->retval);
+ vam->result_ready = 1;
+}
+
+static void vl_api_one_add_del_locator_set_reply_t_handler
+ (vl_api_one_add_del_locator_set_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_one_add_del_locator_set_reply_t_handler_json
+ (vl_api_one_add_del_locator_set_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, "locator_set_index", ntohl (mp->ls_index));
+
+ vat_json_print (vam->ofp, &node);
+ vat_json_free (&node);
+
+ vam->retval = ntohl (mp->retval);
+ vam->result_ready = 1;
+}
+
+static void vl_api_vxlan_add_del_tunnel_reply_t_handler
+ (vl_api_vxlan_add_del_tunnel_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;
+ }
+ vam->regenerate_interface_table = 1;
+}
+
+static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
+ (vl_api_vxlan_add_del_tunnel_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_geneve_add_del_tunnel_reply_t_handler
+ (vl_api_geneve_add_del_tunnel_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_geneve_add_del_tunnel_reply_t_handler_json
+ (vl_api_geneve_add_del_tunnel_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_vxlan_gpe_add_del_tunnel_reply_t_handler
+ (vl_api_vxlan_gpe_add_del_tunnel_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;
+ }
+ vam->regenerate_interface_table = 1;
+}
+
+static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
+ (vl_api_vxlan_gpe_add_del_tunnel_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_gre_add_del_tunnel_reply_t_handler
+ (vl_api_gre_add_del_tunnel_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_gre_add_del_tunnel_reply_t_handler_json
+ (vl_api_gre_add_del_tunnel_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_create_vhost_user_if_reply_t_handler
+ (vl_api_create_vhost_user_if_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;
+ }
+ vam->regenerate_interface_table = 1;
+}
+
+static void vl_api_create_vhost_user_if_reply_t_handler_json
+ (vl_api_create_vhost_user_if_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);
#if VPP_API_TEST_BUILTIN == 0
vat_main_t *vam = &vat_main;
api_main_t *am = &api_main;
- socket_client_main_t *scm = &vam->socket_client_main;
+ socket_client_main_t *scm = vam->socket_client_main;
int my_fd = -1;
clib_error_t *error;
- memfd_private_t memfd;
+ ssvm_private_t memfd;
i32 retval = ntohl (mp->retval);
if (retval == 0)
vam->client_index_invalid = 1;
- retval = memfd_slave_init (&memfd);
+ /* Note: this closes memfd.fd */
+ retval = ssvm_slave_init_memfd (&memfd);
if (retval)
clib_warning ("WARNING: segment map returned %d", retval);
vl_client_connect_to_vlib_no_map ("pvt",
"vpp_api_test(p)",
32 /* input_queue_length */ );
- if (close (my_fd) < 0)
- clib_unix_warning ("close memfd fd pivot");
vam->vl_input_queue = am->shmem_hdr->vl_input_queue;
- vl_socket_client_enable_disable (&vam->socket_client_main,
- 0 /* disable socket */ );
+ vl_socket_client_enable_disable (0 /* disable socket */ );
}
out:
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)
{
}
static void
- vl_api_show_one_use_petr_reply_t_handler
- (vl_api_show_one_use_petr_reply_t * mp)
+ 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->status ? "enabled" : "disabled");
- if (mp->status)
- {
- print (vam->ofp, "Proxy-ETR address; %U",
- mp->is_ip4 ? format_ip4_address : format_ip6_address,
- mp->address);
- }
+ print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
}
vam->retval = retval;
}
static void
- vl_api_show_one_use_petr_reply_t_handler_json
- (vl_api_show_one_use_petr_reply_t * mp)
+ 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;
- struct in_addr ip4;
- struct in6_addr ip6;
- status = format (0, "%s", mp->status ? "enabled" : "disabled");
+ 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);
- if (mp->status)
- {
- if (mp->is_ip4)
- {
- clib_memcpy (&ip6, mp->address, sizeof (ip6));
- vat_json_object_add_ip6 (&node, "address", ip6);
- }
- else
- {
- clib_memcpy (&ip4, mp->address, sizeof (ip4));
+
+ 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)
+{
+ vat_main_t *vam = &vat_main;
+ i32 retval = ntohl (mp->retval);
+
+ if (0 <= retval)
+ {
+ print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
+ if (mp->status)
+ {
+ print (vam->ofp, "Proxy-ETR address; %U",
+ mp->is_ip4 ? format_ip4_address : format_ip6_address,
+ mp->address);
+ }
+ }
+
+ vam->retval = retval;
+ vam->result_ready = 1;
+}
+
+static void
+ vl_api_show_one_use_petr_reply_t_handler_json
+ (vl_api_show_one_use_petr_reply_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t node;
+ u8 *status = 0;
+ struct in_addr ip4;
+ struct in6_addr ip6;
+
+ status = format (0, "%s", mp->status ? "enabled" : "disabled");
+ vec_add1 (status, 0);
+
+ vat_json_init_object (&node);
+ vat_json_object_add_string_copy (&node, "status", status);
+ if (mp->status)
+ {
+ if (mp->is_ip4)
+ {
+ clib_memcpy (&ip6, mp->address, sizeof (ip6));
+ vat_json_object_add_ip6 (&node, "address", ip6);
+ }
+ else
+ {
+ clib_memcpy (&ip4, mp->address, sizeof (ip4));
vat_json_object_add_ip4 (&node, "address", ip4);
}
}
vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
+ vam->regenerate_interface_table = 1;
}
static void vl_api_ipsec_gre_add_del_tunnel_reply_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) \
_(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) \
_(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) \
_(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) \
_(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) \
+_(output_acl_set_interface_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
_(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) \
_(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) \
+_(BOND_CREATE_REPLY, bond_create_reply) \
+_(BOND_DELETE_REPLY, bond_delete_reply) \
+_(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
+_(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
+_(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
+_(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_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) \
_(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) \
_(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) \
_(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) \
_(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) \
+_(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
#define foreach_standalone_reply_msg \
_(SW_INTERFACE_EVENT, sw_interface_event) \
W (ret);
/* json responses may or may not include a useful reply... */
if (vec_len (vam->cmd_reply))
- print (vam->ofp, (char *) (vam->cmd_reply));
+ print (vam->ofp, "%v", (char *) (vam->cmd_reply));
return ret;
}
/* recreate the interface name hash table */
vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
- /* Get list of ethernets */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and local / loopback interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and packet-generator interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "pg", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and vxlan-gpe tunnel interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "vxlan_gpe",
- sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and vxlan tunnel interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and geneve tunnel interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "geneve", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and host (af_packet) interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and l2tpv3 tunnel interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
- sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and GRE tunnel interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and LISP-GPE interfaces */
- M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "lisp_gpe",
- sizeof (mp->name_filter) - 1);
- S (mp);
-
- /* and IPSEC tunnel interfaces */
+ /*
+ * Ask for all interface names. Otherwise, the epic catalog of
+ * name filters becomes ridiculously long, and vat ends up needing
+ * to be taught about new interface types.
+ */
M (SW_INTERFACE_DUMP, mp);
- mp->name_filter_valid = 1;
- strncpy ((char *) mp->name_filter, "ipsec", sizeof (mp->name_filter) - 1);
S (mp);
/* Use a control ping for synchronization */
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)
{
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;
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);
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;
/* 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;
{
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;
mp->filter_mac = filter_mac;
mp->bvi_mac = bvi_mac;
}
- increment_mac_address (&mac);
+ increment_mac_address (mac);
/* send it... */
S (mp);
}
}
static int
-api_tap_delete (vat_main_t * vam)
+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;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "sw_if_index %d", &sw_if_index))
+ sw_if_index_is_set = 1;
+ else if (unformat (i, "bond %u", &bond_sw_if_index))
+ bond_sw_if_index_is_set = 1;
+ else if (unformat (i, "passive %d", &is_passive))
+ ;
+ else if (unformat (i, "long-timeout %d", &is_long_timeout))
+ ;
+ else
+ break;
+ }
+
+ if (bond_sw_if_index_is_set == 0)
+ {
+ errmsg ("Missing bond sw_if_index. ");
+ return -99;
+ }
+ if (sw_if_index_is_set == 0)
+ {
+ errmsg ("Missing slave sw_if_index. ");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (BOND_ENSLAVE, mp);
+
+ mp->bond_sw_if_index = ntohl (bond_sw_if_index);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_long_timeout = is_long_timeout;
+ mp->is_passive = is_passive;
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_bond_detach_slave (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_tap_delete_t *mp;
+ vl_api_bond_detach_slave_t *mp;
u32 sw_if_index = ~0;
u8 sw_if_index_set = 0;
int ret;
if (sw_if_index_set == 0)
{
- errmsg ("missing vpp interface name");
+ errmsg ("missing vpp interface name. ");
return -99;
}
/* Construct the API message */
- M (TAP_DELETE, mp);
+ M (BOND_DETACH_SLAVE, mp);
mp->sw_if_index = ntohl (sw_if_index);
u8 is_unreach = 0, is_prohibit = 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;
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"))
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);
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "del"))
+ if (unformat (i, "table %d", &table_id))
+ ;
+ else if (unformat (i, "del"))
is_add = 0;
else if (unformat (i, "add"))
is_add = 1;
- else if (unformat (i, "table-id %d", &table_id))
- ;
else
{
clib_warning ("parse error '%U'", format_unformat_error, i);
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_path_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].label = 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)
{
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;
-
- S (mp);
- W (ret);
- return ret;
-}
-
static int
api_create_vlan_subif (vat_main_t * vam)
{
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 ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%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 ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%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++)
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));
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;
}
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;
+
+ u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
+ mp->host_ip4_prefix_len);
+ u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
+ mp->host_ip6_prefix_len);
+
+ print (vam->ofp,
+ "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s",
+ mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
+ ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
+ format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
+ mp->host_bridge, ip4, ip6);
+
+ vec_free (ip4);
+ vec_free (ip6);
+}
+
+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, "id", ntohl (mp->id));
+ 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);
+ vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
+ vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
+ vat_json_object_add_string_copy (node, "host_mac_addr",
+ format (0, "%U", format_ethernet_address,
+ &mp->host_mac_addr));
+ vat_json_object_add_string_copy (node, "host_namespace",
+ mp->host_namespace);
+ vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
+ vat_json_object_add_string_copy (node, "host_ip4_addr",
+ format (0, "%U/%d", format_ip4_address,
+ mp->host_ip4_addr,
+ mp->host_ip4_prefix_len));
+ vat_json_object_add_string_copy (node, "host_ip6_addr",
+ format (0, "%U/%d", format_ip6_address,
+ mp->host_ip6_addr,
+ mp->host_ip6_prefix_len));
+
+}
+
+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 %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
+ "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
+ "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
+ "host_ip6_addr");
+
+ /* 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)
{
u8 src_set = 0;
u8 dst_set = 0;
u8 grp_set = 0;
+ u32 instance = ~0;
u32 mcast_sw_if_index = ~0;
u32 encap_vrf_id = 0;
u32 decap_next_index = ~0;
{
if (unformat (line_input, "del"))
is_add = 0;
+ else if (unformat (line_input, "instance %d", &instance))
+ ;
else
if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
{
clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
}
+
+ mp->instance = htonl (instance);
mp->encap_vrf_id = ntohl (encap_vrf_id);
mp->decap_next_index = ntohl (decap_next_index);
mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
- print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
+ print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
ntohl (mp->sw_if_index),
+ ntohl (mp->instance),
format_ip46_address, &src, IP46_TYPE_ANY,
format_ip46_address, &dst, IP46_TYPE_ANY,
ntohl (mp->encap_vrf_id),
vat_json_init_object (node);
vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
+
+ vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
+
if (mp->is_ipv6)
{
struct in6_addr ip6;
if (!vam->json_output)
{
- print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
- "sw_if_index", "src_address", "dst_address",
+ print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
+ "sw_if_index", "instance", "src_address", "dst_address",
"encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
}
u8 is_add = 1;
u8 ipv4_set = 0;
u8 ipv6_set = 0;
- u8 teb = 0;
+ u8 t_type = GRE_TUNNEL_TYPE_L3;
u8 src_set = 0;
u8 dst_set = 0;
u32 outer_fib_id = 0;
+ u32 session_id = 0;
+ u32 instance = ~0;
int ret;
memset (&src4, 0, sizeof src4);
{
if (unformat (line_input, "del"))
is_add = 0;
+ else if (unformat (line_input, "instance %d", &instance))
+ ;
else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
{
src_set = 1;
else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
;
else if (unformat (line_input, "teb"))
- teb = 1;
+ t_type = GRE_TUNNEL_TYPE_TEB;
+ else if (unformat (line_input, "erspan %d", &session_id))
+ t_type = GRE_TUNNEL_TYPE_ERSPAN;
else
{
errmsg ("parse error '%U'", format_unformat_error, line_input);
clib_memcpy (&mp->src_address, &src6, 16);
clib_memcpy (&mp->dst_address, &dst6, 16);
}
- mp->outer_fib_id = ntohl (outer_fib_id);
+ mp->instance = htonl (instance);
+ mp->outer_fib_id = htonl (outer_fib_id);
mp->is_add = is_add;
- mp->teb = teb;
+ mp->session_id = htons ((u16) session_id);
+ mp->tunnel_type = t_type;
mp->is_ipv6 = ipv6_set;
S (mp);
ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
- print (vam->ofp, "%11d%24U%24U%6d%14d",
+ print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
ntohl (mp->sw_if_index),
+ ntohl (mp->instance),
format_ip46_address, &src, IP46_TYPE_ANY,
format_ip46_address, &dst, IP46_TYPE_ANY,
- mp->teb, ntohl (mp->outer_fib_id));
+ mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id));
}
static void vl_api_gre_tunnel_details_t_handler_json
vat_json_init_object (node);
vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
+ vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
if (!mp->is_ipv6)
{
clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
vat_json_object_add_ip6 (node, "dst_address", ip6);
}
- vat_json_object_add_uint (node, "teb", mp->teb);
+ vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type);
vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
+ vat_json_object_add_uint (node, "session_id", mp->session_id);
}
static int
if (!vam->json_output)
{
- print (vam->ofp, "%11s%24s%24s%6s%14s",
- "sw_if_index", "src_address", "dst_address", "teb",
- "outer_fib_id");
+ print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
+ "sw_if_index", "instance", "src_address", "dst_address",
+ "tunnel_type", "outer_fib_id", "session_id");
}
/* Get list of gre-tunnel interfaces */
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)
{
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);
}
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);
u32 learn_limit = 0;
int ret;
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "learn-limit %d", &learn_limit))
+ ;
+ else if (unformat (line_input, "scan-delay %d", &scan_delay))
+ ;
+ else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
+ ;
+ else if (unformat (line_input, "disable"))
+ enable_disable = 0;
+ else
+ break;
+ }
+
+ M (WANT_L2_MACS_EVENTS, mp);
+ mp->enable_disable = enable_disable;
+ mp->pid = htonl (getpid ());
+ mp->learn_limit = htonl (learn_limit);
+ mp->scan_delay = (u8) scan_delay;
+ mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
+ S (mp);
+ W (ret);
+ return ret;
+}
+
+static int
+api_input_acl_set_interface (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_input_acl_set_interface_t *mp;
+ u32 sw_if_index;
+ int sw_if_index_set;
+ u32 ip4_table_index = ~0;
+ u32 ip6_table_index = ~0;
+ u32 l2_table_index = ~0;
+ u8 is_add = 1;
+ int ret;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (line_input, "learn-limit %d", &learn_limit))
+ 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, "del"))
+ is_add = 0;
+ else if (unformat (i, "ip4-table %d", &ip4_table_index))
;
- else if (unformat (line_input, "scan-delay %d", &scan_delay))
+ else if (unformat (i, "ip6-table %d", &ip6_table_index))
;
- else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
+ else if (unformat (i, "l2-table %d", &l2_table_index))
;
- else if (unformat (line_input, "disable"))
- enable_disable = 0;
else
- break;
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
}
- M (WANT_L2_MACS_EVENTS, mp);
- mp->enable_disable = enable_disable;
- mp->pid = htonl (getpid ());
- mp->learn_limit = htonl (learn_limit);
- mp->scan_delay = (u8) scan_delay;
- mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index");
+ return -99;
+ }
+
+ M (INPUT_ACL_SET_INTERFACE, mp);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->ip4_table_index = ntohl (ip4_table_index);
+ mp->ip6_table_index = ntohl (ip6_table_index);
+ mp->l2_table_index = ntohl (l2_table_index);
+ mp->is_add = is_add;
+
S (mp);
W (ret);
return ret;
}
static int
-api_input_acl_set_interface (vat_main_t * vam)
+api_output_acl_set_interface (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_input_acl_set_interface_t *mp;
+ vl_api_output_acl_set_interface_t *mp;
u32 sw_if_index;
int sw_if_index_set;
u32 ip4_table_index = ~0;
return -99;
}
- M (INPUT_ACL_SET_INTERFACE, mp);
+ M (OUTPUT_ACL_SET_INTERFACE, mp);
mp->sw_if_index = ntohl (sw_if_index);
mp->ip4_table_index = ntohl (ip4_table_index);
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)
{
return -99;
}
- /* Construct the API message */
- M (ONE_ENABLE_DISABLE, mp);
+ /* 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);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_one_enable_disable_pitr_mode (vat_main_t * vam)
+{
+ unformat_input_t *input = vam->input;
+ vl_api_one_enable_disable_pitr_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_PITR_MODE, mp);
+
+ mp->is_en = is_en;
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+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_petr_mode (vat_main_t * vam)
+{
+ unformat_input_t *input = vam->input;
+ vl_api_one_enable_disable_petr_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_PETR_MODE, mp);
+
+ mp->is_en = is_en;
+
+ /* send it... */
+ S (mp);
+
+ /* Wait for a reply... */
+ W (ret);
+ return ret;
+}
+
+static int
+api_one_show_petr_mode (vat_main_t * vam)
+{
+ vl_api_one_show_petr_mode_t *mp;
+ int ret;
- mp->is_en = is_en;
+ /* Construct the API message */
+ M (ONE_SHOW_PETR_MODE, mp);
/* send it... */
S (mp);
return ret;
}
-#define api_lisp_enable_disable api_one_enable_disable
-
static int
api_show_one_map_register_state (vat_main_t * vam)
{
}
static void
-vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path2_t * fp)
+vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
{
if (fp->afi == IP46_TYPE_IP6)
print (vam->ofp,
static void
vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
- vl_api_fib_path2_t * fp)
+ vl_api_fib_path_t * fp)
{
struct in_addr ip4;
struct in6_addr ip6;
{
vat_main_t *vam = &vat_main;
int count = ntohl (mp->mt_count);
- vl_api_fib_path2_t *fp;
+ vl_api_fib_path_t *fp;
i32 i;
print (vam->ofp, "[%d]: sw_if_index %d via:",
vat_main_t *vam = &vat_main;
vat_json_node_t *node = NULL;
int count = ntohl (mp->mt_count);
- vl_api_fib_path2_t *fp;
+ vl_api_fib_path_t *fp;
i32 i;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
vat_main_t *vam = &vat_main;
int count = ntohl (mp->count);
- vl_api_fib_path2_t *fp;
+ vl_api_fib_path_t *fp;
int i;
print (vam->ofp,
vat_main_t *vam = &vat_main;
int count = ntohl (mp->count);
vat_json_node_t *node = NULL;
- vl_api_fib_path2_t *fp;
+ vl_api_fib_path_t *fp;
int i;
if (VAT_JSON_ARRAY != vam->json_tree.type)
}
}));
/* *INDENT-ON* */
- print (vam->ofp, "%20s => %20s (%s)",
- sw_if_from_name, sw_if_to_name, states[mp->state]);
+ print (vam->ofp, "%20s => %20s (%s) %s",
+ sw_if_from_name, sw_if_to_name, states[mp->state],
+ mp->is_l2 ? "l2" : "device");
}
static void
vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
}
vat_json_object_add_uint (node, "state", mp->state);
+ vat_json_object_add_uint (node, "is-l2", mp->is_l2);
}
static int
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)
{
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);
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;
-#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))
S (mp);
W (ret);
return ret;
+
+#else
+ errmsg ("memfd_segment_create (builtin) not supported");
+ return -99;
+#endif
+}
+
+static int
+api_sock_init_shm (vat_main_t * vam)
+{
+#if VPP_API_TEST_BUILTIN == 0
+ unformat_input_t *i = vam->input;
+ vl_api_shm_elem_config_t *config = 0;
+ u64 size = 64 << 20;
+ int rv;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "size %U", unformat_memory_size, &size))
+ ;
+ else
+ break;
+ }
+
+ /* Try customized config to see if it works */
+ vec_validate (config, 3);
+ config[0].type = VL_API_VLIB_RING;
+ config[0].count = 256;
+ config[0].size = 256;
+ config[1].type = VL_API_CLIENT_RING;
+ config[1].count = 256;
+ config[1].size = 1024;
+ config[2].type = VL_API_CLIENT_RING;
+ config[2].count = 8;
+ config[2].size = 4096;
+ config[3].type = VL_API_QUEUE;
+ config[3].count = 256;
+ config[3].size = sizeof (uword);
+ rv = vl_socket_client_init_shm (config);
+ if (!rv)
+ vam->client_index_invalid = 1;
+ return rv;
+#else
+ return -99;
+#endif
}
static int
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)
{
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)
if (unformat (vam->input, "%s", &name_and_crc))
{
- message_index = vl_api_get_msg_index (name_and_crc);
+ message_index = vl_msg_api_get_msg_index (name_and_crc);
if (message_index == ~0)
{
print (vam->ofp, " '%s' not found", name_and_crc);
"<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
_(sw_interface_add_del_address, \
"<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
+_(sw_interface_set_rx_mode, \
+ "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
_(sw_interface_set_table, \
"<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
_(sw_interface_set_mpls_enable, \
"enable | disable") \
_(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
_(bridge_domain_add_del, \
- "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag <tag>] [del]\n") \
+ "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag <text>] [del]\n") \
_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
_(l2fib_add_del, \
"mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
_(tap_delete, \
"<vpp-if-name> | sw_if_index <id>") \
_(sw_interface_tap_dump, "") \
+_(tap_create_v2, \
+ "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
+_(tap_delete_v2, \
+ "<vpp-if-name> | sw_if_index <id>") \
+_(sw_interface_tap_v2_dump, "") \
+_(bond_create, \
+ "[hw-addr <mac-addr>] {round-robin | active-backup | " \
+ "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]}") \
+_(bond_delete, \
+ "<vpp-if-name> | sw_if_index <id>") \
+_(bond_enslave, \
+ "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
+_(bond_detach_slave, \
+ "sw_if_index <n>") \
+_(sw_interface_bond_dump, "") \
+_(sw_interface_slave_dump, \
+ "<vpp-if-name> | sw_if_index <id>") \
_(ip_table_add_del, \
"table-id <n> [ipv6]\n") \
_(ip_add_del_route, \
_(mpls_tunnel_add_del, \
" via <addr> [table-id <n>]\n" \
"sw_if_index <id>] [l2] [del]") \
+_(bier_table_add_del, \
+ "<label> <sub-domain> <set> <bsl> [del]") \
+_(bier_route_add_del, \
+ "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
+ "[<intfc> | sw_if_index <id>]" \
+ "[weight <n>] [del] [multipath]") \
_(proxy_arp_add_del, \
"<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
_(proxy_arp_intfc_enable_disable, \
_(ip_neighbor_add_del, \
"(<intfc> | sw_if_index <id>) dst <ip46-address> " \
"[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
-_(reset_vrf, "vrf <id> [ipv6]") \
_(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
_(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
"[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
"svr <v46-address> src <v46-address>\n" \
"rx_vrf_id <nn> server_vrf_id <nn> [del]") \
_(dhcp_proxy_set_vss, \
- "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
+ "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
_(dhcp_proxy_dump, "ip6") \
_(dhcp_client_config, \
"<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
_(sw_if_l2tpv3_tunnel_dump, "") \
_(vxlan_add_del_tunnel, \
"src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
- "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
+ "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
"vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
_(geneve_add_del_tunnel, \
"src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
_(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(gre_add_del_tunnel, \
- "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [teb] [del]\n") \
+ "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
+ "[teb | erspan <session-id>] [del]") \
_(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(l2_fib_clear_table, "") \
_(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
_(ipsec_sa_dump, "[sa_id <n>]") \
_(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
" <alg> <hex>\n") \
+_(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
_(ikev2_profile_add_del, "name <profile_name> [del]") \
_(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
"(auth_data 0x<data> | auth_data <data>)") \
_(one_map_register_set_ttl, "<ttl>") \
_(one_set_transport_protocol, "udp|api") \
_(one_get_transport_protocol, "") \
+_(one_enable_disable_xtr_mode, "enable|disable") \
+_(one_show_xtr_mode, "") \
+_(one_enable_disable_pitr_mode, "enable|disable") \
+_(one_show_pitr_mode, "") \
+_(one_enable_disable_petr_mode, "enable|disable") \
+_(one_show_petr_mode, "") \
_(show_one_nsh_mapping, "") \
_(show_one_pitr, "") \
_(show_one_use_petr, "") \
" [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
_(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
_(memfd_segment_create,"size <nnn>") \
+_(sock_init_shm, "size <nnn>") \
_(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
_(dns_enable_disable, "[enable][disable]") \
_(dns_name_server_add_del, "<ip-address> [del]") \
-_(dns_resolve_name, "<hostname>")
+_(dns_resolve_name, "<hostname>") \
+_(dns_resolve_ip, "<ip4|ip6>") \
+_(dns_name_server_add_del, "<ip-address> [del]") \
+_(dns_resolve_name, "<hostname>") \
+_(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
+ "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
+_(session_rules_dump, "") \
+_(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
+_(output_acl_set_interface, \
+ "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
+ " [l2-table <nn>] [del]") \
/* List of command functions, CLI names map directly to functions */
#define foreach_cli_function \