*------------------------------------------------------------------
* api_format.c
*
- * Copyright (c) 2014 Cisco and/or its affiliates.
+ * Copyright (c) 2014-2016 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
#include <vnet/l2/l2_vtr.h>
#include <vnet/classify/input_acl.h>
#include <vnet/classify/policer_classify.h>
+#include <vnet/classify/flow_classify.h>
#include <vnet/mpls/mpls.h>
-#if DPDK > 0
#include <vnet/ipsec/ipsec.h>
#include <vnet/ipsec/ikev2.h>
-#else
#include <inttypes.h>
-#endif
#include <vnet/map/map.h>
#include <vnet/cop/cop.h>
#include <vnet/ip/ip6_hop_by_hop.h>
#include <vnet/ip/ip_source_and_port_range_check.h>
#include <vnet/policer/xlate.h>
+#include <vnet/span/span.h>
#include <vnet/policer/policer.h>
#include <vnet/policer/police.h>
#include "vat/json_format.h"
+#include <inttypes.h>
#include <sys/stat.h>
#define vl_typedefs /* define message structures */
uword
unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
{
-#if DPDK > 0
u32 *r = va_arg (*args, u32 *);
if (0);
else
return 0;
return 1;
-#else
- return 0;
-#endif
}
uword
unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
{
-#if DPDK > 0
u32 *r = va_arg (*args, u32 *);
if (0);
else
return 0;
return 1;
-#else
- return 0;
-#endif
}
u8 *
format_ipsec_crypto_alg (u8 * s, va_list * args)
{
-#if DPDK > 0
u32 i = va_arg (*args, u32);
u8 *t = 0;
return format (s, "unknown");
}
return format (s, "%s", t);
-#else
- return format (s, "Unimplemented");
-#endif
}
uword
unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
{
-#if DPDK > 0
u32 *r = va_arg (*args, u32 *);
if (0);
else
return 0;
return 1;
-#else
- return 0;
-#endif
}
u8 *
format_ipsec_integ_alg (u8 * s, va_list * args)
{
-#if DPDK > 0
u32 i = va_arg (*args, u32);
u8 *t = 0;
return format (s, "unknown");
}
return format (s, "%s", t);
-#else
- return format (s, "Unsupported");
-#endif
}
uword
unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
{
-#if DPDK > 0
u32 *r = va_arg (*args, u32 *);
if (0);
else
return 0;
return 1;
-#else
- return 0;
-#endif
}
uword
unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
{
-#if DPDK > 0
u32 *r = va_arg (*args, u32 *);
if (0);
else
return 0;
return 1;
-#else
- return 0;
-#endif
}
uword
}
uword
-unformat_classify_table_type (unformat_input_t * input, va_list * va)
+unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
{
u32 *r = va_arg (*va, u32 *);
u32 tid;
return 1;
}
+uword
+unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
+{
+ u32 *r = va_arg (*va, u32 *);
+ u32 tid;
+
+ if (unformat (input, "ip4"))
+ tid = FLOW_CLASSIFY_TABLE_IP4;
+ else if (unformat (input, "ip6"))
+ tid = FLOW_CLASSIFY_TABLE_IP6;
+ else
+ return 0;
+
+ *r = tid;
+ return 1;
+}
+
u8 *
format_ip4_address (u8 * s, va_list * args)
{
vam->result_ready = 1;
}
-static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
- (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
-{
- vat_main_t *vam = &vat_main;
- i32 retval = ntohl (mp->retval);
- u32 sw_if_index = ntohl (mp->tunnel_sw_if_index);
-
- if (retval >= 0 && sw_if_index != (u32) ~ 0)
- {
- errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
- }
- vam->retval = retval;
- vam->result_ready = 1;
-}
-
-static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
- (vl_api_mpls_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, "tunnel_sw_if_index",
- ntohl (mp->tunnel_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_show_version_reply_t_handler
(vl_api_show_version_reply_t * mp)
{
vam->result_ready = 1;
}
-static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
- (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
+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);
}
}
-static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
- (vl_api_mpls_ethernet_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, "tunnel_sw_if_index",
- ntohl (mp->tunnel_sw_if_index));
+ ntohl (mp->sw_if_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vec_free (next_decap_str);
}
+static void
+ vl_api_lisp_adjacencies_get_reply_t_handler
+ (vl_api_lisp_adjacencies_get_reply_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ u32 i, n;
+ int retval = clib_net_to_host_u32 (mp->retval);
+ vl_api_lisp_adjacency_t *a;
+
+ if (retval)
+ goto end;
+
+ n = clib_net_to_host_u32 (mp->count);
+
+ for (i = 0; i < n; i++)
+ {
+ a = &mp->adjacencies[i];
+ fformat (vam->ofp, "%U %40U\n",
+ format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
+ format_lisp_flat_eid, a->eid_type, a->reid,
+ a->reid_prefix_len);
+ }
+
+end:
+ vam->retval = retval;
+ vam->result_ready = 1;
+}
+
+static void
+ vl_api_lisp_adjacencies_get_reply_t_handler_json
+ (vl_api_lisp_adjacencies_get_reply_t * mp)
+{
+ u8 *s = 0;
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t *e = 0, root;
+ u32 i, n;
+ int retval = clib_net_to_host_u32 (mp->retval);
+ vl_api_lisp_adjacency_t *a;
+
+ if (retval)
+ goto end;
+
+ n = clib_net_to_host_u32 (mp->count);
+ vat_json_init_array (&root);
+
+ for (i = 0; i < n; i++)
+ {
+ e = vat_json_array_add (&root);
+ a = &mp->adjacencies[i];
+
+ vat_json_init_object (e);
+ s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
+ a->leid_prefix_len);
+ vec_add1 (s, 0);
+ vat_json_object_add_string_copy (e, "leid", s);
+ vec_free (s);
+
+ s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
+ a->reid_prefix_len);
+ vec_add1 (s, 0);
+ vat_json_object_add_string_copy (e, "reid", s);
+ vec_free (s);
+ }
+
+ vat_json_print (vam->ofp, &root);
+ vat_json_free (&root);
+
+end:
+ vam->retval = retval;
+ vam->result_ready = 1;
+}
+
static void
vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
* mp)
vam->result_ready = 1;
}
+static u8 *
+format_lisp_map_request_mode (u8 * s, va_list * args)
+{
+ u32 mode = va_arg (*args, u32);
+
+ switch (mode)
+ {
+ case 0:
+ return format (0, "dst-only");
+ case 1:
+ return format (0, "src-dst");
+ }
+ return 0;
+}
+
+static void
+ vl_api_show_lisp_map_request_mode_reply_t_handler
+ (vl_api_show_lisp_map_request_mode_reply_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ i32 retval = ntohl (mp->retval);
+
+ if (0 <= retval)
+ {
+ u32 mode = mp->mode;
+ fformat (vam->ofp, "map_request_mode: %U\n",
+ format_lisp_map_request_mode, mode);
+ }
+
+ vam->retval = retval;
+ vam->result_ready = 1;
+}
+
+static void
+ vl_api_show_lisp_map_request_mode_reply_t_handler_json
+ (vl_api_show_lisp_map_request_mode_reply_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t node;
+ u8 *s = 0;
+ u32 mode;
+
+ mode = mp->mode;
+ s = format (0, "%U", format_lisp_map_request_mode, mode);
+ vec_add1 (s, 0);
+
+ vat_json_init_object (&node);
+ vat_json_object_add_string_copy (&node, "map_request_mode", s);
+ vat_json_print (vam->ofp, &node);
+ vat_json_free (&node);
+
+ vec_free (s);
+ vam->retval = ntohl (mp->retval);
+ vam->result_ready = 1;
+}
+
static void
vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
{
vam->result_ready = 1;
}
+static void vl_api_flow_classify_details_t_handler
+ (vl_api_flow_classify_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
+ ntohl (mp->table_index));
+}
+
+static void vl_api_flow_classify_details_t_handler_json
+ (vl_api_flow_classify_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t *node;
+
+ 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_uint (node, "table_index", ntohl (mp->table_index));
+}
+
+
+
#define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
#define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
#define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
#define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
+#define vl_api_lisp_adjacencies_get_reply_t_endian vl_noop_handler
+#define vl_api_lisp_adjacencies_get_reply_t_print vl_noop_handler
/*
* Generate boilerplate reply handlers, which
_(sw_interface_set_flags_reply) \
_(sw_interface_add_del_address_reply) \
_(sw_interface_set_table_reply) \
+_(sw_interface_set_mpls_enable_reply) \
_(sw_interface_set_vpath_reply) \
+_(sw_interface_set_vxlan_bypass_reply) \
_(sw_interface_set_l2_bridge_reply) \
+_(sw_interface_set_dpdk_hqos_pipe_reply) \
+_(sw_interface_set_dpdk_hqos_subport_reply) \
+_(sw_interface_set_dpdk_hqos_tctbl_reply) \
_(bridge_domain_add_del_reply) \
_(sw_interface_set_l2_xconnect_reply) \
_(l2fib_add_del_reply) \
_(ip_add_del_route_reply) \
+_(mpls_route_add_del_reply) \
+_(mpls_ip_bind_unbind_reply) \
_(proxy_arp_add_del_reply) \
_(proxy_arp_intfc_enable_disable_reply) \
-_(mpls_add_del_encap_reply) \
-_(mpls_add_del_decap_reply) \
-_(mpls_ethernet_add_del_tunnel_2_reply) \
_(sw_interface_set_unnumbered_reply) \
_(ip_neighbor_add_del_reply) \
_(reset_vrf_reply) \
_(lisp_gpe_add_del_iface_reply) \
_(lisp_enable_disable_reply) \
_(lisp_pitr_set_locator_set_reply) \
+_(lisp_map_request_mode_reply) \
_(lisp_add_del_map_request_itr_rlocs_reply) \
_(lisp_eid_table_add_del_map_reply) \
_(vxlan_gpe_add_del_tunnel_reply) \
_(set_ipfix_exporter_reply) \
_(set_ipfix_classify_stream_reply) \
_(ipfix_classify_table_add_del_reply) \
+_(flow_classify_set_interface_reply) \
+_(sw_interface_span_enable_disable_reply) \
_(pg_capture_reply) \
_(pg_enable_disable_reply) \
_(ip_source_and_port_range_check_add_del_reply) \
_(ip_source_and_port_range_check_interface_add_del_reply)\
-_(delete_subif_reply)
+_(delete_subif_reply) \
+_(l2_interface_pbb_tag_rewrite_reply) \
+_(punt_reply) \
+_(feature_enable_disable_reply) \
+_(sw_interface_tag_add_del_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
_(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
sw_interface_add_del_address_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) \
+_(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
_(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
sw_interface_set_l2_xconnect_reply) \
_(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
sw_interface_set_l2_bridge_reply) \
+_(SW_INTERFACE_SET_DPDK_HQOS_PIPE_REPLY, \
+ sw_interface_set_dpdk_hqos_pipe_reply) \
+_(SW_INTERFACE_SET_DPDK_HQOS_SUBPORT_REPLY, \
+ sw_interface_set_dpdk_hqos_subport_reply) \
+_(SW_INTERFACE_SET_DPDK_HQOS_TCTBL_REPLY, \
+ sw_interface_set_dpdk_hqos_tctbl_reply) \
_(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
_(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
_(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
_(TAP_DELETE_REPLY, tap_delete_reply) \
_(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
_(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
+_(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
+_(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
_(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
_(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
proxy_arp_intfc_enable_disable_reply) \
-_(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
-_(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
-_(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
-_(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
- mpls_ethernet_add_del_tunnel_reply) \
-_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
- mpls_ethernet_add_del_tunnel_2_reply) \
+_(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
_(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
sw_interface_set_unnumbered_reply) \
_(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
_(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
_(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
_(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
+_(LISP_MAP_REQUEST_MODE_REPLY, lisp_map_request_mode_reply) \
_(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
_(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
_(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
_(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
_(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
_(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
+_(LISP_ADJACENCIES_GET_REPLY, lisp_adjacencies_get_reply) \
_(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
_(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
lisp_add_del_map_request_itr_rlocs_reply) \
_(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
lisp_get_map_request_itr_rlocs_reply) \
_(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
+_(SHOW_LISP_MAP_REQUEST_MODE_REPLY, show_lisp_map_request_mode_reply) \
_(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
_(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
_(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
_(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
_(NETMAP_CREATE_REPLY, netmap_create_reply) \
_(NETMAP_DELETE_REPLY, netmap_delete_reply) \
-_(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
-_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
-_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
-_(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
+_(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
+_(MPLS_FIB_DETAILS, mpls_fib_details) \
_(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
_(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
_(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
_(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
_(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
_(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
+_(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
+_(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
+_(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
+_(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
_(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
_(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
_(PG_CAPTURE_REPLY, pg_capture_reply) \
ip_source_and_port_range_check_interface_add_del_reply) \
_(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
-_(DELETE_SUBIF_REPLY, delete_subif_reply)
+_(DELETE_SUBIF_REPLY, delete_subif_reply) \
+_(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
+_(PUNT_REPLY, punt_reply) \
+_(IP_FIB_DETAILS, ip_fib_details) \
+_(IP6_FIB_DETAILS, ip6_fib_details) \
+_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
+_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply)
/* M: construct, but don't yet send a message */
strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
S;
+ /* and packet-generator interfaces */
+ M (SW_INTERFACE_DUMP, sw_interface_dump);
+ mp->name_filter_valid = 1;
+ strncpy ((char *) mp->name_filter, "pg", sizeof (mp->name_filter) - 1);
+ S;
/* and vxlan-gpe tunnel interfaces */
M (SW_INTERFACE_DUMP, sw_interface_dump);
}
static int
-api_sw_interface_add_del_address (vat_main_t * vam)
+api_sw_interface_set_dpdk_hqos_pipe (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_add_del_address_t *mp;
+ vl_api_sw_interface_set_dpdk_hqos_pipe_t *mp;
f64 timeout;
u32 sw_if_index;
u8 sw_if_index_set = 0;
- u8 is_add = 1, del_all = 0;
- u32 address_length = 0;
- u8 v4_address_set = 0;
- u8 v6_address_set = 0;
- ip4_address_t v4address;
- ip6_address_t v6address;
+ u32 subport;
+ u8 subport_set = 0;
+ u32 pipe;
+ u8 pipe_set = 0;
+ u32 profile;
+ u8 profile_set = 0;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "del-all"))
- del_all = 1;
- else if (unformat (i, "del"))
- is_add = 0;
- else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ else if (unformat (i, "sw_if_index %u", &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "%U/%d",
- unformat_ip4_address, &v4address, &address_length))
- v4_address_set = 1;
- else if (unformat (i, "%U/%d",
- unformat_ip6_address, &v6address, &address_length))
- v6_address_set = 1;
+ else if (unformat (i, "subport %u", &subport))
+ subport_set = 1;
+ else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ sw_if_index_set = 1;
+ else if (unformat (i, "pipe %u", &pipe))
+ pipe_set = 1;
+ else if (unformat (i, "profile %u", &profile))
+ profile_set = 1;
else
break;
}
errmsg ("missing interface name or sw_if_index\n");
return -99;
}
- if (v4_address_set && v6_address_set)
+
+ if (subport_set == 0)
{
- errmsg ("both v4 and v6 addresses set\n");
+ errmsg ("missing subport \n");
return -99;
}
- if (!v4_address_set && !v6_address_set && !del_all)
+
+ if (pipe_set == 0)
{
- errmsg ("no addresses set\n");
+ errmsg ("missing pipe\n");
return -99;
}
- /* Construct the API message */
- M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
-
- mp->sw_if_index = ntohl (sw_if_index);
- mp->is_add = is_add;
- mp->del_all = del_all;
- if (v6_address_set)
- {
- mp->is_ipv6 = 1;
- clib_memcpy (mp->address, &v6address, sizeof (v6address));
- }
- else
+ if (profile_set == 0)
{
- clib_memcpy (mp->address, &v4address, sizeof (v4address));
+ errmsg ("missing profile\n");
+ return -99;
}
- mp->address_length = address_length;
- /* send it... */
- S;
+ M (SW_INTERFACE_SET_DPDK_HQOS_PIPE, sw_interface_set_dpdk_hqos_pipe);
- /* Wait for a reply, return good/bad news */
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->subport = ntohl (subport);
+ mp->pipe = ntohl (pipe);
+ mp->profile = ntohl (profile);
+
+
+ S;
W;
+ /* NOTREACHED */
+ return 0;
}
static int
-api_sw_interface_set_table (vat_main_t * vam)
+api_sw_interface_set_dpdk_hqos_subport (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_table_t *mp;
+ vl_api_sw_interface_set_dpdk_hqos_subport_t *mp;
f64 timeout;
- u32 sw_if_index, vrf_id = 0;
+ u32 sw_if_index;
u8 sw_if_index_set = 0;
- u8 is_ipv6 = 0;
+ u32 subport;
+ u8 subport_set = 0;
+ u32 tb_rate = 1250000000; /* 10GbE */
+ u32 tb_size = 1000000;
+ u32 tc_rate[] = { 1250000000, 1250000000, 1250000000, 1250000000 };
+ u32 tc_period = 10;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ else if (unformat (i, "sw_if_index %u", &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "vrf %d", &vrf_id))
+ else if (unformat (i, "subport %u", &subport))
+ subport_set = 1;
+ else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ sw_if_index_set = 1;
+ else if (unformat (i, "rate %u", &tb_rate))
+ {
+ u32 tc_id;
+
+ for (tc_id = 0; tc_id < (sizeof (tc_rate) / sizeof (tc_rate[0]));
+ tc_id++)
+ tc_rate[tc_id] = tb_rate;
+ }
+ else if (unformat (i, "bktsize %u", &tb_size))
+ ;
+ else if (unformat (i, "tc0 %u", &tc_rate[0]))
+ ;
+ else if (unformat (i, "tc1 %u", &tc_rate[1]))
+ ;
+ else if (unformat (i, "tc2 %u", &tc_rate[2]))
+ ;
+ else if (unformat (i, "tc3 %u", &tc_rate[3]))
+ ;
+ else if (unformat (i, "period %u", &tc_period))
;
- else if (unformat (i, "ipv6"))
- is_ipv6 = 1;
else
break;
}
return -99;
}
- /* Construct the API message */
- M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
+ if (subport_set == 0)
+ {
+ errmsg ("missing subport \n");
+ return -99;
+ }
+
+ M (SW_INTERFACE_SET_DPDK_HQOS_SUBPORT, sw_interface_set_dpdk_hqos_subport);
mp->sw_if_index = ntohl (sw_if_index);
- mp->is_ipv6 = is_ipv6;
- mp->vrf_id = ntohl (vrf_id);
+ mp->subport = ntohl (subport);
+ mp->tb_rate = ntohl (tb_rate);
+ mp->tb_size = ntohl (tb_size);
+ mp->tc_rate[0] = ntohl (tc_rate[0]);
+ mp->tc_rate[1] = ntohl (tc_rate[1]);
+ mp->tc_rate[2] = ntohl (tc_rate[2]);
+ mp->tc_rate[3] = ntohl (tc_rate[3]);
+ mp->tc_period = ntohl (tc_period);
- /* send it... */
S;
-
- /* Wait for a reply... */
W;
+ /* NOTREACHED */
+ return 0;
}
static int
-api_sw_interface_set_vpath (vat_main_t * vam)
+api_sw_interface_set_dpdk_hqos_tctbl (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_vpath_t *mp;
+ vl_api_sw_interface_set_dpdk_hqos_tctbl_t *mp;
f64 timeout;
- u32 sw_if_index = 0;
+ u32 sw_if_index;
u8 sw_if_index_set = 0;
- u8 is_enable = 0;
+ u8 entry_set = 0;
+ u8 tc_set = 0;
+ u8 queue_set = 0;
+ u32 entry, tc, queue;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ else if (unformat (i, "sw_if_index %u", &sw_if_index))
sw_if_index_set = 1;
- else if (unformat (i, "enable"))
- is_enable = 1;
- else if (unformat (i, "disable"))
- is_enable = 0;
+ else if (unformat (i, "entry %d", &entry))
+ entry_set = 1;
+ else if (unformat (i, "tc %d", &tc))
+ tc_set = 1;
+ else if (unformat (i, "queue %d", &queue))
+ queue_set = 1;
else
break;
}
return -99;
}
- /* Construct the API message */
- M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
+ if (entry_set == 0)
+ {
+ errmsg ("missing entry \n");
+ return -99;
+ }
+
+ if (tc_set == 0)
+ {
+ errmsg ("missing traffic class \n");
+ return -99;
+ }
+
+ if (queue_set == 0)
+ {
+ errmsg ("missing queue \n");
+ return -99;
+ }
+
+ M (SW_INTERFACE_SET_DPDK_HQOS_TCTBL, sw_interface_set_dpdk_hqos_tctbl);
mp->sw_if_index = ntohl (sw_if_index);
- mp->enable = is_enable;
+ mp->entry = ntohl (entry);
+ mp->tc = ntohl (tc);
+ mp->queue = ntohl (queue);
- /* send it... */
S;
-
- /* Wait for a reply... */
W;
+ /* NOTREACHED */
+ return 0;
}
static int
-api_sw_interface_set_l2_xconnect (vat_main_t * vam)
+api_sw_interface_add_del_address (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_l2_xconnect_t *mp;
+ vl_api_sw_interface_add_del_address_t *mp;
f64 timeout;
- u32 rx_sw_if_index;
- u8 rx_sw_if_index_set = 0;
- u32 tx_sw_if_index;
- u8 tx_sw_if_index_set = 0;
- u8 enable = 1;
+ u32 sw_if_index;
+ u8 sw_if_index_set = 0;
+ u8 is_add = 1, del_all = 0;
+ u32 address_length = 0;
+ u8 v4_address_set = 0;
+ u8 v6_address_set = 0;
+ ip4_address_t v4address;
+ ip6_address_t v6address;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
- rx_sw_if_index_set = 1;
- else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
- tx_sw_if_index_set = 1;
- else if (unformat (i, "rx"))
- {
- if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "%U", unformat_sw_if_index, vam,
- &rx_sw_if_index))
- rx_sw_if_index_set = 1;
- }
- else
- break;
- }
- else if (unformat (i, "tx"))
- {
- if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "%U", unformat_sw_if_index, vam,
- &tx_sw_if_index))
- tx_sw_if_index_set = 1;
- }
- else
- break;
- }
- else if (unformat (i, "enable"))
- enable = 1;
- else if (unformat (i, "disable"))
- enable = 0;
+ if (unformat (i, "del-all"))
+ del_all = 1;
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else if (unformat (i, "%U", 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, "%U/%d",
+ unformat_ip4_address, &v4address, &address_length))
+ v4_address_set = 1;
+ else if (unformat (i, "%U/%d",
+ unformat_ip6_address, &v6address, &address_length))
+ v6_address_set = 1;
else
break;
}
- if (rx_sw_if_index_set == 0)
+ if (sw_if_index_set == 0)
{
- errmsg ("missing rx interface name or rx_sw_if_index\n");
+ errmsg ("missing interface name or sw_if_index\n");
return -99;
}
-
- if (enable && (tx_sw_if_index_set == 0))
+ if (v4_address_set && v6_address_set)
{
- errmsg ("missing tx interface name or tx_sw_if_index\n");
+ errmsg ("both v4 and v6 addresses set\n");
+ return -99;
+ }
+ if (!v4_address_set && !v6_address_set && !del_all)
+ {
+ errmsg ("no addresses set\n");
return -99;
}
- M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
+ /* Construct the API message */
+ M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
- mp->rx_sw_if_index = ntohl (rx_sw_if_index);
- mp->tx_sw_if_index = ntohl (tx_sw_if_index);
- mp->enable = enable;
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_add = is_add;
+ mp->del_all = del_all;
+ if (v6_address_set)
+ {
+ mp->is_ipv6 = 1;
+ clib_memcpy (mp->address, &v6address, sizeof (v6address));
+ }
+ else
+ {
+ clib_memcpy (mp->address, &v4address, sizeof (v4address));
+ }
+ mp->address_length = address_length;
+ /* send it... */
S;
+
+ /* Wait for a reply, return good/bad news */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_sw_interface_set_l2_bridge (vat_main_t * vam)
+api_sw_interface_set_mpls_enable (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_l2_bridge_t *mp;
+ vl_api_sw_interface_set_mpls_enable_t *mp;
f64 timeout;
- u32 rx_sw_if_index;
- u8 rx_sw_if_index_set = 0;
- u32 bd_id;
- u8 bd_id_set = 0;
- u8 bvi = 0;
- u32 shg = 0;
+ u32 sw_if_index;
+ u8 sw_if_index_set = 0;
u8 enable = 1;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
- rx_sw_if_index_set = 1;
- else if (unformat (i, "bd_id %d", &bd_id))
- bd_id_set = 1;
- else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
- rx_sw_if_index_set = 1;
- else if (unformat (i, "shg %d", &shg))
- ;
- else if (unformat (i, "bvi"))
- bvi = 1;
- else if (unformat (i, "enable"))
- enable = 1;
+ if (unformat (i, "%U", 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, "disable"))
enable = 0;
+ else if (unformat (i, "dis"))
+ enable = 0;
else
break;
}
- if (rx_sw_if_index_set == 0)
- {
- errmsg ("missing rx interface name or sw_if_index\n");
- return -99;
- }
-
- if (enable && (bd_id_set == 0))
+ if (sw_if_index_set == 0)
{
- errmsg ("missing bridge domain\n");
+ errmsg ("missing interface name or sw_if_index\n");
return -99;
}
- M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_MPLS_ENABLE, sw_interface_set_mpls_enable);
- mp->rx_sw_if_index = ntohl (rx_sw_if_index);
- mp->bd_id = ntohl (bd_id);
- mp->shg = (u8) shg;
- mp->bvi = bvi;
+ mp->sw_if_index = ntohl (sw_if_index);
mp->enable = enable;
+ /* send it... */
S;
+
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_bridge_domain_dump (vat_main_t * vam)
+api_sw_interface_set_table (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_bridge_domain_dump_t *mp;
+ vl_api_sw_interface_set_table_t *mp;
f64 timeout;
- u32 bd_id = ~0;
+ u32 sw_if_index, vrf_id = 0;
+ u8 sw_if_index_set = 0;
+ u8 is_ipv6 = 0;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "bd_id %d", &bd_id))
+ if (unformat (i, "%U", 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, "vrf %d", &vrf_id))
;
+ else if (unformat (i, "ipv6"))
+ is_ipv6 = 1;
else
break;
}
- M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
- mp->bd_id = ntohl (bd_id);
- S;
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
- /* Use a control ping for synchronization */
- {
- vl_api_control_ping_t *mp;
- M (CONTROL_PING, control_ping);
- S;
- }
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_ipv6 = is_ipv6;
+ mp->vrf_id = ntohl (vrf_id);
+
+ /* send it... */
+ S;
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_bridge_domain_add_del (vat_main_t * vam)
+api_sw_interface_set_vpath (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_bridge_domain_add_del_t *mp;
+ vl_api_sw_interface_set_vpath_t *mp;
f64 timeout;
- u32 bd_id = ~0;
- u8 is_add = 1;
- u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
+ u32 sw_if_index = 0;
+ u8 sw_if_index_set = 0;
+ u8 is_enable = 0;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "bd_id %d", &bd_id))
- ;
- else if (unformat (i, "flood %d", &flood))
- ;
- else if (unformat (i, "uu-flood %d", &uu_flood))
- ;
- else if (unformat (i, "forward %d", &forward))
- ;
- else if (unformat (i, "learn %d", &learn))
- ;
- else if (unformat (i, "arp-term %d", &arp_term))
- ;
- else if (unformat (i, "del"))
- {
- is_add = 0;
- flood = uu_flood = forward = learn = 0;
- }
+ if (unformat (i, "%U", 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, "enable"))
+ is_enable = 1;
+ else if (unformat (i, "disable"))
+ is_enable = 0;
else
break;
}
- if (bd_id == ~0)
+ if (sw_if_index_set == 0)
{
- errmsg ("missing bridge domain\n");
+ errmsg ("missing interface name or sw_if_index\n");
return -99;
}
- M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
- mp->bd_id = ntohl (bd_id);
- mp->flood = flood;
- mp->uu_flood = uu_flood;
- mp->forward = forward;
- mp->learn = learn;
- mp->arp_term = arp_term;
- mp->is_add = is_add;
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = is_enable;
+ /* send it... */
S;
+
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_l2fib_add_del (vat_main_t * vam)
+api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_l2fib_add_del_t *mp;
+ vl_api_sw_interface_set_vxlan_bypass_t *mp;
f64 timeout;
- u64 mac = 0;
- u8 mac_set = 0;
- u32 bd_id;
- u8 bd_id_set = 0;
- u32 sw_if_index;
+ u32 sw_if_index = 0;
u8 sw_if_index_set = 0;
- u8 is_add = 1;
- u8 static_mac = 0;
- u8 filter_mac = 0;
- u8 bvi_mac = 0;
- int count = 1;
- f64 before = 0;
- int j;
+ u8 is_enable = 0;
+ u8 is_ipv6 = 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))
- mac_set = 1;
- else if (unformat (i, "bd_id %d", &bd_id))
- bd_id_set = 1;
+ if (unformat (i, "%U", 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, "sw_if"))
- {
- if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
- sw_if_index_set = 1;
- }
- else
- break;
- }
- else if (unformat (i, "static"))
- static_mac = 1;
- else if (unformat (i, "filter"))
- {
- filter_mac = 1;
- static_mac = 1;
- }
- else if (unformat (i, "bvi"))
- {
- bvi_mac = 1;
- static_mac = 1;
- }
- else if (unformat (i, "del"))
- is_add = 0;
- else if (unformat (i, "count %d", &count))
- ;
+ else if (unformat (i, "enable"))
+ is_enable = 1;
+ else if (unformat (i, "disable"))
+ is_enable = 0;
+ else if (unformat (i, "ip4"))
+ is_ipv6 = 0;
+ else if (unformat (i, "ip6"))
+ is_ipv6 = 1;
else
break;
}
- if (mac_set == 0)
- {
- errmsg ("missing mac address\n");
- return -99;
- }
-
- if (bd_id_set == 0)
- {
- errmsg ("missing bridge domain\n");
- return -99;
- }
-
- if (is_add && (sw_if_index_set == 0))
+ if (sw_if_index_set == 0)
{
errmsg ("missing interface name or sw_if_index\n");
return -99;
}
- if (count > 1)
- {
- /* Turn on async mode */
- vam->async_mode = 1;
- vam->async_errors = 0;
- before = vat_time_now (vam);
- }
-
- for (j = 0; j < count; j++)
- {
- M (L2FIB_ADD_DEL, l2fib_add_del);
-
- mp->mac = mac;
- mp->bd_id = ntohl (bd_id);
- mp->is_add = is_add;
-
- if (is_add)
- {
- mp->sw_if_index = ntohl (sw_if_index);
- mp->static_mac = static_mac;
- mp->filter_mac = filter_mac;
- mp->bvi_mac = bvi_mac;
- }
- increment_mac_address (&mac);
- /* send it... */
- S;
- }
-
- if (count > 1)
- {
- vl_api_control_ping_t *mp;
- f64 after;
-
- /* Shut off async mode */
- vam->async_mode = 0;
-
- M (CONTROL_PING, control_ping);
- S;
-
- timeout = vat_time_now (vam) + 1.0;
- while (vat_time_now (vam) < timeout)
- if (vam->result_ready == 1)
- goto out;
- vam->retval = -99;
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_VXLAN_BYPASS, sw_interface_set_vxlan_bypass);
- out:
- if (vam->retval == -99)
- errmsg ("timeout\n");
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = is_enable;
+ mp->is_ipv6 = is_ipv6;
- if (vam->async_errors > 0)
- {
- errmsg ("%d asynchronous errors\n", vam->async_errors);
- vam->retval = -98;
- }
- vam->async_errors = 0;
- after = vat_time_now (vam);
+ /* send it... */
+ S;
- fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
- count, after - before, count / (after - before));
- }
- else
- {
- /* Wait for a reply... */
- W;
- }
- /* Return the good/bad news */
- return (vam->retval);
+ /* Wait for a reply... */
+ W;
}
static int
-api_l2_flags (vat_main_t * vam)
+api_sw_interface_set_l2_xconnect (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_l2_flags_t *mp;
+ vl_api_sw_interface_set_l2_xconnect_t *mp;
f64 timeout;
- u32 sw_if_index;
- u32 feature_bitmap = 0;
- u8 sw_if_index_set = 0;
+ u32 rx_sw_if_index;
+ u8 rx_sw_if_index_set = 0;
+ u32 tx_sw_if_index;
+ u8 tx_sw_if_index_set = 0;
+ u8 enable = 1;
/* 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_set = 1;
- else if (unformat (i, "sw_if"))
+ if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
+ rx_sw_if_index_set = 1;
+ else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
+ tx_sw_if_index_set = 1;
+ else if (unformat (i, "rx"))
{
if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
- sw_if_index_set = 1;
+ if (unformat (i, "%U", unformat_sw_if_index, vam,
+ &rx_sw_if_index))
+ rx_sw_if_index_set = 1;
}
else
break;
}
- else if (unformat (i, "learn"))
- feature_bitmap |= L2INPUT_FEAT_LEARN;
- else if (unformat (i, "forward"))
- feature_bitmap |= L2INPUT_FEAT_FWD;
- else if (unformat (i, "flood"))
- feature_bitmap |= L2INPUT_FEAT_FLOOD;
- else if (unformat (i, "uu-flood"))
- feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
+ else if (unformat (i, "tx"))
+ {
+ if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", unformat_sw_if_index, vam,
+ &tx_sw_if_index))
+ tx_sw_if_index_set = 1;
+ }
+ else
+ break;
+ }
+ else if (unformat (i, "enable"))
+ enable = 1;
+ else if (unformat (i, "disable"))
+ enable = 0;
else
break;
}
- if (sw_if_index_set == 0)
+ if (rx_sw_if_index_set == 0)
{
- errmsg ("missing interface name or sw_if_index\n");
+ errmsg ("missing rx interface name or rx_sw_if_index\n");
return -99;
}
- M (L2_FLAGS, l2_flags);
+ if (enable && (tx_sw_if_index_set == 0))
+ {
+ errmsg ("missing tx interface name or tx_sw_if_index\n");
+ return -99;
+ }
- mp->sw_if_index = ntohl (sw_if_index);
- mp->feature_bitmap = ntohl (feature_bitmap);
+ M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
+
+ mp->rx_sw_if_index = ntohl (rx_sw_if_index);
+ mp->tx_sw_if_index = ntohl (tx_sw_if_index);
+ mp->enable = enable;
S;
W;
}
static int
-api_bridge_flags (vat_main_t * vam)
+api_sw_interface_set_l2_bridge (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_bridge_flags_t *mp;
+ vl_api_sw_interface_set_l2_bridge_t *mp;
f64 timeout;
+ u32 rx_sw_if_index;
+ u8 rx_sw_if_index_set = 0;
u32 bd_id;
u8 bd_id_set = 0;
- u8 is_set = 1;
- u32 flags = 0;
+ u8 bvi = 0;
+ u32 shg = 0;
+ u8 enable = 1;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "bd_id %d", &bd_id))
+ if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
+ rx_sw_if_index_set = 1;
+ else if (unformat (i, "bd_id %d", &bd_id))
bd_id_set = 1;
- else if (unformat (i, "learn"))
- flags |= L2_LEARN;
- else if (unformat (i, "forward"))
- flags |= L2_FWD;
- else if (unformat (i, "flood"))
- flags |= L2_FLOOD;
- else if (unformat (i, "uu-flood"))
- flags |= L2_UU_FLOOD;
- else if (unformat (i, "arp-term"))
- flags |= L2_ARP_TERM;
- else if (unformat (i, "off"))
- is_set = 0;
+ else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
+ rx_sw_if_index_set = 1;
+ else if (unformat (i, "shg %d", &shg))
+ ;
+ else if (unformat (i, "bvi"))
+ bvi = 1;
+ else if (unformat (i, "enable"))
+ enable = 1;
else if (unformat (i, "disable"))
- is_set = 0;
+ enable = 0;
else
break;
}
- if (bd_id_set == 0)
+ if (rx_sw_if_index_set == 0)
{
- errmsg ("missing bridge domain\n");
+ errmsg ("missing rx interface name or sw_if_index\n");
return -99;
}
- M (BRIDGE_FLAGS, bridge_flags);
+ if (enable && (bd_id_set == 0))
+ {
+ errmsg ("missing bridge domain\n");
+ return -99;
+ }
+
+ M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
+ mp->rx_sw_if_index = ntohl (rx_sw_if_index);
mp->bd_id = ntohl (bd_id);
- mp->feature_bitmap = ntohl (flags);
- mp->is_set = is_set;
+ mp->shg = (u8) shg;
+ mp->bvi = bvi;
+ mp->enable = enable;
S;
W;
}
static int
-api_bd_ip_mac_add_del (vat_main_t * vam)
+api_bridge_domain_dump (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_bd_ip_mac_add_del_t *mp;
+ vl_api_bridge_domain_dump_t *mp;
f64 timeout;
- u32 bd_id;
- u8 is_ipv6 = 0;
- u8 is_add = 1;
- u8 bd_id_set = 0;
- u8 ip_set = 0;
- u8 mac_set = 0;
- ip4_address_t v4addr;
- ip6_address_t v6addr;
- u8 macaddr[6];
-
+ u32 bd_id = ~0;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
if (unformat (i, "bd_id %d", &bd_id))
- {
- bd_id_set++;
- }
- else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
- {
- ip_set++;
- }
- else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
- {
- ip_set++;
- is_ipv6++;
- }
- else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
- {
- mac_set++;
- }
- else if (unformat (i, "del"))
- is_add = 0;
+ ;
else
break;
}
- if (bd_id_set == 0)
- {
- errmsg ("missing bridge domain\n");
- return -99;
- }
- else if (ip_set == 0)
- {
- errmsg ("missing IP address\n");
- return -99;
- }
- else if (mac_set == 0)
- {
- errmsg ("missing MAC address\n");
- return -99;
- }
-
- M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
-
+ M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
mp->bd_id = ntohl (bd_id);
- mp->is_ipv6 = is_ipv6;
- mp->is_add = is_add;
- if (is_ipv6)
- clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
- else
- clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
- clib_memcpy (mp->mac_address, macaddr, 6);
S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t *mp;
+ M (CONTROL_PING, control_ping);
+ S;
+ }
+
W;
/* NOTREACHED */
return 0;
}
static int
-api_tap_connect (vat_main_t * vam)
+api_bridge_domain_add_del (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_tap_connect_t *mp;
+ vl_api_bridge_domain_add_del_t *mp;
f64 timeout;
- u8 mac_address[6];
- u8 random_mac = 1;
- u8 name_set = 0;
- u8 *tap_name;
-
- memset (mac_address, 0, sizeof (mac_address));
+ u32 bd_id = ~0;
+ u8 is_add = 1;
+ u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 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_address))
+ if (unformat (i, "bd_id %d", &bd_id))
+ ;
+ else if (unformat (i, "flood %d", &flood))
+ ;
+ else if (unformat (i, "uu-flood %d", &uu_flood))
+ ;
+ else if (unformat (i, "forward %d", &forward))
+ ;
+ else if (unformat (i, "learn %d", &learn))
+ ;
+ else if (unformat (i, "arp-term %d", &arp_term))
+ ;
+ else if (unformat (i, "del"))
{
- random_mac = 0;
+ is_add = 0;
+ flood = uu_flood = forward = learn = 0;
}
- else if (unformat (i, "random-mac"))
- random_mac = 1;
- else if (unformat (i, "tapname %s", &tap_name))
- name_set = 1;
else
break;
}
- if (name_set == 0)
+ if (bd_id == ~0)
{
- errmsg ("missing tap name\n");
+ errmsg ("missing bridge domain\n");
return -99;
}
- if (vec_len (tap_name) > 63)
- {
- errmsg ("tap name too long\n");
- }
- vec_add1 (tap_name, 0);
- /* Construct the API message */
- M (TAP_CONNECT, tap_connect);
+ M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
- mp->use_random_mac = random_mac;
- clib_memcpy (mp->mac_address, mac_address, 6);
- clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
- vec_free (tap_name);
+ mp->bd_id = ntohl (bd_id);
+ mp->flood = flood;
+ mp->uu_flood = uu_flood;
+ mp->forward = forward;
+ mp->learn = learn;
+ mp->arp_term = arp_term;
+ mp->is_add = is_add;
- /* send it... */
S;
-
- /* Wait for a reply... */
W;
+ /* NOTREACHED */
+ return 0;
}
static int
-api_tap_modify (vat_main_t * vam)
+api_l2fib_add_del (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_tap_modify_t *mp;
+ vl_api_l2fib_add_del_t *mp;
f64 timeout;
- u8 mac_address[6];
- u8 random_mac = 1;
- u8 name_set = 0;
- u8 *tap_name;
+ u64 mac = 0;
+ u8 mac_set = 0;
+ u32 bd_id;
+ u8 bd_id_set = 0;
u32 sw_if_index = ~0;
u8 sw_if_index_set = 0;
-
- memset (mac_address, 0, sizeof (mac_address));
+ u8 is_add = 1;
+ u8 static_mac = 0;
+ u8 filter_mac = 0;
+ u8 bvi_mac = 0;
+ int count = 1;
+ f64 before = 0;
+ int j;
/* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
- sw_if_index_set = 1;
+ 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;
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))
+ else if (unformat (i, "sw_if"))
{
- random_mac = 0;
+ if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ sw_if_index_set = 1;
+ }
+ else
+ break;
}
- else if (unformat (i, "random-mac"))
- random_mac = 1;
- else if (unformat (i, "tapname %s", &tap_name))
- name_set = 1;
+ else if (unformat (i, "static"))
+ static_mac = 1;
+ else if (unformat (i, "filter"))
+ {
+ filter_mac = 1;
+ static_mac = 1;
+ }
+ else if (unformat (i, "bvi"))
+ {
+ bvi_mac = 1;
+ static_mac = 1;
+ }
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else if (unformat (i, "count %d", &count))
+ ;
else
break;
}
- if (sw_if_index_set == 0)
+ if (mac_set == 0)
{
- errmsg ("missing vpp interface name");
+ errmsg ("missing mac address\n");
return -99;
}
- if (name_set == 0)
+
+ if (bd_id_set == 0)
{
- errmsg ("missing tap name\n");
+ errmsg ("missing bridge domain\n");
return -99;
}
- if (vec_len (tap_name) > 63)
+
+ if (is_add && sw_if_index_set == 0 && filter_mac == 0)
{
- errmsg ("tap name too long\n");
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
}
- vec_add1 (tap_name, 0);
-
- /* Construct the API message */
- M (TAP_MODIFY, tap_modify);
-
- 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;
-
- /* Wait for a reply... */
- W;
-}
-
-static int
-api_tap_delete (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_tap_delete_t *mp;
- f64 timeout;
- u32 sw_if_index = ~0;
- u8 sw_if_index_set = 0;
- /* Parse args required to build the message */
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ if (count > 1)
{
- if (unformat (i, "%U", 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;
+ /* Turn on async mode */
+ vam->async_mode = 1;
+ vam->async_errors = 0;
+ before = vat_time_now (vam);
}
- if (sw_if_index_set == 0)
+ for (j = 0; j < count; j++)
{
- errmsg ("missing vpp interface name");
- return -99;
- }
-
- /* Construct the API message */
- M (TAP_DELETE, tap_delete);
-
- mp->sw_if_index = ntohl (sw_if_index);
-
- /* send it... */
- S;
-
- /* Wait for a reply... */
- W;
-}
-
-static int
-api_ip_add_del_route (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_ip_add_del_route_t *mp;
- f64 timeout;
- u32 sw_if_index = ~0, vrf_id = 0;
- u8 sw_if_index_set = 0;
- u8 is_ipv6 = 0;
- u8 is_local = 0, is_drop = 0;
- u8 create_vrf_if_needed = 0;
- u8 is_add = 1;
- u8 next_hop_weight = 1;
- u8 not_last = 0;
- u8 is_multipath = 0;
- u8 address_set = 0;
- u8 address_length_set = 0;
- u32 lookup_in_vrf = 0;
- u32 resolve_attempts = 0;
- u32 dst_address_length = 0;
- u8 next_hop_set = 0;
- ip4_address_t v4_dst_address, v4_next_hop_address;
- ip6_address_t v6_dst_address, v6_next_hop_address;
- int count = 1;
- int j;
- f64 before = 0;
- u32 random_add_del = 0;
- u32 *random_vector = 0;
- uword *random_hash;
- u32 random_seed = 0xdeaddabe;
- u32 classify_table_index = ~0;
- u8 is_classify = 0;
- u8 resolve_host, resolve_attached;
-
- /* Parse args required to build the message */
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "%U", 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, "%U", unformat_ip4_address, &v4_dst_address))
- {
- address_set = 1;
- is_ipv6 = 0;
- }
- else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
- {
- address_set = 1;
- is_ipv6 = 1;
- }
- else if (unformat (i, "/%d", &dst_address_length))
- {
- address_length_set = 1;
- }
-
- else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
- &v4_next_hop_address))
- {
- next_hop_set = 1;
- }
- else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
- &v6_next_hop_address))
- {
- next_hop_set = 1;
- }
- else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
- ;
- else if (unformat (i, "weight %d", &next_hop_weight))
- ;
- else if (unformat (i, "drop"))
- {
- is_drop = 1;
- }
- else if (unformat (i, "local"))
- {
- is_local = 1;
- }
- else if (unformat (i, "classify %d", &classify_table_index))
- {
- is_classify = 1;
- }
- else if (unformat (i, "del"))
- 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"))
- resolve_attached = 1;
- else if (unformat (i, "multipath"))
- is_multipath = 1;
- else if (unformat (i, "vrf %d", &vrf_id))
- ;
- else if (unformat (i, "create-vrf"))
- create_vrf_if_needed = 1;
- else if (unformat (i, "count %d", &count))
- ;
- else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
- ;
- else if (unformat (i, "random"))
- random_add_del = 1;
- else if (unformat (i, "seed %d", &random_seed))
- ;
- else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- if (resolve_attempts > 0 && sw_if_index_set == 0)
- {
- errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
- return -99;
- }
-
- if (!next_hop_set && !is_drop && !is_local && !is_classify)
- {
- errmsg ("next hop / local / drop / classify not set\n");
- return -99;
- }
-
- if (address_set == 0)
- {
- errmsg ("missing addresses\n");
- return -99;
- }
-
- if (address_length_set == 0)
- {
- errmsg ("missing address length\n");
- return -99;
- }
-
- /* Generate a pile of unique, random routes */
- if (random_add_del)
- {
- u32 this_random_address;
- random_hash = hash_create (count, sizeof (uword));
-
- hash_set (random_hash, v4_next_hop_address.as_u32, 1);
- for (j = 0; j <= count; j++)
- {
- do
- {
- this_random_address = random_u32 (&random_seed);
- this_random_address =
- clib_host_to_net_u32 (this_random_address);
- }
- while (hash_get (random_hash, this_random_address));
- vec_add1 (random_vector, this_random_address);
- hash_set (random_hash, this_random_address, 1);
- }
- hash_free (random_hash);
- v4_dst_address.as_u32 = random_vector[0];
- }
-
- if (count > 1)
- {
- /* Turn on async mode */
- vam->async_mode = 1;
- vam->async_errors = 0;
- before = vat_time_now (vam);
- }
-
- for (j = 0; j < count; j++)
- {
- /* Construct the API message */
- M (IP_ADD_DEL_ROUTE, ip_add_del_route);
-
- mp->next_hop_sw_if_index = ntohl (sw_if_index);
- mp->vrf_id = ntohl (vrf_id);
- if (resolve_attempts > 0)
- {
- mp->resolve_attempts = ntohl (resolve_attempts);
- mp->resolve_if_needed = 1;
- }
- mp->create_vrf_if_needed = create_vrf_if_needed;
+ M (L2FIB_ADD_DEL, l2fib_add_del);
+ mp->mac = mac;
+ mp->bd_id = ntohl (bd_id);
mp->is_add = is_add;
- mp->is_drop = is_drop;
- mp->is_ipv6 = is_ipv6;
- mp->is_local = is_local;
- mp->is_classify = is_classify;
- 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->lookup_in_vrf = ntohl (lookup_in_vrf);
- mp->classify_table_index = ntohl (classify_table_index);
- if (is_ipv6)
- {
- clib_memcpy (mp->dst_address, &v6_dst_address,
- sizeof (v6_dst_address));
- if (next_hop_set)
- clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
- sizeof (v6_next_hop_address));
- increment_v6_address (&v6_dst_address);
- }
- else
+ if (is_add)
{
- clib_memcpy (mp->dst_address, &v4_dst_address,
- sizeof (v4_dst_address));
- if (next_hop_set)
- clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
- sizeof (v4_next_hop_address));
- if (random_add_del)
- v4_dst_address.as_u32 = random_vector[j + 1];
- else
- increment_v4_address (&v4_dst_address);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->static_mac = static_mac;
+ mp->filter_mac = filter_mac;
+ mp->bvi_mac = bvi_mac;
}
+ increment_mac_address (&mac);
/* send it... */
S;
}
- /* When testing multiple add/del ops, use a control-ping to sync */
if (count > 1)
{
vl_api_control_ping_t *mp;
/* Wait for a reply... */
W;
}
-
/* Return the good/bad news */
return (vam->retval);
}
static int
-api_proxy_arp_add_del (vat_main_t * vam)
+api_l2_flags (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_proxy_arp_add_del_t *mp;
+ vl_api_l2_flags_t *mp;
f64 timeout;
- u32 vrf_id = 0;
- u8 is_add = 1;
- ip4_address_t lo, hi;
- u8 range_set = 0;
+ u32 sw_if_index;
+ u32 feature_bitmap = 0;
+ u8 sw_if_index_set = 0;
+ /* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "vrf %d", &vrf_id))
- ;
- else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
- unformat_ip4_address, &hi))
- range_set = 1;
- else if (unformat (i, "del"))
- is_add = 0;
- else
+ if (unformat (i, "sw_if_index %d", &sw_if_index))
+ sw_if_index_set = 1;
+ else if (unformat (i, "sw_if"))
{
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- if (range_set == 0)
- {
- errmsg ("address range not set\n");
+ if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ sw_if_index_set = 1;
+ }
+ else
+ break;
+ }
+ else if (unformat (i, "learn"))
+ feature_bitmap |= L2INPUT_FEAT_LEARN;
+ else if (unformat (i, "forward"))
+ feature_bitmap |= L2INPUT_FEAT_FWD;
+ else if (unformat (i, "flood"))
+ feature_bitmap |= L2INPUT_FEAT_FLOOD;
+ else if (unformat (i, "uu-flood"))
+ feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
+ else
+ break;
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
return -99;
}
- M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
+ M (L2_FLAGS, l2_flags);
- mp->vrf_id = ntohl (vrf_id);
- mp->is_add = is_add;
- clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
- clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->feature_bitmap = ntohl (feature_bitmap);
S;
W;
}
static int
-api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
+api_bridge_flags (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_proxy_arp_intfc_enable_disable_t *mp;
+ vl_api_bridge_flags_t *mp;
f64 timeout;
- u32 sw_if_index;
- u8 enable = 1;
- u8 sw_if_index_set = 0;
+ u32 bd_id;
+ u8 bd_id_set = 0;
+ u8 is_set = 1;
+ u32 flags = 0;
+ /* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "%U", 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, "enable"))
- enable = 1;
+ if (unformat (i, "bd_id %d", &bd_id))
+ bd_id_set = 1;
+ else if (unformat (i, "learn"))
+ flags |= L2_LEARN;
+ else if (unformat (i, "forward"))
+ flags |= L2_FWD;
+ else if (unformat (i, "flood"))
+ flags |= L2_FLOOD;
+ else if (unformat (i, "uu-flood"))
+ flags |= L2_UU_FLOOD;
+ else if (unformat (i, "arp-term"))
+ flags |= L2_ARP_TERM;
+ else if (unformat (i, "off"))
+ is_set = 0;
else if (unformat (i, "disable"))
- enable = 0;
+ is_set = 0;
else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
+ break;
}
- if (sw_if_index_set == 0)
+ if (bd_id_set == 0)
{
- errmsg ("missing interface name or sw_if_index\n");
+ errmsg ("missing bridge domain\n");
return -99;
}
- M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
+ M (BRIDGE_FLAGS, bridge_flags);
- mp->sw_if_index = ntohl (sw_if_index);
- mp->enable_disable = enable;
+ mp->bd_id = ntohl (bd_id);
+ mp->feature_bitmap = ntohl (flags);
+ mp->is_set = is_set;
S;
W;
}
static int
-api_mpls_add_del_decap (vat_main_t * vam)
+api_bd_ip_mac_add_del (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_mpls_add_del_decap_t *mp;
+ vl_api_bd_ip_mac_add_del_t *mp;
f64 timeout;
- u32 rx_vrf_id = 0;
- u32 tx_vrf_id = 0;
- u32 label = 0;
+ u32 bd_id;
+ u8 is_ipv6 = 0;
u8 is_add = 1;
- u8 s_bit = 1;
- u32 next_index = 1;
+ u8 bd_id_set = 0;
+ u8 ip_set = 0;
+ u8 mac_set = 0;
+ ip4_address_t v4addr;
+ ip6_address_t v6addr;
+ u8 macaddr[6];
+
+ /* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
- ;
- else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
- ;
- else if (unformat (i, "label %d", &label))
- ;
- else if (unformat (i, "next-index %d", &next_index))
- ;
+ if (unformat (i, "bd_id %d", &bd_id))
+ {
+ bd_id_set++;
+ }
+ else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
+ {
+ ip_set++;
+ }
+ else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
+ {
+ ip_set++;
+ is_ipv6++;
+ }
+ else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
+ {
+ mac_set++;
+ }
else if (unformat (i, "del"))
is_add = 0;
- else if (unformat (i, "s-bit-clear"))
- s_bit = 0;
else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
+ break;
+ }
+
+ if (bd_id_set == 0)
+ {
+ errmsg ("missing bridge domain\n");
+ return -99;
+ }
+ else if (ip_set == 0)
+ {
+ errmsg ("missing IP address\n");
+ return -99;
+ }
+ else if (mac_set == 0)
+ {
+ errmsg ("missing MAC address\n");
+ return -99;
}
- M (MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
+ M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
- mp->rx_vrf_id = ntohl (rx_vrf_id);
- mp->tx_vrf_id = ntohl (tx_vrf_id);
- mp->label = ntohl (label);
- mp->next_index = ntohl (next_index);
- mp->s_bit = s_bit;
+ mp->bd_id = ntohl (bd_id);
+ mp->is_ipv6 = is_ipv6;
mp->is_add = is_add;
-
+ if (is_ipv6)
+ clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
+ else
+ clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
+ clib_memcpy (mp->mac_address, macaddr, 6);
S;
W;
/* NOTREACHED */
}
static int
-api_mpls_add_del_encap (vat_main_t * vam)
+api_tap_connect (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_mpls_add_del_encap_t *mp;
+ vl_api_tap_connect_t *mp;
f64 timeout;
- u32 vrf_id = 0;
- u32 *labels = 0;
- u32 label;
- ip4_address_t dst_address;
- u8 is_add = 1;
+ u8 mac_address[6];
+ u8 random_mac = 1;
+ u8 name_set = 0;
+ u8 *tap_name;
+ u8 *tag = 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, "vrf %d", &vrf_id))
- ;
- else if (unformat (i, "label %d", &label))
- vec_add1 (labels, ntohl (label));
- else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
- ;
- else if (unformat (i, "del"))
- is_add = 0;
- else
+ if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
{
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
+ random_mac = 0;
}
+ else if (unformat (i, "random-mac"))
+ random_mac = 1;
+ else if (unformat (i, "tapname %s", &tap_name))
+ name_set = 1;
+ else if (unformat (i, "tag %s", &tag));
+ else
+ break;
+ }
+
+ if (name_set == 0)
+ {
+ errmsg ("missing tap name\n");
+ return -99;
+ }
+ if (vec_len (tap_name) > 63)
+ {
+ errmsg ("tap name too long\n");
+ return -99;
}
+ vec_add1 (tap_name, 0);
- if (vec_len (labels) == 0)
+ if (vec_len (tag) > 63)
{
- errmsg ("missing encap label stack\n");
+ errmsg ("tag too long\n");
return -99;
}
+ vec_add1 (tag, 0);
- M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
- sizeof (u32) * vec_len (labels));
+ /* Construct the API message */
+ M (TAP_CONNECT, tap_connect);
- mp->vrf_id = ntohl (vrf_id);
- clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
- mp->is_add = is_add;
- mp->nlabels = vec_len (labels);
- clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
+ mp->use_random_mac = random_mac;
+ clib_memcpy (mp->mac_address, mac_address, 6);
+ clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
+ if (tag)
+ clib_memcpy (mp->tag, tag, vec_len (tag));
- vec_free (labels);
+ vec_free (tap_name);
+ vec_free (tag);
+ /* send it... */
S;
+
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_mpls_gre_add_del_tunnel (vat_main_t * vam)
+api_tap_modify (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_mpls_gre_add_del_tunnel_t *mp;
+ vl_api_tap_modify_t *mp;
f64 timeout;
- u32 inner_vrf_id = 0;
- u32 outer_vrf_id = 0;
- ip4_address_t src_address;
- ip4_address_t dst_address;
- ip4_address_t intfc_address;
- u32 tmp;
- u8 intfc_address_length = 0;
- u8 is_add = 1;
- u8 l2_only = 0;
+ u8 mac_address[6];
+ u8 random_mac = 1;
+ u8 name_set = 0;
+ u8 *tap_name;
+ u32 sw_if_index = ~0;
+ u8 sw_if_index_set = 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, "inner_vrf_id %d", &inner_vrf_id))
- ;
- else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
- ;
- else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
- ;
- else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
- ;
- else if (unformat (i, "adj %U/%d", unformat_ip4_address,
- &intfc_address, &tmp))
- intfc_address_length = tmp;
- else if (unformat (i, "l2-only"))
- l2_only = 1;
- else if (unformat (i, "del"))
- is_add = 0;
- else
+ if (unformat (i, "%U", 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))
{
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
+ 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;
}
- M (MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
-
- mp->inner_vrf_id = ntohl (inner_vrf_id);
- mp->outer_vrf_id = ntohl (outer_vrf_id);
- clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
- clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
- clib_memcpy (mp->intfc_address, &intfc_address, sizeof (intfc_address));
- mp->intfc_address_length = intfc_address_length;
- mp->l2_only = l2_only;
- mp->is_add = is_add;
-
- S;
- W;
- /* NOTREACHED */
- return 0;
-}
-
-static int
-api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_mpls_ethernet_add_del_tunnel_t *mp;
- f64 timeout;
- u32 inner_vrf_id = 0;
- ip4_address_t intfc_address;
- u8 dst_mac_address[6];
- int dst_set = 1;
- u32 tmp;
- u8 intfc_address_length = 0;
- u8 is_add = 1;
- u8 l2_only = 0;
- u32 tx_sw_if_index;
- int tx_sw_if_index_set = 0;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "vrf %d", &inner_vrf_id))
- ;
- else if (unformat (i, "adj %U/%d", unformat_ip4_address,
- &intfc_address, &tmp))
- intfc_address_length = tmp;
- else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
- tx_sw_if_index_set = 1;
- else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
- tx_sw_if_index_set = 1;
- else if (unformat (i, "dst %U", unformat_ethernet_address,
- dst_mac_address))
- dst_set = 1;
- else if (unformat (i, "l2-only"))
- l2_only = 1;
- else if (unformat (i, "del"))
- is_add = 0;
- else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- if (!dst_set)
- {
- errmsg ("dst (mac address) not set\n");
- return -99;
- }
- if (!tx_sw_if_index_set)
+ if (sw_if_index_set == 0)
{
- errmsg ("tx-intfc not set\n");
+ errmsg ("missing vpp interface name");
return -99;
}
-
- M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
-
- mp->vrf_id = ntohl (inner_vrf_id);
- clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
- mp->adj_address_length = intfc_address_length;
- clib_memcpy (mp->dst_mac_address, dst_mac_address,
- sizeof (dst_mac_address));
- mp->tx_sw_if_index = ntohl (tx_sw_if_index);
- mp->l2_only = l2_only;
- mp->is_add = is_add;
-
- S;
- W;
- /* NOTREACHED */
- return 0;
-}
-
-static int
-api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
- f64 timeout;
- u32 inner_vrf_id = 0;
- u32 outer_vrf_id = 0;
- ip4_address_t adj_address;
- int adj_address_set = 0;
- ip4_address_t next_hop_address;
- int next_hop_address_set = 0;
- u32 tmp;
- u8 adj_address_length = 0;
- u8 l2_only = 0;
- u8 is_add = 1;
- u32 resolve_attempts = 5;
- u8 resolve_if_needed = 1;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
- ;
- else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
- ;
- else if (unformat (i, "adj %U/%d", unformat_ip4_address,
- &adj_address, &tmp))
- {
- adj_address_length = tmp;
- adj_address_set = 1;
- }
- else if (unformat (i, "next-hop %U", unformat_ip4_address,
- &next_hop_address))
- next_hop_address_set = 1;
- else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
- ;
- else if (unformat (i, "resolve-if-needed %d", &tmp))
- resolve_if_needed = tmp;
- else if (unformat (i, "l2-only"))
- l2_only = 1;
- else if (unformat (i, "del"))
- is_add = 0;
- else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- if (!adj_address_set)
+ if (name_set == 0)
{
- errmsg ("adjacency address/mask not set\n");
+ errmsg ("missing tap name\n");
return -99;
}
- if (!next_hop_address_set)
+ if (vec_len (tap_name) > 63)
{
- errmsg ("ip4 next hop address (in outer fib) not set\n");
- return -99;
+ errmsg ("tap name too long\n");
}
+ vec_add1 (tap_name, 0);
- M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
+ /* Construct the API message */
+ M (TAP_MODIFY, tap_modify);
- mp->inner_vrf_id = ntohl (inner_vrf_id);
- mp->outer_vrf_id = ntohl (outer_vrf_id);
- mp->resolve_attempts = ntohl (resolve_attempts);
- mp->resolve_if_needed = resolve_if_needed;
- mp->is_add = is_add;
- mp->l2_only = l2_only;
- clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
- mp->adj_address_length = adj_address_length;
- clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
- sizeof (next_hop_address));
+ 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;
+
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_sw_interface_set_unnumbered (vat_main_t * vam)
+api_tap_delete (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_unnumbered_t *mp;
+ vl_api_tap_delete_t *mp;
f64 timeout;
- u32 sw_if_index;
- u32 unnum_sw_index = ~0;
- u8 is_add = 1;
+ u32 sw_if_index = ~0;
u8 sw_if_index_set = 0;
+ /* Parse args required to build the message */
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
if (unformat (i, "%U", 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, "unnum_if_index %d", &unnum_sw_index))
- ;
- else if (unformat (i, "del"))
- is_add = 0;
else
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
+ break;
}
if (sw_if_index_set == 0)
{
- errmsg ("missing interface name or sw_if_index\n");
+ errmsg ("missing vpp interface name");
return -99;
}
- M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
+ /* Construct the API message */
+ M (TAP_DELETE, tap_delete);
mp->sw_if_index = ntohl (sw_if_index);
- mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
- mp->is_add = is_add;
+ /* send it... */
S;
+
+ /* Wait for a reply... */
W;
- /* NOTREACHED */
- return 0;
}
static int
-api_ip_neighbor_add_del (vat_main_t * vam)
+api_ip_add_del_route (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_ip_neighbor_add_del_t *mp;
+ vl_api_ip_add_del_route_t *mp;
f64 timeout;
- u32 sw_if_index;
- u8 sw_if_index_set = 0;
- u32 vrf_id = 0;
+ u32 sw_if_index = ~0, vrf_id = 0;
+ u8 is_ipv6 = 0;
+ u8 is_local = 0, is_drop = 0;
+ u8 is_unreach = 0, is_prohibit = 0;
+ u8 create_vrf_if_needed = 0;
u8 is_add = 1;
- u8 is_static = 0;
- u8 mac_address[6];
- u8 mac_set = 0;
- u8 v4_address_set = 0;
- u8 v6_address_set = 0;
- ip4_address_t v4address;
- ip6_address_t v6address;
-
- memset (mac_address, 0, sizeof (mac_address));
+ u32 next_hop_weight = 1;
+ u8 not_last = 0;
+ u8 is_multipath = 0;
+ u8 address_set = 0;
+ u8 address_length_set = 0;
+ u32 next_hop_table_id = 0;
+ u32 resolve_attempts = 0;
+ u32 dst_address_length = 0;
+ u8 next_hop_set = 0;
+ ip4_address_t v4_dst_address, v4_next_hop_address;
+ ip6_address_t v6_dst_address, v6_next_hop_address;
+ int count = 1;
+ int j;
+ f64 before = 0;
+ u32 random_add_del = 0;
+ u32 *random_vector = 0;
+ uword *random_hash;
+ u32 random_seed = 0xdeaddabe;
+ u32 classify_table_index = ~0;
+ u8 is_classify = 0;
+ u8 resolve_host = 0, resolve_attached = 0;
+ mpls_label_t *next_hop_out_label_stack = NULL;
+ mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
+ mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
/* 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_address))
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
{
- mac_set = 1;
+ address_set = 1;
+ is_ipv6 = 0;
+ }
+ else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
+ {
+ address_set = 1;
+ is_ipv6 = 1;
+ }
+ else if (unformat (i, "/%d", &dst_address_length))
+ {
+ address_length_set = 1;
+ }
+
+ else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
+ &v4_next_hop_address))
+ {
+ next_hop_set = 1;
+ }
+ else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
+ &v6_next_hop_address))
+ {
+ next_hop_set = 1;
+ }
+ else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
+ ;
+ else if (unformat (i, "weight %d", &next_hop_weight))
+ ;
+ else if (unformat (i, "drop"))
+ {
+ is_drop = 1;
+ }
+ else if (unformat (i, "null-send-unreach"))
+ {
+ is_unreach = 1;
+ }
+ else if (unformat (i, "null-send-prohibit"))
+ {
+ is_prohibit = 1;
+ }
+ else if (unformat (i, "local"))
+ {
+ is_local = 1;
+ }
+ else if (unformat (i, "classify %d", &classify_table_index))
+ {
+ is_classify = 1;
}
else if (unformat (i, "del"))
is_add = 0;
- else if (unformat (i, "%U", 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, "is_static"))
- is_static = 1;
+ 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"))
+ resolve_attached = 1;
+ else if (unformat (i, "multipath"))
+ is_multipath = 1;
else if (unformat (i, "vrf %d", &vrf_id))
;
- else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
- v4_address_set = 1;
- else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
- v6_address_set = 1;
+ else if (unformat (i, "create-vrf"))
+ create_vrf_if_needed = 1;
+ else if (unformat (i, "count %d", &count))
+ ;
+ else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
+ ;
+ else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
+ ;
+ else if (unformat (i, "out-label %d", &next_hop_out_label))
+ vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
+ else if (unformat (i, "via-label %d", &next_hop_via_label))
+ ;
+ else if (unformat (i, "random"))
+ random_add_del = 1;
+ else if (unformat (i, "seed %d", &random_seed))
+ ;
else
{
clib_warning ("parse error '%U'", format_unformat_error, i);
}
}
- if (sw_if_index_set == 0)
+ if (!next_hop_set && !is_drop && !is_local &&
+ !is_classify && !is_unreach && !is_prohibit &&
+ MPLS_LABEL_INVALID == next_hop_via_label)
{
- errmsg ("missing interface name or sw_if_index\n");
+ errmsg
+ ("next hop / local / drop / unreach / prohibit / classify not set\n");
return -99;
}
- if (v4_address_set && v6_address_set)
+
+ if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
{
- errmsg ("both v4 and v6 addresses set\n");
+ errmsg ("next hop and next-hop via label set\n");
return -99;
}
- if (!v4_address_set && !v6_address_set)
+ if (address_set == 0)
{
- errmsg ("no address set\n");
+ errmsg ("missing addresses\n");
return -99;
}
- /* Construct the API message */
- M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
-
- mp->sw_if_index = ntohl (sw_if_index);
- mp->is_add = is_add;
- mp->vrf_id = ntohl (vrf_id);
- mp->is_static = is_static;
- if (mac_set)
- clib_memcpy (mp->mac_address, mac_address, 6);
- if (v6_address_set)
+ if (address_length_set == 0)
{
- mp->is_ipv6 = 1;
- clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
+ errmsg ("missing address length\n");
+ return -99;
+ }
+
+ /* Generate a pile of unique, random routes */
+ if (random_add_del)
+ {
+ u32 this_random_address;
+ random_hash = hash_create (count, sizeof (uword));
+
+ hash_set (random_hash, v4_next_hop_address.as_u32, 1);
+ for (j = 0; j <= count; j++)
+ {
+ do
+ {
+ this_random_address = random_u32 (&random_seed);
+ this_random_address =
+ clib_host_to_net_u32 (this_random_address);
+ }
+ while (hash_get (random_hash, this_random_address));
+ vec_add1 (random_vector, this_random_address);
+ hash_set (random_hash, this_random_address, 1);
+ }
+ hash_free (random_hash);
+ v4_dst_address.as_u32 = random_vector[0];
+ }
+
+ if (count > 1)
+ {
+ /* Turn on async mode */
+ vam->async_mode = 1;
+ vam->async_errors = 0;
+ before = vat_time_now (vam);
+ }
+
+ for (j = 0; j < count; j++)
+ {
+ /* Construct the API message */
+ M2 (IP_ADD_DEL_ROUTE, ip_add_del_route,
+ sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
+
+ mp->next_hop_sw_if_index = ntohl (sw_if_index);
+ mp->table_id = ntohl (vrf_id);
+ mp->create_vrf_if_needed = create_vrf_if_needed;
+
+ mp->is_add = is_add;
+ mp->is_drop = is_drop;
+ mp->is_unreach = is_unreach;
+ mp->is_prohibit = is_prohibit;
+ mp->is_ipv6 = is_ipv6;
+ mp->is_local = is_local;
+ mp->is_classify = is_classify;
+ 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);
+ mp->classify_table_index = ntohl (classify_table_index);
+ mp->next_hop_via_label = ntohl (next_hop_via_label);
+ mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
+ if (0 != mp->next_hop_n_out_labels)
+ {
+ memcpy (mp->next_hop_out_label_stack,
+ next_hop_out_label_stack,
+ vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
+ vec_free (next_hop_out_label_stack);
+ }
+
+ if (is_ipv6)
+ {
+ clib_memcpy (mp->dst_address, &v6_dst_address,
+ sizeof (v6_dst_address));
+ if (next_hop_set)
+ clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
+ sizeof (v6_next_hop_address));
+ increment_v6_address (&v6_dst_address);
+ }
+ else
+ {
+ clib_memcpy (mp->dst_address, &v4_dst_address,
+ sizeof (v4_dst_address));
+ if (next_hop_set)
+ clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
+ sizeof (v4_next_hop_address));
+ if (random_add_del)
+ v4_dst_address.as_u32 = random_vector[j + 1];
+ else
+ increment_v4_address (&v4_dst_address);
+ }
+ /* send it... */
+ S;
+ /* If we receive SIGTERM, stop now... */
+ if (vam->do_exit)
+ break;
+ }
+
+ /* When testing multiple add/del ops, use a control-ping to sync */
+ if (count > 1)
+ {
+ vl_api_control_ping_t *mp;
+ f64 after;
+
+ /* Shut off async mode */
+ vam->async_mode = 0;
+
+ M (CONTROL_PING, control_ping);
+ S;
+
+ timeout = vat_time_now (vam) + 1.0;
+ while (vat_time_now (vam) < timeout)
+ if (vam->result_ready == 1)
+ goto out;
+ vam->retval = -99;
+
+ out:
+ if (vam->retval == -99)
+ errmsg ("timeout\n");
+
+ if (vam->async_errors > 0)
+ {
+ errmsg ("%d asynchronous errors\n", vam->async_errors);
+ vam->retval = -98;
+ }
+ vam->async_errors = 0;
+ after = vat_time_now (vam);
+
+ /* slim chance, but we might have eaten SIGTERM on the first iteration */
+ if (j > 0)
+ count = j;
+
+ fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
+ count, after - before, count / (after - before));
+ }
+ else
+ {
+ /* Wait for a reply... */
+ W;
+ }
+
+ /* Return the good/bad news */
+ return (vam->retval);
+}
+
+static int
+api_mpls_route_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_mpls_route_add_del_t *mp;
+ f64 timeout;
+ u32 sw_if_index = ~0, table_id = 0;
+ u8 create_table_if_needed = 0;
+ u8 is_add = 1;
+ u32 next_hop_weight = 1;
+ u8 is_multipath = 0;
+ u32 next_hop_table_id = 0;
+ u8 next_hop_set = 0;
+ ip4_address_t v4_next_hop_address = {
+ .as_u32 = 0,
+ };
+ ip6_address_t v6_next_hop_address = { {0} };
+ int count = 1;
+ int j;
+ f64 before = 0;
+ u32 classify_table_index = ~0;
+ u8 is_classify = 0;
+ u8 resolve_host = 0, resolve_attached = 0;
+ mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
+ mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
+ mpls_label_t *next_hop_out_label_stack = NULL;
+ mpls_label_t local_label = MPLS_LABEL_INVALID;
+ u8 is_eos = 0;
+ u8 next_hop_proto_is_ip4 = 1;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "%d", &local_label))
+ ;
+ else if (unformat (i, "eos"))
+ is_eos = 1;
+ else if (unformat (i, "non-eos"))
+ is_eos = 0;
+ else if (unformat (i, "via %U", unformat_ip4_address,
+ &v4_next_hop_address))
+ {
+ next_hop_set = 1;
+ next_hop_proto_is_ip4 = 1;
+ }
+ else if (unformat (i, "via %U", unformat_ip6_address,
+ &v6_next_hop_address))
+ {
+ next_hop_set = 1;
+ next_hop_proto_is_ip4 = 0;
+ }
+ else if (unformat (i, "weight %d", &next_hop_weight))
+ ;
+ else if (unformat (i, "create-table"))
+ create_table_if_needed = 1;
+ else if (unformat (i, "classify %d", &classify_table_index))
+ {
+ is_classify = 1;
+ }
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else if (unformat (i, "add"))
+ is_add = 1;
+ else if (unformat (i, "resolve-via-host"))
+ resolve_host = 1;
+ else if (unformat (i, "resolve-via-attached"))
+ resolve_attached = 1;
+ else if (unformat (i, "multipath"))
+ is_multipath = 1;
+ else if (unformat (i, "count %d", &count))
+ ;
+ else if (unformat (i, "lookup-in-ip4-table %d", &next_hop_table_id))
+ {
+ next_hop_set = 1;
+ next_hop_proto_is_ip4 = 1;
+ }
+ else if (unformat (i, "lookup-in-ip6-table %d", &next_hop_table_id))
+ {
+ next_hop_set = 1;
+ next_hop_proto_is_ip4 = 0;
+ }
+ else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
+ ;
+ else if (unformat (i, "via-label %d", &next_hop_via_label))
+ ;
+ else if (unformat (i, "out-label %d", &next_hop_out_label))
+ vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (!next_hop_set && !is_classify)
+ {
+ errmsg ("next hop / classify not set\n");
+ return -99;
+ }
+
+ if (MPLS_LABEL_INVALID == local_label)
+ {
+ errmsg ("missing label\n");
+ return -99;
+ }
+
+ if (count > 1)
+ {
+ /* Turn on async mode */
+ vam->async_mode = 1;
+ vam->async_errors = 0;
+ before = vat_time_now (vam);
+ }
+
+ for (j = 0; j < count; j++)
+ {
+ /* Construct the API message */
+ M2 (MPLS_ROUTE_ADD_DEL, mpls_route_add_del,
+ sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
+
+ mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
+ mp->mr_table_id = ntohl (table_id);
+ mp->mr_create_table_if_needed = create_table_if_needed;
+
+ mp->mr_is_add = is_add;
+ mp->mr_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
+ mp->mr_is_classify = is_classify;
+ mp->mr_is_multipath = is_multipath;
+ mp->mr_is_resolve_host = resolve_host;
+ mp->mr_is_resolve_attached = resolve_attached;
+ mp->mr_next_hop_weight = next_hop_weight;
+ mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
+ mp->mr_classify_table_index = ntohl (classify_table_index);
+ mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
+ mp->mr_label = ntohl (local_label);
+ mp->mr_eos = is_eos;
+
+ mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
+ if (0 != mp->mr_next_hop_n_out_labels)
+ {
+ memcpy (mp->mr_next_hop_out_label_stack,
+ next_hop_out_label_stack,
+ vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
+ vec_free (next_hop_out_label_stack);
+ }
+
+ if (next_hop_set)
+ {
+ if (next_hop_proto_is_ip4)
+ {
+ clib_memcpy (mp->mr_next_hop,
+ &v4_next_hop_address,
+ sizeof (v4_next_hop_address));
+ }
+ else
+ {
+ clib_memcpy (mp->mr_next_hop,
+ &v6_next_hop_address,
+ sizeof (v6_next_hop_address));
+ }
+ }
+ local_label++;
+
+ /* send it... */
+ S;
+ /* If we receive SIGTERM, stop now... */
+ if (vam->do_exit)
+ break;
+ }
+
+ /* When testing multiple add/del ops, use a control-ping to sync */
+ if (count > 1)
+ {
+ vl_api_control_ping_t *mp;
+ f64 after;
+
+ /* Shut off async mode */
+ vam->async_mode = 0;
+
+ M (CONTROL_PING, control_ping);
+ S;
+
+ timeout = vat_time_now (vam) + 1.0;
+ while (vat_time_now (vam) < timeout)
+ if (vam->result_ready == 1)
+ goto out;
+ vam->retval = -99;
+
+ out:
+ if (vam->retval == -99)
+ errmsg ("timeout\n");
+
+ if (vam->async_errors > 0)
+ {
+ errmsg ("%d asynchronous errors\n", vam->async_errors);
+ vam->retval = -98;
+ }
+ vam->async_errors = 0;
+ after = vat_time_now (vam);
+
+ /* slim chance, but we might have eaten SIGTERM on the first iteration */
+ if (j > 0)
+ count = j;
+
+ fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
+ count, after - before, count / (after - before));
+ }
+ else
+ {
+ /* Wait for a reply... */
+ W;
+ }
+
+ /* Return the good/bad news */
+ return (vam->retval);
+}
+
+static int
+api_mpls_ip_bind_unbind (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_mpls_ip_bind_unbind_t *mp;
+ f64 timeout;
+ u32 ip_table_id = 0;
+ u8 create_table_if_needed = 0;
+ u8 is_bind = 1;
+ u8 is_ip4 = 1;
+ ip4_address_t v4_address;
+ ip6_address_t v6_address;
+ u32 address_length;
+ u8 address_set = 0;
+ mpls_label_t local_label = MPLS_LABEL_INVALID;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U/%d", unformat_ip4_address,
+ &v4_address, &address_length))
+ {
+ is_ip4 = 1;
+ address_set = 1;
+ }
+ else if (unformat (i, "%U/%d", unformat_ip6_address,
+ &v6_address, &address_length))
+ {
+ is_ip4 = 0;
+ address_set = 1;
+ }
+ else if (unformat (i, "%d", &local_label))
+ ;
+ else if (unformat (i, "create-table"))
+ create_table_if_needed = 1;
+ else if (unformat (i, "table-id %d", &ip_table_id))
+ ;
+ else if (unformat (i, "unbind"))
+ is_bind = 0;
+ else if (unformat (i, "bind"))
+ is_bind = 1;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (!address_set)
+ {
+ errmsg ("IP addres not set\n");
+ return -99;
+ }
+
+ if (MPLS_LABEL_INVALID == local_label)
+ {
+ errmsg ("missing label\n");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind);
+
+ mp->mb_create_table_if_needed = create_table_if_needed;
+ mp->mb_is_bind = is_bind;
+ mp->mb_is_ip4 = is_ip4;
+ mp->mb_ip_table_id = ntohl (ip_table_id);
+ mp->mb_mpls_table_id = 0;
+ mp->mb_label = ntohl (local_label);
+ mp->mb_address_length = address_length;
+
+ if (is_ip4)
+ clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
+ else
+ clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+}
+
+static int
+api_proxy_arp_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_proxy_arp_add_del_t *mp;
+ f64 timeout;
+ u32 vrf_id = 0;
+ u8 is_add = 1;
+ ip4_address_t lo, hi;
+ u8 range_set = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "vrf %d", &vrf_id))
+ ;
+ else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
+ unformat_ip4_address, &hi))
+ range_set = 1;
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (range_set == 0)
+ {
+ errmsg ("address range not set\n");
+ return -99;
+ }
+
+ M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
+
+ mp->vrf_id = ntohl (vrf_id);
+ mp->is_add = is_add;
+ clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
+ clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_proxy_arp_intfc_enable_disable_t *mp;
+ f64 timeout;
+ u32 sw_if_index;
+ u8 enable = 1;
+ u8 sw_if_index_set = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", 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, "enable"))
+ enable = 1;
+ else if (unformat (i, "disable"))
+ enable = 0;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
+
+ M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable_disable = enable;
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_mpls_tunnel_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_mpls_tunnel_add_del_t *mp;
+ f64 timeout;
+
+ u8 is_add = 1;
+ u8 l2_only = 0;
+ u32 sw_if_index = ~0;
+ u32 next_hop_sw_if_index = ~0;
+ u32 next_hop_proto_is_ip4 = 1;
+
+ u32 next_hop_table_id = 0;
+ ip4_address_t v4_next_hop_address = {
+ .as_u32 = 0,
+ };
+ ip6_address_t v6_next_hop_address = { {0} };
+ mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID, *labels = NULL;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "add"))
+ is_add = 1;
+ else if (unformat (i, "del sw_if_index %d", &sw_if_index))
+ is_add = 0;
+ else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
+ ;
+ else if (unformat (i, "via %U",
+ unformat_ip4_address, &v4_next_hop_address))
+ {
+ next_hop_proto_is_ip4 = 1;
+ }
+ else if (unformat (i, "via %U",
+ unformat_ip6_address, &v6_next_hop_address))
+ {
+ next_hop_proto_is_ip4 = 0;
+ }
+ else if (unformat (i, "l2-only"))
+ l2_only = 1;
+ else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
+ ;
+ else if (unformat (i, "out-label %d", &next_hop_out_label))
+ vec_add1 (labels, ntohl (next_hop_out_label));
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ M2 (MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del,
+ sizeof (mpls_label_t) * vec_len (labels));
+
+ mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
+ mp->mt_sw_if_index = ntohl (sw_if_index);
+ mp->mt_is_add = is_add;
+ mp->mt_l2_only = l2_only;
+ mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
+ mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
+
+ mp->mt_next_hop_n_out_labels = vec_len (labels);
+
+ if (0 != mp->mt_next_hop_n_out_labels)
+ {
+ clib_memcpy (mp->mt_next_hop_out_label_stack, labels,
+ sizeof (mpls_label_t) * mp->mt_next_hop_n_out_labels);
+ vec_free (labels);
+ }
+
+ if (next_hop_proto_is_ip4)
+ {
+ clib_memcpy (mp->mt_next_hop,
+ &v4_next_hop_address, sizeof (v4_next_hop_address));
+ }
+ else
+ {
+ clib_memcpy (mp->mt_next_hop,
+ &v6_next_hop_address, sizeof (v6_next_hop_address));
+ }
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_sw_interface_set_unnumbered (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_set_unnumbered_t *mp;
+ f64 timeout;
+ u32 sw_if_index;
+ u32 unnum_sw_index = ~0;
+ u8 is_add = 1;
+ u8 sw_if_index_set = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "%U", 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, "unnum_if_index %d", &unnum_sw_index))
+ ;
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
+
+ M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
+ mp->is_add = is_add;
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_ip_neighbor_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_ip_neighbor_add_del_t *mp;
+ f64 timeout;
+ u32 sw_if_index;
+ u8 sw_if_index_set = 0;
+ u32 vrf_id = 0;
+ u8 is_add = 1;
+ u8 is_static = 0;
+ u8 mac_address[6];
+ u8 mac_set = 0;
+ u8 v4_address_set = 0;
+ u8 v6_address_set = 0;
+ ip4_address_t v4address;
+ ip6_address_t v6address;
+
+ 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, "mac %U", unformat_ethernet_address, mac_address))
+ {
+ mac_set = 1;
+ }
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else if (unformat (i, "%U", 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, "is_static"))
+ is_static = 1;
+ else if (unformat (i, "vrf %d", &vrf_id))
+ ;
+ else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
+ v4_address_set = 1;
+ else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
+ v6_address_set = 1;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
+ if (v4_address_set && v6_address_set)
+ {
+ errmsg ("both v4 and v6 addresses set\n");
+ return -99;
+ }
+ if (!v4_address_set && !v6_address_set)
+ {
+ errmsg ("no address set\n");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_add = is_add;
+ mp->vrf_id = ntohl (vrf_id);
+ mp->is_static = is_static;
+ if (mac_set)
+ clib_memcpy (mp->mac_address, mac_address, 6);
+ if (v6_address_set)
+ {
+ mp->is_ipv6 = 1;
+ clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
}
else
{
f64 timeout;
u32 id = 0;
int has_trace_option = 0;
- int has_pow_option = 0;
- int has_ppc_option = 0;
+ int has_pot_option = 0;
+ int has_seqno_option = 0;
+ int has_analyse_option = 0;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (input, "trace"))
has_trace_option = 1;
- else if (unformat (input, "pow"))
- has_pow_option = 1;
- else if (unformat (input, "ppc encap"))
- has_ppc_option = PPC_ENCAP;
- else if (unformat (input, "ppc decap"))
- has_ppc_option = PPC_DECAP;
- else if (unformat (input, "ppc none"))
- has_ppc_option = PPC_NONE;
+ else if (unformat (input, "pot"))
+ has_pot_option = 1;
+ else if (unformat (input, "seqno"))
+ has_seqno_option = 1;
+ else if (unformat (input, "analyse"))
+ has_analyse_option = 1;
else
break;
}
M (IOAM_ENABLE, ioam_enable);
mp->id = htons (id);
- mp->trace_ppc = has_ppc_option;
- mp->pow_enable = has_pow_option;
+ mp->seqno = has_seqno_option;
+ mp->analyse = has_analyse_option;
+ mp->pot_enable = has_pot_option;
mp->trace_enable = has_trace_option;
S;
}
+#define foreach_tcp_proto_field \
+_(src_port) \
+_(dst_port)
+
+#define foreach_udp_proto_field \
+_(src_port) \
+_(dst_port)
+
#define foreach_ip4_proto_field \
_(src_address) \
_(dst_address) \
_(tos) \
-_(length) \
+_(length) \
_(fragment_id) \
_(ttl) \
_(protocol) \
_(checksum)
+uword
+unformat_tcp_mask (unformat_input_t * input, va_list * args)
+{
+ u8 **maskp = va_arg (*args, u8 **);
+ u8 *mask = 0;
+ u8 found_something = 0;
+ tcp_header_t *tcp;
+
+#define _(a) u8 a=0;
+ foreach_tcp_proto_field;
+#undef _
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (0);
+#define _(a) else if (unformat (input, #a)) a=1;
+ foreach_tcp_proto_field
+#undef _
+ else
+ break;
+ }
+
+#define _(a) found_something += a;
+ foreach_tcp_proto_field;
+#undef _
+
+ if (found_something == 0)
+ return 0;
+
+ vec_validate (mask, sizeof (*tcp) - 1);
+
+ tcp = (tcp_header_t *) mask;
+
+#define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
+ foreach_tcp_proto_field;
+#undef _
+
+ *maskp = mask;
+ return 1;
+}
+
+uword
+unformat_udp_mask (unformat_input_t * input, va_list * args)
+{
+ u8 **maskp = va_arg (*args, u8 **);
+ u8 *mask = 0;
+ u8 found_something = 0;
+ udp_header_t *udp;
+
+#define _(a) u8 a=0;
+ foreach_udp_proto_field;
+#undef _
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (0);
+#define _(a) else if (unformat (input, #a)) a=1;
+ foreach_udp_proto_field
+#undef _
+ else
+ break;
+ }
+
+#define _(a) found_something += a;
+ foreach_udp_proto_field;
+#undef _
+
+ if (found_something == 0)
+ return 0;
+
+ vec_validate (mask, sizeof (*udp) - 1);
+
+ udp = (udp_header_t *) mask;
+
+#define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
+ foreach_udp_proto_field;
+#undef _
+
+ *maskp = mask;
+ return 1;
+}
+
+typedef struct
+{
+ u16 src_port, dst_port;
+} tcpudp_header_t;
+
+uword
+unformat_l4_mask (unformat_input_t * input, va_list * args)
+{
+ u8 **maskp = va_arg (*args, u8 **);
+ u16 src_port = 0, dst_port = 0;
+ tcpudp_header_t *tcpudp;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
+ return 1;
+ else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
+ return 1;
+ else if (unformat (input, "src_port"))
+ src_port = 0xFFFF;
+ else if (unformat (input, "dst_port"))
+ dst_port = 0xFFFF;
+ else
+ return 0;
+ }
+
+ if (!src_port && !dst_port)
+ return 0;
+
+ u8 *mask = 0;
+ vec_validate (mask, sizeof (tcpudp_header_t) - 1);
+
+ tcpudp = (tcpudp_header_t *) mask;
+ tcpudp->src_port = src_port;
+ tcpudp->dst_port = dst_port;
+
+ *maskp = mask;
+
+ return 1;
+}
+
uword
unformat_ip4_mask (unformat_input_t * input, va_list * args)
{
u8 *mask = 0;
u8 *l2 = 0;
u8 *l3 = 0;
+ u8 *l4 = 0;
int i;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
;
else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
;
+ else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
+ ;
else
break;
}
- if (mask || l2 || l3)
+ if (l4 && !l3)
+ {
+ vec_free (mask);
+ vec_free (l2);
+ vec_free (l4);
+ return 0;
+ }
+
+ if (mask || l2 || l3 || l4)
{
- if (l2 || l3)
+ if (l2 || l3 || l4)
{
/* "With a free Ethernet header in every package" */
if (l2 == 0)
vec_append (mask, l3);
vec_free (l3);
}
+ if (vec_len (l4))
+ {
+ vec_append (mask, l4);
+ vec_free (l4);
+ }
}
/* Scan forward looking for the first significant mask octet */
u32 memory_size = 32 << 20;
u8 *mask = 0;
f64 timeout;
+ u32 current_data_flag = 0;
+ int current_data_offset = 0;
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
&miss_next_index))
;
+ else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
+ ;
+ else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
+ ;
else
break;
}
mp->match_n_vectors = ntohl (match);
mp->next_table_index = ntohl (next_table_index);
mp->miss_next_index = ntohl (miss_next_index);
+ mp->current_data_flag = ntohl (current_data_flag);
+ mp->current_data_offset = ntohl (current_data_offset);
clib_memcpy (mp->mask, mask, vec_len (mask));
vec_free (mask);
/* NOTREACHED */
}
+uword
+unformat_l4_match (unformat_input_t * input, va_list * args)
+{
+ u8 **matchp = va_arg (*args, u8 **);
+
+ u8 *proto_header = 0;
+ int src_port = 0;
+ int dst_port = 0;
+
+ tcpudp_header_t h;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "src_port %d", &src_port))
+ ;
+ else if (unformat (input, "dst_port %d", &dst_port))
+ ;
+ else
+ return 0;
+ }
+
+ h.src_port = clib_host_to_net_u16 (src_port);
+ h.dst_port = clib_host_to_net_u16 (dst_port);
+ vec_validate (proto_header, sizeof (h) - 1);
+ memcpy (proto_header, &h, sizeof (h));
+
+ *matchp = proto_header;
+
+ return 1;
+}
+
uword
unformat_ip4_match (unformat_input_t * input, va_list * args)
{
ip->tos = tos_val;
if (length)
- ip->length = length_val;
+ ip->length = clib_host_to_net_u16 (length_val);
if (ttl)
ip->ttl = ttl_val;
if (checksum)
- ip->checksum = checksum_val;
+ ip->checksum = clib_host_to_net_u16 (checksum_val);
*matchp = match;
return 1;
u8 *match = 0;
u8 *l2 = 0;
u8 *l3 = 0;
+ u8 *l4 = 0;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
;
else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
;
+ else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
+ ;
else
break;
}
- if (match || l2 || l3)
+ if (l4 && !l3)
+ {
+ vec_free (match);
+ vec_free (l2);
+ vec_free (l4);
+ return 0;
+ }
+
+ if (match || l2 || l3 || l4)
{
- if (l2 || l3)
+ if (l2 || l3 || l4)
{
/* "Win a free Ethernet header in every packet" */
if (l2 == 0)
vec_append_aligned (match, l3, sizeof (u32x4));
vec_free (l3);
}
+ if (vec_len (l4))
+ {
+ vec_append_aligned (match, l4, sizeof (u32x4));
+ vec_free (l4);
+ }
}
/* Make sure the vector is big enough even if key is all 0's */
f64 timeout;
u32 skip_n_vectors = 0;
u32 match_n_vectors = 0;
+ u32 action = 0;
+ u32 metadata = 0;
/*
* Warning: you have to supply skip_n and match_n
;
else if (unformat (i, "table-index %d", &table_index))
;
+ else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
+ action = 1;
+ else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
+ action = 2;
+ else if (unformat (i, "action %d", &action))
+ ;
+ else if (unformat (i, "metadata %d", &metadata))
+ ;
else
break;
}
mp->hit_next_index = ntohl (hit_next_index);
mp->opaque_index = ntohl (opaque_index);
mp->advance = ntohl (advance);
+ mp->action = action;
+ mp->metadata = ntohl (metadata);
clib_memcpy (mp->match, match, vec_len (match));
vec_free (match);
u32 *result = va_arg (*args, u32 *);
u32 tmp;
- if (unformat (input, "drop"))
- *result = VXLAN_INPUT_NEXT_DROP;
- else if (unformat (input, "ip4"))
- *result = VXLAN_INPUT_NEXT_IP4_INPUT;
- else if (unformat (input, "ip6"))
- *result = VXLAN_INPUT_NEXT_IP6_INPUT;
- else if (unformat (input, "l2"))
+ if (unformat (input, "l2"))
*result = VXLAN_INPUT_NEXT_L2_INPUT;
else if (unformat (input, "%d", &tmp))
*result = tmp;
unformat_input_t *line_input = vam->input;
vl_api_vxlan_add_del_tunnel_t *mp;
f64 timeout;
- ip4_address_t src4, dst4;
- ip6_address_t src6, dst6;
+ ip46_address_t src, dst;
u8 is_add = 1;
u8 ipv4_set = 0, ipv6_set = 0;
u8 src_set = 0;
u8 dst_set = 0;
+ u8 grp_set = 0;
+ u32 mcast_sw_if_index = ~0;
u32 encap_vrf_id = 0;
u32 decap_next_index = ~0;
u32 vni = 0;
+ /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
+ memset (&src, 0, sizeof src);
+ memset (&dst, 0, sizeof dst);
+
while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (line_input, "del"))
is_add = 0;
- else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
+ else
+ if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
{
ipv4_set = 1;
src_set = 1;
}
- else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
+ else
+ if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
{
ipv4_set = 1;
dst_set = 1;
}
- else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
+ else
+ if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
{
ipv6_set = 1;
src_set = 1;
}
- else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
+ else
+ if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
{
ipv6_set = 1;
dst_set = 1;
}
+ else if (unformat (line_input, "group %U %U",
+ unformat_ip4_address, &dst.ip4,
+ unformat_sw_if_index, vam, &mcast_sw_if_index))
+ {
+ grp_set = dst_set = 1;
+ ipv4_set = 1;
+ }
+ else if (unformat (line_input, "group %U",
+ unformat_ip4_address, &dst.ip4))
+ {
+ grp_set = dst_set = 1;
+ ipv4_set = 1;
+ }
+ else if (unformat (line_input, "group %U %U",
+ unformat_ip6_address, &dst.ip6,
+ unformat_sw_if_index, vam, &mcast_sw_if_index))
+ {
+ grp_set = dst_set = 1;
+ ipv6_set = 1;
+ }
+ else if (unformat (line_input, "group %U",
+ unformat_ip6_address, &dst.ip6))
+ {
+ grp_set = dst_set = 1;
+ ipv6_set = 1;
+ }
+ else
+ if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
+ ;
else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
;
else if (unformat (line_input, "decap-next %U",
return -99;
}
+ if (grp_set && !ip46_address_is_multicast (&dst))
+ {
+ errmsg ("tunnel group address not multicast\n");
+ return -99;
+ }
+ if (grp_set && mcast_sw_if_index == ~0)
+ {
+ errmsg ("tunnel nonexistent multicast device\n");
+ return -99;
+ }
+
+
if (ipv4_set && ipv6_set)
{
errmsg ("both IPv4 and IPv6 addresses specified");
if (ipv6_set)
{
- clib_memcpy (&mp->src_address, &src6, sizeof (src6));
- clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
+ clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
+ clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
}
else
{
- clib_memcpy (&mp->src_address, &src4, sizeof (src4));
- clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
+ clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
+ clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
}
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);
mp->vni = ntohl (vni);
mp->is_add = is_add;
mp->is_ipv6 = ipv6_set;
(vl_api_vxlan_tunnel_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ ip46_address_t src, dst;
+
+ ip46_from_addr_buf (mp->is_ipv6, mp->src_address, &src);
+ ip46_from_addr_buf (mp->is_ipv6, mp->dst_address, &dst);
- fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
+ fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d\n",
ntohl (mp->sw_if_index),
- format_ip46_address, &(mp->src_address[0]),
- IP46_TYPE_ANY,
- format_ip46_address, &(mp->dst_address[0]),
- IP46_TYPE_ANY,
+ format_ip46_address, &src, IP46_TYPE_ANY,
+ format_ip46_address, &dst, IP46_TYPE_ANY,
ntohl (mp->encap_vrf_id),
- ntohl (mp->decap_next_index), ntohl (mp->vni));
+ ntohl (mp->decap_next_index), ntohl (mp->vni),
+ ntohl (mp->mcast_sw_if_index));
}
static void vl_api_vxlan_tunnel_details_t_handler_json
{
vat_main_t *vam = &vat_main;
vat_json_node_t *node = NULL;
- struct in_addr ip4;
- struct in6_addr ip6;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
if (mp->is_ipv6)
{
- clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
+ struct in6_addr ip6;
+
+ clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
vat_json_object_add_ip6 (node, "src_address", ip6);
- clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
+ clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
vat_json_object_add_ip6 (node, "dst_address", ip6);
}
else
{
- clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
+ struct in_addr ip4;
+
+ clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
vat_json_object_add_ip4 (node, "src_address", ip4);
- clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
+ clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
vat_json_object_add_ip4 (node, "dst_address", ip4);
}
vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
ntohl (mp->decap_next_index));
vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
+ vat_json_object_add_uint (node, "mcast_sw_if_index",
+ ntohl (mp->mcast_sw_if_index));
}
static int
if (!vam->json_output)
{
- fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
+ fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s\n",
"sw_if_index", "src_address", "dst_address",
- "encap_vrf_id", "decap_next_index", "vni");
+ "encap_vrf_id", "decap_next_index", "vni",
+ "mcast_sw_if_index");
}
/* Get list of vxlan-tunnel interfaces */
u32 custom_dev_instance = ~0;
u8 hwaddr[6];
u8 use_custom_mac = 0;
+ u8 *tag = 0;
+
+ /* Shut up coverity */
+ memset (hwaddr, 0, sizeof (hwaddr));
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
use_custom_mac = 1;
else if (unformat (i, "server"))
is_server = 1;
+ else if (unformat (i, "tag %s", &tag))
+ ;
else
break;
}
}
mp->use_custom_mac = use_custom_mac;
clib_memcpy (mp->mac_address, hwaddr, 6);
+ if (tag)
+ strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
+ vec_free (tag);
S;
W;
static int
api_ipsec_spd_add_del (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ipsec_spd_add_del_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ipsec_interface_add_del_spd (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ipsec_interface_add_del_spd_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ipsec_spd_add_del_entry (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ipsec_spd_add_del_entry_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ipsec_sad_add_del_entry (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ipsec_sad_add_del_entry_t *mp;
f64 timeout;
(i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
{
if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
- crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
+ crypto_alg >= IPSEC_CRYPTO_N_ALG)
{
clib_warning ("unsupported crypto-alg: '%U'",
format_ipsec_crypto_alg, crypto_alg);
if (unformat
(i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
{
+#if DPDK_CRYPTO==1
+ if (integ_alg < IPSEC_INTEG_ALG_NONE ||
+#else
if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
- integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
+#endif
+ integ_alg >= IPSEC_INTEG_N_ALG)
{
clib_warning ("unsupported integ-alg: '%U'",
format_ipsec_integ_alg, integ_alg);
clib_warning ("parse error '%U'", format_unformat_error, i);
return -99;
}
-
+
+ }
+
+#if DPDK_CRYPTO==1
+ /*Special cases, aes-gcm-128 encryption */
+ if (crypto_alg == IPSEC_CRYPTO_ALG_AES_GCM_128)
+ {
+ if (integ_alg != IPSEC_INTEG_ALG_NONE
+ && integ_alg != IPSEC_INTEG_ALG_AES_GCM_128)
+ {
+ clib_warning
+ ("unsupported: aes-gcm-128 crypto-alg needs none as integ-alg");
+ return -99;
+ }
+ else /*set integ-alg internally to aes-gcm-128 */
+ integ_alg = IPSEC_INTEG_ALG_AES_GCM_128;
+ }
+ else if (integ_alg == IPSEC_INTEG_ALG_AES_GCM_128)
+ {
+ clib_warning ("unsupported integ-alg: aes-gcm-128");
+ return -99;
}
+ else if (integ_alg == IPSEC_INTEG_ALG_NONE)
+ {
+ clib_warning ("unsupported integ-alg: none");
+ return -99;
+ }
+#endif
+
M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ipsec_sa_set_key (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ipsec_sa_set_key_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ikev2_profile_add_del (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ikev2_profile_add_del_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ikev2_profile_set_auth (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ikev2_profile_set_auth_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ikev2_profile_set_id (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ikev2_profile_set_id_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ikev2_profile_set_ts (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ikev2_profile_set_ts_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
static int
api_ikev2_set_local_key (vat_main_t * vam)
{
-#if DPDK > 0
unformat_input_t *i = vam->input;
vl_api_ikev2_set_local_key_t *mp;
f64 timeout;
W;
/* NOTREACHED */
return 0;
-#else
- clib_warning ("unsupported (no dpdk)");
- return -99;
-#endif
}
/*
u8 locator_set_name_set = 0;
ls_locator_t locator, *locators = 0;
u32 sw_if_index, priority, weight;
+ u32 data_len = 0;
/* Parse args required to build the message */
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
}
vec_add1 (locator_set_name, 0);
+ data_len = sizeof (ls_locator_t) * vec_len (locators);
+
/* Construct the API message */
- M (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
+ M2 (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set, data_len);
mp->is_add = is_add;
clib_memcpy (mp->locator_set_name, locator_set_name,
mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
if (locators)
- clib_memcpy (mp->locators, locators,
- (sizeof (ls_locator_t) * vec_len (locators)));
+ clib_memcpy (mp->locators, locators, data_len);
vec_free (locators);
/* send it... */
return 0;
}
+static int
+api_show_lisp_map_request_mode (vat_main_t * vam)
+{
+ f64 timeout = ~0;
+ vl_api_show_lisp_map_request_mode_t *mp;
+
+ M (SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode);
+
+ /* send */
+ S;
+
+ /* wait for reply */
+ W;
+
+ return 0;
+}
+
+static int
+api_lisp_map_request_mode (vat_main_t * vam)
+{
+ f64 timeout = ~0;
+ unformat_input_t *input = vam->input;
+ vl_api_lisp_map_request_mode_t *mp;
+ u8 mode = 0;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "dst-only"))
+ mode = 0;
+ else if (unformat (input, "src-dst"))
+ mode = 1;
+ else
+ {
+ errmsg ("parse error '%U'", format_unformat_error, input);
+ return -99;
+ }
+ }
+
+ M (LISP_MAP_REQUEST_MODE, lisp_map_request_mode);
+
+ mp->mode = mode;
+
+ /* send */
+ S;
+
+ /* wait for reply */
+ W;
+
+ /* notreached */
+ return 0;
+}
+
/**
* Enable/disable LISP proxy ITR.
*
lisp_eid_vat_t _eid, *eid = &_eid;
lisp_eid_vat_t _seid, *seid = &_seid;
u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
- u32 action = ~0, p, w;
+ u32 action = ~0, p, w, data_len;
ip4_address_t rloc4;
ip6_address_t rloc6;
rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
{
is_add = 1;
}
- else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid))
+ else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
{
eid_set = 1;
}
return -99;
}
- M (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
+ data_len = vec_len (rlocs) * sizeof (rloc_t);
+
+ M2 (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping, data_len);
mp->is_add = is_add;
mp->vni = htonl (vni);
mp->action = (u8) action;
lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
- clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
+ clib_memcpy (mp->rlocs, rlocs, data_len);
vec_free (rlocs);
/* send it... */
vl_api_lisp_add_del_adjacency_t *mp;
f64 timeout = ~0;
u32 vni = 0;
- ip4_address_t seid4, deid4;
- ip6_address_t seid6, deid6;
- u8 deid_mac[6] = { 0 };
- u8 seid_mac[6] = { 0 };
- u8 deid_type, seid_type;
- u32 seid_len = 0, deid_len = 0, len;
+ ip4_address_t leid4, reid4;
+ ip6_address_t leid6, reid6;
+ u8 reid_mac[6] = { 0 };
+ u8 leid_mac[6] = { 0 };
+ u8 reid_type, leid_type;
+ u32 leid_len = 0, reid_len = 0, len;
u8 is_add = 1;
- seid_type = deid_type = (u8) ~ 0;
+ leid_type = reid_type = (u8) ~ 0;
/* Parse args required to build the message */
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
is_add = 1;
}
- else if (unformat (input, "deid %U/%d", unformat_ip4_address,
- &deid4, &len))
+ else if (unformat (input, "reid %U/%d", unformat_ip4_address,
+ &reid4, &len))
{
- deid_type = 0; /* ipv4 */
- deid_len = len;
+ reid_type = 0; /* ipv4 */
+ reid_len = len;
}
- else if (unformat (input, "deid %U/%d", unformat_ip6_address,
- &deid6, &len))
+ else if (unformat (input, "reid %U/%d", unformat_ip6_address,
+ &reid6, &len))
{
- deid_type = 1; /* ipv6 */
- deid_len = len;
+ reid_type = 1; /* ipv6 */
+ reid_len = len;
}
- else if (unformat (input, "deid %U", unformat_ethernet_address,
- deid_mac))
+ else if (unformat (input, "reid %U", unformat_ethernet_address,
+ reid_mac))
{
- deid_type = 2; /* mac */
+ reid_type = 2; /* mac */
}
- else if (unformat (input, "seid %U/%d", unformat_ip4_address,
- &seid4, &len))
+ else if (unformat (input, "leid %U/%d", unformat_ip4_address,
+ &leid4, &len))
{
- seid_type = 0; /* ipv4 */
- seid_len = len;
+ leid_type = 0; /* ipv4 */
+ leid_len = len;
}
- else if (unformat (input, "seid %U/%d", unformat_ip6_address,
- &seid6, &len))
+ else if (unformat (input, "leid %U/%d", unformat_ip6_address,
+ &leid6, &len))
{
- seid_type = 1; /* ipv6 */
- seid_len = len;
+ leid_type = 1; /* ipv6 */
+ leid_len = len;
}
- else if (unformat (input, "seid %U", unformat_ethernet_address,
- seid_mac))
+ else if (unformat (input, "leid %U", unformat_ethernet_address,
+ leid_mac))
{
- seid_type = 2; /* mac */
+ leid_type = 2; /* mac */
}
else if (unformat (input, "vni %d", &vni))
{
}
}
- if ((u8) ~ 0 == deid_type)
+ if ((u8) ~ 0 == reid_type)
{
errmsg ("missing params!");
return -99;
}
- if (seid_type != deid_type)
+ if (leid_type != reid_type)
{
- errmsg ("source and destination EIDs are of different types!");
+ errmsg ("remote and local EIDs are of different types!");
return -99;
}
M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
mp->is_add = is_add;
mp->vni = htonl (vni);
- mp->seid_len = seid_len;
- mp->deid_len = deid_len;
- mp->eid_type = deid_type;
+ mp->leid_len = leid_len;
+ mp->reid_len = reid_len;
+ mp->eid_type = reid_type;
switch (mp->eid_type)
{
case 0:
- clib_memcpy (mp->seid, &seid4, sizeof (seid4));
- clib_memcpy (mp->deid, &deid4, sizeof (deid4));
+ clib_memcpy (mp->leid, &leid4, sizeof (leid4));
+ clib_memcpy (mp->reid, &reid4, sizeof (reid4));
break;
case 1:
- clib_memcpy (mp->seid, &seid6, sizeof (seid6));
- clib_memcpy (mp->deid, &deid6, sizeof (deid6));
+ clib_memcpy (mp->leid, &leid6, sizeof (leid6));
+ clib_memcpy (mp->reid, &reid6, sizeof (reid6));
break;
case 2:
- clib_memcpy (mp->seid, seid_mac, 6);
- clib_memcpy (mp->deid, deid_mac, 6);
+ clib_memcpy (mp->leid, leid_mac, 6);
+ clib_memcpy (mp->reid, reid_mac, 6);
break;
default:
errmsg ("unknown EID type %d!", mp->eid_type);
return -99;
}
- if (vec_len (ls_name) > 63)
+ if (vec_len (ls_name) > 62)
{
errmsg ("error: locator set name too long!");
return -99;
else
{
vec_add1 (ls_name, 0);
- strncpy ((char *) mp->ls_name, (char *) ls_name, sizeof (mp->ls_name));
+ strncpy ((char *) mp->ls_name, (char *) ls_name,
+ sizeof (mp->ls_name) - 1);
}
/* send it... */
return 0;
}
+static int
+api_lisp_adjacencies_get (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_lisp_adjacencies_get_t *mp;
+ f64 timeout = ~0;
+ u8 vni_set = 0;
+ u32 vni = ~0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "vni %d", &vni))
+ {
+ vni_set = 1;
+ }
+ else
+ {
+ errmsg ("parse error '%U'\n", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ if (!vni_set)
+ {
+ errmsg ("vni not set!\n");
+ return -99;
+ }
+
+ if (!vam->json_output)
+ {
+ fformat (vam->ofp, "%s %40s\n", "leid", "reid");
+ }
+
+ M (LISP_ADJACENCIES_GET, lisp_adjacencies_get);
+ mp->vni = clib_host_to_net_u32 (vni);
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
+}
+
static int
api_lisp_map_resolver_dump (vat_main_t * vam)
{
f64 timeout = ~0;
u8 type = POLICER_CLASSIFY_N_TABLES;
- if (unformat (i, "type %U", unformat_classify_table_type, &type))
+ if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
;
else
{
return 0;
}
-static void vl_api_mpls_gre_tunnel_details_t_handler
- (vl_api_mpls_gre_tunnel_details_t * mp)
+static void vl_api_mpls_tunnel_details_t_handler
+ (vl_api_mpls_tunnel_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ i32 len = mp->mt_next_hop_n_labels;
i32 i;
- i32 len = ntohl (mp->nlabels);
- if (mp->l2_only == 0)
- {
- fformat (vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
- ntohl (mp->tunnel_index),
- format_ip4_address, &mp->tunnel_src,
- format_ip4_address, &mp->tunnel_dst,
- format_ip4_address, &mp->intfc_address,
- ntohl (mp->mask_width));
- for (i = 0; i < len; i++)
- {
- fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
- }
- fformat (vam->ofp, "\n");
- fformat (vam->ofp, " inner fib index %d, outer fib index %d\n",
- ntohl (mp->inner_fib_index), ntohl (mp->outer_fib_index));
- }
- else
+ fformat (vam->ofp, "[%d]: via %U %d labels ",
+ mp->tunnel_index,
+ format_ip4_address, mp->mt_next_hop,
+ ntohl (mp->mt_next_hop_sw_if_index));
+ for (i = 0; i < len; i++)
{
- fformat (vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
- ntohl (mp->tunnel_index),
- format_ip4_address, &mp->tunnel_src,
- format_ip4_address, &mp->tunnel_dst,
- format_ip4_address, &mp->intfc_address);
- for (i = 0; i < len; i++)
- {
- fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
- }
- fformat (vam->ofp, "\n");
- fformat (vam->ofp, " l2 interface %d, outer fib index %d\n",
- ntohl (mp->hw_if_index), ntohl (mp->outer_fib_index));
+ fformat (vam->ofp, "%u ", ntohl (mp->mt_next_hop_out_labels[i]));
}
+ fformat (vam->ofp, "\n");
}
-static void vl_api_mpls_gre_tunnel_details_t_handler_json
- (vl_api_mpls_gre_tunnel_details_t * mp)
+static void vl_api_mpls_tunnel_details_t_handler_json
+ (vl_api_mpls_tunnel_details_t * mp)
{
vat_main_t *vam = &vat_main;
vat_json_node_t *node = NULL;
struct in_addr ip4;
i32 i;
- i32 len = ntohl (mp->nlabels);
+ i32 len = mp->mt_next_hop_n_labels;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
vat_json_init_object (node);
vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
- clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
- vat_json_object_add_ip4 (node, "intfc_address", ip4);
- vat_json_object_add_uint (node, "inner_fib_index",
- ntohl (mp->inner_fib_index));
- vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
- vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
- vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
- vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
- clib_memcpy (&ip4, &(mp->tunnel_src), sizeof (ip4));
- vat_json_object_add_ip4 (node, "tunnel_src", ip4);
- clib_memcpy (&ip4, &(mp->tunnel_dst), sizeof (ip4));
- vat_json_object_add_ip4 (node, "tunnel_dst", ip4);
- vat_json_object_add_uint (node, "outer_fib_index",
- ntohl (mp->outer_fib_index));
+ clib_memcpy (&ip4, &(mp->mt_next_hop), sizeof (ip4));
+ vat_json_object_add_ip4 (node, "next_hop", ip4);
+ vat_json_object_add_uint (node, "next_hop_sw_if_index",
+ ntohl (mp->mt_next_hop_sw_if_index));
+ vat_json_object_add_uint (node, "l2_only", ntohl (mp->mt_l2_only));
vat_json_object_add_uint (node, "label_count", len);
for (i = 0; i < len; i++)
{
- vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
+ vat_json_object_add_uint (node, "label",
+ ntohl (mp->mt_next_hop_out_labels[i]));
}
}
static int
-api_mpls_gre_tunnel_dump (vat_main_t * vam)
+api_mpls_tunnel_dump (vat_main_t * vam)
{
- vl_api_mpls_gre_tunnel_dump_t *mp;
+ vl_api_mpls_tunnel_dump_t *mp;
f64 timeout;
i32 index = -1;
fformat (vam->ofp, " tunnel_index %d\n", index);
- M (MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
+ M (MPLS_TUNNEL_DUMP, mpls_tunnel_dump);
mp->tunnel_index = htonl (index);
S;
W;
}
-static void vl_api_mpls_eth_tunnel_details_t_handler
- (vl_api_mpls_eth_tunnel_details_t * mp)
+#define vl_api_mpls_fib_details_t_endian vl_noop_handler
+#define vl_api_mpls_fib_details_t_print vl_noop_handler
+
+static void
+vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
- i32 i;
- i32 len = ntohl (mp->nlabels);
+ int count = ntohl (mp->count);
+ vl_api_fib_path_t *fp;
+ int i;
- fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
- ntohl (mp->tunnel_index),
- format_ethernet_address, &mp->tunnel_dst_mac,
- format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
- for (i = 0; i < len; i++)
+ fformat (vam->ofp,
+ "table-id %d, label %u, ess_bit %u\n",
+ ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
{
- fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
+ if (fp->afi == IP46_TYPE_IP6)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip6_address, fp->next_hop);
+ else if (fp->afi == IP46_TYPE_IP4)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip4_address, fp->next_hop);
+ fp++;
}
- fformat (vam->ofp, "\n");
- fformat (vam->ofp, " tx on %d, rx fib index %d\n",
- ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
}
-static void vl_api_mpls_eth_tunnel_details_t_handler_json
- (vl_api_mpls_eth_tunnel_details_t * mp)
+static void vl_api_mpls_fib_details_t_handler_json
+ (vl_api_mpls_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ int count = ntohl (mp->count);
vat_json_node_t *node = NULL;
struct in_addr ip4;
- i32 i;
- i32 len = ntohl (mp->nlabels);
+ struct in6_addr ip6;
+ vl_api_fib_path_t *fp;
+ int i;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
node = vat_json_array_add (&vam->json_tree);
vat_json_init_object (node);
- vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
- clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
- vat_json_object_add_ip4 (node, "intfc_address", ip4);
- vat_json_object_add_uint (node, "inner_fib_index",
- ntohl (mp->inner_fib_index));
- vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
- vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
- vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
- vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
- vat_json_object_add_string_copy (node, "tunnel_dst_mac",
- format (0, "%U", format_ethernet_address,
- &mp->tunnel_dst_mac));
- vat_json_object_add_uint (node, "tx_sw_if_index",
- ntohl (mp->tx_sw_if_index));
- vat_json_object_add_uint (node, "label_count", len);
- for (i = 0; i < len; i++)
+ vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
+ vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
+ vat_json_object_add_uint (node, "label", ntohl (mp->label));
+ vat_json_object_add_uint (node, "path_count", count);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
{
- vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
+ vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
+ vat_json_object_add_uint (node, "is_local", fp->is_local);
+ vat_json_object_add_uint (node, "is_drop", fp->is_drop);
+ vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
+ vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
+ vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
+ if (fp->afi == IP46_TYPE_IP4)
+ {
+ clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "next_hop", ip4);
+ }
+ else if (fp->afi == IP46_TYPE_IP6)
+ {
+ clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
+ vat_json_object_add_ip6 (node, "next_hop", ip6);
+ }
}
}
static int
-api_mpls_eth_tunnel_dump (vat_main_t * vam)
+api_mpls_fib_dump (vat_main_t * vam)
{
- vl_api_mpls_eth_tunnel_dump_t *mp;
+ vl_api_mpls_fib_dump_t *mp;
f64 timeout;
- i32 index = -1;
- /* Parse args required to build the message */
- while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
- {
- if (!unformat (vam->input, "tunnel_index %d", &index))
- {
- index = -1;
- break;
- }
- }
-
- fformat (vam->ofp, " tunnel_index %d\n", index);
-
- M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
- mp->tunnel_index = htonl (index);
+ M (MPLS_FIB_DUMP, mpls_fib_dump);
S;
/* Use a control ping for synchronization */
W;
}
-static void vl_api_mpls_fib_encap_details_t_handler
- (vl_api_mpls_fib_encap_details_t * mp)
+#define vl_api_ip_fib_details_t_endian vl_noop_handler
+#define vl_api_ip_fib_details_t_print vl_noop_handler
+
+static void
+vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
- i32 i;
- i32 len = ntohl (mp->nlabels);
+ int count = ntohl (mp->count);
+ vl_api_fib_path_t *fp;
+ int i;
- fformat (vam->ofp, "table %d, dest %U, label ",
- ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
- for (i = 0; i < len; i++)
+ fformat (vam->ofp,
+ "table-id %d, prefix %U/%d\n",
+ ntohl (mp->table_id), format_ip4_address, mp->address,
+ mp->address_length);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
{
- fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
+ if (fp->afi == IP46_TYPE_IP6)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip6_address, fp->next_hop);
+ else if (fp->afi == IP46_TYPE_IP4)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip4_address, fp->next_hop);
+ fp++;
}
- fformat (vam->ofp, "\n");
}
-static void vl_api_mpls_fib_encap_details_t_handler_json
- (vl_api_mpls_fib_encap_details_t * mp)
+static void vl_api_ip_fib_details_t_handler_json
+ (vl_api_ip_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ int count = ntohl (mp->count);
vat_json_node_t *node = NULL;
- i32 i;
- i32 len = ntohl (mp->nlabels);
struct in_addr ip4;
+ struct in6_addr ip6;
+ vl_api_fib_path_t *fp;
+ int i;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
node = vat_json_array_add (&vam->json_tree);
vat_json_init_object (node);
- vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
- vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
- clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
- vat_json_object_add_ip4 (node, "dest", ip4);
- vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
- vat_json_object_add_uint (node, "label_count", len);
- for (i = 0; i < len; i++)
+ vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
+ clib_memcpy (&ip4, &mp->address, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "prefix", ip4);
+ vat_json_object_add_uint (node, "mask_length", mp->address_length);
+ vat_json_object_add_uint (node, "path_count", count);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
{
- vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
+ vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
+ vat_json_object_add_uint (node, "is_local", fp->is_local);
+ vat_json_object_add_uint (node, "is_drop", fp->is_drop);
+ vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
+ vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
+ vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
+ if (fp->afi == IP46_TYPE_IP4)
+ {
+ clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "next_hop", ip4);
+ }
+ else if (fp->afi == IP46_TYPE_IP6)
+ {
+ clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
+ vat_json_object_add_ip6 (node, "next_hop", ip6);
+ }
}
}
static int
-api_mpls_fib_encap_dump (vat_main_t * vam)
+api_ip_fib_dump (vat_main_t * vam)
{
- vl_api_mpls_fib_encap_dump_t *mp;
+ vl_api_ip_fib_dump_t *mp;
f64 timeout;
- M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
+ M (IP_FIB_DUMP, ip_fib_dump);
S;
/* Use a control ping for synchronization */
W;
}
-static void vl_api_mpls_fib_decap_details_t_handler
- (vl_api_mpls_fib_decap_details_t * mp)
+#define vl_api_ip6_fib_details_t_endian vl_noop_handler
+#define vl_api_ip6_fib_details_t_print vl_noop_handler
+
+static void
+vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ int count = ntohl (mp->count);
+ vl_api_fib_path_t *fp;
+ int i;
fformat (vam->ofp,
- "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
- ntohl (mp->rx_table_id), ntohl (mp->tx_table_id), mp->swif_tag,
- ntohl (mp->label), ntohl (mp->s_bit));
+ "table-id %d, prefix %U/%d\n",
+ ntohl (mp->table_id), format_ip6_address, mp->address,
+ mp->address_length);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
+ {
+ if (fp->afi == IP46_TYPE_IP6)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip6_address, fp->next_hop);
+ else if (fp->afi == IP46_TYPE_IP4)
+ fformat (vam->ofp,
+ " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
+ "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U\n",
+ ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
+ fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
+ format_ip4_address, fp->next_hop);
+ fp++;
+ }
}
-static void vl_api_mpls_fib_decap_details_t_handler_json
- (vl_api_mpls_fib_decap_details_t * mp)
+static void vl_api_ip6_fib_details_t_handler_json
+ (vl_api_ip6_fib_details_t * mp)
{
vat_main_t *vam = &vat_main;
+ int count = ntohl (mp->count);
vat_json_node_t *node = NULL;
struct in_addr ip4;
+ struct in6_addr ip6;
+ vl_api_fib_path_t *fp;
+ int i;
if (VAT_JSON_ARRAY != vam->json_tree.type)
{
node = vat_json_array_add (&vam->json_tree);
vat_json_init_object (node);
- vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
- vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
- clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
- vat_json_object_add_ip4 (node, "dest", ip4);
- vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
- vat_json_object_add_uint (node, "label", ntohl (mp->label));
- vat_json_object_add_uint (node, "rx_table_id", ntohl (mp->rx_table_id));
- vat_json_object_add_uint (node, "tx_table_id", ntohl (mp->tx_table_id));
- vat_json_object_add_string_copy (node, "swif_tag", mp->swif_tag);
+ vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
+ clib_memcpy (&ip6, &mp->address, sizeof (ip6));
+ vat_json_object_add_ip6 (node, "prefix", ip6);
+ vat_json_object_add_uint (node, "mask_length", mp->address_length);
+ vat_json_object_add_uint (node, "path_count", count);
+ fp = mp->path;
+ for (i = 0; i < count; i++)
+ {
+ vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
+ vat_json_object_add_uint (node, "is_local", fp->is_local);
+ vat_json_object_add_uint (node, "is_drop", fp->is_drop);
+ vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
+ vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
+ vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
+ if (fp->afi == IP46_TYPE_IP4)
+ {
+ clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "next_hop", ip4);
+ }
+ else if (fp->afi == IP46_TYPE_IP6)
+ {
+ clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
+ vat_json_object_add_ip6 (node, "next_hop", ip6);
+ }
+ }
}
static int
-api_mpls_fib_decap_dump (vat_main_t * vam)
+api_ip6_fib_dump (vat_main_t * vam)
{
- vl_api_mpls_fib_decap_dump_t *mp;
+ vl_api_ip6_fib_dump_t *mp;
f64 timeout;
- M (MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
+ M (IP6_FIB_DUMP, ip6_fib_dump);
S;
/* Use a control ping for synchronization */
mp->transport_protocol);
}
+static int
+api_sw_interface_span_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_span_enable_disable_t *mp;
+ f64 timeout;
+ u32 src_sw_if_index = ~0;
+ u32 dst_sw_if_index = ~0;
+ u8 enable = 1;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "src %U", unformat_sw_if_index, vam, &src_sw_if_index))
+ ;
+ else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
+ ;
+ else
+ if (unformat
+ (i, "dst %U", unformat_sw_if_index, vam, &dst_sw_if_index))
+ ;
+ else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
+ ;
+ else if (unformat (i, "disable"))
+ enable = 0;
+ else
+ break;
+ }
+
+ M (SW_INTERFACE_SPAN_ENABLE_DISABLE, sw_interface_span_enable_disable);
+
+ mp->sw_if_index_from = htonl (src_sw_if_index);
+ mp->sw_if_index_to = htonl (dst_sw_if_index);
+ mp->enable = enable;
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static void
+vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
+ * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ fformat (vam->ofp, "%u => %u\n",
+ ntohl (mp->sw_if_index_from), ntohl (mp->sw_if_index_to));
+}
+
+static void
+ vl_api_sw_interface_span_details_t_handler_json
+ (vl_api_sw_interface_span_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, "src-if-index",
+ ntohl (mp->sw_if_index_from));
+ vat_json_object_add_uint (node, "dst-if-index", ntohl (mp->sw_if_index_to));
+}
+
+static int
+api_sw_interface_span_dump (vat_main_t * vam)
+{
+ vl_api_sw_interface_span_dump_t *mp;
+ f64 timeout;
+
+ M (SW_INTERFACE_SPAN_DUMP, sw_interface_span_dump);
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t *mp;
+ M (CONTROL_PING, control_ping);
+ S;
+ }
+ W;
+}
+
int
api_pg_create_interface (vat_main_t * vam)
{
}
}
- u32 name_len = vec_len (stream_name);
- /* Construct the API message */
- M (PG_ENABLE_DISABLE, pg_enable_disable);
- mp->context = 0;
- mp->is_enabled = enable;
- if (stream_name_set != 0)
- {
- mp->stream_name_length = ntohl (name_len);
- clib_memcpy (mp->stream_name, stream_name, name_len);
- }
- vec_free (stream_name);
+ u32 name_len = vec_len (stream_name);
+ /* Construct the API message */
+ M (PG_ENABLE_DISABLE, pg_enable_disable);
+ mp->context = 0;
+ mp->is_enabled = enable;
+ if (stream_name_set != 0)
+ {
+ mp->stream_name_length = ntohl (name_len);
+ clib_memcpy (mp->stream_name, stream_name, name_len);
+ }
+ vec_free (stream_name);
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+int
+api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
+{
+ unformat_input_t *input = vam->input;
+ vl_api_ip_source_and_port_range_check_add_del_t *mp;
+ f64 timeout;
+
+ u16 *low_ports = 0;
+ u16 *high_ports = 0;
+ u16 this_low;
+ u16 this_hi;
+ ip4_address_t ip4_addr;
+ ip6_address_t ip6_addr;
+ u32 length;
+ u32 tmp, tmp2;
+ u8 prefix_set = 0;
+ u32 vrf_id = ~0;
+ u8 is_add = 1;
+ u8 is_ipv6 = 0;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
+ {
+ prefix_set = 1;
+ }
+ else
+ if (unformat
+ (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
+ {
+ prefix_set = 1;
+ is_ipv6 = 1;
+ }
+ else if (unformat (input, "vrf %d", &vrf_id))
+ ;
+ else if (unformat (input, "del"))
+ is_add = 0;
+ else if (unformat (input, "port %d", &tmp))
+ {
+ if (tmp == 0 || tmp > 65535)
+ {
+ errmsg ("port %d out of range", tmp);
+ return -99;
+ }
+ this_low = tmp;
+ this_hi = this_low + 1;
+ vec_add1 (low_ports, this_low);
+ vec_add1 (high_ports, this_hi);
+ }
+ else if (unformat (input, "range %d - %d", &tmp, &tmp2))
+ {
+ if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
+ {
+ errmsg ("incorrect range parameters\n");
+ return -99;
+ }
+ this_low = tmp;
+ /* Note: in debug CLI +1 is added to high before
+ passing to real fn that does "the work"
+ (ip_source_and_port_range_check_add_del).
+ This fn is a wrapper around the binary API fn a
+ control plane will call, which expects this increment
+ to have occurred. Hence letting the binary API control
+ plane fn do the increment for consistency between VAT
+ and other control planes.
+ */
+ this_hi = tmp2;
+ vec_add1 (low_ports, this_low);
+ vec_add1 (high_ports, this_hi);
+ }
+ else
+ break;
+ }
+
+ if (prefix_set == 0)
+ {
+ errmsg ("<address>/<mask> not specified\n");
+ return -99;
+ }
+
+ if (vrf_id == ~0)
+ {
+ errmsg ("VRF ID required, not specified\n");
+ return -99;
+ }
+
+ if (vrf_id == 0)
+ {
+ errmsg
+ ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
+ return -99;
+ }
+
+ if (vec_len (low_ports) == 0)
+ {
+ errmsg ("At least one port or port range required\n");
+ return -99;
+ }
+
+ M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
+ ip_source_and_port_range_check_add_del);
+
+ mp->is_add = is_add;
+
+ if (is_ipv6)
+ {
+ mp->is_ipv6 = 1;
+ clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
+ }
+ else
+ {
+ mp->is_ipv6 = 0;
+ clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
+ }
+
+ mp->mask_length = length;
+ mp->number_of_ranges = vec_len (low_ports);
+
+ clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
+ vec_free (low_ports);
+
+ clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
+ vec_free (high_ports);
+
+ mp->vrf_id = ntohl (vrf_id);
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+int
+api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
+{
+ unformat_input_t *input = vam->input;
+ vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
+ f64 timeout;
+ u32 sw_if_index = ~0;
+ int vrf_set = 0;
+ u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
+ u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
+ u8 is_add = 1;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (input, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
+ vrf_set = 1;
+ else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
+ vrf_set = 1;
+ else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
+ vrf_set = 1;
+ else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
+ vrf_set = 1;
+ else if (unformat (input, "del"))
+ is_add = 0;
+ else
+ break;
+ }
+
+ if (sw_if_index == ~0)
+ {
+ errmsg ("Interface required but not specified\n");
+ return -99;
+ }
+
+ if (vrf_set == 0)
+ {
+ errmsg ("VRF ID required but not specified\n");
+ return -99;
+ }
+
+ if (tcp_out_vrf_id == 0
+ || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
+ {
+ errmsg
+ ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
+ ip_source_and_port_range_check_interface_add_del);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_add = is_add;
+ mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
+ mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
+ mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
+ mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+}
+
+static int
+api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_ipsec_gre_add_del_tunnel_t *mp;
+ f64 timeout;
+ u32 local_sa_id = 0;
+ u32 remote_sa_id = 0;
+ ip4_address_t src_address;
+ ip4_address_t dst_address;
+ u8 is_add = 1;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (i, "local_sa %d", &local_sa_id))
+ ;
+ else if (unformat (i, "remote_sa %d", &remote_sa_id))
+ ;
+ else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
+ ;
+ else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
+ ;
+ else if (unformat (i, "del"))
+ is_add = 0;
+ else
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
+ }
+
+ M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
+
+ mp->local_sa_id = ntohl (local_sa_id);
+ mp->remote_sa_id = ntohl (remote_sa_id);
+ clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
+ clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
+ mp->is_add = is_add;
S;
W;
return 0;
}
-int
-api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
+static int
+api_punt (vat_main_t * vam)
{
- unformat_input_t *input = vam->input;
- vl_api_ip_source_and_port_range_check_add_del_t *mp;
+ unformat_input_t *i = vam->input;
+ vl_api_punt_t *mp;
f64 timeout;
+ u32 ipv = ~0;
+ u32 protocol = ~0;
+ u32 port = ~0;
+ int is_add = 1;
- u16 *low_ports = 0;
- u16 *high_ports = 0;
- u16 this_low;
- u16 this_hi;
- ip4_address_t ip4_addr;
- ip6_address_t ip6_addr;
- u32 length;
- u32 tmp, tmp2;
- u8 prefix_set = 0;
- u32 vrf_id = ~0;
- u8 is_add = 1;
- u8 is_ipv6 = 0;
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
- {
- prefix_set = 1;
- }
- else
- if (unformat
- (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
- {
- prefix_set = 1;
- is_ipv6 = 1;
- }
- else if (unformat (input, "vrf %d", &vrf_id))
+ if (unformat (i, "ip %d", &ipv))
;
- else if (unformat (input, "del"))
+ else if (unformat (i, "protocol %d", &protocol))
+ ;
+ else if (unformat (i, "port %d", &port))
+ ;
+ else if (unformat (i, "del"))
is_add = 0;
- else if (unformat (input, "port %d", &tmp))
- {
- if (tmp == 0 || tmp > 65535)
- {
- errmsg ("port %d out of range", tmp);
- return -99;
- }
- this_low = tmp;
- this_hi = this_low + 1;
- vec_add1 (low_ports, this_low);
- vec_add1 (high_ports, this_hi);
- }
- else if (unformat (input, "range %d - %d", &tmp, &tmp2))
+ else
{
- if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
- {
- errmsg ("incorrect range parameters\n");
- return -99;
- }
- this_low = tmp;
- /* Note: in debug CLI +1 is added to high before
- passing to real fn that does "the work"
- (ip_source_and_port_range_check_add_del).
- This fn is a wrapper around the binary API fn a
- control plane will call, which expects this increment
- to have occurred. Hence letting the binary API control
- plane fn do the increment for consistency between VAT
- and other control planes.
- */
- this_hi = tmp2;
- vec_add1 (low_ports, this_low);
- vec_add1 (high_ports, this_hi);
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
}
- else
- break;
}
- if (prefix_set == 0)
+ M (PUNT, punt);
+
+ mp->is_add = (u8) is_add;
+ mp->ipv = (u8) ipv;
+ mp->l4_protocol = (u8) protocol;
+ mp->l4_port = htons ((u16) port);
+
+ S;
+ W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static void vl_api_ipsec_gre_tunnel_details_t_handler
+ (vl_api_ipsec_gre_tunnel_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
+ ntohl (mp->sw_if_index),
+ format_ip4_address, &mp->src_address,
+ format_ip4_address, &mp->dst_address,
+ ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
+}
+
+static void vl_api_ipsec_gre_tunnel_details_t_handler_json
+ (vl_api_ipsec_gre_tunnel_details_t * mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t *node = NULL;
+ struct in_addr ip4;
+
+ if (VAT_JSON_ARRAY != vam->json_tree.type)
{
- errmsg ("<address>/<mask> not specified\n");
- return -99;
+ ASSERT (VAT_JSON_NONE == vam->json_tree.type);
+ vat_json_init_array (&vam->json_tree);
}
+ node = vat_json_array_add (&vam->json_tree);
- if (vrf_id == ~0)
+ vat_json_init_object (node);
+ vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
+ clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "src_address", ip4);
+ clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
+ vat_json_object_add_ip4 (node, "dst_address", ip4);
+ vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
+ vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
+}
+
+static int
+api_ipsec_gre_tunnel_dump (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_ipsec_gre_tunnel_dump_t *mp;
+ f64 timeout;
+ u32 sw_if_index;
+ u8 sw_if_index_set = 0;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- errmsg ("VRF ID required, not specified\n");
- return -99;
+ if (unformat (i, "sw_if_index %d", &sw_if_index))
+ sw_if_index_set = 1;
+ else
+ break;
}
- if (vrf_id == 0)
+ if (sw_if_index_set == 0)
{
- errmsg
- ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
- return -99;
+ sw_if_index = ~0;
}
- if (vec_len (low_ports) == 0)
+ if (!vam->json_output)
{
- errmsg ("At least one port or port range required\n");
- return -99;
+ fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
+ "sw_if_index", "src_address", "dst_address",
+ "local_sa_id", "remote_sa_id");
}
- M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
- ip_source_and_port_range_check_add_del);
+ /* Get list of gre-tunnel interfaces */
+ M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
- mp->is_add = is_add;
+ mp->sw_if_index = htonl (sw_if_index);
- if (is_ipv6)
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t *mp;
+ M (CONTROL_PING, control_ping);
+ S;
+ }
+ W;
+}
+
+static int
+api_delete_subif (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_delete_subif_t *mp;
+ f64 timeout;
+ u32 sw_if_index = ~0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- mp->is_ipv6 = 1;
- clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else
+ break;
}
- else
+
+ if (sw_if_index == ~0)
{
- mp->is_ipv6 = 0;
- clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
+ errmsg ("missing sw_if_index\n");
+ return -99;
}
- mp->mask_length = length;
- mp->number_of_ranges = vec_len (low_ports);
-
- clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
- vec_free (low_ports);
-
- clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
- vec_free (high_ports);
-
- mp->vrf_id = ntohl (vrf_id);
+ /* Construct the API message */
+ M (DELETE_SUBIF, delete_subif);
+ mp->sw_if_index = ntohl (sw_if_index);
S;
W;
- /* NOTREACHED */
- return 0;
}
-int
-api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
+#define foreach_pbb_vtr_op \
+_("disable", L2_VTR_DISABLED) \
+_("pop", L2_VTR_POP_2) \
+_("push", L2_VTR_PUSH_2)
+
+static int
+api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
{
- unformat_input_t *input = vam->input;
- vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
+ unformat_input_t *i = vam->input;
+ vl_api_l2_interface_pbb_tag_rewrite_t *mp;
f64 timeout;
- u32 sw_if_index = ~0;
- int vrf_set = 0;
- u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
- u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
- u8 is_add = 1;
+ u32 sw_if_index = ~0, vtr_op = ~0;
+ u16 outer_tag = ~0;
+ u8 dmac[6], smac[6];
+ u8 dmac_set = 0, smac_set = 0;
+ u16 vlanid = 0;
+ u32 sid = ~0;
+ u32 tmp;
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ /* Shut up coverity */
+ memset (dmac, 0, sizeof (dmac));
+ memset (smac, 0, sizeof (smac));
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
;
- else if (unformat (input, "sw_if_index %d", &sw_if_index))
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "vtr_op %d", &vtr_op))
+ ;
+#define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
+ foreach_pbb_vtr_op
+#undef _
+ else if (unformat (i, "translate_pbb_stag"))
+ {
+ if (unformat (i, "%d", &tmp))
+ {
+ vtr_op = L2_VTR_TRANSLATE_2_1;
+ outer_tag = tmp;
+ }
+ else
+ {
+ errmsg
+ ("translate_pbb_stag operation requires outer tag definition\n");
+ return -99;
+ }
+ }
+ else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
+ dmac_set++;
+ else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
+ smac_set++;
+ else if (unformat (i, "sid %d", &sid))
;
- else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
- vrf_set = 1;
- else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
- vrf_set = 1;
- else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
- vrf_set = 1;
- else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
- vrf_set = 1;
- else if (unformat (input, "del"))
- is_add = 0;
+ else if (unformat (i, "vlanid %d", &tmp))
+ vlanid = tmp;
else
- break;
- }
-
- if (sw_if_index == ~0)
- {
- errmsg ("Interface required but not specified\n");
- return -99;
+ {
+ clib_warning ("parse error '%U'", format_unformat_error, i);
+ return -99;
+ }
}
- if (vrf_set == 0)
+ if ((sw_if_index == ~0) || (vtr_op == ~0))
{
- errmsg ("VRF ID required but not specified\n");
+ errmsg ("missing sw_if_index or vtr operation\n");
return -99;
}
-
- if (tcp_out_vrf_id == 0
- || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
+ if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
+ && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
{
errmsg
- ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
+ ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid\n");
return -99;
}
- /* Construct the API message */
- M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
- ip_source_and_port_range_check_interface_add_del);
-
+ M (L2_INTERFACE_PBB_TAG_REWRITE, l2_interface_pbb_tag_rewrite);
mp->sw_if_index = ntohl (sw_if_index);
- mp->is_add = is_add;
- mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
- mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
- mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
- mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
+ mp->vtr_op = ntohl (vtr_op);
+ mp->outer_tag = ntohs (outer_tag);
+ clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
+ clib_memcpy (mp->b_smac, smac, sizeof (smac));
+ mp->b_vlanid = ntohs (vlanid);
+ mp->i_sid = ntohl (sid);
- /* send it... */
S;
-
- /* Wait for a reply... */
W;
+ /* NOTREACHED */
+ return 0;
}
static int
-api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
+api_flow_classify_set_interface (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_ipsec_gre_add_del_tunnel_t *mp;
+ vl_api_flow_classify_set_interface_t *mp;
f64 timeout;
- u32 local_sa_id = 0;
- u32 remote_sa_id = 0;
- ip4_address_t src_address;
- ip4_address_t dst_address;
+ u32 sw_if_index;
+ int sw_if_index_set;
+ u32 ip4_table_index = ~0;
+ u32 ip6_table_index = ~0;
u8 is_add = 1;
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "local_sa %d", &local_sa_id))
- ;
- else if (unformat (i, "remote_sa %d", &remote_sa_id))
- ;
- else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
- ;
- else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
- ;
+ if (unformat (i, "%U", 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 (i, "ip6-table %d", &ip6_table_index))
+ ;
else
{
clib_warning ("parse error '%U'", format_unformat_error, i);
}
}
- M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
- mp->local_sa_id = ntohl (local_sa_id);
- mp->remote_sa_id = ntohl (remote_sa_id);
- clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
- clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
+ M (FLOW_CLASSIFY_SET_INTERFACE, flow_classify_set_interface);
+
+ 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->is_add = is_add;
S;
return 0;
}
-static void vl_api_ipsec_gre_tunnel_details_t_handler
- (vl_api_ipsec_gre_tunnel_details_t * mp)
+static int
+api_flow_classify_dump (vat_main_t * vam)
{
- vat_main_t *vam = &vat_main;
-
- fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
- ntohl (mp->sw_if_index),
- format_ip4_address, &mp->src_address,
- format_ip4_address, &mp->dst_address,
- ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
-}
+ unformat_input_t *i = vam->input;
+ vl_api_flow_classify_dump_t *mp;
+ f64 timeout = ~0;
+ u8 type = FLOW_CLASSIFY_N_TABLES;
-static void vl_api_ipsec_gre_tunnel_details_t_handler_json
- (vl_api_ipsec_gre_tunnel_details_t * mp)
-{
- vat_main_t *vam = &vat_main;
- vat_json_node_t *node = NULL;
- struct in_addr ip4;
+ if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
+ ;
+ else
+ {
+ errmsg ("classify table type must be specified\n");
+ return -99;
+ }
- if (VAT_JSON_ARRAY != vam->json_tree.type)
+ if (!vam->json_output)
{
- ASSERT (VAT_JSON_NONE == vam->json_tree.type);
- vat_json_init_array (&vam->json_tree);
+ fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
}
- 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));
- clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
- vat_json_object_add_ip4 (node, "src_address", ip4);
- clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
- vat_json_object_add_ip4 (node, "dst_address", ip4);
- vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
- vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
+ M (FLOW_CLASSIFY_DUMP, flow_classify_dump);
+ mp->type = type;
+ /* send it... */
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t *mp;
+ M (CONTROL_PING, control_ping);
+ S;
+ }
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
}
static int
-api_ipsec_gre_tunnel_dump (vat_main_t * vam)
+api_feature_enable_disable (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_ipsec_gre_tunnel_dump_t *mp;
+ vl_api_feature_enable_disable_t *mp;
f64 timeout;
- u32 sw_if_index;
- u8 sw_if_index_set = 0;
+ u8 *arc_name = 0;
+ u8 *feature_name = 0;
+ u32 sw_if_index = ~0;
+ u8 enable = 1;
- /* 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_set = 1;
+ if (unformat (i, "arc_name %s", &arc_name))
+ ;
+ else if (unformat (i, "feature_name %s", &feature_name))
+ ;
+ else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
+ ;
+ else if (unformat (i, "disable"))
+ enable = 0;
else
break;
}
- if (sw_if_index_set == 0)
+ if (arc_name == 0)
{
- sw_if_index = ~0;
+ errmsg ("missing arc name\n");
+ return -99;
+ }
+ if (vec_len (arc_name) > 63)
+ {
+ errmsg ("arc name too long\n");
}
- if (!vam->json_output)
+ if (feature_name == 0)
{
- fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
- "sw_if_index", "src_address", "dst_address",
- "local_sa_id", "remote_sa_id");
+ errmsg ("missing feature name\n");
+ return -99;
+ }
+ if (vec_len (feature_name) > 63)
+ {
+ errmsg ("feature name too long\n");
}
- /* Get list of gre-tunnel interfaces */
- M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
+ if (sw_if_index == ~0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
- mp->sw_if_index = htonl (sw_if_index);
+ /* Construct the API message */
+ M (FEATURE_ENABLE_DISABLE, feature_enable_disable);
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = enable;
+ clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
+ clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
+ vec_free (arc_name);
+ vec_free (feature_name);
S;
-
- /* Use a control ping for synchronization */
- {
- vl_api_control_ping_t *mp;
- M (CONTROL_PING, control_ping);
- S;
- }
W;
}
static int
-api_delete_subif (vat_main_t * vam)
+api_sw_interface_tag_add_del (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_delete_subif_t *mp;
+ vl_api_sw_interface_tag_add_del_t *mp;
f64 timeout;
u32 sw_if_index = ~0;
+ u8 *tag = 0;
+ u8 enable = 1;
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
- if (unformat (i, "sw_if_index %d", &sw_if_index))
+ if (unformat (i, "tag %s", &tag))
+ ;
+ if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
+ ;
+ else if (unformat (i, "sw_if_index %d", &sw_if_index))
;
+ else if (unformat (i, "del"))
+ enable = 0;
else
break;
}
if (sw_if_index == ~0)
{
- errmsg ("missing sw_if_index\n");
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
+
+ if (enable && (tag == 0))
+ {
+ errmsg ("no tag specified\n");
return -99;
}
/* Construct the API message */
- M (DELETE_SUBIF, delete_subif);
+ M (SW_INTERFACE_TAG_ADD_DEL, sw_interface_tag_add_del);
mp->sw_if_index = ntohl (sw_if_index);
+ mp->is_add = enable;
+ if (enable)
+ strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
+ vec_free (tag);
S;
W;
return 0;
}
+static int
+value_sort_cmp (void *a1, void *a2)
+{
+ name_sort_t *n1 = a1;
+ name_sort_t *n2 = a2;
+
+ if (n1->value < n2->value)
+ return -1;
+ if (n1->value > n2->value)
+ return 1;
+ return 0;
+}
+
+
+static int
+dump_msg_api_table (vat_main_t * vam)
+{
+ api_main_t *am = &api_main;
+ name_sort_t *nses = 0, *ns;
+ hash_pair_t *hp;
+ int i;
+
+ /* *INDENT-OFF* */
+ hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
+ ({
+ vec_add2 (nses, ns, 1);
+ ns->name = (u8 *)(hp->key);
+ ns->value = (u32) hp->value[0];
+ }));
+ /* *INDENT-ON* */
+
+ vec_sort_with_function (nses, value_sort_cmp);
+
+ for (i = 0; i < vec_len (nses); i++)
+ fformat (vam->ofp, " [%d]: %s\n", nses[i].value, nses[i].name);
+ vec_free (nses);
+ return 0;
+}
+
+static int
+get_msg_id (vat_main_t * vam)
+{
+ u8 *name_and_crc;
+ u32 message_index;
+
+ if (unformat (vam->input, "%s", &name_and_crc))
+ {
+ message_index = vl_api_get_msg_index (name_and_crc);
+ if (message_index == ~0)
+ {
+ fformat (vam->ofp, " '%s' not found\n", name_and_crc);
+ return 0;
+ }
+ fformat (vam->ofp, " '%s' has message index %d\n",
+ name_and_crc, message_index);
+ return 0;
+ }
+ errmsg ("name_and_crc required...\n");
+ return 0;
+}
+
static int
search_node_table (vat_main_t * vam)
{
"<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
_(sw_interface_set_table, \
"<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
+_(sw_interface_set_mpls_enable, \
+ "<intfc> | sw_if_index [disable | dis]") \
_(sw_interface_set_vpath, \
"<intfc> | sw_if_index <id> enable | disable") \
+_(sw_interface_set_vxlan_bypass, \
+ "<intfc> | sw_if_index <id> [ip4 | ip6] enable | disable") \
_(sw_interface_set_l2_xconnect, \
"rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
"enable | disable") \
"<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
"[shg <split-horizon-group>] [bvi]\n" \
"enable | disable") \
+_(sw_interface_set_dpdk_hqos_pipe, \
+ "rx <intfc> | sw_if_index <id> subport <subport-id> pipe <pipe-id>\n" \
+ "profile <profile-id>\n") \
+_(sw_interface_set_dpdk_hqos_subport, \
+ "rx <intfc> | sw_if_index <id> subport <subport-id> [rate <n>]\n" \
+ "[bktsize <n>] [tc0 <n>] [tc1 <n>] [tc2 <n>] [tc3 <n>] [period <n>]\n") \
+_(sw_interface_set_dpdk_hqos_tctbl, \
+ "rx <intfc> | sw_if_index <id> entry <n> tc <n> queue <n>\n") \
_(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] [del]\n")\
_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
_(bridge_flags, \
"bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
_(tap_connect, \
- "tapname <name> mac <mac-addr> | random-mac") \
+ "tapname <name> mac <mac-addr> | random-mac [tag <string>]") \
_(tap_modify, \
"<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
_(tap_delete, \
"<vpp-if-name> | sw_if_index <id>") \
_(sw_interface_tap_dump, "") \
_(ip_add_del_route, \
- "<addr>/<mask> via <addr> [vrf <n>]\n" \
+ "<addr>/<mask> via <addr> [table-id <n>]\n" \
+ "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
+ "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
+ "[multipath] [count <n>]") \
+_(mpls_route_add_del, \
+ "<label> <eos> via <addr> [table-id <n>]\n" \
"[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
"[weight <n>] [drop] [local] [classify <n>] [del]\n" \
"[multipath] [count <n>]") \
+_(mpls_ip_bind_unbind, \
+ "<label> <addr/len>") \
+_(mpls_tunnel_add_del, \
+ " via <addr> [table-id <n>]\n" \
+ "sw_if_index <id>] [l2] [del]") \
_(proxy_arp_add_del, \
"<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
_(proxy_arp_intfc_enable_disable, \
"<intfc> | sw_if_index <id> enable | disable") \
-_(mpls_add_del_encap, \
- "label <n> dst <ip4-addr> [vrf <n>] [del]") \
-_(mpls_add_del_decap, \
- "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
-_(mpls_gre_add_del_tunnel, \
- "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
- "adj <ip4-address>/<mask-width> [del]") \
_(sw_interface_set_unnumbered, \
"<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
_(ip_neighbor_add_del, \
_(l2_patch_add_del, \
"rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
"enable | disable") \
-_(mpls_ethernet_add_del_tunnel, \
- "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
- "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
-_(mpls_ethernet_add_del_tunnel_2, \
- "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
- "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
_(sr_tunnel_add_del, \
"[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
"(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
"address [ip6 multicast address] sr-policy [policy name] [del]") \
_(classify_add_del_table, \
"buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
- "[del] mask <mask-value>\n" \
- " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
+ " [del] mask <mask-value>\n" \
+ " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
+ " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
_(classify_add_del_session, \
"[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
" table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
- " [l3 [ip4|ip6]]") \
+ " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
+ " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
_(classify_set_interface_ip_table, \
"<intfc> | sw_if_index <nn> table <nn>") \
_(classify_set_interface_l2_tables, \
"lookup_v6_src | lookup_v6_dst | lookup_session_id") \
_(sw_if_l2tpv3_tunnel_dump, "") \
_(vxlan_add_del_tunnel, \
- "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
- " [decap-next l2|ip4|ip6] [del]") \
+ "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
+ "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
+ "vni <vni> [encap-vrf-id <nn>] [decap-next l2|ip4|ip6] [del]") \
_(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(gre_add_del_tunnel, \
"src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [teb] [del]\n") \
"rloc <locator> p <prio> " \
"w <weight> [rloc <loc> ... ] " \
"action <action> [del-all]") \
-_(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
- "<src-eid> rloc <locator> p <prio> w <weight>"\
- "[rloc <loc> ... ] action <action>") \
+_(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
+ "<local-eid>") \
_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
+_(lisp_map_request_mode, "src-dst|dst-only") \
_(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
_(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
_(lisp_locator_set_dump, "[local | remote]") \
_(lisp_eid_table_map_dump, "l2|l3") \
_(lisp_gpe_tunnel_dump, "") \
_(lisp_map_resolver_dump, "") \
+_(lisp_adjacencies_get, "vni <vni>") \
_(show_lisp_status, "") \
_(lisp_get_map_request_itr_rlocs, "") \
_(show_lisp_pitr, "") \
+_(show_lisp_map_request_mode, "") \
_(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
_(af_packet_delete, "name <host interface name>") \
_(policer_add_del, "name <policer name> <params> [del]") \
_(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
"[master|slave]") \
_(netmap_delete, "name <interface name>") \
-_(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
-_(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
-_(mpls_fib_encap_dump, "") \
-_(mpls_fib_decap_dump, "") \
+_(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
+_(mpls_fib_dump, "") \
_(classify_table_ids, "") \
_(classify_table_by_interface, "sw_if_index <sw_if_index>") \
_(classify_table_info, "table_id <nn>") \
_(ipfix_classify_stream_dump, "") \
_(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]")\
_(ipfix_classify_table_dump, "") \
+_(sw_interface_span_enable_disable, "[src <intfc> | src_sw_if_index <id>] [[dst <intfc> | dst_sw_if_index <id>] | disable]") \
+_(sw_interface_span_dump, "") \
_(get_next_index, "node-name <node-name> next-node-name <node-name>") \
_(pg_create_interface, "if_id <nn>") \
_(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
_(ipsec_gre_add_del_tunnel, \
"src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
_(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
-_(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>")
+_(delete_subif,"<intfc> | sw_if_index <nn>") \
+_(l2_interface_pbb_tag_rewrite, \
+ "<intfc> | sw_if_index <nn> \n" \
+ "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
+ "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
+_(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
+_(flow_classify_set_interface, \
+ "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
+_(flow_classify_dump, "type [ip4|ip6]") \
+_(ip_fib_dump, "") \
+_(ip6_fib_dump, "") \
+_(feature_enable_disable, "arc_name <arc_name> " \
+ "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
+_(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
+"[disable]")
/* List of command functions, CLI names map directly to functions */
#define foreach_cli_function \
_(dump_stats_table, "usage: dump_stats_table") \
_(dump_macro_table, "usage: dump_macro_table ") \
_(dump_node_table, "usage: dump_node_table") \
+_(dump_msg_api_table, "usage: dump_msg_api_table") \
+_(get_msg_id, "usage: get_msg_id name_and_crc") \
_(echo, "usage: echo <message>") \
_(exec, "usage: exec <vpe-debug-CLI-command>") \
_(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
}
#undef vl_api_version
-#define vl_api_version(n,v) static u32 vpe_api_version = v;
+#define vl_api_version(n,v) static u32 memory_api_version = v;
+#include <vlibmemory/vl_memory_api_h.h>
+#undef vl_api_version
+
+#undef vl_api_version
+#define vl_api_version(n,v) static u32 vnet_interface_api_version = v;
+#include <vnet/interface.api.h>
+#undef vl_api_version
+
+#undef vl_api_version
+#define vl_api_version(n,v) static u32 vpp_api_version = v;
#include <vpp-api/vpe.api.h>
#undef vl_api_version
+static u32 *api_versions[] = {
+ &memory_api_version,
+ &vnet_interface_api_version,
+ &vpp_api_version,
+};
+
void
vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
{
+ int i;
+
+ ASSERT (ARRAY_LEN (mp->api_versions) >= ARRAY_LEN (api_versions));
+
/*
- * Send the main API signature in slot 0. This bit of code must
+ * Send the API signatures. This bit of code must
* match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
*/
- mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
+
+ for (i = 0; i < ARRAY_LEN (api_versions); i++)
+ mp->api_versions[i] = clib_host_to_net_u32 (*api_versions[i]);
}
/*