#include <vnet/l2/l2_input.h>
#include <vnet/l2tp/l2tp.h>
#include <vnet/vxlan/vxlan.h>
-#include <vnet/nsh-gre/nsh_gre.h>
-#include <vnet/nsh-vxlan-gpe/nsh_vxlan_gpe.h>
+#include <vnet/gre/gre.h>
+#include <vnet/vxlan-gpe/vxlan_gpe.h>
#include <vnet/lisp-gpe/lisp_gpe.h>
#include <api/vpe_msg_enum.h>
#include <vnet/map/map.h>
#include <vnet/cop/cop.h>
#include <vnet/ip/ip6_hop_by_hop.h>
+#include <vnet/policer/xlate.h>
#include "vat/json_format.h"
#endif
}
+uword
+unformat_policer_rate_type (unformat_input_t * input, va_list * args)
+{
+ u8 * r = va_arg (*args, u8 *);
+
+ if (unformat (input, "kbps"))
+ *r = SSE2_QOS_RATE_KBPS;
+ else if (unformat(input, "pps"))
+ *r = SSE2_QOS_RATE_PPS;
+ else
+ return 0;
+ return 1;
+}
+
+uword
+unformat_policer_round_type (unformat_input_t * input, va_list * args)
+{
+ u8 * r = va_arg (*args, u8 *);
+
+ if (unformat(input, "closest"))
+ *r = SSE2_QOS_ROUND_TO_CLOSEST;
+ else if (unformat (input, "up"))
+ *r = SSE2_QOS_ROUND_TO_UP;
+ else if (unformat (input, "down"))
+ *r = SSE2_QOS_ROUND_TO_DOWN;
+ else
+ return 0;
+ return 1;
+}
+
+uword
+unformat_policer_type (unformat_input_t * input, va_list * args)
+{
+ u8 * r = va_arg (*args, u8 *);
+
+ if (unformat (input, "1r2c"))
+ *r = SSE2_QOS_POLICER_TYPE_1R2C;
+ else if (unformat (input, "1r3c"))
+ *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
+ else if (unformat (input, "2r3c-2698"))
+ *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
+ else if (unformat (input, "2r3c-4115"))
+ *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
+ else if (unformat (input, "2r3c-mef5cf1"))
+ *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
+ else
+ return 0;
+ return 1;
+}
+
u8 * format_ip4_address (u8 * s, va_list * args)
{
u8 * a = va_arg (*args, u8 *);
u8 * format_ip46_address (u8 * s, va_list * args)
{
ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
- return ip46_address_is_ip4(ip46)?
+ ip46_type_t type = va_arg (*args, ip46_type_t);
+ int is_ip4 = 1;
+
+ switch (type)
+ {
+ case IP46_TYPE_ANY:
+ is_ip4 = ip46_address_is_ip4(ip46);
+ break;
+ case IP46_TYPE_IP4:
+ is_ip4 = 1;
+ break;
+ case IP46_TYPE_IP6:
+ is_ip4 = 0;
+ break;
+ }
+
+ return is_ip4 ?
format(s, "%U", format_ip4_address, &ip46->ip4):
format(s, "%U", format_ip6_address, &ip46->ip6);
}
i32 retval = ntohl(mp->retval);
vam->retval = retval;
- vam->result_ready = 1;
vam->regenerate_interface_table = 1;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
}
static void vl_api_create_loopback_reply_t_handler_json
vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
+ vat_json_print(vam->ofp, &node);
+ vat_json_free(&node);
+ vam->retval = ntohl(mp->retval);
+ vam->result_ready = 1;
+}
+
+static void vl_api_af_packet_create_reply_t_handler
+(vl_api_af_packet_create_reply_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ i32 retval = ntohl(mp->retval);
+
+ vam->retval = retval;
+ vam->regenerate_interface_table = 1;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
+}
+
+static void vl_api_af_packet_create_reply_t_handler_json
+(vl_api_af_packet_create_reply_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ vat_json_node_t node;
+
+ vat_json_init_object(&node);
+ vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
+ vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
+
vat_json_print(vam->ofp, &node);
vat_json_free(&node);
i32 retval = ntohl(mp->retval);
vam->retval = retval;
- vam->result_ready = 1;
vam->regenerate_interface_table = 1;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
}
static void vl_api_create_vlan_subif_reply_t_handler_json
i32 retval = ntohl(mp->retval);
vam->retval = retval;
- vam->result_ready = 1;
vam->regenerate_interface_table = 1;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
}
static void vl_api_create_subif_reply_t_handler_json
i32 retval = ntohl(mp->retval);
vam->retval = retval;
- vam->result_ready = 1;
vam->regenerate_interface_table = 1;
+ vam->result_ready = 1;
}
static void vl_api_interface_name_renumber_reply_t_handler_json
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
- vam->result_ready = 1;
if (retval == 0 &&
((mp->new_table_index != 0xFFFFFFFF) ||
(mp->skip_n_vectors != 0xFFFFFFFF) ||
errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
ntohl(mp->new_table_index),
ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
+ vam->result_ready = 1;
}
}
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
- vam->result_ready = 1;
if (retval == 0)
errmsg ("node index %d\n", ntohl(mp->node_index));
+ vam->result_ready = 1;
}
}
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
- vam->result_ready = 1;
if (retval == 0)
errmsg ("next index %d\n", ntohl(mp->next_index));
+ vam->result_ready = 1;
}
}
vam->result_ready = 1;
}
-static void vl_api_nsh_gre_add_del_tunnel_reply_t_handler
-(vl_api_nsh_gre_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- i32 retval = ntohl(mp->retval);
- u32 sw_if_index = ntohl(mp->sw_if_index);
-
- if (retval >= 0 && sw_if_index != (u32)~0) {
- errmsg ("sw_if_index %d\n", ntohl(mp->sw_if_index));
- }
- vam->retval = retval;
- vam->result_ready = 1;
-}
-
-static void vl_api_nsh_gre_add_del_tunnel_reply_t_handler_json
-(vl_api_nsh_gre_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- vat_json_node_t node;
-
- vat_json_init_object(&node);
- vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
- vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
-
- vat_json_print(vam->ofp, &node);
- vat_json_free(&node);
-
- vam->retval = ntohl(mp->retval);
- vam->result_ready = 1;
-}
-
-static void vl_api_nsh_vxlan_gpe_add_del_tunnel_reply_t_handler
-(vl_api_nsh_vxlan_gpe_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- i32 retval = ntohl(mp->retval);
- u32 sw_if_index = ntohl(mp->sw_if_index);
-
- if (retval >= 0 && sw_if_index != (u32)~0) {
- errmsg ("sw_if_index %d\n", ntohl(mp->sw_if_index));
- }
- vam->retval = retval;
- vam->result_ready = 1;
-}
-
-static void vl_api_nsh_vxlan_gpe_add_del_tunnel_reply_t_handler_json
-(vl_api_nsh_vxlan_gpe_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- vat_json_node_t node;
-
- vat_json_init_object(&node);
- vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
- vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
-
- vat_json_print(vam->ofp, &node);
- vat_json_free(&node);
-
- vam->retval = ntohl(mp->retval);
- vam->result_ready = 1;
-}
-
-static void vl_api_lisp_gpe_add_del_tunnel_reply_t_handler
-(vl_api_lisp_gpe_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- i32 retval = ntohl(mp->retval);
- u32 sw_if_index = ntohl(mp->sw_if_index);
-
- if (retval >= 0 && sw_if_index != (u32)~0) {
- errmsg ("sw_if_index %d\n", ntohl(mp->sw_if_index));
- }
- vam->retval = retval;
- vam->result_ready = 1;
-}
-
-static void vl_api_lisp_gpe_add_del_tunnel_reply_t_handler_json
-(vl_api_lisp_gpe_add_del_tunnel_reply_t * mp)
-{
- vat_main_t * vam = &vat_main;
- vat_json_node_t node;
-
- vat_json_init_object(&node);
- vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
- vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
-
- vat_json_print(vam->ofp, &node);
- vat_json_free(&node);
-
- vam->retval = ntohl(mp->retval);
- vam->result_ready = 1;
-}
static void vl_api_show_version_reply_t_handler
(vl_api_show_version_reply_t * mp)
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
- vam->result_ready = 1;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
}
+
}
static void vl_api_tap_connect_reply_t_handler_json
vam->retval = ntohl(mp->retval);
vam->result_ready = 1;
+
}
static void vl_api_tap_modify_reply_t_handler
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
vam->result_ready = 1;
}
+static void vl_api_gre_add_del_tunnel_reply_t_handler
+(vl_api_gre_add_del_tunnel_reply_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ i32 retval = ntohl(mp->retval);
+ if (vam->async_mode) {
+ vam->async_errors += (retval < 0);
+ } else {
+ vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
+ vam->result_ready = 1;
+ }
+}
+
+static void vl_api_gre_add_del_tunnel_reply_t_handler_json
+(vl_api_gre_add_del_tunnel_reply_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ vat_json_node_t node;
+
+ vat_json_init_object(&node);
+ vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
+ vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
+
+ vat_json_print(vam->ofp, &node);
+ vat_json_free(&node);
+
+ vam->retval = ntohl(mp->retval);
+ vam->result_ready = 1;
+}
+
static void vl_api_create_vhost_user_if_reply_t_handler
(vl_api_create_vhost_user_if_reply_t * mp)
{
vam->async_errors += (retval < 0);
} else {
vam->retval = retval;
+ vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
vl_api_lisp_locator_set_details_t *mp)
{
vat_main_t *vam = &vat_main;
+ u8 * tmp_str = NULL;
+
+ if (mp->local) {
+ fformat(vam->ofp, "%=20s%=16d%=16d%=16d\n",
+ mp->locator_set_name,
+ ntohl(mp->sw_if_index),
+ mp->priority,
+ mp->weight);
+ } else {
+ tmp_str = format(0,"%U/%d",
+ mp->is_ipv6 ? format_ip6_address : format_ip4_address,
+ mp->ip_address,
+ mp->prefix_len);
- fformat(vam->ofp, "%=20s%=16d%=16d%=16d\n",
- mp->locator_set_name,
- ntohl(mp->sw_if_index),
- mp->priority,
- mp->weight);
+ fformat(vam->ofp, "%=20s%=16s%=16d%=16d\n",
+ mp->locator_set_name,
+ tmp_str,
+ mp->priority,
+ mp->weight);
+ vec_free(tmp_str);
+ }
}
static void
{
vat_main_t *vam = &vat_main;
vat_json_node_t *node = NULL;
+ struct in6_addr ip6;
+ struct in_addr ip4;
if (VAT_JSON_ARRAY != vam->json_tree.type) {
ASSERT(VAT_JSON_NONE == vam->json_tree.type);
vat_json_init_object(node);
vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
- vat_json_object_add_uint(node, "locator", ntohl(mp->sw_if_index));
+ if (mp->local) {
+ vat_json_object_add_uint(node, "locator", ntohl(mp->sw_if_index));
+ } else {
+ if (mp->is_ipv6) {
+ clib_memcpy(&ip6, mp->ip_address, sizeof(ip6));
+ vat_json_object_add_ip6(node, "locator", ip6);
+ } else {
+ clib_memcpy(&ip4, mp->ip_address, sizeof(ip4));
+ vat_json_object_add_ip4(node, "locator", ip4);
+ }
+ vat_json_object_add_uint(node, "prefix-length", mp->prefix_len);
+ }
vat_json_object_add_uint(node, "priority", mp->priority);
vat_json_object_add_uint(node, "weight", mp->weight);
}
}
}
+static void
+vl_api_lisp_enable_disable_status_details_t_handler
+(vl_api_lisp_enable_disable_status_details_t *mp)
+{
+ vat_main_t *vam = &vat_main;
+
+ fformat(vam->ofp, "feature: %s\ngpe: %s\n",
+ mp->feature_status ? "enabled" : "disabled",
+ mp->gpe_status ? "enabled" : "disabled");
+}
+
+static void
+vl_api_lisp_enable_disable_status_details_t_handler_json
+(vl_api_lisp_enable_disable_status_details_t *mp)
+{
+ vat_main_t *vam = &vat_main;
+ vat_json_node_t *node = NULL;
+ u8 * gpe_status = NULL;
+ u8 * feature_status = NULL;
+
+ gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
+ feature_status = format (0, "%s",
+ mp->feature_status ? "enabled" : "disabled");
+ vec_add1 (gpe_status, 0);
+ vec_add1 (feature_status, 0);
+
+ 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_string_copy(node, "gpe_status", gpe_status);
+ vat_json_object_add_string_copy(node, "feature_status", feature_status);
+
+ vec_free (gpe_status);
+ vec_free (feature_status);
+}
+
+static u8 * format_policer_type (u8 * s, va_list * va)
+{
+ u32 i = va_arg (*va, u32);
+
+ if (i == SSE2_QOS_POLICER_TYPE_1R2C)
+ s = format (s, "1r2c");
+ else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
+ s = format (s, "1r3c");
+ else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
+ s = format (s, "2r3c-2698");
+ else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
+ s = format (s, "2r3c-4115");
+ else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
+ s = format (s, "2r3c-mef5cf1");
+ else
+ s = format (s, "ILLEGAL");
+ return s;
+}
+
+static u8 * format_policer_rate_type (u8 * s, va_list * va)
+{
+ u32 i = va_arg (*va, u32);
+
+ if (i == SSE2_QOS_RATE_KBPS)
+ s = format (s, "kbps");
+ else if (i == SSE2_QOS_RATE_PPS)
+ s = format(s, "pps");
+ else
+ s = format (s, "ILLEGAL");
+ return s;
+}
+
+static u8 * format_policer_round_type (u8 * s, va_list * va)
+{
+ u32 i = va_arg (*va, u32);
+
+ if (i == SSE2_QOS_ROUND_TO_CLOSEST)
+ s = format(s, "closest");
+ else if (i == SSE2_QOS_ROUND_TO_UP)
+ s = format (s, "up");
+ else if (i == SSE2_QOS_ROUND_TO_DOWN)
+ s = format (s, "down");
+ else
+ s = format (s, "ILLEGAL");
+ return s;
+}
+
+static void vl_api_policer_details_t_handler
+(vl_api_policer_details_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+
+ fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
+ "rate type %U, round type %U, %s rate, %s color-aware, "
+ "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
+ "cur bkt %u, ext lim %u, ext bkt %u, last update %llu\n",
+ mp->name,
+ format_policer_type, mp->type,
+ ntohl(mp->cir),
+ ntohl(mp->eir),
+ ntohl(mp->cb),
+ ntohl(mp->eb),
+ format_policer_rate_type, mp->rate_type,
+ format_policer_round_type, mp->round_type,
+ mp->single_rate ? "single" : "dual",
+ mp->color_aware ? "is" : "not",
+ ntohl(mp->cir_tokens_per_period),
+ ntohl(mp->pir_tokens_per_period),
+ ntohl(mp->scale),
+ ntohl(mp->current_limit),
+ ntohl(mp->current_bucket),
+ ntohl(mp->extended_limit),
+ ntohl(mp->extended_bucket),
+ clib_net_to_host_u64(mp->last_update_time));
+}
+
+static void vl_api_policer_details_t_handler_json
+(vl_api_policer_details_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+ vat_json_node_t *node;
+ u8 *rate_type_str, *round_type_str, *type_str;
+
+ rate_type_str = format(0, "%U", format_policer_rate_type, mp->rate_type);
+ round_type_str = format(0, "%U", format_policer_round_type, mp->round_type);
+ type_str = format(0, "%U", format_policer_type, mp->type);
+
+ 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_string_copy(node, "name", mp->name);
+ vat_json_object_add_uint(node, "cir", ntohl(mp->cir));
+ vat_json_object_add_uint(node, "eir", ntohl(mp->eir));
+ vat_json_object_add_uint(node, "cb", ntohl(mp->cb));
+ vat_json_object_add_uint(node, "eb", ntohl(mp->eb));
+ vat_json_object_add_string_copy(node, "rate_type", rate_type_str);
+ vat_json_object_add_string_copy(node, "round_type", round_type_str);
+ vat_json_object_add_string_copy(node, "type", type_str);
+ vat_json_object_add_uint(node, "single_rate", mp->single_rate);
+ vat_json_object_add_uint(node, "color_aware", mp->color_aware);
+ vat_json_object_add_uint(node, "scale", ntohl(mp->scale));
+ vat_json_object_add_uint(node, "cir_tokens_per_period",
+ ntohl(mp->cir_tokens_per_period));
+ vat_json_object_add_uint(node, "eir_tokens_per_period",
+ ntohl(mp->pir_tokens_per_period));
+ vat_json_object_add_uint(node, "current_limit", ntohl(mp->current_limit));
+ vat_json_object_add_uint(node, "current_bucket", ntohl(mp->current_bucket));
+ vat_json_object_add_uint(node, "extended_limit", ntohl(mp->extended_limit));
+ vat_json_object_add_uint(node, "extended_bucket",
+ ntohl(mp->extended_bucket));
+ vat_json_object_add_uint(node, "last_update_time",
+ ntohl(mp->last_update_time));
+
+ vec_free(rate_type_str);
+ vec_free(round_type_str);
+ vec_free(type_str);
+}
+
+
#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
_(set_arp_neighbor_limit_reply) \
_(l2_patch_add_del_reply) \
_(sr_tunnel_add_del_reply) \
+_(sr_policy_add_del_reply) \
+_(sr_multicast_map_add_del_reply) \
_(classify_add_del_session_reply) \
_(classify_set_interface_ip_table_reply) \
_(classify_set_interface_l2_tables_reply) \
_(lisp_gpe_add_del_fwd_entry_reply) \
_(lisp_add_del_map_resolver_reply) \
_(lisp_gpe_enable_disable_reply) \
-_(lisp_gpe_add_del_iface_reply)
+_(lisp_gpe_add_del_iface_reply) \
+_(lisp_enable_disable_reply) \
+_(lisp_pitr_set_locator_set_reply) \
+_(vxlan_gpe_add_del_tunnel_reply) \
+_(af_packet_delete_reply) \
+_(policer_add_del_reply) \
+_(netmap_create_reply) \
+_(netmap_delete_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
_(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
_(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
_(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
+_(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
+_(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
_(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
_(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
_(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
_(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
_(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
_(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
+_(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
+_(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
_(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
_(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
_(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
_(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
_(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
_(SHOW_VERSION_REPLY, show_version_reply) \
-_(NSH_GRE_ADD_DEL_TUNNEL_REPLY, nsh_gre_add_del_tunnel_reply) \
_(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
-_(NSH_VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, nsh_vxlan_gpe_add_del_tunnel_reply) \
-_(LISP_GPE_ADD_DEL_TUNNEL_REPLY, lisp_gpe_add_del_tunnel_reply) \
+_(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
+_(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
_(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
_(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
_(IP4_ARP_EVENT, ip4_arp_event) \
_(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
_(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_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_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
_(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
_(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details) \
_(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
-_(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details)
+_(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
+_(LISP_ENABLE_DISABLE_STATUS_DETAILS, \
+ lisp_enable_disable_status_details) \
+_(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_DETAILS, policer_details) \
+_(NETMAP_CREATE_REPLY, netmap_create_reply) \
+_(NETMAP_DELETE_REPLY, netmap_delete_reply)
/* M: construct, but don't yet send a message */
return -99; \
} while(0);
+/* W2: wait for results, with timeout */
+#define W2(body) \
+do { \
+ timeout = vat_time_now (vam) + 1.0; \
+ \
+ while (vat_time_now (vam) < timeout) { \
+ if (vam->result_ready == 1) { \
+ (body); \
+ return (vam->retval); \
+ } \
+ } \
+ return -99; \
+} while(0);
+
typedef struct {
u8 * name;
u32 value;
strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
S;
+
+ /* and vxlan-gpe tunnel interfaces */
+ M(SW_INTERFACE_DUMP, sw_interface_dump);
+ mp->name_filter_valid = 1;
+ strncpy ((char *) mp->name_filter, "vxlan_gpe", sizeof(mp->name_filter)-1);
+ S;
+
/* and vxlan tunnel interfaces */
M(SW_INTERFACE_DUMP, sw_interface_dump);
mp->name_filter_valid = 1;
strncpy ((char *) mp->name_filter, "l2tpv3_tunnel", sizeof(mp->name_filter)-1);
S;
+ /* and GRE tunnel interfaces */
+ M(SW_INTERFACE_DUMP, sw_interface_dump);
+ mp->name_filter_valid = 1;
+ strncpy ((char *) mp->name_filter, "gre", sizeof(mp->name_filter)-1);
+ S;
+
/* Use a control ping for synchronization */
{
vl_api_control_ping_t * mp;
S; W;
return 0;
}
+
static int api_sr_tunnel_add_del (vat_main_t * vam)
{
unformat_input_t * i = vam->input;
ip6_address_t * tags = 0;
ip6_address_t * this_tag;
ip6_address_t next_address, tag;
+ u8 * name = 0;
+ u8 * policy_name = 0;
while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
{
if (unformat (i, "del"))
is_del = 1;
+ else if (unformat (i, "name %s", &name))
+ ;
+ else if (unformat (i, "policy %s", &policy_name))
+ ;
else if (unformat (i, "rx_fib_id %d", &rx_table_id))
;
else if (unformat (i, "tx_fib_id %d", &tx_table_id))
mp->outer_vrf_id = ntohl (rx_table_id);
mp->inner_vrf_id = ntohl (tx_table_id);
+ memcpy (mp->name, name, vec_len(name));
+ memcpy (mp->policy_name, policy_name, vec_len(policy_name));
vec_free (segments);
vec_free (tags);
/* NOTREACHED */
}
+static int api_sr_policy_add_del (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_sr_policy_add_del_t *mp;
+ f64 timeout;
+ int is_del = 0;
+ u8 * name = 0;
+ u8 * tunnel_name = 0;
+ u8 ** tunnel_names = 0;
+
+ int name_set = 0 ;
+ int tunnel_set = 0;
+ int j = 0;
+ int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
+ int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "del"))
+ is_del = 1;
+ else if (unformat (input, "name %s", &name))
+ name_set = 1;
+ else if (unformat (input, "tunnel %s", &tunnel_name))
+ {
+ if (tunnel_name)
+ {
+ vec_add1 (tunnel_names, tunnel_name);
+ /* For serializer:
+ - length = #bytes to store in serial vector
+ - +1 = byte to store that length
+ */
+ tunnel_names_length += (vec_len (tunnel_name) + 1);
+ tunnel_set = 1;
+ tunnel_name = 0;
+ }
+ }
+ else
+ break;
+ }
+
+ if (!name_set)
+ {
+ errmsg ("policy name required\n");
+ return -99;
+ }
+
+ if ((!tunnel_set) && (!is_del))
+ {
+ errmsg ("tunnel name required\n");
+ return -99;
+ }
+
+ M2(SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
+
+
+
+ mp->is_add = !is_del;
+
+ memcpy (mp->name, name, vec_len(name));
+ // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
+ u8 * serial_orig = 0;
+ vec_validate (serial_orig, tunnel_names_length);
+ *serial_orig = vec_len(tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
+ serial_orig += 1; // Move along one byte to store the length of first tunnel_name
+
+ for (j=0; j < vec_len(tunnel_names); j++)
+ {
+ tun_name_len = vec_len (tunnel_names[j]);
+ *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
+ serial_orig += 1; // Move along one byte to store the actual tunnel name
+ memcpy (serial_orig, tunnel_names[j], tun_name_len);
+ serial_orig += tun_name_len; // Advance past the copy
+ }
+ memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
+
+ vec_free (tunnel_names);
+ vec_free (tunnel_name);
+
+ S; W;
+ /* NOTREACHED */
+}
+
+static int api_sr_multicast_map_add_del (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_sr_multicast_map_add_del_t *mp;
+ f64 timeout;
+ int is_del = 0;
+ ip6_address_t multicast_address;
+ u8 * policy_name = 0;
+ int multicast_address_set = 0;
+
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "del"))
+ is_del = 1;
+ else if (unformat (input, "address %U", unformat_ip6_address, &multicast_address))
+ multicast_address_set = 1;
+ else if (unformat (input, "sr-policy %s", &policy_name))
+ ;
+ else
+ break;
+ }
+
+ if (!is_del && !policy_name)
+ {
+ errmsg ("sr-policy name required\n");
+ return -99;
+ }
+
+
+ if (!multicast_address_set)
+ {
+ errmsg ("address required\n");
+ return -99;
+ }
+
+ M(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
+
+ mp->is_add = !is_del;
+ memcpy (mp->policy_name, policy_name, vec_len(policy_name));
+ clib_memcpy (mp->multicast_address, &multicast_address, sizeof (mp->multicast_address));
+
+
+ vec_free (policy_name);
+
+ S; W;
+ /* NOTREACHED */
+}
+
#define foreach_ip4_proto_field \
_(src_address) \
M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
if (ipv6_set) {
- clib_memcpy(&mp->dst_address, &src6, sizeof(src6));
- clib_memcpy(&mp->dst_address, &src6, sizeof(dst6));
+ clib_memcpy(&mp->src_address, &src6, sizeof(src6));
+ clib_memcpy(&mp->dst_address, &dst6, sizeof(dst6));
} else {
clib_memcpy(&mp->src_address, &src4, sizeof(src4));
clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
fformat(vam->ofp, "%11d%24U%24U%14d%18d%13d\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,
ntohl(mp->encap_vrf_id),
ntohl(mp->decap_next_index),
ntohl(mp->vni));
W;
}
+static int api_gre_add_del_tunnel (vat_main_t * vam)
+{
+ unformat_input_t * line_input = vam->input;
+ vl_api_gre_add_del_tunnel_t *mp;
+ f64 timeout;
+ ip4_address_t src4, dst4;
+ u8 is_add = 1;
+ u8 src_set = 0;
+ u8 dst_set = 0;
+ u32 outer_fib_id = 0;
+
+ 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))
+ src_set = 1;
+ else if (unformat (line_input, "dst %U",
+ unformat_ip4_address, &dst4))
+ dst_set = 1;
+ else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
+ ;
+ else {
+ errmsg ("parse error '%U'\n", format_unformat_error, line_input);
+ return -99;
+ }
+ }
+
+ if (src_set == 0) {
+ errmsg ("tunnel src address not specified\n");
+ return -99;
+ }
+ if (dst_set == 0) {
+ errmsg ("tunnel dst address not specified\n");
+ return -99;
+ }
+
+
+ M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
+
+ clib_memcpy(&mp->src_address, &src4, sizeof(src4));
+ clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
+ mp->outer_table_id = ntohl(outer_fib_id);
+ mp->is_add = is_add;
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static void vl_api_gre_tunnel_details_t_handler
+(vl_api_gre_tunnel_details_t * mp)
+{
+ vat_main_t * vam = &vat_main;
+
+ fformat(vam->ofp, "%11d%15U%15U%14d\n",
+ ntohl(mp->sw_if_index),
+ format_ip4_address, &mp->src_address,
+ format_ip4_address, &mp->dst_address,
+ ntohl(mp->outer_table_id));
+}
+
+static void vl_api_gre_tunnel_details_t_handler_json
+(vl_api_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) {
+ 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));
+ 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, "outer_fib_id", ntohl(mp->outer_table_id));
+}
+
+static int api_gre_tunnel_dump (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_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) {
+ if (unformat (i, "sw_if_index %d", &sw_if_index))
+ sw_if_index_set = 1;
+ else
+ break;
+ }
+
+ if (sw_if_index_set == 0) {
+ sw_if_index = ~0;
+ }
+
+ if (!vam->json_output) {
+ fformat(vam->ofp, "%11s%15s%15s%14s\n",
+ "sw_if_index", "src_address", "dst_address",
+ "outer_fib_id");
+ }
+
+ /* Get list of gre-tunnel interfaces */
+ M(GRE_TUNNEL_DUMP, gre_tunnel_dump);
+
+ mp->sw_if_index = htonl(sw_if_index);
+
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t * mp;
+ M(CONTROL_PING, control_ping);
+ S;
+ }
+ W;
+}
+
static int api_l2_fib_clear_table (vat_main_t * vam)
{
// unformat_input_t * i = vam->input;
return 0;
}
-static uword unformat_nsh_gre_decap_next
-(unformat_input_t * input, va_list * args)
-{
- u32 * result = va_arg (*args, u32 *);
- u32 tmp;
-
- if (unformat (input, "drop"))
- *result = NSH_INPUT_NEXT_DROP;
- else if (unformat (input, "ip4"))
- *result = NSH_INPUT_NEXT_IP4_INPUT;
- else if (unformat (input, "ip6"))
- *result = NSH_INPUT_NEXT_IP6_INPUT;
- else if (unformat (input, "ethernet"))
- *result = NSH_INPUT_NEXT_ETHERNET_INPUT;
- else if (unformat (input, "%d", &tmp))
- *result = tmp;
- else
- return 0;
- return 1;
-}
-static int api_nsh_gre_add_del_tunnel (vat_main_t * vam)
+static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
{
unformat_input_t * line_input = vam->input;
- vl_api_nsh_gre_add_del_tunnel_t *mp;
+ vl_api_vxlan_gpe_add_del_tunnel_t *mp;
f64 timeout;
- ip4_address_t src, dst;
+ ip4_address_t local4, remote4;
+ ip6_address_t local6, remote6;
u8 is_add = 1;
- u8 src_set = 0;
- u8 dst_set = 0;
+ u8 ipv4_set = 0, ipv6_set = 0;
+ u8 local_set = 0;
+ u8 remote_set = 0;
u32 encap_vrf_id = 0;
u32 decap_vrf_id = 0;
- u8 ver_o_c = 0;
- u8 md_type = 0;
- u8 next_protocol = 1; /* ip4 */
- u32 spi;
- u8 spi_set = 0;
- u32 si;
- u8 si_set = 0;
- u32 spi_si;
- u32 c1 = 0;
- u32 c2 = 0;
- u32 c3 = 0;
- u32 c4 = 0;
- u32 *tlvs = 0;
- u32 decap_next_index = NSH_INPUT_NEXT_IP4_INPUT;
- u32 tmp;
- int i;
+ u8 protocol = ~0;
+ u32 vni;
+ u8 vni_set = 0;
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, &src))
- src_set = 1;
- else if (unformat (line_input, "dst %U",
- unformat_ip4_address, &dst))
- dst_set = 1;
+ else if (unformat (line_input, "local %U",
+ unformat_ip4_address, &local4))
+ {
+ local_set = 1;
+ ipv4_set = 1;
+ }
+ else if (unformat (line_input, "remote %U",
+ unformat_ip4_address, &remote4))
+ {
+ remote_set = 1;
+ ipv4_set = 1;
+ }
+ else if (unformat (line_input, "local %U",
+ unformat_ip6_address, &local6))
+ {
+ local_set = 1;
+ ipv6_set = 1;
+ }
+ else if (unformat (line_input, "remote %U",
+ unformat_ip6_address, &remote6))
+ {
+ remote_set = 1;
+ ipv6_set = 1;
+ }
else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
;
else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
;
- else if (unformat (line_input, "decap-next %U",
- unformat_nsh_gre_decap_next, &decap_next_index))
- ;
- else if (unformat (line_input, "version %d", &tmp))
- ver_o_c |= (tmp & 3) << 6;
- else if (unformat (line_input, "o-bit %d", &tmp))
- ver_o_c |= (tmp & 1) << 5;
- else if (unformat (line_input, "c-bit %d", &tmp))
- ver_o_c |= (tmp & 1) << 4;
- else if (unformat (line_input, "md-type %d", &tmp))
- md_type = tmp;
+ else if (unformat (line_input, "vni %d", &vni))
+ vni_set = 1;
else if (unformat(line_input, "next-ip4"))
- next_protocol = 1;
+ protocol = 1;
else if (unformat(line_input, "next-ip6"))
- next_protocol = 2;
+ protocol = 2;
else if (unformat(line_input, "next-ethernet"))
- next_protocol = 3;
- else if (unformat (line_input, "c1 %d", &c1))
- ;
- else if (unformat (line_input, "c2 %d", &c2))
- ;
- else if (unformat (line_input, "c3 %d", &c3))
- ;
- else if (unformat (line_input, "c4 %d", &c4))
- ;
- else if (unformat (line_input, "spi %d", &spi))
- spi_set = 1;
- else if (unformat (line_input, "si %d", &si))
- si_set = 1;
- else if (unformat (line_input, "tlv %x"))
- vec_add1 (tlvs, tmp);
+ protocol = 3;
+ else if (unformat(line_input, "next-nsh"))
+ protocol = 4;
else {
errmsg ("parse error '%U'\n", format_unformat_error, line_input);
return -99;
}
}
- if (src_set == 0) {
- errmsg ("tunnel src address not specified\n");
+ if (local_set == 0) {
+ errmsg ("tunnel local address not specified\n");
return -99;
}
- if (dst_set == 0) {
- errmsg ("tunnel dst address not specified\n");
+ if (remote_set == 0) {
+ errmsg ("tunnel remote address not specified\n");
return -99;
}
-
- if (spi_set == 0) {
- errmsg ("spi not specified\n");
+ if (ipv4_set && ipv6_set) {
+ errmsg ("both IPv4 and IPv6 addresses specified");
return -99;
}
- if (si_set == 0) {
- errmsg ("si not specified\n");
+ if (vni_set == 0) {
+ errmsg ("vni not specified\n");
return -99;
}
- M2 (NSH_GRE_ADD_DEL_TUNNEL, nsh_gre_add_del_tunnel,
- sizeof(u32) * vec_len (tlvs));
+ M(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
- spi_si = (spi<<8) | si;
- mp->src = src.as_u32;
- mp->dst = dst.as_u32;
+ if (ipv6_set) {
+ clib_memcpy(&mp->local, &local6, sizeof(local6));
+ clib_memcpy(&mp->remote, &remote6, sizeof(remote6));
+ } else {
+ clib_memcpy(&mp->local, &local4, sizeof(local4));
+ clib_memcpy(&mp->remote, &remote4, sizeof(remote4));
+ }
+
mp->encap_vrf_id = ntohl(encap_vrf_id);
mp->decap_vrf_id = ntohl(decap_vrf_id);
- mp->decap_next_index = ntohl(decap_next_index);
- mp->tlv_len_in_words = vec_len (tlvs);
+ mp->protocol = ntohl(protocol);
+ mp->vni = ntohl(vni);
mp->is_add = is_add;
- mp->ver_o_c = ver_o_c;
- mp->length = 6 + vec_len(tlvs);
- mp->md_type = md_type;
- mp->next_protocol = next_protocol;
- mp->spi_si = ntohl(spi_si);
- mp->c1 = ntohl(c1);
- mp->c2 = ntohl(c2);
- mp->c3 = ntohl(c3);
- mp->c4 = ntohl(c4);
-
- for (i = 0; i < vec_len(tlvs); i++)
- mp->tlvs[i] = ntohl(tlvs[i]);
-
- vec_free (tlvs);
+ mp->is_ipv6 = ipv6_set;
S; W;
/* NOTREACHED */
return 0;
}
-static uword unformat_nsh_vxlan_gpe_decap_next
-(unformat_input_t * input, va_list * args)
+static void vl_api_vxlan_gpe_tunnel_details_t_handler
+(vl_api_vxlan_gpe_tunnel_details_t * mp)
{
- u32 * result = va_arg (*args, u32 *);
- u32 tmp;
-
- if (unformat (input, "drop"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_DROP;
- else if (unformat (input, "ip4"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_IP4_INPUT;
- else if (unformat (input, "ip6"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_IP6_INPUT;
- else if (unformat (input, "ethernet"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_ETHERNET_INPUT;
- else if (unformat (input, "nsh-vxlan-gpe"))
- *result = NSH_VXLAN_GPE_INPUT_NEXT_ETHERNET_INPUT;
- else if (unformat (input, "%d", &tmp))
- *result = tmp;
- else
- return 0;
- return 1;
+ vat_main_t * vam = &vat_main;
+
+ fformat(vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
+ ntohl(mp->sw_if_index),
+ format_ip46_address, &(mp->local[0]),
+ format_ip46_address, &(mp->remote[0]),
+ ntohl(mp->vni),
+ ntohl(mp->protocol),
+ ntohl(mp->encap_vrf_id),
+ ntohl(mp->decap_vrf_id));
}
-static int api_nsh_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
+static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
+(vl_api_vxlan_gpe_tunnel_details_t * mp)
{
- unformat_input_t * line_input = vam->input;
- vl_api_nsh_vxlan_gpe_add_del_tunnel_t *mp;
- f64 timeout;
- ip4_address_t src, dst;
- u8 is_add = 1;
- u8 src_set = 0;
- u8 dst_set = 0;
- u32 encap_vrf_id = 0;
- u32 decap_vrf_id = 0;
- u8 ver_o_c = 0;
- u8 md_type = 0;
- u8 next_protocol = 1; /* ip4 */
- u32 spi;
- u8 spi_set = 0;
- u32 si;
- u8 si_set = 0;
- u32 spi_si;
- u32 c1 = 0;
- u32 c2 = 0;
- u32 c3 = 0;
- u32 c4 = 0;
- u32 *tlvs = 0;
- u32 decap_next_index = NSH_INPUT_NEXT_IP4_INPUT;
- u32 vni;
- u8 vni_set = 0;
- u32 tmp;
- int i;
+ vat_main_t * vam = &vat_main;
+ vat_json_node_t *node = NULL;
+ struct in_addr ip4;
+ struct in6_addr ip6;
- 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, &src))
- src_set = 1;
- else if (unformat (line_input, "dst %U",
- unformat_ip4_address, &dst))
- dst_set = 1;
- else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
- ;
- else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
- ;
- else if (unformat (line_input, "decap-next %U",
- unformat_nsh_vxlan_gpe_decap_next,
- &decap_next_index))
- ;
- else if (unformat (line_input, "vni %d", &vni))
- vni_set = 1;
- else if (unformat (line_input, "version %d", &tmp))
- ver_o_c |= (tmp & 3) << 6;
- else if (unformat (line_input, "o-bit %d", &tmp))
- ver_o_c |= (tmp & 1) << 5;
- else if (unformat (line_input, "c-bit %d", &tmp))
- ver_o_c |= (tmp & 1) << 4;
- else if (unformat (line_input, "md-type %d", &tmp))
- md_type = tmp;
- else if (unformat(line_input, "next-ip4"))
- next_protocol = 1;
- else if (unformat(line_input, "next-ip6"))
- next_protocol = 2;
- else if (unformat(line_input, "next-ethernet"))
- next_protocol = 3;
- else if (unformat (line_input, "c1 %d", &c1))
- ;
- else if (unformat (line_input, "c2 %d", &c2))
- ;
- else if (unformat (line_input, "c3 %d", &c3))
- ;
- else if (unformat (line_input, "c4 %d", &c4))
- ;
- else if (unformat (line_input, "spi %d", &spi))
- spi_set = 1;
- else if (unformat (line_input, "si %d", &si))
- si_set = 1;
- else if (unformat (line_input, "tlv %x"))
- vec_add1 (tlvs, tmp);
- else {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
-
- if (src_set == 0) {
- errmsg ("tunnel src address not specified\n");
- return -99;
- }
- if (dst_set == 0) {
- errmsg ("tunnel dst address not specified\n");
- return -99;
- }
-
- if (spi_set == 0) {
- errmsg ("spi not specified\n");
- return -99;
+ 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);
- if (si_set == 0) {
- errmsg ("si not specified\n");
- return -99;
- }
- if (vni_set == 0) {
- errmsg ("vni not specified\n");
- return -99;
+ vat_json_init_object(node);
+ vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
+ if (mp->is_ipv6) {
+ clib_memcpy(&ip6, &(mp->local[0]), sizeof(ip6));
+ vat_json_object_add_ip6(node, "local", ip6);
+ clib_memcpy(&ip6, &(mp->remote[0]), sizeof(ip6));
+ vat_json_object_add_ip6(node, "remote", ip6);
+ } else {
+ clib_memcpy(&ip4, &(mp->local[0]), sizeof(ip4));
+ vat_json_object_add_ip4(node, "local", ip4);
+ clib_memcpy(&ip4, &(mp->remote[0]), sizeof(ip4));
+ vat_json_object_add_ip4(node, "remote", ip4);
}
-
- M2 (NSH_VXLAN_GPE_ADD_DEL_TUNNEL, nsh_vxlan_gpe_add_del_tunnel,
- sizeof(u32) * vec_len (tlvs));
-
- spi_si = (spi<<8) | si;
-
- mp->src = src.as_u32;
- mp->dst = dst.as_u32;
- mp->encap_vrf_id = ntohl(encap_vrf_id);
- mp->decap_vrf_id = ntohl(decap_vrf_id);
- mp->decap_next_index = ntohl(decap_next_index);
- mp->tlv_len_in_words = vec_len (tlvs);
- mp->vni = ntohl(vni);
- mp->is_add = is_add;
- mp->ver_o_c = ver_o_c;
- mp->length = 6 + vec_len(tlvs);
- mp->md_type = md_type;
- mp->next_protocol = next_protocol;
- mp->spi_si = ntohl(spi_si);
- mp->c1 = ntohl(c1);
- mp->c2 = ntohl(c2);
- mp->c3 = ntohl(c3);
- mp->c4 = ntohl(c4);
-
- for (i = 0; i < vec_len(tlvs); i++)
- mp->tlvs[i] = ntohl(tlvs[i]);
-
- vec_free (tlvs);
-
- S; W;
- /* NOTREACHED */
- return 0;
-}
-
-static uword unformat_lisp_gpe_decap_next (unformat_input_t * input,
- va_list * args)
-{
- u32 * result = va_arg (*args, u32 *);
- u32 tmp;
-
- if (unformat (input, "drop"))
- *result = LISP_GPE_INPUT_NEXT_DROP;
- else if (unformat (input, "ip4"))
- *result = LISP_GPE_INPUT_NEXT_IP4_INPUT;
- else if (unformat (input, "ip6"))
- *result = LISP_GPE_INPUT_NEXT_IP6_INPUT;
- else if (unformat (input, "ethernet"))
- *result = LISP_GPE_INPUT_NEXT_IP6_INPUT;
- else if (unformat (input, "%d", &tmp))
- *result = tmp;
- else
- return 0;
- return 1;
+ vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
+ vat_json_object_add_uint(node, "protocol", ntohl(mp->protocol));
+ vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
+ vat_json_object_add_uint(node, "decap_vrf_id", ntohl(mp->decap_vrf_id));
+ vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
}
-static int
-api_lisp_gpe_add_del_tunnel (vat_main_t * vam)
+static int api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
{
- unformat_input_t * line_input = vam->input;
- vl_api_lisp_gpe_add_del_tunnel_t *mp;
+ unformat_input_t * i = vam->input;
+ vl_api_vxlan_gpe_tunnel_dump_t *mp;
f64 timeout;
- ip4_address_t src, dst;
- u8 is_add = 1;
- u8 src_set = 0;
- u8 dst_set = 0;
- u32 encap_vrf_id = 0;
- u32 decap_vrf_id = 0;
- u8 next_protocol = LISP_GPE_NEXT_PROTOCOL_IP4;
- u32 decap_next_index = LISP_GPE_INPUT_NEXT_IP4_INPUT;
- u8 flags = LISP_GPE_FLAGS_P;
- u8 ver_res = 0;
- u8 res = 0;
- u32 iid = 0;
- u8 iid_set = 0;
- u32 tmp;
-
- 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, &src))
- src_set = 1;
- else if (unformat (line_input, "dst %U",
- unformat_ip4_address, &dst))
- dst_set = 1;
- else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
- ;
- else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
- ;
- else if (unformat (line_input, "decap-next %U",
- unformat_lisp_gpe_decap_next,
- &decap_next_index))
- ;
- else if (unformat(line_input, "next-ip4"))
- next_protocol = 1;
- else if (unformat(line_input, "next-ip6"))
- next_protocol = 2;
- else if (unformat(line_input, "next-ethernet"))
- next_protocol = 3;
- else if (unformat(line_input, "next-nsh"))
- next_protocol = 4;
- /* Allow the user to specify anything they want in the LISP hdr */
- else if (unformat (line_input, "ver_res %x", &tmp))
- ver_res = tmp;
- else if (unformat (line_input, "res %x", &tmp))
- res = tmp;
- else if (unformat (line_input, "flags %x", &tmp))
- flags = tmp;
- else if (unformat (line_input, "n-bit"))
- flags |= LISP_GPE_FLAGS_N;
- else if (unformat (line_input, "l-bit"))
- flags |= LISP_GPE_FLAGS_L;
- else if (unformat (line_input, "e-bit"))
- flags |= LISP_GPE_FLAGS_E;
- else if (unformat (line_input, "v-bit"))
- flags |= LISP_GPE_FLAGS_V;
- else if (unformat (line_input, "i-bit"))
- flags |= LISP_GPE_FLAGS_V;
- else if (unformat (line_input, "not-p-bit"))
- flags &= !LISP_GPE_FLAGS_P;
- else if (unformat (line_input, "p-bit"))
- flags |= LISP_GPE_FLAGS_P;
- else if (unformat (line_input, "o-bit"))
- flags |= LISP_GPE_FLAGS_O;
- else if (unformat (line_input, "iidx %x", &iid))
- iid_set = 1;
- else if (unformat (line_input, "iid %d", &iid))
- iid_set = 1;
- else {
- errmsg ("parse error '%U'\n", format_unformat_error, line_input);
- return -99;
- }
- }
+ u32 sw_if_index;
+ u8 sw_if_index_set = 0;
- if (src_set == 0) {
- errmsg ("tunnel src address not specified\n");
- return -99;
+ /* 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
+ break;
}
- if (dst_set == 0) {
- errmsg ("tunnel dst address not specified\n");
- return -99;
+
+ if (sw_if_index_set == 0) {
+ sw_if_index = ~0;
}
- if (iid_set == 0) {
- errmsg ("iid not specified\n");
- return -99;
+
+ if (!vam->json_output) {
+ fformat(vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
+ "sw_if_index", "local", "remote", "vni",
+ "protocol","encap_vrf_id", "decap_vrf_id");
}
- M(LISP_GPE_ADD_DEL_TUNNEL, lisp_gpe_add_del_tunnel);
+ /* Get list of vxlan-tunnel interfaces */
+ M(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
- mp->src = src.as_u32;
- mp->dst = dst.as_u32;
- mp->encap_vrf_id = ntohl(encap_vrf_id);
- mp->decap_vrf_id = ntohl(decap_vrf_id);
- mp->decap_next_index = ntohl(decap_next_index);
- mp->is_add = is_add;
- mp->flags = flags;
- mp->ver_res = ver_res;
- mp->res = res;
- mp->next_protocol = next_protocol;
- mp->iid = ntohl(iid);
+ mp->sw_if_index = htonl(sw_if_index);
- S; W;
+ S;
- /* NOTREACHED */
- return 0;
+ /* Use a control ping for synchronization */
+ {
+ vl_api_control_ping_t * mp;
+ M(CONTROL_PING, control_ping);
+ S;
+ }
+ W;
}
-
u8 * format_l2_fib_mac_address (u8 * s, va_list * args)
{
u8 * a = va_arg (*args, u8 *);
return -99;
}
+ if (eidv4_set && eid_lenght > 32) {
+ errmsg ("eid prefix to big\n");
+ vec_free(locator_set_name);
+ return -99;
+ }
+
+ if (eidv6_set && eid_lenght > 128) {
+ errmsg ("eid prefix to big\n");
+ vec_free(locator_set_name);
+ return -99;
+ }
+
/* Construct the API message */
M(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
return 0;
}
+static int
+api_lisp_enable_disable (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_lisp_enable_disable_t *mp;
+ f64 timeout = ~0;
+ u8 is_set = 0;
+ u8 is_en = 0;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "enable"))
+ {
+ is_set = 1;
+ is_en = 1;
+ }
+ else if (unformat (input, "disable"))
+ {
+ is_set = 1;
+ }
+ else
+ break;
+ }
+
+ if (!is_set)
+ {
+ errmsg ("Value not set\n");
+ return -99;
+ }
+
+ /* Construct the API message */
+ M(LISP_ENABLE_DISABLE, lisp_enable_disable);
+
+ mp->is_en = is_en;
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
+}
+
+/** Used for transferring locators via VPP API */
+typedef CLIB_PACKED(struct
+{
+ u8 is_ip4; /**< is locator an IPv4 address? */
+ u8 addr[16]; /**< IPv4/IPv6 address */
+}) rloc_t;
+
+/**
+ * Enable/disable LISP proxy ITR.
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_pitr_set_locator_set (vat_main_t * vam)
+{
+ f64 timeout = ~0;
+ u8 ls_name_set = 0;
+ unformat_input_t * input = vam->input;
+ vl_api_lisp_pitr_set_locator_set_t * mp;
+ u8 is_add = 1;
+ u8 * ls_name = 0;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (input, "del"))
+ is_add = 0;
+ else if (unformat (input, "locator-set %s", &ls_name))
+ ls_name_set = 1;
+ else
+ {
+ errmsg ("parse error '%U'", format_unformat_error, input);
+ return -99;
+ }
+ }
+
+ if (!ls_name_set)
+ {
+ errmsg ("locator-set name not set!");
+ return -99;
+ }
+
+ M(LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
+
+ mp->is_add = is_add;
+ clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
+ vec_free (ls_name);
+
+ /* send */
+ S;
+
+ /* wait for reply */
+ W;
+
+ /* notreached*/
+ return 0;
+}
+
+/**
+ * Add/del remote mapping from LISP control plane and updates
+ * forwarding entries in data-plane accordingly.
+ *
+ * @param vam vpp API test context
+ * @return return code
+ */
+static int
+api_lisp_add_del_remote_mapping (vat_main_t * vam)
+{
+ unformat_input_t * input = vam->input;
+ vl_api_lisp_add_del_remote_mapping_t *mp;
+ f64 timeout = ~0;
+ u32 vni = 0;
+ u8 seid_set = 0, deid_set = 0;
+ ip4_address_t seid4, deid4, rloc4;
+ ip6_address_t seid6, deid6, rloc6;
+ u32 seid_len = 0, deid_len = 0, len;
+ u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
+ u8 is_add = 1, del_all = 0;
+ u32 action = ~0;
+ rloc_t * rlocs = 0, rloc;
+
+ /* Parse args required to build the message */
+ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
+ if (unformat(input, "del-all")) {
+ del_all = 1;
+ } else if (unformat(input, "del")) {
+ is_add = 0;
+ } else if (unformat(input, "add")) {
+ is_add = 1;
+ } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
+ &deid4, &len)) {
+ deid_set = 1;
+ deid_is_ip4 = 1;
+ deid_len = len;
+ } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
+ &deid6, &len)) {
+ deid_set = 1;
+ deid_is_ip4 = 0;
+ deid_len = len;
+ } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
+ &seid4, &len)) {
+ seid_set = 1;
+ seid_is_ip4 = 1;
+ seid_len = len;
+ } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
+ &seid6, &len)) {
+ seid_set = 1;
+ seid_is_ip4 = 0;
+ seid_len = len;
+ } else if (unformat(input, "vni %d", &vni)) {
+ ;
+ } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
+ rloc.is_ip4 = 1;
+ clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
+ vec_add1 (rlocs, rloc);
+ } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
+ rloc.is_ip4 = 0;
+ clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
+ vec_add1 (rlocs, rloc);
+ } else if (unformat(input, "action %d", &action)) {
+ ;
+ } else {
+ clib_warning ("parse error '%U'", format_unformat_error, input);
+ return -99;
+ }
+ }
+
+ if (!seid_set || !deid_set) {
+ errmsg ("missing params!");
+ return -99;
+ }
+
+ if (seid_is_ip4 != deid_is_ip4) {
+ errmsg ("source and destination EIDs are not in " "same IP family!");
+ return -99;
+ }
+
+ if (is_add && (~0 == action)
+ && 0 == vec_len (rlocs)) {
+ errmsg ("no action set for negative map-reply!");
+ return -99;
+ }
+
+ M(LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
+ mp->is_add = is_add;
+ mp->vni = htonl (vni);
+ mp->seid_len = seid_len;
+ mp->action = (u8) action;
+ mp->deid_len = deid_len;
+ mp->del_all = del_all;
+ if (seid_is_ip4) {
+ mp->eid_is_ip4 = 1;
+ clib_memcpy (mp->seid, &seid4, sizeof (seid4));
+ } else {
+ mp->eid_is_ip4 = 0;
+ clib_memcpy (mp->seid, &seid6, sizeof (seid6));
+ }
+
+ if (deid_is_ip4) {
+ mp->eid_is_ip4 = 1;
+ clib_memcpy (mp->deid, &deid4, sizeof (deid4));
+ } else {
+ mp->eid_is_ip4 = 0;
+ clib_memcpy (mp->deid, &deid6, sizeof (deid6));
+ }
+
+ mp->rloc_num = vec_len (rlocs);
+ clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
+ vec_free (rlocs);
+
+ /* send it... */
+ S;
+
+ /* Wait for a reply... */
+ W;
+
+ /* NOTREACHED */
+ return 0;
+}
+
static int
api_lisp_gpe_add_del_iface(vat_main_t * vam)
{
return 0;
}
+static int
+api_lisp_enable_disable_status_dump(vat_main_t *vam)
+{
+ vl_api_lisp_enable_disable_status_dump_t *mp;
+ f64 timeout = ~0;
+
+ if (!vam->json_output) {
+ fformat(vam->ofp, "%=20s\n",
+ "lisp status:");
+ }
+
+ M(LISP_ENABLE_DISABLE_STATUS_DUMP,
+ lisp_enable_disable_status_dump);
+ /* 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_af_packet_create (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_af_packet_create_t * mp;
+ f64 timeout;
+ u8 * host_if_name = 0;
+ u8 hw_addr[6];
+ u8 random_hw_addr = 1;
+
+ memset (hw_addr, 0, sizeof (hw_addr));
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &host_if_name))
+ vec_add1 (host_if_name, 0);
+ else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
+ random_hw_addr = 0;
+ else
+ break;
+ }
+
+ if (!vec_len (host_if_name)) {
+ errmsg ("host-interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (host_if_name) > 64) {
+ errmsg ("host-interface name too long");
+ return -99;
+ }
+
+ M(AF_PACKET_CREATE, af_packet_create);
+
+ clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
+ clib_memcpy (mp->hw_addr, hw_addr, 6);
+ mp->use_random_hw_addr = random_hw_addr;
+ vec_free (host_if_name);
+
+ S; W2(fprintf(vam->ofp," new sw_if_index = %d ", vam->sw_if_index));
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_af_packet_delete (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_af_packet_delete_t * mp;
+ f64 timeout;
+ u8 * host_if_name = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &host_if_name))
+ vec_add1 (host_if_name, 0);
+ else
+ break;
+ }
+
+ if (!vec_len (host_if_name)) {
+ errmsg ("host-interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (host_if_name) > 64) {
+ errmsg ("host-interface name too long");
+ return -99;
+ }
+
+ M(AF_PACKET_DELETE, af_packet_delete);
+
+ clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
+ vec_free (host_if_name);
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_policer_add_del (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_policer_add_del_t * mp;
+ f64 timeout;
+ u8 is_add = 1;
+ u8 * name = 0;
+ u32 cir = 0;
+ u32 eir = 0;
+ u64 cb = 0;
+ u64 eb = 0;
+ u8 rate_type = 0;
+ u8 round_type = 0;
+ u8 type = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "del"))
+ is_add = 0;
+ else if (unformat (i, "name %s", &name))
+ vec_add1 (name, 0);
+ else if (unformat (i, "cir %u", &cir))
+ ;
+ else if (unformat (i, "eir %u", &eir))
+ ;
+ else if (unformat (i, "cb %u", &cb))
+ ;
+ else if (unformat (i, "eb %u", &eb))
+ ;
+ else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
+ &rate_type))
+ ;
+ else if (unformat (i, "round_type %U", unformat_policer_round_type,
+ &round_type))
+ ;
+ else if (unformat (i, "type %U", unformat_policer_type, &type))
+ ;
+ else
+ break;
+ }
+
+ if (!vec_len (name)) {
+ errmsg ("policer name must be specified");
+ return -99;
+ }
+
+ if (vec_len (name) > 64) {
+ errmsg ("policer name too long");
+ return -99;
+ }
+
+ M(POLICER_ADD_DEL, policer_add_del);
+
+ clib_memcpy (mp->name, name, vec_len (name));
+ vec_free (name);
+ mp->is_add = is_add;
+ mp->cir = cir;
+ mp->eir = eir;
+ mp->cb = cb;
+ mp->eb = eb;
+ mp->rate_type = rate_type;
+ mp->round_type = round_type;
+ mp->type = type;
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_policer_dump(vat_main_t *vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_policer_dump_t *mp;
+ f64 timeout = ~0;
+ u8 *match_name = 0;
+ u8 match_name_valid = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &match_name)) {
+ vec_add1 (match_name, 0);
+ match_name_valid = 1;
+ } else
+ break;
+ }
+
+ M(POLICER_DUMP, policer_dump);
+ mp->match_name_valid = match_name_valid;
+ clib_memcpy (mp->match_name, match_name, vec_len (match_name));
+ vec_free (match_name);
+ /* 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_netmap_create (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_netmap_create_t * mp;
+ f64 timeout;
+ u8 * if_name = 0;
+ u8 hw_addr[6];
+ u8 random_hw_addr = 1;
+ u8 is_pipe = 0;
+ u8 is_master = 0;
+
+ memset (hw_addr, 0, sizeof (hw_addr));
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &if_name))
+ vec_add1 (if_name, 0);
+ else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
+ random_hw_addr = 0;
+ else if (unformat (i, "pipe"))
+ is_pipe = 1;
+ else if (unformat (i, "master"))
+ is_master = 1;
+ else if (unformat (i, "slave"))
+ is_master = 0;
+ else
+ break;
+ }
+
+ if (!vec_len (if_name)) {
+ errmsg ("interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (if_name) > 64) {
+ errmsg ("interface name too long");
+ return -99;
+ }
+
+ M(NETMAP_CREATE, netmap_create);
+
+ clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
+ clib_memcpy (mp->hw_addr, hw_addr, 6);
+ mp->use_random_hw_addr = random_hw_addr;
+ mp->is_pipe = is_pipe;
+ mp->is_master = is_master;
+ vec_free (if_name);
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_netmap_delete (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_netmap_delete_t * mp;
+ f64 timeout;
+ u8 * if_name = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &if_name))
+ vec_add1 (if_name, 0);
+ else
+ break;
+ }
+
+ if (!vec_len (if_name)) {
+ errmsg ("interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (if_name) > 64) {
+ errmsg ("interface name too long");
+ return -99;
+ }
+
+ M(NETMAP_DELETE, netmap_delete);
+
+ clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
+ vec_free (if_name);
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
static int q_or_quit (vat_main_t * vam)
{
longjmp (vam->jump_buf, 1);
"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, \
- "src <ip6-addr> dst <ip6-addr>/<mw> (next <ip6-addr>)+\n" \
- " [tag <ip6-addr>]* [clean] [reroute]") \
+ "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
+ "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
+ "[policy <policy_name>]") \
+_(sr_policy_add_del, \
+ "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
+_(sr_multicast_map_add_del, \
+ "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" \
"lookup_v6_src | lookup_v6_dst | lookup_session_id") \
_(sw_if_l2tpv3_tunnel_dump, "") \
_(vxlan_add_del_tunnel, \
- "src <ip4-addr> dst <ip4-addr> vni [encap-vrf-id <nn>]\n" \
+ "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
" [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>] [del]\n") \
+_(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(l2_fib_clear_table, "") \
_(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
_(l2_interface_vlan_tag_rewrite, \
_(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
_(sw_interface_vhost_user_dump, "") \
_(show_version, "") \
-_(nsh_gre_add_del_tunnel, \
- "src <ip4-addr> dst <ip4-addr>" \
- "c1 <nn> c2 <nn> c3 <nn> c4 <nn> spi <nn> si <nn>\n" \
- "[encap-fib-id <nn>] [decap-fib-id <nn>] [o-bit <1|0>]\n" \
- "[c-bit <1|0>] [md-type <nn>][next-ip4][next-ip6][next-ethernet]\n" \
- "[tlv <xx>][del]") \
-_(nsh_vxlan_gpe_add_del_tunnel, \
- "src <ip4-addr> dst <ip4-addr> vni <nn>\n" \
- "c1 <nn> c2 <nn> c3 <nn> c4 <nn> spi <nn> si <nn>\n" \
- "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [o-bit <1|0>]\n" \
- "[c-bit <1|0>] [md-type <nn>][next-ip4][next-ip6][next-ethernet]\n" \
- "[tlv <xx>][del]") \
+_(vxlan_gpe_add_del_tunnel, \
+ "local <addr> remote <addr> vni <nn>\n" \
+ "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
+ "[next-ethernet] [next-nsh]\n") \
+_(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
-_(lisp_gpe_add_del_tunnel, \
- "src <ip4-addr> dst <ip4-addr> iid <nn>|iidx <0xnn>\n" \
- "[encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
- "[n-bit][l-bit][e-bit][v-bit][i-bit][p-bit][not-p-bit][o-bit]\n" \
- "[next-ip4][next-ip6][next-ethernet][next-nsh]\n" \
- "[decap-next [ip4|ip6|ethernet|nsh-encap|<nn>]][del]") \
_(interface_name_renumber, \
"<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
_(input_acl_set_interface, \
"sloc <ip4/6-addr> dloc <ip4|6-addr> [del]") \
_(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
_(lisp_gpe_enable_disable, "enable|disable") \
+_(lisp_enable_disable, "enable|disable") \
_(lisp_gpe_add_del_iface, "up|down") \
+_(lisp_add_del_remote_mapping, "add|del vni <vni> table-id <id> " \
+ "deid <dest-eid> seid" \
+ " <src-eid> rloc <locator> " \
+ "[rloc <loc> ... ]") \
+_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
_(lisp_locator_set_dump, "") \
_(lisp_local_eid_table_dump, "") \
_(lisp_gpe_tunnel_dump, "") \
-_(lisp_map_resolver_dump, "")
+_(lisp_map_resolver_dump, "") \
+_(lisp_enable_disable_status_dump, "") \
+_(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]") \
+_(policer_dump, "[name <policer name>]") \
+_(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
+ "[master|slave]") \
+_(netmap_delete, "name <interface name>")
/* List of command functions, CLI names map directly to functions */
#define foreach_cli_function \