#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 "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
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);
_(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) \
_(mpls_ip_bind_unbind_reply) \
_(proxy_arp_add_del_reply) \
_(proxy_arp_intfc_enable_disable_reply) \
-_(mpls_add_del_encap_reply) \
-_(mpls_ethernet_add_del_tunnel_2_reply) \
_(sw_interface_set_unnumbered_reply) \
_(ip_neighbor_add_del_reply) \
_(reset_vrf_reply) \
_(delete_subif_reply) \
_(l2_interface_pbb_tag_rewrite_reply) \
_(punt_reply) \
-_(feature_enable_disable_reply)
+_(feature_enable_disable_reply) \
+_(sw_interface_tag_add_del_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
_(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, \
_(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_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) \
_(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
_(NETMAP_CREATE_REPLY, netmap_create_reply) \
_(NETMAP_DELETE_REPLY, netmap_delete_reply) \
-_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
-_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_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) \
_(PUNT_REPLY, punt_reply) \
_(IP_FIB_DETAILS, ip_fib_details) \
_(IP6_FIB_DETAILS, ip6_fib_details) \
-_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply)
+_(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 */
W;
}
+static int
+api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_set_vxlan_bypass_t *mp;
+ f64 timeout;
+ u32 sw_if_index = 0;
+ u8 sw_if_index_set = 0;
+ 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, "%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 if (unformat (i, "ip4"))
+ is_ipv6 = 0;
+ else if (unformat (i, "ip6"))
+ is_ipv6 = 1;
+ else
+ break;
+ }
+
+ if (sw_if_index_set == 0)
+ {
+ errmsg ("missing interface name or sw_if_index\n");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M (SW_INTERFACE_SET_VXLAN_BYPASS, sw_interface_set_vxlan_bypass);
+
+ mp->sw_if_index = ntohl (sw_if_index);
+ mp->enable = is_enable;
+ mp->is_ipv6 = is_ipv6;
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+}
+
static int
api_sw_interface_set_l2_xconnect (vat_main_t * vam)
{
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;
return -99;
}
- if (is_add && (sw_if_index_set == 0))
+ if (is_add && sw_if_index_set == 0 && filter_mac == 0)
{
errmsg ("missing interface name or sw_if_index\n");
return -99;
u8 random_mac = 1;
u8 name_set = 0;
u8 *tap_name;
+ u8 *tag = 0;
memset (mac_address, 0, sizeof (mac_address));
random_mac = 1;
else if (unformat (i, "tapname %s", &tap_name))
name_set = 1;
+ else if (unformat (i, "tag %s", &tag));
else
break;
}
if (vec_len (tap_name) > 63)
{
errmsg ("tap name too long\n");
+ return -99;
}
vec_add1 (tap_name, 0);
+ if (vec_len (tag) > 63)
+ {
+ errmsg ("tag too long\n");
+ return -99;
+ }
+ vec_add1 (tag, 0);
+
/* Construct the API message */
M (TAP_CONNECT, tap_connect);
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 (tap_name);
+ vec_free (tag);
/* send it... */
S;
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 is_unreach = 0, is_prohibit = 0;
u8 create_vrf_if_needed = 0;
u8 is_add = 1;
- u8 next_hop_weight = 1;
+ u32 next_hop_weight = 1;
u8 not_last = 0;
u8 is_multipath = 0;
u8 address_set = 0;
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, "%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;
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;
}
}
- 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 && !is_unreach && !is_prohibit)
+ !is_classify && !is_unreach && !is_prohibit &&
+ MPLS_LABEL_INVALID == next_hop_via_label)
{
errmsg
("next hop / local / drop / unreach / prohibit / classify not set\n");
return -99;
}
+ if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
+ {
+ errmsg ("next hop and next-hop via label set\n");
+ return -99;
+ }
if (address_set == 0)
{
errmsg ("missing addresses\n");
for (j = 0; j < count; j++)
{
/* Construct the API message */
- M (IP_ADD_DEL_ROUTE, ip_add_del_route);
+ 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);
- if (resolve_attempts > 0)
- {
- mp->resolve_attempts = ntohl (resolve_attempts);
- mp->resolve_if_needed = 1;
- }
mp->create_vrf_if_needed = create_vrf_if_needed;
mp->is_add = is_add;
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_out_label = ntohl (next_hop_out_label);
+ 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)
{
u32 sw_if_index = ~0, table_id = 0;
u8 create_table_if_needed = 0;
u8 is_add = 1;
- u8 next_hop_weight = 1;
+ u32 next_hop_weight = 1;
u8 is_multipath = 0;
u32 next_hop_table_id = 0;
u8 next_hop_set = 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 = 1;
+ u8 is_eos = 0;
u8 next_hop_proto_is_ip4 = 1;
/* Parse args required to build the message */
}
else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
;
- else if (unformat (i, "out-label %d", &next_hop_out_label))
+ 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);
for (j = 0; j < count; j++)
{
/* Construct the API message */
- M (MPLS_ROUTE_ADD_DEL, mpls_route_add_del);
+ 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_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_out_label = ntohl (next_hop_out_label);
+ 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)
}
static int
-api_mpls_add_del_encap (vat_main_t * vam)
+api_mpls_tunnel_add_del (vat_main_t * vam)
{
unformat_input_t *i = vam->input;
- vl_api_mpls_add_del_encap_t *mp;
+ vl_api_mpls_tunnel_add_del_t *mp;
f64 timeout;
- u32 vrf_id = 0;
- u32 *labels = 0;
- u32 label;
- ip4_address_t dst_address;
- u8 is_add = 1;
-
- 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
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- if (vec_len (labels) == 0)
- {
- errmsg ("missing encap label stack\n");
- return -99;
- }
-
- M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
- sizeof (u32) * vec_len (labels));
- 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);
-
- vec_free (labels);
-
- 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;
+ u32 sw_if_index = ~0;
+ u32 next_hop_sw_if_index = ~0;
+ u32 next_hop_proto_is_ip4 = 1;
- /* Shut up coverity */
- memset (dst_mac_address, 0, sizeof (dst_mac_address));
+ 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, "vrf %d", &inner_vrf_id))
+ 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, "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, "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, "del"))
- is_add = 0;
+ 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);
}
}
- if (!dst_set)
- {
- errmsg ("dst (mac address) not set\n");
- return -99;
- }
- if (!tx_sw_if_index_set)
- {
- errmsg ("tx-intfc not set\n");
- return -99;
- }
+ M2 (MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del,
+ sizeof (mpls_label_t) * vec_len (labels));
- M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
+ 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->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;
-}
+ mp->mt_next_hop_n_out_labels = vec_len (labels);
-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 (0 != mp->mt_next_hop_n_out_labels)
{
- 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;
- }
+ 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 (!adj_address_set)
+ if (next_hop_proto_is_ip4)
{
- errmsg ("adjacency address/mask not set\n");
- return -99;
+ clib_memcpy (mp->mt_next_hop,
+ &v4_next_hop_address, sizeof (v4_next_hop_address));
}
- if (!next_hop_address_set)
+ else
{
- errmsg ("ip4 next hop address (in outer fib) not set\n");
- return -99;
+ clib_memcpy (mp->mt_next_hop,
+ &v6_next_hop_address, sizeof (v6_next_hop_address));
}
- M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
-
- 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));
-
S;
W;
/* NOTREACHED */
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;
- fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
+ 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%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));
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);
}
+#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);
mp->sad_id = ntohl (sad_id);
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
}
/*
return 0;
}
-static void vl_api_mpls_eth_tunnel_details_t_handler
- (vl_api_mpls_eth_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);
- 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));
+ 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, "%u ", ntohl (mp->labels[i]));
+ fformat (vam->ofp, "%u ", ntohl (mp->mt_next_hop_out_labels[i]));
}
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_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));
- 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));
+ 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_eth_tunnel_dump (vat_main_t * vam)
+api_mpls_tunnel_dump (vat_main_t * vam)
{
- vl_api_mpls_eth_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_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
+ M (MPLS_TUNNEL_DUMP, mpls_tunnel_dump);
mp->tunnel_index = htonl (index);
S;
W;
}
-static void vl_api_mpls_fib_encap_details_t_handler
- (vl_api_mpls_fib_encap_details_t * mp)
-{
- vat_main_t *vam = &vat_main;
- i32 i;
- i32 len = ntohl (mp->nlabels);
-
- 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, "%u ", ntohl (mp->labels[i]));
- }
- fformat (vam->ofp, "\n");
-}
-
-static void vl_api_mpls_fib_encap_details_t_handler_json
- (vl_api_mpls_fib_encap_details_t * mp)
-{
- vat_main_t *vam = &vat_main;
- vat_json_node_t *node = NULL;
- i32 i;
- i32 len = ntohl (mp->nlabels);
- struct in_addr ip4;
-
- if (VAT_JSON_ARRAY != vam->json_tree.type)
- {
- ASSERT (VAT_JSON_NONE == vam->json_tree.type);
- vat_json_init_array (&vam->json_tree);
- }
- node = vat_json_array_add (&vam->json_tree);
-
- vat_json_init_object (node);
- vat_json_object_add_uint (node, "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, "label", ntohl (mp->labels[i]));
- }
-}
-
-static int
-api_mpls_fib_encap_dump (vat_main_t * vam)
-{
- vl_api_mpls_fib_encap_dump_t *mp;
- f64 timeout;
-
- M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
- S;
-
- /* Use a control ping for synchronization */
- {
- vl_api_control_ping_t *mp;
- M (CONTROL_PING, control_ping);
- S;
- }
- W;
-}
-
#define vl_api_mpls_fib_details_t_endian vl_noop_handler
#define vl_api_mpls_fib_details_t_print vl_noop_handler
W;
}
+static int
+api_sw_interface_tag_add_del (vat_main_t * vam)
+{
+ unformat_input_t *i = vam->input;
+ vl_api_sw_interface_tag_add_del_t *mp;
+ 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, "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 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 (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;
+}
+
static int
q_or_quit (vat_main_t * vam)
{
"<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") \
_(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, \
"[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]") \
_(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" \
"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") \
_(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
"[master|slave]") \
_(netmap_delete, "name <interface name>") \
-_(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
-_(mpls_fib_encap_dump, "") \
+_(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
_(mpls_fib_dump, "") \
_(classify_table_ids, "") \
_(classify_table_by_interface, "sw_if_index <sw_if_index>") \
_(ip_fib_dump, "") \
_(ip6_fib_dump, "") \
_(feature_enable_disable, "arc_name <arc_name> " \
- "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]")
+ "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 \
}
#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]);
}
/*