2 *------------------------------------------------------------------
5 * Copyright (c) 2014-2016 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
21 #include <vlibapi/api.h>
22 #include <vlibmemory/api.h>
23 #include <vlibsocket/api.h>
24 #include <vnet/ip/ip.h>
25 #include <vnet/l2/l2_input.h>
26 #include <vnet/l2tp/l2tp.h>
27 #include <vnet/vxlan/vxlan.h>
28 #include <vnet/gre/gre.h>
29 #include <vnet/vxlan-gpe/vxlan_gpe.h>
30 #include <vnet/lisp-gpe/lisp_gpe.h>
32 #include <vpp/api/vpe_msg_enum.h>
33 #include <vnet/l2/l2_classify.h>
34 #include <vnet/l2/l2_vtr.h>
35 #include <vnet/classify/input_acl.h>
36 #include <vnet/classify/policer_classify.h>
37 #include <vnet/classify/flow_classify.h>
38 #include <vnet/mpls/mpls.h>
39 #include <vnet/ipsec/ipsec.h>
40 #include <vnet/ipsec/ikev2.h>
42 #include <vnet/map/map.h>
43 #include <vnet/cop/cop.h>
44 #include <vnet/ip/ip6_hop_by_hop.h>
45 #include <vnet/ip/ip_source_and_port_range_check.h>
46 #include <vnet/policer/xlate.h>
47 #include <vnet/span/span.h>
48 #include <vnet/policer/policer.h>
49 #include <vnet/policer/police.h>
50 #include <vnet/mfib/mfib_types.h>
52 #include "vat/json_format.h"
57 #define vl_typedefs /* define message structures */
58 #include <vpp/api/vpe_all_api_h.h>
61 /* declare message handlers for each api */
63 #define vl_endianfun /* define message structures */
64 #include <vpp/api/vpe_all_api_h.h>
67 /* instantiate all the print functions we know about */
68 #define vl_print(handle, ...)
70 #include <vpp/api/vpe_all_api_h.h>
73 #define __plugin_msg_base 0
74 #include <vlibapi/vat_helper_macros.h>
77 vat_time_now (vat_main_t * vam)
79 #if VPP_API_TEST_BUILTIN
80 return vlib_time_now (vam->vlib_main);
82 return clib_time_now (&vam->clib_time);
87 errmsg (char *fmt, ...)
89 vat_main_t *vam = &vat_main;
94 s = va_format (0, fmt, &va);
99 #if VPP_API_TEST_BUILTIN
100 vlib_cli_output (vam->vlib_main, (char *) s);
103 if (vam->ifp != stdin)
104 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
105 vam->input_line_number);
106 fformat (vam->ofp, (char *) s);
114 #if VPP_API_TEST_BUILTIN == 0
116 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
118 vat_main_t *vam = va_arg (*args, vat_main_t *);
119 u32 *result = va_arg (*args, u32 *);
123 if (!unformat (input, "%s", &if_name))
126 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
133 /* Parse an IP4 address %d.%d.%d.%d. */
135 unformat_ip4_address (unformat_input_t * input, va_list * args)
137 u8 *result = va_arg (*args, u8 *);
140 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
143 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
155 unformat_ethernet_address (unformat_input_t * input, va_list * args)
157 u8 *result = va_arg (*args, u8 *);
160 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
161 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
165 for (i = 0; i < 6; i++)
166 if (a[i] >= (1 << 8))
169 for (i = 0; i < 6; i++)
175 /* Returns ethernet type as an int in host byte order. */
177 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
180 u16 *result = va_arg (*args, u16 *);
184 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
186 if (type >= (1 << 16))
194 /* Parse an IP6 address. */
196 unformat_ip6_address (unformat_input_t * input, va_list * args)
198 ip6_address_t *result = va_arg (*args, ip6_address_t *);
200 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
201 uword c, n_colon, double_colon_index;
203 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
204 double_colon_index = ARRAY_LEN (hex_quads);
205 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
208 if (c >= '0' && c <= '9')
210 else if (c >= 'a' && c <= 'f')
211 hex_digit = c + 10 - 'a';
212 else if (c >= 'A' && c <= 'F')
213 hex_digit = c + 10 - 'A';
214 else if (c == ':' && n_colon < 2)
218 unformat_put_input (input);
222 /* Too many hex quads. */
223 if (n_hex_quads >= ARRAY_LEN (hex_quads))
228 hex_quad = (hex_quad << 4) | hex_digit;
230 /* Hex quad must fit in 16 bits. */
231 if (n_hex_digits >= 4)
238 /* Save position of :: */
241 /* More than one :: ? */
242 if (double_colon_index < ARRAY_LEN (hex_quads))
244 double_colon_index = n_hex_quads;
247 if (n_colon > 0 && n_hex_digits > 0)
249 hex_quads[n_hex_quads++] = hex_quad;
255 if (n_hex_digits > 0)
256 hex_quads[n_hex_quads++] = hex_quad;
261 /* Expand :: to appropriate number of zero hex quads. */
262 if (double_colon_index < ARRAY_LEN (hex_quads))
264 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
266 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
267 hex_quads[n_zero + i] = hex_quads[i];
269 for (i = 0; i < n_zero; i++)
270 hex_quads[double_colon_index + i] = 0;
272 n_hex_quads = ARRAY_LEN (hex_quads);
275 /* Too few hex quads given. */
276 if (n_hex_quads < ARRAY_LEN (hex_quads))
279 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
280 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
287 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
289 u32 *r = va_arg (*args, u32 *);
292 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
293 foreach_ipsec_policy_action
301 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
303 u32 *r = va_arg (*args, u32 *);
306 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
307 foreach_ipsec_crypto_alg
315 format_ipsec_crypto_alg (u8 * s, va_list * args)
317 u32 i = va_arg (*args, u32);
322 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
323 foreach_ipsec_crypto_alg
326 return format (s, "unknown");
328 return format (s, "%s", t);
332 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
334 u32 *r = va_arg (*args, u32 *);
337 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
338 foreach_ipsec_integ_alg
346 format_ipsec_integ_alg (u8 * s, va_list * args)
348 u32 i = va_arg (*args, u32);
353 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
354 foreach_ipsec_integ_alg
357 return format (s, "unknown");
359 return format (s, "%s", t);
363 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
365 u32 *r = va_arg (*args, u32 *);
368 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
369 foreach_ikev2_auth_method
377 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
379 u32 *r = va_arg (*args, u32 *);
382 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
383 foreach_ikev2_id_type
389 #else /* VPP_API_TEST_BUILTIN == 1 */
391 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
393 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
394 vnet_main_t *vnm = vnet_get_main ();
395 u32 *result = va_arg (*args, u32 *);
398 if (!unformat (input, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
401 *result = sw_if_index;
404 #endif /* VPP_API_TEST_BUILTIN */
407 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
409 u8 *r = va_arg (*args, u8 *);
411 if (unformat (input, "kbps"))
412 *r = SSE2_QOS_RATE_KBPS;
413 else if (unformat (input, "pps"))
414 *r = SSE2_QOS_RATE_PPS;
421 unformat_policer_round_type (unformat_input_t * input, va_list * args)
423 u8 *r = va_arg (*args, u8 *);
425 if (unformat (input, "closest"))
426 *r = SSE2_QOS_ROUND_TO_CLOSEST;
427 else if (unformat (input, "up"))
428 *r = SSE2_QOS_ROUND_TO_UP;
429 else if (unformat (input, "down"))
430 *r = SSE2_QOS_ROUND_TO_DOWN;
437 unformat_policer_type (unformat_input_t * input, va_list * args)
439 u8 *r = va_arg (*args, u8 *);
441 if (unformat (input, "1r2c"))
442 *r = SSE2_QOS_POLICER_TYPE_1R2C;
443 else if (unformat (input, "1r3c"))
444 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
445 else if (unformat (input, "2r3c-2698"))
446 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
447 else if (unformat (input, "2r3c-4115"))
448 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
449 else if (unformat (input, "2r3c-mef5cf1"))
450 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
457 unformat_dscp (unformat_input_t * input, va_list * va)
459 u8 *r = va_arg (*va, u8 *);
462 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
471 unformat_policer_action_type (unformat_input_t * input, va_list * va)
473 sse2_qos_pol_action_params_st *a
474 = va_arg (*va, sse2_qos_pol_action_params_st *);
476 if (unformat (input, "drop"))
477 a->action_type = SSE2_QOS_ACTION_DROP;
478 else if (unformat (input, "transmit"))
479 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
480 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
481 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
488 unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
490 u32 *r = va_arg (*va, u32 *);
493 if (unformat (input, "ip4"))
494 tid = POLICER_CLASSIFY_TABLE_IP4;
495 else if (unformat (input, "ip6"))
496 tid = POLICER_CLASSIFY_TABLE_IP6;
497 else if (unformat (input, "l2"))
498 tid = POLICER_CLASSIFY_TABLE_L2;
507 unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
509 u32 *r = va_arg (*va, u32 *);
512 if (unformat (input, "ip4"))
513 tid = FLOW_CLASSIFY_TABLE_IP4;
514 else if (unformat (input, "ip6"))
515 tid = FLOW_CLASSIFY_TABLE_IP6;
523 static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
524 static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
525 static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
526 static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
528 #if (VPP_API_TEST_BUILTIN==0)
530 unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
532 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
533 mfib_itf_attribute_t attr;
536 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
538 if (unformat (input, mfib_itf_flag_long_names[attr]))
539 *iflags |= (1 << attr);
541 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
543 if (unformat (input, mfib_itf_flag_names[attr]))
544 *iflags |= (1 << attr);
547 return (old == *iflags ? 0 : 1);
551 unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
553 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
554 mfib_entry_attribute_t attr;
557 FOR_EACH_MFIB_ATTRIBUTE (attr)
559 if (unformat (input, mfib_flag_long_names[attr]))
560 *eflags |= (1 << attr);
562 FOR_EACH_MFIB_ATTRIBUTE (attr)
564 if (unformat (input, mfib_flag_names[attr]))
565 *eflags |= (1 << attr);
568 return (old == *eflags ? 0 : 1);
572 format_ip4_address (u8 * s, va_list * args)
574 u8 *a = va_arg (*args, u8 *);
575 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
579 format_ip6_address (u8 * s, va_list * args)
581 ip6_address_t *a = va_arg (*args, ip6_address_t *);
582 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
584 i_max_n_zero = ARRAY_LEN (a->as_u16);
586 i_first_zero = i_max_n_zero;
588 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
590 u32 is_zero = a->as_u16[i] == 0;
591 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
597 if ((!is_zero && n_zeros > max_n_zeros)
598 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
600 i_max_n_zero = i_first_zero;
601 max_n_zeros = n_zeros;
602 i_first_zero = ARRAY_LEN (a->as_u16);
607 last_double_colon = 0;
608 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
610 if (i == i_max_n_zero && max_n_zeros > 1)
612 s = format (s, "::");
613 i += max_n_zeros - 1;
614 last_double_colon = 1;
618 s = format (s, "%s%x",
619 (last_double_colon || i == 0) ? "" : ":",
620 clib_net_to_host_u16 (a->as_u16[i]));
621 last_double_colon = 0;
628 /* Format an IP46 address. */
630 format_ip46_address (u8 * s, va_list * args)
632 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
633 ip46_type_t type = va_arg (*args, ip46_type_t);
639 is_ip4 = ip46_address_is_ip4 (ip46);
650 format (s, "%U", format_ip4_address, &ip46->ip4) :
651 format (s, "%U", format_ip6_address, &ip46->ip6);
655 format_ethernet_address (u8 * s, va_list * args)
657 u8 *a = va_arg (*args, u8 *);
659 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
660 a[0], a[1], a[2], a[3], a[4], a[5]);
665 increment_v4_address (ip4_address_t * a)
669 v = ntohl (a->as_u32) + 1;
670 a->as_u32 = ntohl (v);
674 increment_v6_address (ip6_address_t * a)
678 v0 = clib_net_to_host_u64 (a->as_u64[0]);
679 v1 = clib_net_to_host_u64 (a->as_u64[1]);
684 a->as_u64[0] = clib_net_to_host_u64 (v0);
685 a->as_u64[1] = clib_net_to_host_u64 (v1);
689 increment_mac_address (u64 * mac)
693 tmp = clib_net_to_host_u64 (tmp);
694 tmp += 1 << 16; /* skip unused (least significant) octets */
695 tmp = clib_host_to_net_u64 (tmp);
699 static void vl_api_create_loopback_reply_t_handler
700 (vl_api_create_loopback_reply_t * mp)
702 vat_main_t *vam = &vat_main;
703 i32 retval = ntohl (mp->retval);
705 vam->retval = retval;
706 vam->regenerate_interface_table = 1;
707 vam->sw_if_index = ntohl (mp->sw_if_index);
708 vam->result_ready = 1;
711 static void vl_api_create_loopback_reply_t_handler_json
712 (vl_api_create_loopback_reply_t * mp)
714 vat_main_t *vam = &vat_main;
715 vat_json_node_t node;
717 vat_json_init_object (&node);
718 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
719 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
721 vat_json_print (vam->ofp, &node);
722 vat_json_free (&node);
723 vam->retval = ntohl (mp->retval);
724 vam->result_ready = 1;
727 static void vl_api_create_loopback_instance_reply_t_handler
728 (vl_api_create_loopback_instance_reply_t * mp)
730 vat_main_t *vam = &vat_main;
731 i32 retval = ntohl (mp->retval);
733 vam->retval = retval;
734 vam->regenerate_interface_table = 1;
735 vam->sw_if_index = ntohl (mp->sw_if_index);
736 vam->result_ready = 1;
739 static void vl_api_create_loopback_instance_reply_t_handler_json
740 (vl_api_create_loopback_instance_reply_t * mp)
742 vat_main_t *vam = &vat_main;
743 vat_json_node_t node;
745 vat_json_init_object (&node);
746 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
747 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
749 vat_json_print (vam->ofp, &node);
750 vat_json_free (&node);
751 vam->retval = ntohl (mp->retval);
752 vam->result_ready = 1;
755 static void vl_api_af_packet_create_reply_t_handler
756 (vl_api_af_packet_create_reply_t * mp)
758 vat_main_t *vam = &vat_main;
759 i32 retval = ntohl (mp->retval);
761 vam->retval = retval;
762 vam->regenerate_interface_table = 1;
763 vam->sw_if_index = ntohl (mp->sw_if_index);
764 vam->result_ready = 1;
767 static void vl_api_af_packet_create_reply_t_handler_json
768 (vl_api_af_packet_create_reply_t * mp)
770 vat_main_t *vam = &vat_main;
771 vat_json_node_t node;
773 vat_json_init_object (&node);
774 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
775 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
777 vat_json_print (vam->ofp, &node);
778 vat_json_free (&node);
780 vam->retval = ntohl (mp->retval);
781 vam->result_ready = 1;
784 static void vl_api_create_vlan_subif_reply_t_handler
785 (vl_api_create_vlan_subif_reply_t * mp)
787 vat_main_t *vam = &vat_main;
788 i32 retval = ntohl (mp->retval);
790 vam->retval = retval;
791 vam->regenerate_interface_table = 1;
792 vam->sw_if_index = ntohl (mp->sw_if_index);
793 vam->result_ready = 1;
796 static void vl_api_create_vlan_subif_reply_t_handler_json
797 (vl_api_create_vlan_subif_reply_t * mp)
799 vat_main_t *vam = &vat_main;
800 vat_json_node_t node;
802 vat_json_init_object (&node);
803 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
804 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
806 vat_json_print (vam->ofp, &node);
807 vat_json_free (&node);
809 vam->retval = ntohl (mp->retval);
810 vam->result_ready = 1;
813 static void vl_api_create_subif_reply_t_handler
814 (vl_api_create_subif_reply_t * mp)
816 vat_main_t *vam = &vat_main;
817 i32 retval = ntohl (mp->retval);
819 vam->retval = retval;
820 vam->regenerate_interface_table = 1;
821 vam->sw_if_index = ntohl (mp->sw_if_index);
822 vam->result_ready = 1;
825 static void vl_api_create_subif_reply_t_handler_json
826 (vl_api_create_subif_reply_t * mp)
828 vat_main_t *vam = &vat_main;
829 vat_json_node_t node;
831 vat_json_init_object (&node);
832 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
833 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
835 vat_json_print (vam->ofp, &node);
836 vat_json_free (&node);
838 vam->retval = ntohl (mp->retval);
839 vam->result_ready = 1;
842 static void vl_api_interface_name_renumber_reply_t_handler
843 (vl_api_interface_name_renumber_reply_t * mp)
845 vat_main_t *vam = &vat_main;
846 i32 retval = ntohl (mp->retval);
848 vam->retval = retval;
849 vam->regenerate_interface_table = 1;
850 vam->result_ready = 1;
853 static void vl_api_interface_name_renumber_reply_t_handler_json
854 (vl_api_interface_name_renumber_reply_t * mp)
856 vat_main_t *vam = &vat_main;
857 vat_json_node_t node;
859 vat_json_init_object (&node);
860 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
862 vat_json_print (vam->ofp, &node);
863 vat_json_free (&node);
865 vam->retval = ntohl (mp->retval);
866 vam->result_ready = 1;
870 * Special-case: build the interface table, maintain
871 * the next loopback sw_if_index vbl.
873 static void vl_api_sw_interface_details_t_handler
874 (vl_api_sw_interface_details_t * mp)
876 vat_main_t *vam = &vat_main;
877 u8 *s = format (0, "%s%c", mp->interface_name, 0);
879 hash_set_mem (vam->sw_if_index_by_interface_name, s,
880 ntohl (mp->sw_if_index));
882 /* In sub interface case, fill the sub interface table entry */
883 if (mp->sw_if_index != mp->sup_sw_if_index)
885 sw_interface_subif_t *sub = NULL;
887 vec_add2 (vam->sw_if_subif_table, sub, 1);
889 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
890 strncpy ((char *) sub->interface_name, (char *) s,
891 vec_len (sub->interface_name));
892 sub->sw_if_index = ntohl (mp->sw_if_index);
893 sub->sub_id = ntohl (mp->sub_id);
895 sub->sub_dot1ad = mp->sub_dot1ad;
896 sub->sub_number_of_tags = mp->sub_number_of_tags;
897 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
898 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
899 sub->sub_exact_match = mp->sub_exact_match;
900 sub->sub_default = mp->sub_default;
901 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
902 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
904 /* vlan tag rewrite */
905 sub->vtr_op = ntohl (mp->vtr_op);
906 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
907 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
908 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
912 static void vl_api_sw_interface_details_t_handler_json
913 (vl_api_sw_interface_details_t * mp)
915 vat_main_t *vam = &vat_main;
916 vat_json_node_t *node = NULL;
918 if (VAT_JSON_ARRAY != vam->json_tree.type)
920 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
921 vat_json_init_array (&vam->json_tree);
923 node = vat_json_array_add (&vam->json_tree);
925 vat_json_init_object (node);
926 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
927 vat_json_object_add_uint (node, "sup_sw_if_index",
928 ntohl (mp->sup_sw_if_index));
929 vat_json_object_add_uint (node, "l2_address_length",
930 ntohl (mp->l2_address_length));
931 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
932 sizeof (mp->l2_address));
933 vat_json_object_add_string_copy (node, "interface_name",
935 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
936 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
937 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
938 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
939 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
940 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
941 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
942 vat_json_object_add_uint (node, "sub_number_of_tags",
943 mp->sub_number_of_tags);
944 vat_json_object_add_uint (node, "sub_outer_vlan_id",
945 ntohs (mp->sub_outer_vlan_id));
946 vat_json_object_add_uint (node, "sub_inner_vlan_id",
947 ntohs (mp->sub_inner_vlan_id));
948 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
949 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
950 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
951 mp->sub_outer_vlan_id_any);
952 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
953 mp->sub_inner_vlan_id_any);
954 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
955 vat_json_object_add_uint (node, "vtr_push_dot1q",
956 ntohl (mp->vtr_push_dot1q));
957 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
958 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
961 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
963 format_ethernet_address,
965 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
967 format_ethernet_address,
969 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
970 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
974 #if VPP_API_TEST_BUILTIN == 0
975 static void vl_api_sw_interface_set_flags_t_handler
976 (vl_api_sw_interface_set_flags_t * mp)
978 vat_main_t *vam = &vat_main;
979 if (vam->interface_event_display)
980 errmsg ("interface flags: sw_if_index %d %s %s",
981 ntohl (mp->sw_if_index),
982 mp->admin_up_down ? "admin-up" : "admin-down",
983 mp->link_up_down ? "link-up" : "link-down");
987 static void vl_api_sw_interface_set_flags_t_handler_json
988 (vl_api_sw_interface_set_flags_t * mp)
990 /* JSON output not supported */
994 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
996 vat_main_t *vam = &vat_main;
997 i32 retval = ntohl (mp->retval);
999 vam->retval = retval;
1000 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
1001 vam->result_ready = 1;
1005 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
1007 vat_main_t *vam = &vat_main;
1008 vat_json_node_t node;
1009 api_main_t *am = &api_main;
1013 vat_json_init_object (&node);
1014 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1015 vat_json_object_add_uint (&node, "reply_in_shmem",
1016 ntohl (mp->reply_in_shmem));
1017 /* Toss the shared-memory original... */
1018 pthread_mutex_lock (&am->vlib_rp->mutex);
1019 oldheap = svm_push_data_heap (am->vlib_rp);
1021 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1024 svm_pop_heap (oldheap);
1025 pthread_mutex_unlock (&am->vlib_rp->mutex);
1027 vat_json_print (vam->ofp, &node);
1028 vat_json_free (&node);
1030 vam->retval = ntohl (mp->retval);
1031 vam->result_ready = 1;
1035 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
1037 vat_main_t *vam = &vat_main;
1038 i32 retval = ntohl (mp->retval);
1040 vam->retval = retval;
1041 vam->cmd_reply = mp->reply;
1042 vam->result_ready = 1;
1046 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
1048 vat_main_t *vam = &vat_main;
1049 vat_json_node_t node;
1051 vat_json_init_object (&node);
1052 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1053 vat_json_object_add_string_copy (&node, "reply", mp->reply);
1055 vat_json_print (vam->ofp, &node);
1056 vat_json_free (&node);
1058 vam->retval = ntohl (mp->retval);
1059 vam->result_ready = 1;
1062 static void vl_api_classify_add_del_table_reply_t_handler
1063 (vl_api_classify_add_del_table_reply_t * mp)
1065 vat_main_t *vam = &vat_main;
1066 i32 retval = ntohl (mp->retval);
1067 if (vam->async_mode)
1069 vam->async_errors += (retval < 0);
1073 vam->retval = retval;
1075 ((mp->new_table_index != 0xFFFFFFFF) ||
1076 (mp->skip_n_vectors != 0xFFFFFFFF) ||
1077 (mp->match_n_vectors != 0xFFFFFFFF)))
1079 * Note: this is just barely thread-safe, depends on
1080 * the main thread spinning waiting for an answer...
1082 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d",
1083 ntohl (mp->new_table_index),
1084 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
1085 vam->result_ready = 1;
1089 static void vl_api_classify_add_del_table_reply_t_handler_json
1090 (vl_api_classify_add_del_table_reply_t * mp)
1092 vat_main_t *vam = &vat_main;
1093 vat_json_node_t node;
1095 vat_json_init_object (&node);
1096 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1097 vat_json_object_add_uint (&node, "new_table_index",
1098 ntohl (mp->new_table_index));
1099 vat_json_object_add_uint (&node, "skip_n_vectors",
1100 ntohl (mp->skip_n_vectors));
1101 vat_json_object_add_uint (&node, "match_n_vectors",
1102 ntohl (mp->match_n_vectors));
1104 vat_json_print (vam->ofp, &node);
1105 vat_json_free (&node);
1107 vam->retval = ntohl (mp->retval);
1108 vam->result_ready = 1;
1111 static void vl_api_get_node_index_reply_t_handler
1112 (vl_api_get_node_index_reply_t * mp)
1114 vat_main_t *vam = &vat_main;
1115 i32 retval = ntohl (mp->retval);
1116 if (vam->async_mode)
1118 vam->async_errors += (retval < 0);
1122 vam->retval = retval;
1124 errmsg ("node index %d", ntohl (mp->node_index));
1125 vam->result_ready = 1;
1129 static void vl_api_get_node_index_reply_t_handler_json
1130 (vl_api_get_node_index_reply_t * mp)
1132 vat_main_t *vam = &vat_main;
1133 vat_json_node_t node;
1135 vat_json_init_object (&node);
1136 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1137 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1139 vat_json_print (vam->ofp, &node);
1140 vat_json_free (&node);
1142 vam->retval = ntohl (mp->retval);
1143 vam->result_ready = 1;
1146 static void vl_api_get_next_index_reply_t_handler
1147 (vl_api_get_next_index_reply_t * mp)
1149 vat_main_t *vam = &vat_main;
1150 i32 retval = ntohl (mp->retval);
1151 if (vam->async_mode)
1153 vam->async_errors += (retval < 0);
1157 vam->retval = retval;
1159 errmsg ("next node index %d", ntohl (mp->next_index));
1160 vam->result_ready = 1;
1164 static void vl_api_get_next_index_reply_t_handler_json
1165 (vl_api_get_next_index_reply_t * mp)
1167 vat_main_t *vam = &vat_main;
1168 vat_json_node_t node;
1170 vat_json_init_object (&node);
1171 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1172 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1174 vat_json_print (vam->ofp, &node);
1175 vat_json_free (&node);
1177 vam->retval = ntohl (mp->retval);
1178 vam->result_ready = 1;
1181 static void vl_api_add_node_next_reply_t_handler
1182 (vl_api_add_node_next_reply_t * mp)
1184 vat_main_t *vam = &vat_main;
1185 i32 retval = ntohl (mp->retval);
1186 if (vam->async_mode)
1188 vam->async_errors += (retval < 0);
1192 vam->retval = retval;
1194 errmsg ("next index %d", ntohl (mp->next_index));
1195 vam->result_ready = 1;
1199 static void vl_api_add_node_next_reply_t_handler_json
1200 (vl_api_add_node_next_reply_t * mp)
1202 vat_main_t *vam = &vat_main;
1203 vat_json_node_t node;
1205 vat_json_init_object (&node);
1206 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1207 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1209 vat_json_print (vam->ofp, &node);
1210 vat_json_free (&node);
1212 vam->retval = ntohl (mp->retval);
1213 vam->result_ready = 1;
1216 static void vl_api_show_version_reply_t_handler
1217 (vl_api_show_version_reply_t * mp)
1219 vat_main_t *vam = &vat_main;
1220 i32 retval = ntohl (mp->retval);
1224 errmsg (" program: %s", mp->program);
1225 errmsg (" version: %s", mp->version);
1226 errmsg (" build date: %s", mp->build_date);
1227 errmsg ("build directory: %s", mp->build_directory);
1229 vam->retval = retval;
1230 vam->result_ready = 1;
1233 static void vl_api_show_version_reply_t_handler_json
1234 (vl_api_show_version_reply_t * mp)
1236 vat_main_t *vam = &vat_main;
1237 vat_json_node_t node;
1239 vat_json_init_object (&node);
1240 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1241 vat_json_object_add_string_copy (&node, "program", mp->program);
1242 vat_json_object_add_string_copy (&node, "version", mp->version);
1243 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1244 vat_json_object_add_string_copy (&node, "build_directory",
1245 mp->build_directory);
1247 vat_json_print (vam->ofp, &node);
1248 vat_json_free (&node);
1250 vam->retval = ntohl (mp->retval);
1251 vam->result_ready = 1;
1255 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1257 u32 sw_if_index = ntohl (mp->sw_if_index);
1258 errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n",
1259 mp->mac_ip ? "mac/ip binding" : "address resolution",
1260 ntohl (mp->pid), format_ip4_address, &mp->address,
1261 format_ethernet_address, mp->new_mac, sw_if_index);
1265 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1267 /* JSON output not supported */
1271 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1273 u32 sw_if_index = ntohl (mp->sw_if_index);
1274 errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n",
1275 mp->mac_ip ? "mac/ip binding" : "address resolution",
1276 ntohl (mp->pid), format_ip6_address, mp->address,
1277 format_ethernet_address, mp->new_mac, sw_if_index);
1281 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1283 /* JSON output not supported */
1287 vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1289 u32 n_macs = ntohl (mp->n_macs);
1290 errmsg ("L2MAC event recived with pid %d cl-idx %d for %d macs: \n",
1291 ntohl (mp->pid), mp->client_index, n_macs);
1293 for (i = 0; i < n_macs; i++)
1295 vl_api_mac_entry_t *mac = &mp->mac[i];
1296 errmsg (" [%d] sw_if_index %d mac_addr %U is_del %d \n",
1297 i + 1, ntohl (mac->sw_if_index),
1298 format_ethernet_address, mac->mac_addr, mac->is_del);
1305 vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1307 /* JSON output not supported */
1310 #define vl_api_bridge_domain_details_t_endian vl_noop_handler
1311 #define vl_api_bridge_domain_details_t_print vl_noop_handler
1314 * Special-case: build the bridge domain table, maintain
1315 * the next bd id vbl.
1317 static void vl_api_bridge_domain_details_t_handler
1318 (vl_api_bridge_domain_details_t * mp)
1320 vat_main_t *vam = &vat_main;
1321 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1324 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s",
1325 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1327 print (vam->ofp, "%3d %3d %3d %3d %3d %3d",
1328 ntohl (mp->bd_id), mp->learn, mp->forward,
1329 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1333 vl_api_bridge_domain_sw_if_t *sw_ifs;
1334 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1337 sw_ifs = mp->sw_if_details;
1338 for (i = 0; i < n_sw_ifs; i++)
1344 sw_if_index = ntohl (sw_ifs->sw_if_index);
1347 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1349 if ((u32) p->value[0] == sw_if_index)
1351 sw_if_name = (u8 *)(p->key);
1356 print (vam->ofp, "%7d %3d %s", sw_if_index,
1357 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1358 "sw_if_index not found!");
1365 static void vl_api_bridge_domain_details_t_handler_json
1366 (vl_api_bridge_domain_details_t * mp)
1368 vat_main_t *vam = &vat_main;
1369 vat_json_node_t *node, *array = NULL;
1370 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1372 if (VAT_JSON_ARRAY != vam->json_tree.type)
1374 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1375 vat_json_init_array (&vam->json_tree);
1377 node = vat_json_array_add (&vam->json_tree);
1379 vat_json_init_object (node);
1380 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1381 vat_json_object_add_uint (node, "flood", mp->flood);
1382 vat_json_object_add_uint (node, "forward", mp->forward);
1383 vat_json_object_add_uint (node, "learn", mp->learn);
1384 vat_json_object_add_uint (node, "bvi_sw_if_index",
1385 ntohl (mp->bvi_sw_if_index));
1386 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
1387 array = vat_json_object_add (node, "sw_if");
1388 vat_json_init_array (array);
1394 vl_api_bridge_domain_sw_if_t *sw_ifs;
1397 sw_ifs = mp->sw_if_details;
1398 for (i = 0; i < n_sw_ifs; i++)
1400 node = vat_json_array_add (array);
1401 vat_json_init_object (node);
1402 vat_json_object_add_uint (node, "sw_if_index",
1403 ntohl (sw_ifs->sw_if_index));
1404 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1410 static void vl_api_control_ping_reply_t_handler
1411 (vl_api_control_ping_reply_t * mp)
1413 vat_main_t *vam = &vat_main;
1414 i32 retval = ntohl (mp->retval);
1415 if (vam->async_mode)
1417 vam->async_errors += (retval < 0);
1421 vam->retval = retval;
1422 vam->result_ready = 1;
1426 static void vl_api_control_ping_reply_t_handler_json
1427 (vl_api_control_ping_reply_t * mp)
1429 vat_main_t *vam = &vat_main;
1430 i32 retval = ntohl (mp->retval);
1432 if (VAT_JSON_NONE != vam->json_tree.type)
1434 vat_json_print (vam->ofp, &vam->json_tree);
1435 vat_json_free (&vam->json_tree);
1436 vam->json_tree.type = VAT_JSON_NONE;
1441 vat_json_init_array (&vam->json_tree);
1442 vat_json_print (vam->ofp, &vam->json_tree);
1443 vam->json_tree.type = VAT_JSON_NONE;
1446 vam->retval = retval;
1447 vam->result_ready = 1;
1451 vl_api_bridge_domain_set_mac_age_reply_t_handler
1452 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1454 vat_main_t *vam = &vat_main;
1455 i32 retval = ntohl (mp->retval);
1456 if (vam->async_mode)
1458 vam->async_errors += (retval < 0);
1462 vam->retval = retval;
1463 vam->result_ready = 1;
1467 static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1468 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1470 vat_main_t *vam = &vat_main;
1471 vat_json_node_t node;
1473 vat_json_init_object (&node);
1474 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1476 vat_json_print (vam->ofp, &node);
1477 vat_json_free (&node);
1479 vam->retval = ntohl (mp->retval);
1480 vam->result_ready = 1;
1484 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1486 vat_main_t *vam = &vat_main;
1487 i32 retval = ntohl (mp->retval);
1488 if (vam->async_mode)
1490 vam->async_errors += (retval < 0);
1494 vam->retval = retval;
1495 vam->result_ready = 1;
1499 static void vl_api_l2_flags_reply_t_handler_json
1500 (vl_api_l2_flags_reply_t * mp)
1502 vat_main_t *vam = &vat_main;
1503 vat_json_node_t node;
1505 vat_json_init_object (&node);
1506 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1507 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1508 ntohl (mp->resulting_feature_bitmap));
1510 vat_json_print (vam->ofp, &node);
1511 vat_json_free (&node);
1513 vam->retval = ntohl (mp->retval);
1514 vam->result_ready = 1;
1517 static void vl_api_bridge_flags_reply_t_handler
1518 (vl_api_bridge_flags_reply_t * mp)
1520 vat_main_t *vam = &vat_main;
1521 i32 retval = ntohl (mp->retval);
1522 if (vam->async_mode)
1524 vam->async_errors += (retval < 0);
1528 vam->retval = retval;
1529 vam->result_ready = 1;
1533 static void vl_api_bridge_flags_reply_t_handler_json
1534 (vl_api_bridge_flags_reply_t * mp)
1536 vat_main_t *vam = &vat_main;
1537 vat_json_node_t node;
1539 vat_json_init_object (&node);
1540 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1541 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1542 ntohl (mp->resulting_feature_bitmap));
1544 vat_json_print (vam->ofp, &node);
1545 vat_json_free (&node);
1547 vam->retval = ntohl (mp->retval);
1548 vam->result_ready = 1;
1551 static void vl_api_tap_connect_reply_t_handler
1552 (vl_api_tap_connect_reply_t * mp)
1554 vat_main_t *vam = &vat_main;
1555 i32 retval = ntohl (mp->retval);
1556 if (vam->async_mode)
1558 vam->async_errors += (retval < 0);
1562 vam->retval = retval;
1563 vam->sw_if_index = ntohl (mp->sw_if_index);
1564 vam->result_ready = 1;
1569 static void vl_api_tap_connect_reply_t_handler_json
1570 (vl_api_tap_connect_reply_t * mp)
1572 vat_main_t *vam = &vat_main;
1573 vat_json_node_t node;
1575 vat_json_init_object (&node);
1576 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1577 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1579 vat_json_print (vam->ofp, &node);
1580 vat_json_free (&node);
1582 vam->retval = ntohl (mp->retval);
1583 vam->result_ready = 1;
1588 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1590 vat_main_t *vam = &vat_main;
1591 i32 retval = ntohl (mp->retval);
1592 if (vam->async_mode)
1594 vam->async_errors += (retval < 0);
1598 vam->retval = retval;
1599 vam->sw_if_index = ntohl (mp->sw_if_index);
1600 vam->result_ready = 1;
1604 static void vl_api_tap_modify_reply_t_handler_json
1605 (vl_api_tap_modify_reply_t * mp)
1607 vat_main_t *vam = &vat_main;
1608 vat_json_node_t node;
1610 vat_json_init_object (&node);
1611 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1612 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1614 vat_json_print (vam->ofp, &node);
1615 vat_json_free (&node);
1617 vam->retval = ntohl (mp->retval);
1618 vam->result_ready = 1;
1622 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1624 vat_main_t *vam = &vat_main;
1625 i32 retval = ntohl (mp->retval);
1626 if (vam->async_mode)
1628 vam->async_errors += (retval < 0);
1632 vam->retval = retval;
1633 vam->result_ready = 1;
1637 static void vl_api_tap_delete_reply_t_handler_json
1638 (vl_api_tap_delete_reply_t * mp)
1640 vat_main_t *vam = &vat_main;
1641 vat_json_node_t node;
1643 vat_json_init_object (&node);
1644 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1646 vat_json_print (vam->ofp, &node);
1647 vat_json_free (&node);
1649 vam->retval = ntohl (mp->retval);
1650 vam->result_ready = 1;
1653 static void vl_api_mpls_tunnel_add_del_reply_t_handler
1654 (vl_api_mpls_tunnel_add_del_reply_t * mp)
1656 vat_main_t *vam = &vat_main;
1657 i32 retval = ntohl (mp->retval);
1658 if (vam->async_mode)
1660 vam->async_errors += (retval < 0);
1664 vam->retval = retval;
1665 vam->result_ready = 1;
1669 static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
1670 (vl_api_mpls_tunnel_add_del_reply_t * mp)
1672 vat_main_t *vam = &vat_main;
1673 vat_json_node_t node;
1675 vat_json_init_object (&node);
1676 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1677 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1678 ntohl (mp->sw_if_index));
1680 vat_json_print (vam->ofp, &node);
1681 vat_json_free (&node);
1683 vam->retval = ntohl (mp->retval);
1684 vam->result_ready = 1;
1687 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1688 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1690 vat_main_t *vam = &vat_main;
1691 i32 retval = ntohl (mp->retval);
1692 if (vam->async_mode)
1694 vam->async_errors += (retval < 0);
1698 vam->retval = retval;
1699 vam->sw_if_index = ntohl (mp->sw_if_index);
1700 vam->result_ready = 1;
1704 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1705 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1707 vat_main_t *vam = &vat_main;
1708 vat_json_node_t node;
1710 vat_json_init_object (&node);
1711 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1712 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1714 vat_json_print (vam->ofp, &node);
1715 vat_json_free (&node);
1717 vam->retval = ntohl (mp->retval);
1718 vam->result_ready = 1;
1721 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
1722 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
1724 vat_main_t *vam = &vat_main;
1725 i32 retval = ntohl (mp->retval);
1726 if (vam->async_mode)
1728 vam->async_errors += (retval < 0);
1732 vam->retval = retval;
1733 vam->result_ready = 1;
1737 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
1738 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
1740 vat_main_t *vam = &vat_main;
1741 vat_json_node_t node;
1743 vat_json_init_object (&node);
1744 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1745 vat_json_object_add_uint (&node, "fwd_entry_index",
1746 clib_net_to_host_u32 (mp->fwd_entry_index));
1748 vat_json_print (vam->ofp, &node);
1749 vat_json_free (&node);
1751 vam->retval = ntohl (mp->retval);
1752 vam->result_ready = 1;
1755 static void vl_api_one_add_del_locator_set_reply_t_handler
1756 (vl_api_one_add_del_locator_set_reply_t * mp)
1758 vat_main_t *vam = &vat_main;
1759 i32 retval = ntohl (mp->retval);
1760 if (vam->async_mode)
1762 vam->async_errors += (retval < 0);
1766 vam->retval = retval;
1767 vam->result_ready = 1;
1771 static void vl_api_one_add_del_locator_set_reply_t_handler_json
1772 (vl_api_one_add_del_locator_set_reply_t * mp)
1774 vat_main_t *vam = &vat_main;
1775 vat_json_node_t node;
1777 vat_json_init_object (&node);
1778 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1779 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1781 vat_json_print (vam->ofp, &node);
1782 vat_json_free (&node);
1784 vam->retval = ntohl (mp->retval);
1785 vam->result_ready = 1;
1788 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1789 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1791 vat_main_t *vam = &vat_main;
1792 i32 retval = ntohl (mp->retval);
1793 if (vam->async_mode)
1795 vam->async_errors += (retval < 0);
1799 vam->retval = retval;
1800 vam->sw_if_index = ntohl (mp->sw_if_index);
1801 vam->result_ready = 1;
1805 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1806 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1808 vat_main_t *vam = &vat_main;
1809 vat_json_node_t node;
1811 vat_json_init_object (&node);
1812 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1813 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1815 vat_json_print (vam->ofp, &node);
1816 vat_json_free (&node);
1818 vam->retval = ntohl (mp->retval);
1819 vam->result_ready = 1;
1822 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
1823 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
1825 vat_main_t *vam = &vat_main;
1826 i32 retval = ntohl (mp->retval);
1827 if (vam->async_mode)
1829 vam->async_errors += (retval < 0);
1833 vam->retval = retval;
1834 vam->sw_if_index = ntohl (mp->sw_if_index);
1835 vam->result_ready = 1;
1839 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
1840 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
1842 vat_main_t *vam = &vat_main;
1843 vat_json_node_t node;
1845 vat_json_init_object (&node);
1846 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1847 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1849 vat_json_print (vam->ofp, &node);
1850 vat_json_free (&node);
1852 vam->retval = ntohl (mp->retval);
1853 vam->result_ready = 1;
1856 static void vl_api_gre_add_del_tunnel_reply_t_handler
1857 (vl_api_gre_add_del_tunnel_reply_t * mp)
1859 vat_main_t *vam = &vat_main;
1860 i32 retval = ntohl (mp->retval);
1861 if (vam->async_mode)
1863 vam->async_errors += (retval < 0);
1867 vam->retval = retval;
1868 vam->sw_if_index = ntohl (mp->sw_if_index);
1869 vam->result_ready = 1;
1873 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1874 (vl_api_gre_add_del_tunnel_reply_t * mp)
1876 vat_main_t *vam = &vat_main;
1877 vat_json_node_t node;
1879 vat_json_init_object (&node);
1880 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1881 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1883 vat_json_print (vam->ofp, &node);
1884 vat_json_free (&node);
1886 vam->retval = ntohl (mp->retval);
1887 vam->result_ready = 1;
1890 static void vl_api_create_vhost_user_if_reply_t_handler
1891 (vl_api_create_vhost_user_if_reply_t * mp)
1893 vat_main_t *vam = &vat_main;
1894 i32 retval = ntohl (mp->retval);
1895 if (vam->async_mode)
1897 vam->async_errors += (retval < 0);
1901 vam->retval = retval;
1902 vam->sw_if_index = ntohl (mp->sw_if_index);
1903 vam->result_ready = 1;
1907 static void vl_api_create_vhost_user_if_reply_t_handler_json
1908 (vl_api_create_vhost_user_if_reply_t * mp)
1910 vat_main_t *vam = &vat_main;
1911 vat_json_node_t node;
1913 vat_json_init_object (&node);
1914 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1915 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1917 vat_json_print (vam->ofp, &node);
1918 vat_json_free (&node);
1920 vam->retval = ntohl (mp->retval);
1921 vam->result_ready = 1;
1924 static void vl_api_ip_address_details_t_handler
1925 (vl_api_ip_address_details_t * mp)
1927 vat_main_t *vam = &vat_main;
1928 static ip_address_details_t empty_ip_address_details = { {0} };
1929 ip_address_details_t *address = NULL;
1930 ip_details_t *current_ip_details = NULL;
1931 ip_details_t *details = NULL;
1933 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1935 if (!details || vam->current_sw_if_index >= vec_len (details)
1936 || !details[vam->current_sw_if_index].present)
1938 errmsg ("ip address details arrived but not stored");
1939 errmsg ("ip_dump should be called first");
1943 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1945 #define addresses (current_ip_details->addr)
1947 vec_validate_init_empty (addresses, vec_len (addresses),
1948 empty_ip_address_details);
1950 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1952 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1953 address->prefix_length = mp->prefix_length;
1957 static void vl_api_ip_address_details_t_handler_json
1958 (vl_api_ip_address_details_t * mp)
1960 vat_main_t *vam = &vat_main;
1961 vat_json_node_t *node = NULL;
1962 struct in6_addr ip6;
1965 if (VAT_JSON_ARRAY != vam->json_tree.type)
1967 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1968 vat_json_init_array (&vam->json_tree);
1970 node = vat_json_array_add (&vam->json_tree);
1972 vat_json_init_object (node);
1975 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1976 vat_json_object_add_ip6 (node, "ip", ip6);
1980 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1981 vat_json_object_add_ip4 (node, "ip", ip4);
1983 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1987 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1989 vat_main_t *vam = &vat_main;
1990 static ip_details_t empty_ip_details = { 0 };
1991 ip_details_t *ip = NULL;
1992 u32 sw_if_index = ~0;
1994 sw_if_index = ntohl (mp->sw_if_index);
1996 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1997 sw_if_index, empty_ip_details);
1999 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2006 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
2008 vat_main_t *vam = &vat_main;
2010 if (VAT_JSON_ARRAY != vam->json_tree.type)
2012 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2013 vat_json_init_array (&vam->json_tree);
2015 vat_json_array_add_uint (&vam->json_tree,
2016 clib_net_to_host_u32 (mp->sw_if_index));
2019 static void vl_api_map_domain_details_t_handler_json
2020 (vl_api_map_domain_details_t * mp)
2022 vat_json_node_t *node = NULL;
2023 vat_main_t *vam = &vat_main;
2024 struct in6_addr ip6;
2027 if (VAT_JSON_ARRAY != vam->json_tree.type)
2029 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2030 vat_json_init_array (&vam->json_tree);
2033 node = vat_json_array_add (&vam->json_tree);
2034 vat_json_init_object (node);
2036 vat_json_object_add_uint (node, "domain_index",
2037 clib_net_to_host_u32 (mp->domain_index));
2038 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
2039 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
2040 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
2041 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
2042 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
2043 vat_json_object_add_ip6 (node, "ip6_src", ip6);
2044 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
2045 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
2046 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
2047 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
2048 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
2049 vat_json_object_add_int (node, "psid_length", mp->psid_length);
2050 vat_json_object_add_uint (node, "flags", mp->flags);
2051 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
2052 vat_json_object_add_int (node, "is_translation", mp->is_translation);
2055 static void vl_api_map_domain_details_t_handler
2056 (vl_api_map_domain_details_t * mp)
2058 vat_main_t *vam = &vat_main;
2060 if (mp->is_translation)
2063 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u",
2064 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
2065 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
2066 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
2067 clib_net_to_host_u32 (mp->domain_index));
2072 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u",
2073 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
2074 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
2075 format_ip6_address, mp->ip6_src,
2076 clib_net_to_host_u32 (mp->domain_index));
2078 print (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s",
2079 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
2080 mp->is_translation ? "map-t" : "");
2083 static void vl_api_map_rule_details_t_handler_json
2084 (vl_api_map_rule_details_t * mp)
2086 struct in6_addr ip6;
2087 vat_json_node_t *node = NULL;
2088 vat_main_t *vam = &vat_main;
2090 if (VAT_JSON_ARRAY != vam->json_tree.type)
2092 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2093 vat_json_init_array (&vam->json_tree);
2096 node = vat_json_array_add (&vam->json_tree);
2097 vat_json_init_object (node);
2099 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
2100 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
2101 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
2105 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
2107 vat_main_t *vam = &vat_main;
2108 print (vam->ofp, " %d (psid) %U (ip6-dst)",
2109 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
2113 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
2115 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
2116 "router_addr %U host_mac %U",
2117 ntohl (mp->pid), mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
2118 format_ip4_address, &mp->host_address,
2119 format_ip4_address, &mp->router_address,
2120 format_ethernet_address, mp->host_mac);
2123 static void vl_api_dhcp_compl_event_t_handler_json
2124 (vl_api_dhcp_compl_event_t * mp)
2126 /* JSON output not supported */
2130 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
2133 vat_main_t *vam = &vat_main;
2134 static u64 default_counter = 0;
2136 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
2138 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
2139 sw_if_index, default_counter);
2140 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
2144 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
2145 interface_counter_t counter)
2147 vat_main_t *vam = &vat_main;
2148 static interface_counter_t default_counter = { 0, };
2150 vec_validate_init_empty (vam->combined_interface_counters,
2151 vnet_counter_type, NULL);
2152 vec_validate_init_empty (vam->combined_interface_counters
2153 [vnet_counter_type], sw_if_index, default_counter);
2154 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
2157 static void vl_api_vnet_interface_simple_counters_t_handler
2158 (vl_api_vnet_interface_simple_counters_t * mp)
2163 static void vl_api_vnet_interface_combined_counters_t_handler
2164 (vl_api_vnet_interface_combined_counters_t * mp)
2169 static void vl_api_vnet_interface_simple_counters_t_handler_json
2170 (vl_api_vnet_interface_simple_counters_t * mp)
2175 u32 first_sw_if_index;
2178 count = ntohl (mp->count);
2179 first_sw_if_index = ntohl (mp->first_sw_if_index);
2181 v_packets = (u64 *) & mp->data;
2182 for (i = 0; i < count; i++)
2184 packets = clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
2185 set_simple_interface_counter (mp->vnet_counter_type,
2186 first_sw_if_index + i, packets);
2191 static void vl_api_vnet_interface_combined_counters_t_handler_json
2192 (vl_api_vnet_interface_combined_counters_t * mp)
2194 interface_counter_t counter;
2196 u32 first_sw_if_index;
2200 count = ntohl (mp->count);
2201 first_sw_if_index = ntohl (mp->first_sw_if_index);
2203 v = (vlib_counter_t *) & mp->data;
2204 for (i = 0; i < count; i++)
2207 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
2209 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
2210 set_combined_interface_counter (mp->vnet_counter_type,
2211 first_sw_if_index + i, counter);
2217 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2219 vat_main_t *vam = &vat_main;
2222 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
2224 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
2233 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2235 vat_main_t *vam = &vat_main;
2238 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2240 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2248 static void vl_api_vnet_ip4_fib_counters_t_handler
2249 (vl_api_vnet_ip4_fib_counters_t * mp)
2254 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2255 (vl_api_vnet_ip4_fib_counters_t * mp)
2257 vat_main_t *vam = &vat_main;
2258 vl_api_ip4_fib_counter_t *v;
2259 ip4_fib_counter_t *counter;
2266 vrf_id = ntohl (mp->vrf_id);
2267 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2268 if (~0 == vrf_index)
2270 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2271 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2272 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2273 vec_validate (vam->ip4_fib_counters, vrf_index);
2274 vam->ip4_fib_counters[vrf_index] = NULL;
2277 vec_free (vam->ip4_fib_counters[vrf_index]);
2278 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2279 count = ntohl (mp->count);
2280 for (i = 0; i < count; i++)
2282 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2283 counter = &vam->ip4_fib_counters[vrf_index][i];
2284 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2285 counter->address = ip4;
2286 counter->address_length = v->address_length;
2287 counter->packets = clib_net_to_host_u64 (v->packets);
2288 counter->bytes = clib_net_to_host_u64 (v->bytes);
2293 static void vl_api_vnet_ip4_nbr_counters_t_handler
2294 (vl_api_vnet_ip4_nbr_counters_t * mp)
2299 static void vl_api_vnet_ip4_nbr_counters_t_handler_json
2300 (vl_api_vnet_ip4_nbr_counters_t * mp)
2302 vat_main_t *vam = &vat_main;
2303 vl_api_ip4_nbr_counter_t *v;
2304 ip4_nbr_counter_t *counter;
2309 sw_if_index = ntohl (mp->sw_if_index);
2310 count = ntohl (mp->count);
2311 vec_validate (vam->ip4_nbr_counters, sw_if_index);
2314 vec_free (vam->ip4_nbr_counters[sw_if_index]);
2316 v = (vl_api_ip4_nbr_counter_t *) & mp->c;
2317 for (i = 0; i < count; i++)
2319 vec_validate (vam->ip4_nbr_counters[sw_if_index], i);
2320 counter = &vam->ip4_nbr_counters[sw_if_index][i];
2321 counter->address.s_addr = v->address;
2322 counter->packets = clib_net_to_host_u64 (v->packets);
2323 counter->bytes = clib_net_to_host_u64 (v->bytes);
2324 counter->linkt = v->link_type;
2329 static void vl_api_vnet_ip6_fib_counters_t_handler
2330 (vl_api_vnet_ip6_fib_counters_t * mp)
2335 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2336 (vl_api_vnet_ip6_fib_counters_t * mp)
2338 vat_main_t *vam = &vat_main;
2339 vl_api_ip6_fib_counter_t *v;
2340 ip6_fib_counter_t *counter;
2341 struct in6_addr ip6;
2347 vrf_id = ntohl (mp->vrf_id);
2348 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2349 if (~0 == vrf_index)
2351 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2352 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2353 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2354 vec_validate (vam->ip6_fib_counters, vrf_index);
2355 vam->ip6_fib_counters[vrf_index] = NULL;
2358 vec_free (vam->ip6_fib_counters[vrf_index]);
2359 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2360 count = ntohl (mp->count);
2361 for (i = 0; i < count; i++)
2363 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2364 counter = &vam->ip6_fib_counters[vrf_index][i];
2365 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2366 counter->address = ip6;
2367 counter->address_length = v->address_length;
2368 counter->packets = clib_net_to_host_u64 (v->packets);
2369 counter->bytes = clib_net_to_host_u64 (v->bytes);
2374 static void vl_api_vnet_ip6_nbr_counters_t_handler
2375 (vl_api_vnet_ip6_nbr_counters_t * mp)
2380 static void vl_api_vnet_ip6_nbr_counters_t_handler_json
2381 (vl_api_vnet_ip6_nbr_counters_t * mp)
2383 vat_main_t *vam = &vat_main;
2384 vl_api_ip6_nbr_counter_t *v;
2385 ip6_nbr_counter_t *counter;
2386 struct in6_addr ip6;
2391 sw_if_index = ntohl (mp->sw_if_index);
2392 count = ntohl (mp->count);
2393 vec_validate (vam->ip6_nbr_counters, sw_if_index);
2396 vec_free (vam->ip6_nbr_counters[sw_if_index]);
2398 v = (vl_api_ip6_nbr_counter_t *) & mp->c;
2399 for (i = 0; i < count; i++)
2401 vec_validate (vam->ip6_nbr_counters[sw_if_index], i);
2402 counter = &vam->ip6_nbr_counters[sw_if_index][i];
2403 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2404 counter->address = ip6;
2405 counter->packets = clib_net_to_host_u64 (v->packets);
2406 counter->bytes = clib_net_to_host_u64 (v->bytes);
2411 static void vl_api_get_first_msg_id_reply_t_handler
2412 (vl_api_get_first_msg_id_reply_t * mp)
2414 vat_main_t *vam = &vat_main;
2415 i32 retval = ntohl (mp->retval);
2417 if (vam->async_mode)
2419 vam->async_errors += (retval < 0);
2423 vam->retval = retval;
2424 vam->result_ready = 1;
2428 errmsg ("first message id %d", ntohs (mp->first_msg_id));
2432 static void vl_api_get_first_msg_id_reply_t_handler_json
2433 (vl_api_get_first_msg_id_reply_t * mp)
2435 vat_main_t *vam = &vat_main;
2436 vat_json_node_t node;
2438 vat_json_init_object (&node);
2439 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2440 vat_json_object_add_uint (&node, "first_msg_id",
2441 (uint) ntohs (mp->first_msg_id));
2443 vat_json_print (vam->ofp, &node);
2444 vat_json_free (&node);
2446 vam->retval = ntohl (mp->retval);
2447 vam->result_ready = 1;
2450 static void vl_api_get_node_graph_reply_t_handler
2451 (vl_api_get_node_graph_reply_t * mp)
2453 vat_main_t *vam = &vat_main;
2454 api_main_t *am = &api_main;
2455 i32 retval = ntohl (mp->retval);
2456 u8 *pvt_copy, *reply;
2461 if (vam->async_mode)
2463 vam->async_errors += (retval < 0);
2467 vam->retval = retval;
2468 vam->result_ready = 1;
2471 /* "Should never happen..." */
2475 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2476 pvt_copy = vec_dup (reply);
2478 /* Toss the shared-memory original... */
2479 pthread_mutex_lock (&am->vlib_rp->mutex);
2480 oldheap = svm_push_data_heap (am->vlib_rp);
2484 svm_pop_heap (oldheap);
2485 pthread_mutex_unlock (&am->vlib_rp->mutex);
2487 if (vam->graph_nodes)
2489 hash_free (vam->graph_node_index_by_name);
2491 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2493 node = vam->graph_nodes[i];
2494 vec_free (node->name);
2495 vec_free (node->next_nodes);
2498 vec_free (vam->graph_nodes);
2501 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2502 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2503 vec_free (pvt_copy);
2505 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2507 node = vam->graph_nodes[i];
2508 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2512 static void vl_api_get_node_graph_reply_t_handler_json
2513 (vl_api_get_node_graph_reply_t * mp)
2515 vat_main_t *vam = &vat_main;
2516 api_main_t *am = &api_main;
2518 vat_json_node_t node;
2521 /* $$$$ make this real? */
2522 vat_json_init_object (&node);
2523 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2524 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2526 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2528 /* Toss the shared-memory original... */
2529 pthread_mutex_lock (&am->vlib_rp->mutex);
2530 oldheap = svm_push_data_heap (am->vlib_rp);
2534 svm_pop_heap (oldheap);
2535 pthread_mutex_unlock (&am->vlib_rp->mutex);
2537 vat_json_print (vam->ofp, &node);
2538 vat_json_free (&node);
2540 vam->retval = ntohl (mp->retval);
2541 vam->result_ready = 1;
2545 vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
2547 vat_main_t *vam = &vat_main;
2552 s = format (s, "%=16d%=16d%=16d",
2553 ntohl (mp->sw_if_index), mp->priority, mp->weight);
2557 s = format (s, "%=16U%=16d%=16d",
2558 mp->is_ipv6 ? format_ip6_address :
2560 mp->ip_address, mp->priority, mp->weight);
2563 print (vam->ofp, "%v", s);
2568 vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
2570 vat_main_t *vam = &vat_main;
2571 vat_json_node_t *node = NULL;
2572 struct in6_addr ip6;
2575 if (VAT_JSON_ARRAY != vam->json_tree.type)
2577 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2578 vat_json_init_array (&vam->json_tree);
2580 node = vat_json_array_add (&vam->json_tree);
2581 vat_json_init_object (node);
2583 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2584 vat_json_object_add_uint (node, "priority", mp->priority);
2585 vat_json_object_add_uint (node, "weight", mp->weight);
2588 vat_json_object_add_uint (node, "sw_if_index",
2589 clib_net_to_host_u32 (mp->sw_if_index));
2594 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2595 vat_json_object_add_ip6 (node, "address", ip6);
2599 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2600 vat_json_object_add_ip4 (node, "address", ip4);
2606 vl_api_one_locator_set_details_t_handler (vl_api_one_locator_set_details_t *
2609 vat_main_t *vam = &vat_main;
2612 ls_name = format (0, "%s", mp->ls_name);
2614 print (vam->ofp, "%=10d%=15v", clib_net_to_host_u32 (mp->ls_index),
2620 vl_api_one_locator_set_details_t_handler_json
2621 (vl_api_one_locator_set_details_t * mp)
2623 vat_main_t *vam = &vat_main;
2624 vat_json_node_t *node = 0;
2627 ls_name = format (0, "%s", mp->ls_name);
2628 vec_add1 (ls_name, 0);
2630 if (VAT_JSON_ARRAY != vam->json_tree.type)
2632 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2633 vat_json_init_array (&vam->json_tree);
2635 node = vat_json_array_add (&vam->json_tree);
2637 vat_json_init_object (node);
2638 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2639 vat_json_object_add_uint (node, "ls_index",
2640 clib_net_to_host_u32 (mp->ls_index));
2648 } __attribute__ ((__packed__)) lisp_nsh_api_t;
2651 unformat_nsh_address (unformat_input_t * input, va_list * args)
2653 lisp_nsh_api_t *nsh = va_arg (*args, lisp_nsh_api_t *);
2654 return unformat (input, "SPI:%d SI:%d", &nsh->spi, &nsh->si);
2658 format_nsh_address_vat (u8 * s, va_list * args)
2660 nsh_t *a = va_arg (*args, nsh_t *);
2661 return format (s, "SPI:%d SI:%d", clib_net_to_host_u32 (a->spi), a->si);
2665 format_lisp_flat_eid (u8 * s, va_list * args)
2667 u32 type = va_arg (*args, u32);
2668 u8 *eid = va_arg (*args, u8 *);
2669 u32 eid_len = va_arg (*args, u32);
2674 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
2676 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
2678 return format (s, "%U", format_ethernet_address, eid);
2680 return format (s, "%U", format_nsh_address_vat, eid);
2686 format_lisp_eid_vat (u8 * s, va_list * args)
2688 u32 type = va_arg (*args, u32);
2689 u8 *eid = va_arg (*args, u8 *);
2690 u32 eid_len = va_arg (*args, u32);
2691 u8 *seid = va_arg (*args, u8 *);
2692 u32 seid_len = va_arg (*args, u32);
2693 u32 is_src_dst = va_arg (*args, u32);
2696 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
2698 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
2704 vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
2706 vat_main_t *vam = &vat_main;
2707 u8 *s = 0, *eid = 0;
2709 if (~0 == mp->locator_set_index)
2710 s = format (0, "action: %d", mp->action);
2712 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
2714 eid = format (0, "%U", format_lisp_eid_vat,
2718 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2721 print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
2722 clib_net_to_host_u32 (mp->vni),
2724 mp->is_local ? "local" : "remote",
2725 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
2726 clib_net_to_host_u16 (mp->key_id), mp->key);
2733 vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
2736 vat_main_t *vam = &vat_main;
2737 vat_json_node_t *node = 0;
2740 if (VAT_JSON_ARRAY != vam->json_tree.type)
2742 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2743 vat_json_init_array (&vam->json_tree);
2745 node = vat_json_array_add (&vam->json_tree);
2747 vat_json_init_object (node);
2748 if (~0 == mp->locator_set_index)
2749 vat_json_object_add_uint (node, "action", mp->action);
2751 vat_json_object_add_uint (node, "locator_set_index",
2752 clib_net_to_host_u32 (mp->locator_set_index));
2754 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
2755 if (mp->eid_type == 3)
2757 vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
2758 vat_json_init_object (nsh_json);
2759 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
2760 vat_json_object_add_uint (nsh_json, "spi",
2761 clib_net_to_host_u32 (nsh->spi));
2762 vat_json_object_add_uint (nsh_json, "si", nsh->si);
2766 eid = format (0, "%U", format_lisp_eid_vat,
2770 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2772 vat_json_object_add_string_copy (node, "eid", eid);
2775 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2776 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
2777 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
2781 vat_json_object_add_uint (node, "key_id",
2782 clib_net_to_host_u16 (mp->key_id));
2783 vat_json_object_add_string_copy (node, "key", mp->key);
2788 vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
2790 vat_main_t *vam = &vat_main;
2791 u8 *seid = 0, *deid = 0;
2792 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
2794 deid = format (0, "%U", format_lisp_eid_vat,
2795 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
2797 seid = format (0, "%U", format_lisp_eid_vat,
2798 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
2804 format_ip_address_fcn = format_ip4_address;
2806 format_ip_address_fcn = format_ip6_address;
2809 print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
2810 clib_net_to_host_u32 (mp->vni),
2812 format_ip_address_fcn, mp->lloc,
2813 format_ip_address_fcn, mp->rloc,
2814 clib_net_to_host_u32 (mp->pkt_count),
2815 clib_net_to_host_u32 (mp->bytes));
2822 vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
2824 struct in6_addr ip6;
2826 vat_main_t *vam = &vat_main;
2827 vat_json_node_t *node = 0;
2828 u8 *deid = 0, *seid = 0;
2830 if (VAT_JSON_ARRAY != vam->json_tree.type)
2832 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2833 vat_json_init_array (&vam->json_tree);
2835 node = vat_json_array_add (&vam->json_tree);
2837 vat_json_init_object (node);
2838 deid = format (0, "%U", format_lisp_eid_vat,
2839 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
2841 seid = format (0, "%U", format_lisp_eid_vat,
2842 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
2847 vat_json_object_add_string_copy (node, "seid", seid);
2848 vat_json_object_add_string_copy (node, "deid", deid);
2849 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2853 clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
2854 vat_json_object_add_ip4 (node, "lloc", ip4);
2855 clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
2856 vat_json_object_add_ip4 (node, "rloc", ip4);
2860 clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
2861 vat_json_object_add_ip6 (node, "lloc", ip6);
2862 clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
2863 vat_json_object_add_ip6 (node, "rloc", ip6);
2865 vat_json_object_add_uint (node, "pkt_count",
2866 clib_net_to_host_u32 (mp->pkt_count));
2867 vat_json_object_add_uint (node, "bytes", clib_net_to_host_u32 (mp->bytes));
2874 vl_api_one_eid_table_map_details_t_handler
2875 (vl_api_one_eid_table_map_details_t * mp)
2877 vat_main_t *vam = &vat_main;
2879 u8 *line = format (0, "%=10d%=10d",
2880 clib_net_to_host_u32 (mp->vni),
2881 clib_net_to_host_u32 (mp->dp_table));
2882 print (vam->ofp, "%v", line);
2887 vl_api_one_eid_table_map_details_t_handler_json
2888 (vl_api_one_eid_table_map_details_t * mp)
2890 vat_main_t *vam = &vat_main;
2891 vat_json_node_t *node = NULL;
2893 if (VAT_JSON_ARRAY != vam->json_tree.type)
2895 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2896 vat_json_init_array (&vam->json_tree);
2898 node = vat_json_array_add (&vam->json_tree);
2899 vat_json_init_object (node);
2900 vat_json_object_add_uint (node, "dp_table",
2901 clib_net_to_host_u32 (mp->dp_table));
2902 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2906 vl_api_one_eid_table_vni_details_t_handler
2907 (vl_api_one_eid_table_vni_details_t * mp)
2909 vat_main_t *vam = &vat_main;
2911 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2912 print (vam->ofp, "%v", line);
2917 vl_api_one_eid_table_vni_details_t_handler_json
2918 (vl_api_one_eid_table_vni_details_t * mp)
2920 vat_main_t *vam = &vat_main;
2921 vat_json_node_t *node = NULL;
2923 if (VAT_JSON_ARRAY != vam->json_tree.type)
2925 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2926 vat_json_init_array (&vam->json_tree);
2928 node = vat_json_array_add (&vam->json_tree);
2929 vat_json_init_object (node);
2930 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2934 vl_api_show_one_map_register_fallback_threshold_reply_t_handler
2935 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
2937 vat_main_t *vam = &vat_main;
2938 int retval = clib_net_to_host_u32 (mp->retval);
2940 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
2941 print (vam->ofp, "fallback threshold value: %d", mp->value);
2943 vam->retval = retval;
2944 vam->result_ready = 1;
2948 vl_api_show_one_map_register_fallback_threshold_reply_t_handler_json
2949 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
2951 vat_main_t *vam = &vat_main;
2952 vat_json_node_t _node, *node = &_node;
2953 int retval = clib_net_to_host_u32 (mp->retval);
2955 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
2956 vat_json_init_object (node);
2957 vat_json_object_add_uint (node, "value", mp->value);
2959 vat_json_print (vam->ofp, node);
2960 vat_json_free (node);
2962 vam->retval = retval;
2963 vam->result_ready = 1;
2967 vl_api_show_one_map_register_state_reply_t_handler
2968 (vl_api_show_one_map_register_state_reply_t * mp)
2970 vat_main_t *vam = &vat_main;
2971 int retval = clib_net_to_host_u32 (mp->retval);
2973 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
2975 vam->retval = retval;
2976 vam->result_ready = 1;
2980 vl_api_show_one_map_register_state_reply_t_handler_json
2981 (vl_api_show_one_map_register_state_reply_t * mp)
2983 vat_main_t *vam = &vat_main;
2984 vat_json_node_t _node, *node = &_node;
2985 int retval = clib_net_to_host_u32 (mp->retval);
2987 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
2989 vat_json_init_object (node);
2990 vat_json_object_add_string_copy (node, "state", s);
2992 vat_json_print (vam->ofp, node);
2993 vat_json_free (node);
2995 vam->retval = retval;
2996 vam->result_ready = 1;
3001 vl_api_show_one_rloc_probe_state_reply_t_handler
3002 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3004 vat_main_t *vam = &vat_main;
3005 int retval = clib_net_to_host_u32 (mp->retval);
3010 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3012 vam->retval = retval;
3013 vam->result_ready = 1;
3017 vl_api_show_one_rloc_probe_state_reply_t_handler_json
3018 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3020 vat_main_t *vam = &vat_main;
3021 vat_json_node_t _node, *node = &_node;
3022 int retval = clib_net_to_host_u32 (mp->retval);
3024 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3025 vat_json_init_object (node);
3026 vat_json_object_add_string_copy (node, "state", s);
3028 vat_json_print (vam->ofp, node);
3029 vat_json_free (node);
3031 vam->retval = retval;
3032 vam->result_ready = 1;
3037 vl_api_show_one_stats_enable_disable_reply_t_handler
3038 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3040 vat_main_t *vam = &vat_main;
3041 int retval = clib_net_to_host_u32 (mp->retval);
3046 print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
3048 vam->retval = retval;
3049 vam->result_ready = 1;
3053 vl_api_show_one_stats_enable_disable_reply_t_handler_json
3054 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3056 vat_main_t *vam = &vat_main;
3057 vat_json_node_t _node, *node = &_node;
3058 int retval = clib_net_to_host_u32 (mp->retval);
3060 u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
3061 vat_json_init_object (node);
3062 vat_json_object_add_string_copy (node, "state", s);
3064 vat_json_print (vam->ofp, node);
3065 vat_json_free (node);
3067 vam->retval = retval;
3068 vam->result_ready = 1;
3073 api_gpe_fwd_entry_net_to_host (vl_api_gpe_fwd_entry_t * e)
3075 e->dp_table = clib_net_to_host_u32 (e->dp_table);
3076 e->fwd_entry_index = clib_net_to_host_u32 (e->fwd_entry_index);
3077 e->vni = clib_net_to_host_u32 (e->vni);
3081 gpe_fwd_entries_get_reply_t_net_to_host
3082 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3086 mp->count = clib_net_to_host_u32 (mp->count);
3087 for (i = 0; i < mp->count; i++)
3089 api_gpe_fwd_entry_net_to_host (&mp->entries[i]);
3094 format_gpe_encap_mode (u8 * s, va_list * args)
3096 u32 mode = va_arg (*args, u32);
3101 return format (s, "lisp");
3103 return format (s, "vxlan");
3109 vl_api_gpe_get_encap_mode_reply_t_handler
3110 (vl_api_gpe_get_encap_mode_reply_t * mp)
3112 vat_main_t *vam = &vat_main;
3114 print (vam->ofp, "gpe mode: %U", format_gpe_encap_mode, mp->encap_mode);
3115 vam->retval = ntohl (mp->retval);
3116 vam->result_ready = 1;
3120 vl_api_gpe_get_encap_mode_reply_t_handler_json
3121 (vl_api_gpe_get_encap_mode_reply_t * mp)
3123 vat_main_t *vam = &vat_main;
3124 vat_json_node_t node;
3126 u8 *encap_mode = format (0, "%U", format_gpe_encap_mode, mp->encap_mode);
3127 vec_add1 (encap_mode, 0);
3129 vat_json_init_object (&node);
3130 vat_json_object_add_string_copy (&node, "gpe_mode", encap_mode);
3132 vec_free (encap_mode);
3133 vat_json_print (vam->ofp, &node);
3134 vat_json_free (&node);
3136 vam->retval = ntohl (mp->retval);
3137 vam->result_ready = 1;
3141 vl_api_gpe_fwd_entry_path_details_t_handler
3142 (vl_api_gpe_fwd_entry_path_details_t * mp)
3144 vat_main_t *vam = &vat_main;
3145 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3147 if (mp->lcl_loc.is_ip4)
3148 format_ip_address_fcn = format_ip4_address;
3150 format_ip_address_fcn = format_ip6_address;
3152 print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
3153 format_ip_address_fcn, &mp->lcl_loc,
3154 format_ip_address_fcn, &mp->rmt_loc);
3158 lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
3160 struct in6_addr ip6;
3165 clib_memcpy (&ip4, loc->addr, sizeof (ip4));
3166 vat_json_object_add_ip4 (n, "address", ip4);
3170 clib_memcpy (&ip6, loc->addr, sizeof (ip6));
3171 vat_json_object_add_ip6 (n, "address", ip6);
3173 vat_json_object_add_uint (n, "weight", loc->weight);
3177 vl_api_gpe_fwd_entry_path_details_t_handler_json
3178 (vl_api_gpe_fwd_entry_path_details_t * mp)
3180 vat_main_t *vam = &vat_main;
3181 vat_json_node_t *node = NULL;
3182 vat_json_node_t *loc_node;
3184 if (VAT_JSON_ARRAY != vam->json_tree.type)
3186 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3187 vat_json_init_array (&vam->json_tree);
3189 node = vat_json_array_add (&vam->json_tree);
3190 vat_json_init_object (node);
3192 loc_node = vat_json_object_add (node, "local_locator");
3193 vat_json_init_object (loc_node);
3194 lisp_fill_locator_node (loc_node, &mp->lcl_loc);
3196 loc_node = vat_json_object_add (node, "remote_locator");
3197 vat_json_init_object (loc_node);
3198 lisp_fill_locator_node (loc_node, &mp->rmt_loc);
3202 vl_api_gpe_fwd_entries_get_reply_t_handler
3203 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3205 vat_main_t *vam = &vat_main;
3207 int retval = clib_net_to_host_u32 (mp->retval);
3208 vl_api_gpe_fwd_entry_t *e;
3213 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3215 for (i = 0; i < mp->count; i++)
3217 e = &mp->entries[i];
3218 print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
3219 format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
3220 format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
3224 vam->retval = retval;
3225 vam->result_ready = 1;
3229 vl_api_gpe_fwd_entries_get_reply_t_handler_json
3230 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3233 vat_main_t *vam = &vat_main;
3234 vat_json_node_t *e = 0, root;
3236 int retval = clib_net_to_host_u32 (mp->retval);
3237 vl_api_gpe_fwd_entry_t *fwd;
3242 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3243 vat_json_init_array (&root);
3245 for (i = 0; i < mp->count; i++)
3247 e = vat_json_array_add (&root);
3248 fwd = &mp->entries[i];
3250 vat_json_init_object (e);
3251 vat_json_object_add_int (e, "fwd_entry_index", fwd->fwd_entry_index);
3252 vat_json_object_add_int (e, "dp_table", fwd->dp_table);
3253 vat_json_object_add_int (e, "vni", fwd->vni);
3254 vat_json_object_add_int (e, "action", fwd->action);
3256 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
3257 fwd->leid_prefix_len);
3259 vat_json_object_add_string_copy (e, "leid", s);
3262 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
3263 fwd->reid_prefix_len);
3265 vat_json_object_add_string_copy (e, "reid", s);
3269 vat_json_print (vam->ofp, &root);
3270 vat_json_free (&root);
3273 vam->retval = retval;
3274 vam->result_ready = 1;
3278 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler
3279 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3281 vat_main_t *vam = &vat_main;
3283 int retval = clib_net_to_host_u32 (mp->retval);
3284 vl_api_gpe_native_fwd_rpath_t *r;
3289 n = clib_net_to_host_u32 (mp->count);
3291 for (i = 0; i < n; i++)
3293 r = &mp->entries[i];
3294 print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
3295 clib_net_to_host_u32 (r->fib_index),
3296 clib_net_to_host_u32 (r->nh_sw_if_index),
3297 r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
3301 vam->retval = retval;
3302 vam->result_ready = 1;
3306 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler_json
3307 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3309 vat_main_t *vam = &vat_main;
3310 vat_json_node_t root, *e;
3312 int retval = clib_net_to_host_u32 (mp->retval);
3313 vl_api_gpe_native_fwd_rpath_t *r;
3319 n = clib_net_to_host_u32 (mp->count);
3320 vat_json_init_array (&root);
3322 for (i = 0; i < n; i++)
3324 e = vat_json_array_add (&root);
3325 vat_json_init_object (e);
3326 r = &mp->entries[i];
3328 format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
3331 vat_json_object_add_string_copy (e, "ip4", s);
3334 vat_json_object_add_uint (e, "fib_index",
3335 clib_net_to_host_u32 (r->fib_index));
3336 vat_json_object_add_uint (e, "nh_sw_if_index",
3337 clib_net_to_host_u32 (r->nh_sw_if_index));
3340 vat_json_print (vam->ofp, &root);
3341 vat_json_free (&root);
3344 vam->retval = retval;
3345 vam->result_ready = 1;
3349 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler
3350 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3352 vat_main_t *vam = &vat_main;
3354 int retval = clib_net_to_host_u32 (mp->retval);
3359 n = clib_net_to_host_u32 (mp->count);
3361 for (i = 0; i < n; i++)
3362 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->vnis[i]));
3365 vam->retval = retval;
3366 vam->result_ready = 1;
3370 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler_json
3371 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3373 vat_main_t *vam = &vat_main;
3374 vat_json_node_t root;
3376 int retval = clib_net_to_host_u32 (mp->retval);
3381 n = clib_net_to_host_u32 (mp->count);
3382 vat_json_init_array (&root);
3384 for (i = 0; i < n; i++)
3385 vat_json_array_add_uint (&root, clib_net_to_host_u32 (mp->vnis[i]));
3387 vat_json_print (vam->ofp, &root);
3388 vat_json_free (&root);
3391 vam->retval = retval;
3392 vam->result_ready = 1;
3396 vl_api_one_l2_arp_entries_get_reply_t_handler
3397 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3399 vat_main_t *vam = &vat_main;
3401 int retval = clib_net_to_host_u32 (mp->retval);
3406 n = clib_net_to_host_u32 (mp->count);
3408 for (i = 0; i < n; i++)
3409 print (vam->ofp, "%U -> %U", format_ip4_address, &mp->entries[i].ip4,
3410 format_ethernet_address, mp->entries[i].mac);
3413 vam->retval = retval;
3414 vam->result_ready = 1;
3418 vl_api_one_l2_arp_entries_get_reply_t_handler_json
3419 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3422 vat_main_t *vam = &vat_main;
3423 vat_json_node_t *e = 0, root;
3425 int retval = clib_net_to_host_u32 (mp->retval);
3426 vl_api_one_l2_arp_entry_t *arp_entry;
3431 n = clib_net_to_host_u32 (mp->count);
3432 vat_json_init_array (&root);
3434 for (i = 0; i < n; i++)
3436 e = vat_json_array_add (&root);
3437 arp_entry = &mp->entries[i];
3439 vat_json_init_object (e);
3440 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3443 vat_json_object_add_string_copy (e, "mac", s);
3446 s = format (0, "%U", format_ip4_address, &arp_entry->ip4);
3448 vat_json_object_add_string_copy (e, "ip4", s);
3452 vat_json_print (vam->ofp, &root);
3453 vat_json_free (&root);
3456 vam->retval = retval;
3457 vam->result_ready = 1;
3461 vl_api_one_l2_arp_bd_get_reply_t_handler
3462 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3464 vat_main_t *vam = &vat_main;
3466 int retval = clib_net_to_host_u32 (mp->retval);
3471 n = clib_net_to_host_u32 (mp->count);
3473 for (i = 0; i < n; i++)
3475 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3479 vam->retval = retval;
3480 vam->result_ready = 1;
3484 vl_api_one_l2_arp_bd_get_reply_t_handler_json
3485 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3487 vat_main_t *vam = &vat_main;
3488 vat_json_node_t root;
3490 int retval = clib_net_to_host_u32 (mp->retval);
3495 n = clib_net_to_host_u32 (mp->count);
3496 vat_json_init_array (&root);
3498 for (i = 0; i < n; i++)
3500 vat_json_array_add_uint (&root,
3501 clib_net_to_host_u32 (mp->bridge_domains[i]));
3504 vat_json_print (vam->ofp, &root);
3505 vat_json_free (&root);
3508 vam->retval = retval;
3509 vam->result_ready = 1;
3513 vl_api_one_adjacencies_get_reply_t_handler
3514 (vl_api_one_adjacencies_get_reply_t * mp)
3516 vat_main_t *vam = &vat_main;
3518 int retval = clib_net_to_host_u32 (mp->retval);
3519 vl_api_one_adjacency_t *a;
3524 n = clib_net_to_host_u32 (mp->count);
3526 for (i = 0; i < n; i++)
3528 a = &mp->adjacencies[i];
3529 print (vam->ofp, "%U %40U",
3530 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
3531 format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
3535 vam->retval = retval;
3536 vam->result_ready = 1;
3540 vl_api_one_adjacencies_get_reply_t_handler_json
3541 (vl_api_one_adjacencies_get_reply_t * mp)
3544 vat_main_t *vam = &vat_main;
3545 vat_json_node_t *e = 0, root;
3547 int retval = clib_net_to_host_u32 (mp->retval);
3548 vl_api_one_adjacency_t *a;
3553 n = clib_net_to_host_u32 (mp->count);
3554 vat_json_init_array (&root);
3556 for (i = 0; i < n; i++)
3558 e = vat_json_array_add (&root);
3559 a = &mp->adjacencies[i];
3561 vat_json_init_object (e);
3562 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
3563 a->leid_prefix_len);
3565 vat_json_object_add_string_copy (e, "leid", s);
3568 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
3569 a->reid_prefix_len);
3571 vat_json_object_add_string_copy (e, "reid", s);
3575 vat_json_print (vam->ofp, &root);
3576 vat_json_free (&root);
3579 vam->retval = retval;
3580 vam->result_ready = 1;
3584 vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
3586 vat_main_t *vam = &vat_main;
3588 print (vam->ofp, "%=20U",
3589 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
3594 vl_api_one_map_server_details_t_handler_json
3595 (vl_api_one_map_server_details_t * mp)
3597 vat_main_t *vam = &vat_main;
3598 vat_json_node_t *node = NULL;
3599 struct in6_addr ip6;
3602 if (VAT_JSON_ARRAY != vam->json_tree.type)
3604 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3605 vat_json_init_array (&vam->json_tree);
3607 node = vat_json_array_add (&vam->json_tree);
3609 vat_json_init_object (node);
3612 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
3613 vat_json_object_add_ip6 (node, "map-server", ip6);
3617 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
3618 vat_json_object_add_ip4 (node, "map-server", ip4);
3623 vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
3626 vat_main_t *vam = &vat_main;
3628 print (vam->ofp, "%=20U",
3629 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
3634 vl_api_one_map_resolver_details_t_handler_json
3635 (vl_api_one_map_resolver_details_t * mp)
3637 vat_main_t *vam = &vat_main;
3638 vat_json_node_t *node = NULL;
3639 struct in6_addr ip6;
3642 if (VAT_JSON_ARRAY != vam->json_tree.type)
3644 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3645 vat_json_init_array (&vam->json_tree);
3647 node = vat_json_array_add (&vam->json_tree);
3649 vat_json_init_object (node);
3652 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
3653 vat_json_object_add_ip6 (node, "map resolver", ip6);
3657 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
3658 vat_json_object_add_ip4 (node, "map resolver", ip4);
3663 vl_api_show_one_status_reply_t_handler (vl_api_show_one_status_reply_t * mp)
3665 vat_main_t *vam = &vat_main;
3666 i32 retval = ntohl (mp->retval);
3670 print (vam->ofp, "feature: %s\ngpe: %s",
3671 mp->feature_status ? "enabled" : "disabled",
3672 mp->gpe_status ? "enabled" : "disabled");
3675 vam->retval = retval;
3676 vam->result_ready = 1;
3680 vl_api_show_one_status_reply_t_handler_json
3681 (vl_api_show_one_status_reply_t * mp)
3683 vat_main_t *vam = &vat_main;
3684 vat_json_node_t node;
3685 u8 *gpe_status = NULL;
3686 u8 *feature_status = NULL;
3688 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
3689 feature_status = format (0, "%s",
3690 mp->feature_status ? "enabled" : "disabled");
3691 vec_add1 (gpe_status, 0);
3692 vec_add1 (feature_status, 0);
3694 vat_json_init_object (&node);
3695 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
3696 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
3698 vec_free (gpe_status);
3699 vec_free (feature_status);
3701 vat_json_print (vam->ofp, &node);
3702 vat_json_free (&node);
3704 vam->retval = ntohl (mp->retval);
3705 vam->result_ready = 1;
3709 vl_api_one_get_map_request_itr_rlocs_reply_t_handler
3710 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
3712 vat_main_t *vam = &vat_main;
3713 i32 retval = ntohl (mp->retval);
3717 print (vam->ofp, "%=20s", mp->locator_set_name);
3720 vam->retval = retval;
3721 vam->result_ready = 1;
3725 vl_api_one_get_map_request_itr_rlocs_reply_t_handler_json
3726 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
3728 vat_main_t *vam = &vat_main;
3729 vat_json_node_t *node = NULL;
3731 if (VAT_JSON_ARRAY != vam->json_tree.type)
3733 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3734 vat_json_init_array (&vam->json_tree);
3736 node = vat_json_array_add (&vam->json_tree);
3738 vat_json_init_object (node);
3739 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
3741 vat_json_print (vam->ofp, node);
3742 vat_json_free (node);
3744 vam->retval = ntohl (mp->retval);
3745 vam->result_ready = 1;
3749 format_lisp_map_request_mode (u8 * s, va_list * args)
3751 u32 mode = va_arg (*args, u32);
3756 return format (0, "dst-only");
3758 return format (0, "src-dst");
3764 vl_api_show_one_map_request_mode_reply_t_handler
3765 (vl_api_show_one_map_request_mode_reply_t * mp)
3767 vat_main_t *vam = &vat_main;
3768 i32 retval = ntohl (mp->retval);
3772 u32 mode = mp->mode;
3773 print (vam->ofp, "map_request_mode: %U",
3774 format_lisp_map_request_mode, mode);
3777 vam->retval = retval;
3778 vam->result_ready = 1;
3782 vl_api_show_one_map_request_mode_reply_t_handler_json
3783 (vl_api_show_one_map_request_mode_reply_t * mp)
3785 vat_main_t *vam = &vat_main;
3786 vat_json_node_t node;
3791 s = format (0, "%U", format_lisp_map_request_mode, mode);
3794 vat_json_init_object (&node);
3795 vat_json_object_add_string_copy (&node, "map_request_mode", s);
3796 vat_json_print (vam->ofp, &node);
3797 vat_json_free (&node);
3800 vam->retval = ntohl (mp->retval);
3801 vam->result_ready = 1;
3805 vl_api_show_one_use_petr_reply_t_handler
3806 (vl_api_show_one_use_petr_reply_t * mp)
3808 vat_main_t *vam = &vat_main;
3809 i32 retval = ntohl (mp->retval);
3813 print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
3816 print (vam->ofp, "Proxy-ETR address; %U",
3817 mp->is_ip4 ? format_ip4_address : format_ip6_address,
3822 vam->retval = retval;
3823 vam->result_ready = 1;
3827 vl_api_show_one_use_petr_reply_t_handler_json
3828 (vl_api_show_one_use_petr_reply_t * mp)
3830 vat_main_t *vam = &vat_main;
3831 vat_json_node_t node;
3834 struct in6_addr ip6;
3836 status = format (0, "%s", mp->status ? "enabled" : "disabled");
3837 vec_add1 (status, 0);
3839 vat_json_init_object (&node);
3840 vat_json_object_add_string_copy (&node, "status", status);
3845 clib_memcpy (&ip6, mp->address, sizeof (ip6));
3846 vat_json_object_add_ip6 (&node, "address", ip6);
3850 clib_memcpy (&ip4, mp->address, sizeof (ip4));
3851 vat_json_object_add_ip4 (&node, "address", ip4);
3857 vat_json_print (vam->ofp, &node);
3858 vat_json_free (&node);
3860 vam->retval = ntohl (mp->retval);
3861 vam->result_ready = 1;
3865 vl_api_show_one_nsh_mapping_reply_t_handler
3866 (vl_api_show_one_nsh_mapping_reply_t * mp)
3868 vat_main_t *vam = &vat_main;
3869 i32 retval = ntohl (mp->retval);
3873 print (vam->ofp, "%-20s%-16s",
3874 mp->is_set ? "set" : "not-set",
3875 mp->is_set ? (char *) mp->locator_set_name : "");
3878 vam->retval = retval;
3879 vam->result_ready = 1;
3883 vl_api_show_one_nsh_mapping_reply_t_handler_json
3884 (vl_api_show_one_nsh_mapping_reply_t * mp)
3886 vat_main_t *vam = &vat_main;
3887 vat_json_node_t node;
3890 status = format (0, "%s", mp->is_set ? "yes" : "no");
3891 vec_add1 (status, 0);
3893 vat_json_init_object (&node);
3894 vat_json_object_add_string_copy (&node, "is_set", status);
3897 vat_json_object_add_string_copy (&node, "locator_set",
3898 mp->locator_set_name);
3903 vat_json_print (vam->ofp, &node);
3904 vat_json_free (&node);
3906 vam->retval = ntohl (mp->retval);
3907 vam->result_ready = 1;
3911 vl_api_show_one_map_register_ttl_reply_t_handler
3912 (vl_api_show_one_map_register_ttl_reply_t * mp)
3914 vat_main_t *vam = &vat_main;
3915 i32 retval = ntohl (mp->retval);
3917 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
3921 print (vam->ofp, "ttl: %u", mp->ttl);
3924 vam->retval = retval;
3925 vam->result_ready = 1;
3929 vl_api_show_one_map_register_ttl_reply_t_handler_json
3930 (vl_api_show_one_map_register_ttl_reply_t * mp)
3932 vat_main_t *vam = &vat_main;
3933 vat_json_node_t node;
3935 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
3936 vat_json_init_object (&node);
3937 vat_json_object_add_uint (&node, "ttl", mp->ttl);
3939 vat_json_print (vam->ofp, &node);
3940 vat_json_free (&node);
3942 vam->retval = ntohl (mp->retval);
3943 vam->result_ready = 1;
3947 vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
3949 vat_main_t *vam = &vat_main;
3950 i32 retval = ntohl (mp->retval);
3954 print (vam->ofp, "%-20s%-16s",
3955 mp->status ? "enabled" : "disabled",
3956 mp->status ? (char *) mp->locator_set_name : "");
3959 vam->retval = retval;
3960 vam->result_ready = 1;
3964 vl_api_show_one_pitr_reply_t_handler_json (vl_api_show_one_pitr_reply_t * mp)
3966 vat_main_t *vam = &vat_main;
3967 vat_json_node_t node;
3970 status = format (0, "%s", mp->status ? "enabled" : "disabled");
3971 vec_add1 (status, 0);
3973 vat_json_init_object (&node);
3974 vat_json_object_add_string_copy (&node, "status", status);
3977 vat_json_object_add_string_copy (&node, "locator_set",
3978 mp->locator_set_name);
3983 vat_json_print (vam->ofp, &node);
3984 vat_json_free (&node);
3986 vam->retval = ntohl (mp->retval);
3987 vam->result_ready = 1;
3991 format_policer_type (u8 * s, va_list * va)
3993 u32 i = va_arg (*va, u32);
3995 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
3996 s = format (s, "1r2c");
3997 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
3998 s = format (s, "1r3c");
3999 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
4000 s = format (s, "2r3c-2698");
4001 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
4002 s = format (s, "2r3c-4115");
4003 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
4004 s = format (s, "2r3c-mef5cf1");
4006 s = format (s, "ILLEGAL");
4011 format_policer_rate_type (u8 * s, va_list * va)
4013 u32 i = va_arg (*va, u32);
4015 if (i == SSE2_QOS_RATE_KBPS)
4016 s = format (s, "kbps");
4017 else if (i == SSE2_QOS_RATE_PPS)
4018 s = format (s, "pps");
4020 s = format (s, "ILLEGAL");
4025 format_policer_round_type (u8 * s, va_list * va)
4027 u32 i = va_arg (*va, u32);
4029 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
4030 s = format (s, "closest");
4031 else if (i == SSE2_QOS_ROUND_TO_UP)
4032 s = format (s, "up");
4033 else if (i == SSE2_QOS_ROUND_TO_DOWN)
4034 s = format (s, "down");
4036 s = format (s, "ILLEGAL");
4041 format_policer_action_type (u8 * s, va_list * va)
4043 u32 i = va_arg (*va, u32);
4045 if (i == SSE2_QOS_ACTION_DROP)
4046 s = format (s, "drop");
4047 else if (i == SSE2_QOS_ACTION_TRANSMIT)
4048 s = format (s, "transmit");
4049 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4050 s = format (s, "mark-and-transmit");
4052 s = format (s, "ILLEGAL");
4057 format_dscp (u8 * s, va_list * va)
4059 u32 i = va_arg (*va, u32);
4064 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
4068 return format (s, "ILLEGAL");
4070 s = format (s, "%s", t);
4075 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
4077 vat_main_t *vam = &vat_main;
4078 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
4080 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4081 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4083 conform_dscp_str = format (0, "");
4085 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4086 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4088 exceed_dscp_str = format (0, "");
4090 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4091 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4093 violate_dscp_str = format (0, "");
4095 print (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
4096 "rate type %U, round type %U, %s rate, %s color-aware, "
4097 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
4098 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
4099 "conform action %U%s, exceed action %U%s, violate action %U%s",
4101 format_policer_type, mp->type,
4104 clib_net_to_host_u64 (mp->cb),
4105 clib_net_to_host_u64 (mp->eb),
4106 format_policer_rate_type, mp->rate_type,
4107 format_policer_round_type, mp->round_type,
4108 mp->single_rate ? "single" : "dual",
4109 mp->color_aware ? "is" : "not",
4110 ntohl (mp->cir_tokens_per_period),
4111 ntohl (mp->pir_tokens_per_period),
4113 ntohl (mp->current_limit),
4114 ntohl (mp->current_bucket),
4115 ntohl (mp->extended_limit),
4116 ntohl (mp->extended_bucket),
4117 clib_net_to_host_u64 (mp->last_update_time),
4118 format_policer_action_type, mp->conform_action_type,
4120 format_policer_action_type, mp->exceed_action_type,
4122 format_policer_action_type, mp->violate_action_type,
4125 vec_free (conform_dscp_str);
4126 vec_free (exceed_dscp_str);
4127 vec_free (violate_dscp_str);
4130 static void vl_api_policer_details_t_handler_json
4131 (vl_api_policer_details_t * mp)
4133 vat_main_t *vam = &vat_main;
4134 vat_json_node_t *node;
4135 u8 *rate_type_str, *round_type_str, *type_str;
4136 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
4138 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
4140 format (0, "%U", format_policer_round_type, mp->round_type);
4141 type_str = format (0, "%U", format_policer_type, mp->type);
4142 conform_action_str = format (0, "%U", format_policer_action_type,
4143 mp->conform_action_type);
4144 exceed_action_str = format (0, "%U", format_policer_action_type,
4145 mp->exceed_action_type);
4146 violate_action_str = format (0, "%U", format_policer_action_type,
4147 mp->violate_action_type);
4149 if (VAT_JSON_ARRAY != vam->json_tree.type)
4151 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4152 vat_json_init_array (&vam->json_tree);
4154 node = vat_json_array_add (&vam->json_tree);
4156 vat_json_init_object (node);
4157 vat_json_object_add_string_copy (node, "name", mp->name);
4158 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
4159 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
4160 vat_json_object_add_uint (node, "cb", clib_net_to_host_u64 (mp->cb));
4161 vat_json_object_add_uint (node, "eb", clib_net_to_host_u64 (mp->eb));
4162 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
4163 vat_json_object_add_string_copy (node, "round_type", round_type_str);
4164 vat_json_object_add_string_copy (node, "type", type_str);
4165 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
4166 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
4167 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
4168 vat_json_object_add_uint (node, "cir_tokens_per_period",
4169 ntohl (mp->cir_tokens_per_period));
4170 vat_json_object_add_uint (node, "eir_tokens_per_period",
4171 ntohl (mp->pir_tokens_per_period));
4172 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
4173 vat_json_object_add_uint (node, "current_bucket",
4174 ntohl (mp->current_bucket));
4175 vat_json_object_add_uint (node, "extended_limit",
4176 ntohl (mp->extended_limit));
4177 vat_json_object_add_uint (node, "extended_bucket",
4178 ntohl (mp->extended_bucket));
4179 vat_json_object_add_uint (node, "last_update_time",
4180 ntohl (mp->last_update_time));
4181 vat_json_object_add_string_copy (node, "conform_action",
4182 conform_action_str);
4183 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4185 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4186 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
4187 vec_free (dscp_str);
4189 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
4190 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4192 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4193 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
4194 vec_free (dscp_str);
4196 vat_json_object_add_string_copy (node, "violate_action",
4197 violate_action_str);
4198 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4200 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4201 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
4202 vec_free (dscp_str);
4205 vec_free (rate_type_str);
4206 vec_free (round_type_str);
4207 vec_free (type_str);
4208 vec_free (conform_action_str);
4209 vec_free (exceed_action_str);
4210 vec_free (violate_action_str);
4214 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
4217 vat_main_t *vam = &vat_main;
4218 int i, count = ntohl (mp->count);
4221 print (vam->ofp, "classify table ids (%d) : ", count);
4222 for (i = 0; i < count; i++)
4224 print (vam->ofp, "%d", ntohl (mp->ids[i]));
4225 print (vam->ofp, (i < count - 1) ? "," : "");
4227 vam->retval = ntohl (mp->retval);
4228 vam->result_ready = 1;
4232 vl_api_classify_table_ids_reply_t_handler_json
4233 (vl_api_classify_table_ids_reply_t * mp)
4235 vat_main_t *vam = &vat_main;
4236 int i, count = ntohl (mp->count);
4240 vat_json_node_t node;
4242 vat_json_init_object (&node);
4243 for (i = 0; i < count; i++)
4245 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
4247 vat_json_print (vam->ofp, &node);
4248 vat_json_free (&node);
4250 vam->retval = ntohl (mp->retval);
4251 vam->result_ready = 1;
4255 vl_api_classify_table_by_interface_reply_t_handler
4256 (vl_api_classify_table_by_interface_reply_t * mp)
4258 vat_main_t *vam = &vat_main;
4261 table_id = ntohl (mp->l2_table_id);
4263 print (vam->ofp, "l2 table id : %d", table_id);
4265 print (vam->ofp, "l2 table id : No input ACL tables configured");
4266 table_id = ntohl (mp->ip4_table_id);
4268 print (vam->ofp, "ip4 table id : %d", table_id);
4270 print (vam->ofp, "ip4 table id : No input ACL tables configured");
4271 table_id = ntohl (mp->ip6_table_id);
4273 print (vam->ofp, "ip6 table id : %d", table_id);
4275 print (vam->ofp, "ip6 table id : No input ACL tables configured");
4276 vam->retval = ntohl (mp->retval);
4277 vam->result_ready = 1;
4281 vl_api_classify_table_by_interface_reply_t_handler_json
4282 (vl_api_classify_table_by_interface_reply_t * mp)
4284 vat_main_t *vam = &vat_main;
4285 vat_json_node_t node;
4287 vat_json_init_object (&node);
4289 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
4290 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
4291 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
4293 vat_json_print (vam->ofp, &node);
4294 vat_json_free (&node);
4296 vam->retval = ntohl (mp->retval);
4297 vam->result_ready = 1;
4300 static void vl_api_policer_add_del_reply_t_handler
4301 (vl_api_policer_add_del_reply_t * mp)
4303 vat_main_t *vam = &vat_main;
4304 i32 retval = ntohl (mp->retval);
4305 if (vam->async_mode)
4307 vam->async_errors += (retval < 0);
4311 vam->retval = retval;
4312 vam->result_ready = 1;
4313 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
4315 * Note: this is just barely thread-safe, depends on
4316 * the main thread spinning waiting for an answer...
4318 errmsg ("policer index %d", ntohl (mp->policer_index));
4322 static void vl_api_policer_add_del_reply_t_handler_json
4323 (vl_api_policer_add_del_reply_t * mp)
4325 vat_main_t *vam = &vat_main;
4326 vat_json_node_t node;
4328 vat_json_init_object (&node);
4329 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
4330 vat_json_object_add_uint (&node, "policer_index",
4331 ntohl (mp->policer_index));
4333 vat_json_print (vam->ofp, &node);
4334 vat_json_free (&node);
4336 vam->retval = ntohl (mp->retval);
4337 vam->result_ready = 1;
4340 /* Format hex dump. */
4342 format_hex_bytes (u8 * s, va_list * va)
4344 u8 *bytes = va_arg (*va, u8 *);
4345 int n_bytes = va_arg (*va, int);
4348 /* Print short or long form depending on byte count. */
4349 uword short_form = n_bytes <= 32;
4350 uword indent = format_get_indent (s);
4355 for (i = 0; i < n_bytes; i++)
4357 if (!short_form && (i % 32) == 0)
4358 s = format (s, "%08x: ", i);
4359 s = format (s, "%02x", bytes[i]);
4360 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
4361 s = format (s, "\n%U", format_white_space, indent);
4368 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
4371 vat_main_t *vam = &vat_main;
4372 i32 retval = ntohl (mp->retval);
4375 print (vam->ofp, "classify table info :");
4376 print (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d",
4377 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
4378 ntohl (mp->miss_next_index));
4379 print (vam->ofp, "nbuckets: %d skip: %d match: %d",
4380 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
4381 ntohl (mp->match_n_vectors));
4382 print (vam->ofp, "mask: %U", format_hex_bytes, mp->mask,
4383 ntohl (mp->mask_length));
4385 vam->retval = retval;
4386 vam->result_ready = 1;
4390 vl_api_classify_table_info_reply_t_handler_json
4391 (vl_api_classify_table_info_reply_t * mp)
4393 vat_main_t *vam = &vat_main;
4394 vat_json_node_t node;
4396 i32 retval = ntohl (mp->retval);
4399 vat_json_init_object (&node);
4401 vat_json_object_add_int (&node, "sessions",
4402 ntohl (mp->active_sessions));
4403 vat_json_object_add_int (&node, "nexttbl",
4404 ntohl (mp->next_table_index));
4405 vat_json_object_add_int (&node, "nextnode",
4406 ntohl (mp->miss_next_index));
4407 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
4408 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
4409 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
4410 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
4411 ntohl (mp->mask_length), 0);
4412 vat_json_object_add_string_copy (&node, "mask", s);
4414 vat_json_print (vam->ofp, &node);
4415 vat_json_free (&node);
4417 vam->retval = ntohl (mp->retval);
4418 vam->result_ready = 1;
4422 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
4425 vat_main_t *vam = &vat_main;
4427 print (vam->ofp, "next_index: %d advance: %d opaque: %d ",
4428 ntohl (mp->hit_next_index), ntohl (mp->advance),
4429 ntohl (mp->opaque_index));
4430 print (vam->ofp, "mask: %U", format_hex_bytes, mp->match,
4431 ntohl (mp->match_length));
4435 vl_api_classify_session_details_t_handler_json
4436 (vl_api_classify_session_details_t * mp)
4438 vat_main_t *vam = &vat_main;
4439 vat_json_node_t *node = NULL;
4441 if (VAT_JSON_ARRAY != vam->json_tree.type)
4443 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4444 vat_json_init_array (&vam->json_tree);
4446 node = vat_json_array_add (&vam->json_tree);
4448 vat_json_init_object (node);
4449 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
4450 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
4451 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
4453 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
4455 vat_json_object_add_string_copy (node, "match", s);
4458 static void vl_api_pg_create_interface_reply_t_handler
4459 (vl_api_pg_create_interface_reply_t * mp)
4461 vat_main_t *vam = &vat_main;
4463 vam->retval = ntohl (mp->retval);
4464 vam->result_ready = 1;
4467 static void vl_api_pg_create_interface_reply_t_handler_json
4468 (vl_api_pg_create_interface_reply_t * mp)
4470 vat_main_t *vam = &vat_main;
4471 vat_json_node_t node;
4473 i32 retval = ntohl (mp->retval);
4476 vat_json_init_object (&node);
4478 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
4480 vat_json_print (vam->ofp, &node);
4481 vat_json_free (&node);
4483 vam->retval = ntohl (mp->retval);
4484 vam->result_ready = 1;
4487 static void vl_api_policer_classify_details_t_handler
4488 (vl_api_policer_classify_details_t * mp)
4490 vat_main_t *vam = &vat_main;
4492 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
4493 ntohl (mp->table_index));
4496 static void vl_api_policer_classify_details_t_handler_json
4497 (vl_api_policer_classify_details_t * mp)
4499 vat_main_t *vam = &vat_main;
4500 vat_json_node_t *node;
4502 if (VAT_JSON_ARRAY != vam->json_tree.type)
4504 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4505 vat_json_init_array (&vam->json_tree);
4507 node = vat_json_array_add (&vam->json_tree);
4509 vat_json_init_object (node);
4510 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
4511 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
4514 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
4515 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
4517 vat_main_t *vam = &vat_main;
4518 i32 retval = ntohl (mp->retval);
4519 if (vam->async_mode)
4521 vam->async_errors += (retval < 0);
4525 vam->retval = retval;
4526 vam->sw_if_index = ntohl (mp->sw_if_index);
4527 vam->result_ready = 1;
4531 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
4532 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
4534 vat_main_t *vam = &vat_main;
4535 vat_json_node_t node;
4537 vat_json_init_object (&node);
4538 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
4539 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
4541 vat_json_print (vam->ofp, &node);
4542 vat_json_free (&node);
4544 vam->retval = ntohl (mp->retval);
4545 vam->result_ready = 1;
4548 static void vl_api_flow_classify_details_t_handler
4549 (vl_api_flow_classify_details_t * mp)
4551 vat_main_t *vam = &vat_main;
4553 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
4554 ntohl (mp->table_index));
4557 static void vl_api_flow_classify_details_t_handler_json
4558 (vl_api_flow_classify_details_t * mp)
4560 vat_main_t *vam = &vat_main;
4561 vat_json_node_t *node;
4563 if (VAT_JSON_ARRAY != vam->json_tree.type)
4565 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4566 vat_json_init_array (&vam->json_tree);
4568 node = vat_json_array_add (&vam->json_tree);
4570 vat_json_init_object (node);
4571 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
4572 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
4575 #define vl_api_vnet_interface_simple_counters_t_endian vl_noop_handler
4576 #define vl_api_vnet_interface_simple_counters_t_print vl_noop_handler
4577 #define vl_api_vnet_interface_combined_counters_t_endian vl_noop_handler
4578 #define vl_api_vnet_interface_combined_counters_t_print vl_noop_handler
4579 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
4580 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
4581 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
4582 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
4583 #define vl_api_vnet_ip4_nbr_counters_t_endian vl_noop_handler
4584 #define vl_api_vnet_ip4_nbr_counters_t_print vl_noop_handler
4585 #define vl_api_vnet_ip6_nbr_counters_t_endian vl_noop_handler
4586 #define vl_api_vnet_ip6_nbr_counters_t_print vl_noop_handler
4587 #define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler
4588 #define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler
4589 #define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler
4590 #define vl_api_one_l2_arp_entries_get_reply_t_endian vl_noop_handler
4591 #define vl_api_one_l2_arp_entries_get_reply_t_print vl_noop_handler
4592 #define vl_api_one_l2_arp_bd_get_reply_t_endian vl_noop_handler
4595 * Generate boilerplate reply handlers, which
4596 * dig the return value out of the xxx_reply_t API message,
4597 * stick it into vam->retval, and set vam->result_ready
4599 * Could also do this by pointing N message decode slots at
4600 * a single function, but that could break in subtle ways.
4603 #define foreach_standard_reply_retval_handler \
4604 _(sw_interface_set_flags_reply) \
4605 _(sw_interface_add_del_address_reply) \
4606 _(sw_interface_set_table_reply) \
4607 _(sw_interface_set_mpls_enable_reply) \
4608 _(sw_interface_set_vpath_reply) \
4609 _(sw_interface_set_vxlan_bypass_reply) \
4610 _(sw_interface_set_vxlan_gpe_bypass_reply) \
4611 _(sw_interface_set_l2_bridge_reply) \
4612 _(bridge_domain_add_del_reply) \
4613 _(sw_interface_set_l2_xconnect_reply) \
4614 _(l2fib_add_del_reply) \
4615 _(l2fib_flush_int_reply) \
4616 _(l2fib_flush_bd_reply) \
4617 _(ip_add_del_route_reply) \
4618 _(ip_mroute_add_del_reply) \
4619 _(mpls_route_add_del_reply) \
4620 _(mpls_ip_bind_unbind_reply) \
4621 _(proxy_arp_add_del_reply) \
4622 _(proxy_arp_intfc_enable_disable_reply) \
4623 _(sw_interface_set_unnumbered_reply) \
4624 _(ip_neighbor_add_del_reply) \
4625 _(reset_vrf_reply) \
4626 _(oam_add_del_reply) \
4627 _(reset_fib_reply) \
4628 _(dhcp_proxy_config_reply) \
4629 _(dhcp_proxy_set_vss_reply) \
4630 _(dhcp_client_config_reply) \
4631 _(set_ip_flow_hash_reply) \
4632 _(sw_interface_ip6_enable_disable_reply) \
4633 _(sw_interface_ip6_set_link_local_address_reply) \
4634 _(ip6nd_proxy_add_del_reply) \
4635 _(sw_interface_ip6nd_ra_prefix_reply) \
4636 _(sw_interface_ip6nd_ra_config_reply) \
4637 _(set_arp_neighbor_limit_reply) \
4638 _(l2_patch_add_del_reply) \
4639 _(sr_policy_add_reply) \
4640 _(sr_policy_mod_reply) \
4641 _(sr_policy_del_reply) \
4642 _(sr_localsid_add_del_reply) \
4643 _(sr_steering_add_del_reply) \
4644 _(classify_add_del_session_reply) \
4645 _(classify_set_interface_ip_table_reply) \
4646 _(classify_set_interface_l2_tables_reply) \
4647 _(l2tpv3_set_tunnel_cookies_reply) \
4648 _(l2tpv3_interface_enable_disable_reply) \
4649 _(l2tpv3_set_lookup_key_reply) \
4650 _(l2_fib_clear_table_reply) \
4651 _(l2_interface_efp_filter_reply) \
4652 _(l2_interface_vlan_tag_rewrite_reply) \
4653 _(modify_vhost_user_if_reply) \
4654 _(delete_vhost_user_if_reply) \
4655 _(want_ip4_arp_events_reply) \
4656 _(want_ip6_nd_events_reply) \
4657 _(want_l2_macs_events_reply) \
4658 _(input_acl_set_interface_reply) \
4659 _(ipsec_spd_add_del_reply) \
4660 _(ipsec_interface_add_del_spd_reply) \
4661 _(ipsec_spd_add_del_entry_reply) \
4662 _(ipsec_sad_add_del_entry_reply) \
4663 _(ipsec_sa_set_key_reply) \
4664 _(ipsec_tunnel_if_add_del_reply) \
4665 _(ikev2_profile_add_del_reply) \
4666 _(ikev2_profile_set_auth_reply) \
4667 _(ikev2_profile_set_id_reply) \
4668 _(ikev2_profile_set_ts_reply) \
4669 _(ikev2_set_local_key_reply) \
4670 _(ikev2_set_responder_reply) \
4671 _(ikev2_set_ike_transforms_reply) \
4672 _(ikev2_set_esp_transforms_reply) \
4673 _(ikev2_set_sa_lifetime_reply) \
4674 _(ikev2_initiate_sa_init_reply) \
4675 _(ikev2_initiate_del_ike_sa_reply) \
4676 _(ikev2_initiate_del_child_sa_reply) \
4677 _(ikev2_initiate_rekey_child_sa_reply) \
4678 _(delete_loopback_reply) \
4679 _(bd_ip_mac_add_del_reply) \
4680 _(map_del_domain_reply) \
4681 _(map_add_del_rule_reply) \
4682 _(want_interface_events_reply) \
4683 _(want_stats_reply) \
4684 _(cop_interface_enable_disable_reply) \
4685 _(cop_whitelist_enable_disable_reply) \
4686 _(sw_interface_clear_stats_reply) \
4687 _(ioam_enable_reply) \
4688 _(ioam_disable_reply) \
4689 _(one_add_del_locator_reply) \
4690 _(one_add_del_local_eid_reply) \
4691 _(one_add_del_remote_mapping_reply) \
4692 _(one_add_del_adjacency_reply) \
4693 _(one_add_del_map_resolver_reply) \
4694 _(one_add_del_map_server_reply) \
4695 _(one_enable_disable_reply) \
4696 _(one_rloc_probe_enable_disable_reply) \
4697 _(one_map_register_enable_disable_reply) \
4698 _(one_map_register_set_ttl_reply) \
4699 _(one_map_register_fallback_threshold_reply) \
4700 _(one_pitr_set_locator_set_reply) \
4701 _(one_map_request_mode_reply) \
4702 _(one_add_del_map_request_itr_rlocs_reply) \
4703 _(one_eid_table_add_del_map_reply) \
4704 _(one_use_petr_reply) \
4705 _(one_stats_enable_disable_reply) \
4706 _(one_add_del_l2_arp_entry_reply) \
4707 _(one_stats_flush_reply) \
4708 _(gpe_enable_disable_reply) \
4709 _(gpe_set_encap_mode_reply) \
4710 _(gpe_add_del_iface_reply) \
4711 _(gpe_add_del_native_fwd_rpath_reply) \
4712 _(af_packet_delete_reply) \
4713 _(policer_classify_set_interface_reply) \
4714 _(netmap_create_reply) \
4715 _(netmap_delete_reply) \
4716 _(set_ipfix_exporter_reply) \
4717 _(set_ipfix_classify_stream_reply) \
4718 _(ipfix_classify_table_add_del_reply) \
4719 _(flow_classify_set_interface_reply) \
4720 _(sw_interface_span_enable_disable_reply) \
4721 _(pg_capture_reply) \
4722 _(pg_enable_disable_reply) \
4723 _(ip_source_and_port_range_check_add_del_reply) \
4724 _(ip_source_and_port_range_check_interface_add_del_reply)\
4725 _(delete_subif_reply) \
4726 _(l2_interface_pbb_tag_rewrite_reply) \
4728 _(feature_enable_disable_reply) \
4729 _(sw_interface_tag_add_del_reply) \
4730 _(sw_interface_set_mtu_reply) \
4731 _(p2p_ethernet_add_reply) \
4732 _(p2p_ethernet_del_reply) \
4733 _(lldp_config_reply) \
4734 _(sw_interface_set_lldp_reply)
4737 static void vl_api_##n##_t_handler \
4738 (vl_api_##n##_t * mp) \
4740 vat_main_t * vam = &vat_main; \
4741 i32 retval = ntohl(mp->retval); \
4742 if (vam->async_mode) { \
4743 vam->async_errors += (retval < 0); \
4745 vam->retval = retval; \
4746 vam->result_ready = 1; \
4749 foreach_standard_reply_retval_handler;
4753 static void vl_api_##n##_t_handler_json \
4754 (vl_api_##n##_t * mp) \
4756 vat_main_t * vam = &vat_main; \
4757 vat_json_node_t node; \
4758 vat_json_init_object(&node); \
4759 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
4760 vat_json_print(vam->ofp, &node); \
4761 vam->retval = ntohl(mp->retval); \
4762 vam->result_ready = 1; \
4764 foreach_standard_reply_retval_handler;
4768 * Table of message reply handlers, must include boilerplate handlers
4772 #define foreach_vpe_api_reply_msg \
4773 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
4774 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
4775 _(SW_INTERFACE_DETAILS, sw_interface_details) \
4776 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
4777 _(CONTROL_PING_REPLY, control_ping_reply) \
4778 _(CLI_REPLY, cli_reply) \
4779 _(CLI_INBAND_REPLY, cli_inband_reply) \
4780 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
4781 sw_interface_add_del_address_reply) \
4782 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
4783 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
4784 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
4785 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
4786 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
4787 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
4788 sw_interface_set_l2_xconnect_reply) \
4789 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
4790 sw_interface_set_l2_bridge_reply) \
4791 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
4792 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
4793 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
4794 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
4795 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
4796 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
4797 _(L2_FLAGS_REPLY, l2_flags_reply) \
4798 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
4799 _(TAP_CONNECT_REPLY, tap_connect_reply) \
4800 _(TAP_MODIFY_REPLY, tap_modify_reply) \
4801 _(TAP_DELETE_REPLY, tap_delete_reply) \
4802 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
4803 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
4804 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
4805 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
4806 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
4807 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
4808 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
4809 proxy_arp_intfc_enable_disable_reply) \
4810 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
4811 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
4812 sw_interface_set_unnumbered_reply) \
4813 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
4814 _(RESET_VRF_REPLY, reset_vrf_reply) \
4815 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
4816 _(CREATE_SUBIF_REPLY, create_subif_reply) \
4817 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
4818 _(RESET_FIB_REPLY, reset_fib_reply) \
4819 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
4820 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
4821 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
4822 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
4823 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
4824 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
4825 sw_interface_ip6_enable_disable_reply) \
4826 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
4827 sw_interface_ip6_set_link_local_address_reply) \
4828 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
4829 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
4830 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
4831 sw_interface_ip6nd_ra_prefix_reply) \
4832 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
4833 sw_interface_ip6nd_ra_config_reply) \
4834 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
4835 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
4836 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
4837 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
4838 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
4839 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
4840 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
4841 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
4842 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
4843 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
4844 classify_set_interface_ip_table_reply) \
4845 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
4846 classify_set_interface_l2_tables_reply) \
4847 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
4848 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
4849 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
4850 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
4851 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
4852 l2tpv3_interface_enable_disable_reply) \
4853 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
4854 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
4855 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
4856 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
4857 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
4858 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
4859 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
4860 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
4861 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
4862 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
4863 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
4864 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
4865 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
4866 _(SHOW_VERSION_REPLY, show_version_reply) \
4867 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
4868 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
4869 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
4870 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
4871 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
4872 _(IP4_ARP_EVENT, ip4_arp_event) \
4873 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
4874 _(IP6_ND_EVENT, ip6_nd_event) \
4875 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
4876 _(L2_MACS_EVENT, l2_macs_event) \
4877 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
4878 _(IP_ADDRESS_DETAILS, ip_address_details) \
4879 _(IP_DETAILS, ip_details) \
4880 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
4881 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
4882 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
4883 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
4884 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
4885 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
4886 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
4887 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
4888 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
4889 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
4890 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
4891 _(IKEV2_SET_RESPONDER_REPLY, ikev2_set_responder_reply) \
4892 _(IKEV2_SET_IKE_TRANSFORMS_REPLY, ikev2_set_ike_transforms_reply) \
4893 _(IKEV2_SET_ESP_TRANSFORMS_REPLY, ikev2_set_esp_transforms_reply) \
4894 _(IKEV2_SET_SA_LIFETIME_REPLY, ikev2_set_sa_lifetime_reply) \
4895 _(IKEV2_INITIATE_SA_INIT_REPLY, ikev2_initiate_sa_init_reply) \
4896 _(IKEV2_INITIATE_DEL_IKE_SA_REPLY, ikev2_initiate_del_ike_sa_reply) \
4897 _(IKEV2_INITIATE_DEL_CHILD_SA_REPLY, ikev2_initiate_del_child_sa_reply) \
4898 _(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \
4899 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
4900 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
4901 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
4902 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
4903 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
4904 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
4905 _(MAP_DOMAIN_DETAILS, map_domain_details) \
4906 _(MAP_RULE_DETAILS, map_rule_details) \
4907 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
4908 _(WANT_STATS_REPLY, want_stats_reply) \
4909 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
4910 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
4911 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
4912 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
4913 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
4914 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
4915 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
4916 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
4917 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
4918 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
4919 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
4920 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
4921 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
4922 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
4923 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
4924 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
4925 one_map_register_enable_disable_reply) \
4926 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
4927 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
4928 one_map_register_fallback_threshold_reply) \
4929 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
4930 one_rloc_probe_enable_disable_reply) \
4931 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
4932 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
4933 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
4934 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
4935 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
4936 _(ONE_LOCATOR_DETAILS, one_locator_details) \
4937 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
4938 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
4939 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
4940 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
4941 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
4942 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
4943 _(ONE_STATS_DETAILS, one_stats_details) \
4944 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
4945 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
4946 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
4947 show_one_stats_enable_disable_reply) \
4948 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
4949 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
4950 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
4951 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
4952 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
4953 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
4954 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
4955 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
4956 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
4957 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
4958 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
4959 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
4960 gpe_add_del_native_fwd_rpath_reply) \
4961 _(GPE_FWD_ENTRY_PATH_DETAILS, \
4962 gpe_fwd_entry_path_details) \
4963 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
4964 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
4965 one_add_del_map_request_itr_rlocs_reply) \
4966 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
4967 one_get_map_request_itr_rlocs_reply) \
4968 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
4969 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
4970 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
4971 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
4972 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
4973 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
4974 show_one_map_register_state_reply) \
4975 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
4976 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
4977 show_one_map_register_fallback_threshold_reply) \
4978 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
4979 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
4980 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
4981 _(POLICER_DETAILS, policer_details) \
4982 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
4983 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
4984 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
4985 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
4986 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
4987 _(MPLS_FIB_DETAILS, mpls_fib_details) \
4988 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
4989 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
4990 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
4991 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
4992 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
4993 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
4994 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
4995 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
4996 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
4997 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
4998 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
4999 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5000 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5001 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5002 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5003 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5004 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5005 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5006 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5007 ip_source_and_port_range_check_add_del_reply) \
5008 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5009 ip_source_and_port_range_check_interface_add_del_reply) \
5010 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
5011 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5012 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5013 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5014 _(PUNT_REPLY, punt_reply) \
5015 _(IP_FIB_DETAILS, ip_fib_details) \
5016 _(IP6_FIB_DETAILS, ip6_fib_details) \
5017 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5018 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5019 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5020 _(SW_INTERFACE_SET_MTU_REPLY, sw_interface_set_mtu_reply) \
5021 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5022 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5023 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5024 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5025 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5026 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply)
5028 #define foreach_standalone_reply_msg \
5029 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
5030 _(VNET_INTERFACE_SIMPLE_COUNTERS, vnet_interface_simple_counters) \
5031 _(VNET_INTERFACE_COMBINED_COUNTERS, vnet_interface_combined_counters) \
5032 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
5033 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
5034 _(VNET_IP4_NBR_COUNTERS, vnet_ip4_nbr_counters) \
5035 _(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters)
5044 #define STR_VTR_OP_CASE(op) \
5045 case L2_VTR_ ## op: \
5049 str_vtr_op (u32 vtr_op)
5053 STR_VTR_OP_CASE (DISABLED);
5054 STR_VTR_OP_CASE (PUSH_1);
5055 STR_VTR_OP_CASE (PUSH_2);
5056 STR_VTR_OP_CASE (POP_1);
5057 STR_VTR_OP_CASE (POP_2);
5058 STR_VTR_OP_CASE (TRANSLATE_1_1);
5059 STR_VTR_OP_CASE (TRANSLATE_1_2);
5060 STR_VTR_OP_CASE (TRANSLATE_2_1);
5061 STR_VTR_OP_CASE (TRANSLATE_2_2);
5068 dump_sub_interface_table (vat_main_t * vam)
5070 const sw_interface_subif_t *sub = NULL;
5072 if (vam->json_output)
5075 ("JSON output supported only for VPE API calls and dump_stats_table");
5080 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5081 "Interface", "sw_if_index",
5082 "sub id", "dot1ad", "tags", "outer id",
5083 "inner id", "exact", "default", "outer any", "inner any");
5085 vec_foreach (sub, vam->sw_if_subif_table)
5088 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5089 sub->interface_name,
5091 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5092 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5093 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5094 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5095 if (sub->vtr_op != L2_VTR_DISABLED)
5098 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5099 "tag1: %d tag2: %d ]",
5100 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5101 sub->vtr_tag1, sub->vtr_tag2);
5109 name_sort_cmp (void *a1, void *a2)
5111 name_sort_t *n1 = a1;
5112 name_sort_t *n2 = a2;
5114 return strcmp ((char *) n1->name, (char *) n2->name);
5118 dump_interface_table (vat_main_t * vam)
5121 name_sort_t *nses = 0, *ns;
5123 if (vam->json_output)
5126 ("JSON output supported only for VPE API calls and dump_stats_table");
5131 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5133 vec_add2 (nses, ns, 1);
5134 ns->name = (u8 *)(p->key);
5135 ns->value = (u32) p->value[0];
5139 vec_sort_with_function (nses, name_sort_cmp);
5141 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5142 vec_foreach (ns, nses)
5144 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5151 dump_ip_table (vat_main_t * vam, int is_ipv6)
5153 const ip_details_t *det = NULL;
5154 const ip_address_details_t *address = NULL;
5157 print (vam->ofp, "%-12s", "sw_if_index");
5159 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5166 print (vam->ofp, "%-12d", i);
5167 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5172 vec_foreach (address, det->addr)
5176 is_ipv6 ? format_ip6_address : format_ip4_address,
5177 address->ip, address->prefix_length);
5185 dump_ipv4_table (vat_main_t * vam)
5187 if (vam->json_output)
5190 ("JSON output supported only for VPE API calls and dump_stats_table");
5194 return dump_ip_table (vam, 0);
5198 dump_ipv6_table (vat_main_t * vam)
5200 if (vam->json_output)
5203 ("JSON output supported only for VPE API calls and dump_stats_table");
5207 return dump_ip_table (vam, 1);
5211 counter_type_to_str (u8 counter_type, u8 is_combined)
5215 switch (counter_type)
5217 case VNET_INTERFACE_COUNTER_DROP:
5219 case VNET_INTERFACE_COUNTER_PUNT:
5221 case VNET_INTERFACE_COUNTER_IP4:
5223 case VNET_INTERFACE_COUNTER_IP6:
5225 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
5227 case VNET_INTERFACE_COUNTER_RX_MISS:
5229 case VNET_INTERFACE_COUNTER_RX_ERROR:
5231 case VNET_INTERFACE_COUNTER_TX_ERROR:
5234 return "INVALID-COUNTER-TYPE";
5239 switch (counter_type)
5241 case VNET_INTERFACE_COUNTER_RX:
5243 case VNET_INTERFACE_COUNTER_TX:
5246 return "INVALID-COUNTER-TYPE";
5252 dump_stats_table (vat_main_t * vam)
5254 vat_json_node_t node;
5255 vat_json_node_t *msg_array;
5256 vat_json_node_t *msg;
5257 vat_json_node_t *counter_array;
5258 vat_json_node_t *counter;
5259 interface_counter_t c;
5261 ip4_fib_counter_t *c4;
5262 ip6_fib_counter_t *c6;
5263 ip4_nbr_counter_t *n4;
5264 ip6_nbr_counter_t *n6;
5267 if (!vam->json_output)
5269 clib_warning ("dump_stats_table supported only in JSON format");
5273 vat_json_init_object (&node);
5275 /* interface counters */
5276 msg_array = vat_json_object_add (&node, "interface_counters");
5277 vat_json_init_array (msg_array);
5278 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
5280 msg = vat_json_array_add (msg_array);
5281 vat_json_init_object (msg);
5282 vat_json_object_add_string_copy (msg, "vnet_counter_type",
5283 (u8 *) counter_type_to_str (i, 0));
5284 vat_json_object_add_int (msg, "is_combined", 0);
5285 counter_array = vat_json_object_add (msg, "data");
5286 vat_json_init_array (counter_array);
5287 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
5289 packets = vam->simple_interface_counters[i][j];
5290 vat_json_array_add_uint (counter_array, packets);
5293 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
5295 msg = vat_json_array_add (msg_array);
5296 vat_json_init_object (msg);
5297 vat_json_object_add_string_copy (msg, "vnet_counter_type",
5298 (u8 *) counter_type_to_str (i, 1));
5299 vat_json_object_add_int (msg, "is_combined", 1);
5300 counter_array = vat_json_object_add (msg, "data");
5301 vat_json_init_array (counter_array);
5302 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
5304 c = vam->combined_interface_counters[i][j];
5305 counter = vat_json_array_add (counter_array);
5306 vat_json_init_object (counter);
5307 vat_json_object_add_uint (counter, "packets", c.packets);
5308 vat_json_object_add_uint (counter, "bytes", c.bytes);
5312 /* ip4 fib counters */
5313 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
5314 vat_json_init_array (msg_array);
5315 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
5317 msg = vat_json_array_add (msg_array);
5318 vat_json_init_object (msg);
5319 vat_json_object_add_uint (msg, "vrf_id",
5320 vam->ip4_fib_counters_vrf_id_by_index[i]);
5321 counter_array = vat_json_object_add (msg, "c");
5322 vat_json_init_array (counter_array);
5323 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
5325 counter = vat_json_array_add (counter_array);
5326 vat_json_init_object (counter);
5327 c4 = &vam->ip4_fib_counters[i][j];
5328 vat_json_object_add_ip4 (counter, "address", c4->address);
5329 vat_json_object_add_uint (counter, "address_length",
5330 c4->address_length);
5331 vat_json_object_add_uint (counter, "packets", c4->packets);
5332 vat_json_object_add_uint (counter, "bytes", c4->bytes);
5336 /* ip6 fib counters */
5337 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
5338 vat_json_init_array (msg_array);
5339 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
5341 msg = vat_json_array_add (msg_array);
5342 vat_json_init_object (msg);
5343 vat_json_object_add_uint (msg, "vrf_id",
5344 vam->ip6_fib_counters_vrf_id_by_index[i]);
5345 counter_array = vat_json_object_add (msg, "c");
5346 vat_json_init_array (counter_array);
5347 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
5349 counter = vat_json_array_add (counter_array);
5350 vat_json_init_object (counter);
5351 c6 = &vam->ip6_fib_counters[i][j];
5352 vat_json_object_add_ip6 (counter, "address", c6->address);
5353 vat_json_object_add_uint (counter, "address_length",
5354 c6->address_length);
5355 vat_json_object_add_uint (counter, "packets", c6->packets);
5356 vat_json_object_add_uint (counter, "bytes", c6->bytes);
5360 /* ip4 nbr counters */
5361 msg_array = vat_json_object_add (&node, "ip4_nbr_counters");
5362 vat_json_init_array (msg_array);
5363 for (i = 0; i < vec_len (vam->ip4_nbr_counters); i++)
5365 msg = vat_json_array_add (msg_array);
5366 vat_json_init_object (msg);
5367 vat_json_object_add_uint (msg, "sw_if_index", i);
5368 counter_array = vat_json_object_add (msg, "c");
5369 vat_json_init_array (counter_array);
5370 for (j = 0; j < vec_len (vam->ip4_nbr_counters[i]); j++)
5372 counter = vat_json_array_add (counter_array);
5373 vat_json_init_object (counter);
5374 n4 = &vam->ip4_nbr_counters[i][j];
5375 vat_json_object_add_ip4 (counter, "address", n4->address);
5376 vat_json_object_add_uint (counter, "link-type", n4->linkt);
5377 vat_json_object_add_uint (counter, "packets", n4->packets);
5378 vat_json_object_add_uint (counter, "bytes", n4->bytes);
5382 /* ip6 nbr counters */
5383 msg_array = vat_json_object_add (&node, "ip6_nbr_counters");
5384 vat_json_init_array (msg_array);
5385 for (i = 0; i < vec_len (vam->ip6_nbr_counters); i++)
5387 msg = vat_json_array_add (msg_array);
5388 vat_json_init_object (msg);
5389 vat_json_object_add_uint (msg, "sw_if_index", i);
5390 counter_array = vat_json_object_add (msg, "c");
5391 vat_json_init_array (counter_array);
5392 for (j = 0; j < vec_len (vam->ip6_nbr_counters[i]); j++)
5394 counter = vat_json_array_add (counter_array);
5395 vat_json_init_object (counter);
5396 n6 = &vam->ip6_nbr_counters[i][j];
5397 vat_json_object_add_ip6 (counter, "address", n6->address);
5398 vat_json_object_add_uint (counter, "packets", n6->packets);
5399 vat_json_object_add_uint (counter, "bytes", n6->bytes);
5403 vat_json_print (vam->ofp, &node);
5404 vat_json_free (&node);
5410 exec (vat_main_t * vam)
5412 api_main_t *am = &api_main;
5417 unformat_input_t *i = vam->input;
5419 if (vec_len (i->buffer) == 0)
5422 if (vam->exec_mode == 0 && unformat (i, "mode"))
5427 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5437 * Copy cmd into shared memory.
5438 * In order for the CLI command to work, it
5439 * must be a vector ending in \n, not a C-string ending
5442 pthread_mutex_lock (&am->vlib_rp->mutex);
5443 oldheap = svm_push_data_heap (am->vlib_rp);
5445 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
5446 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
5448 svm_pop_heap (oldheap);
5449 pthread_mutex_unlock (&am->vlib_rp->mutex);
5451 mp->cmd_in_shmem = pointer_to_uword (cmd);
5453 timeout = vat_time_now (vam) + 10.0;
5455 while (vat_time_now (vam) < timeout)
5457 if (vam->result_ready == 1)
5460 if (vam->shmem_result != NULL)
5461 print (vam->ofp, "%s", vam->shmem_result);
5462 pthread_mutex_lock (&am->vlib_rp->mutex);
5463 oldheap = svm_push_data_heap (am->vlib_rp);
5465 free_me = (u8 *) vam->shmem_result;
5468 svm_pop_heap (oldheap);
5469 pthread_mutex_unlock (&am->vlib_rp->mutex);
5477 * Future replacement of exec() that passes CLI buffers directly in
5478 * the API messages instead of an additional shared memory area.
5481 exec_inband (vat_main_t * vam)
5483 vl_api_cli_inband_t *mp;
5484 unformat_input_t *i = vam->input;
5487 if (vec_len (i->buffer) == 0)
5490 if (vam->exec_mode == 0 && unformat (i, "mode"))
5495 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5502 * In order for the CLI command to work, it
5503 * must be a vector ending in \n, not a C-string ending
5506 u32 len = vec_len (vam->input->buffer);
5507 M2 (CLI_INBAND, mp, len);
5508 clib_memcpy (mp->cmd, vam->input->buffer, len);
5509 mp->length = htonl (len);
5512 W2 (ret, print (vam->ofp, "%s", vam->cmd_reply));
5517 api_create_loopback (vat_main_t * vam)
5519 unformat_input_t *i = vam->input;
5520 vl_api_create_loopback_t *mp;
5521 vl_api_create_loopback_instance_t *mp_lbi;
5524 u8 is_specified = 0;
5525 u32 user_instance = 0;
5528 memset (mac_address, 0, sizeof (mac_address));
5530 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5532 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5534 if (unformat (i, "instance %d", &user_instance))
5542 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5543 mp_lbi->is_specified = is_specified;
5545 mp_lbi->user_instance = htonl (user_instance);
5547 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5552 /* Construct the API message */
5553 M (CREATE_LOOPBACK, mp);
5555 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5564 api_delete_loopback (vat_main_t * vam)
5566 unformat_input_t *i = vam->input;
5567 vl_api_delete_loopback_t *mp;
5568 u32 sw_if_index = ~0;
5571 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5573 if (unformat (i, "sw_if_index %d", &sw_if_index))
5579 if (sw_if_index == ~0)
5581 errmsg ("missing sw_if_index");
5585 /* Construct the API message */
5586 M (DELETE_LOOPBACK, mp);
5587 mp->sw_if_index = ntohl (sw_if_index);
5595 api_want_stats (vat_main_t * vam)
5597 unformat_input_t *i = vam->input;
5598 vl_api_want_stats_t *mp;
5602 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5604 if (unformat (i, "enable"))
5606 else if (unformat (i, "disable"))
5614 errmsg ("missing enable|disable");
5619 mp->enable_disable = enable;
5627 api_want_interface_events (vat_main_t * vam)
5629 unformat_input_t *i = vam->input;
5630 vl_api_want_interface_events_t *mp;
5634 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5636 if (unformat (i, "enable"))
5638 else if (unformat (i, "disable"))
5646 errmsg ("missing enable|disable");
5650 M (WANT_INTERFACE_EVENTS, mp);
5651 mp->enable_disable = enable;
5653 vam->interface_event_display = enable;
5661 /* Note: non-static, called once to set up the initial intfc table */
5663 api_sw_interface_dump (vat_main_t * vam)
5665 vl_api_sw_interface_dump_t *mp;
5666 vl_api_control_ping_t *mp_ping;
5668 name_sort_t *nses = 0, *ns;
5669 sw_interface_subif_t *sub = NULL;
5672 /* Toss the old name table */
5674 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5676 vec_add2 (nses, ns, 1);
5677 ns->name = (u8 *)(p->key);
5678 ns->value = (u32) p->value[0];
5682 hash_free (vam->sw_if_index_by_interface_name);
5684 vec_foreach (ns, nses) vec_free (ns->name);
5688 vec_foreach (sub, vam->sw_if_subif_table)
5690 vec_free (sub->interface_name);
5692 vec_free (vam->sw_if_subif_table);
5694 /* recreate the interface name hash table */
5695 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
5697 /* Get list of ethernets */
5698 M (SW_INTERFACE_DUMP, mp);
5699 mp->name_filter_valid = 1;
5700 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
5703 /* and local / loopback interfaces */
5704 M (SW_INTERFACE_DUMP, mp);
5705 mp->name_filter_valid = 1;
5706 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
5709 /* and packet-generator interfaces */
5710 M (SW_INTERFACE_DUMP, mp);
5711 mp->name_filter_valid = 1;
5712 strncpy ((char *) mp->name_filter, "pg", sizeof (mp->name_filter) - 1);
5715 /* and vxlan-gpe tunnel interfaces */
5716 M (SW_INTERFACE_DUMP, mp);
5717 mp->name_filter_valid = 1;
5718 strncpy ((char *) mp->name_filter, "vxlan_gpe",
5719 sizeof (mp->name_filter) - 1);
5722 /* and vxlan tunnel interfaces */
5723 M (SW_INTERFACE_DUMP, mp);
5724 mp->name_filter_valid = 1;
5725 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
5728 /* and host (af_packet) interfaces */
5729 M (SW_INTERFACE_DUMP, mp);
5730 mp->name_filter_valid = 1;
5731 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
5734 /* and l2tpv3 tunnel interfaces */
5735 M (SW_INTERFACE_DUMP, mp);
5736 mp->name_filter_valid = 1;
5737 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
5738 sizeof (mp->name_filter) - 1);
5741 /* and GRE tunnel interfaces */
5742 M (SW_INTERFACE_DUMP, mp);
5743 mp->name_filter_valid = 1;
5744 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
5747 /* and LISP-GPE interfaces */
5748 M (SW_INTERFACE_DUMP, mp);
5749 mp->name_filter_valid = 1;
5750 strncpy ((char *) mp->name_filter, "lisp_gpe",
5751 sizeof (mp->name_filter) - 1);
5754 /* and IPSEC tunnel interfaces */
5755 M (SW_INTERFACE_DUMP, mp);
5756 mp->name_filter_valid = 1;
5757 strncpy ((char *) mp->name_filter, "ipsec", sizeof (mp->name_filter) - 1);
5760 /* Use a control ping for synchronization */
5761 M (CONTROL_PING, mp_ping);
5769 api_sw_interface_set_flags (vat_main_t * vam)
5771 unformat_input_t *i = vam->input;
5772 vl_api_sw_interface_set_flags_t *mp;
5774 u8 sw_if_index_set = 0;
5775 u8 admin_up = 0, link_up = 0;
5778 /* Parse args required to build the message */
5779 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5781 if (unformat (i, "admin-up"))
5783 else if (unformat (i, "admin-down"))
5785 else if (unformat (i, "link-up"))
5787 else if (unformat (i, "link-down"))
5790 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5791 sw_if_index_set = 1;
5792 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5793 sw_if_index_set = 1;
5798 if (sw_if_index_set == 0)
5800 errmsg ("missing interface name or sw_if_index");
5804 /* Construct the API message */
5805 M (SW_INTERFACE_SET_FLAGS, mp);
5806 mp->sw_if_index = ntohl (sw_if_index);
5807 mp->admin_up_down = admin_up;
5808 mp->link_up_down = link_up;
5813 /* Wait for a reply, return the good/bad news... */
5819 api_sw_interface_clear_stats (vat_main_t * vam)
5821 unformat_input_t *i = vam->input;
5822 vl_api_sw_interface_clear_stats_t *mp;
5824 u8 sw_if_index_set = 0;
5827 /* Parse args required to build the message */
5828 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5830 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5831 sw_if_index_set = 1;
5832 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5833 sw_if_index_set = 1;
5838 /* Construct the API message */
5839 M (SW_INTERFACE_CLEAR_STATS, mp);
5841 if (sw_if_index_set == 1)
5842 mp->sw_if_index = ntohl (sw_if_index);
5844 mp->sw_if_index = ~0;
5849 /* Wait for a reply, return the good/bad news... */
5855 api_sw_interface_add_del_address (vat_main_t * vam)
5857 unformat_input_t *i = vam->input;
5858 vl_api_sw_interface_add_del_address_t *mp;
5860 u8 sw_if_index_set = 0;
5861 u8 is_add = 1, del_all = 0;
5862 u32 address_length = 0;
5863 u8 v4_address_set = 0;
5864 u8 v6_address_set = 0;
5865 ip4_address_t v4address;
5866 ip6_address_t v6address;
5869 /* Parse args required to build the message */
5870 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5872 if (unformat (i, "del-all"))
5874 else if (unformat (i, "del"))
5877 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5878 sw_if_index_set = 1;
5879 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5880 sw_if_index_set = 1;
5881 else if (unformat (i, "%U/%d",
5882 unformat_ip4_address, &v4address, &address_length))
5884 else if (unformat (i, "%U/%d",
5885 unformat_ip6_address, &v6address, &address_length))
5891 if (sw_if_index_set == 0)
5893 errmsg ("missing interface name or sw_if_index");
5896 if (v4_address_set && v6_address_set)
5898 errmsg ("both v4 and v6 addresses set");
5901 if (!v4_address_set && !v6_address_set && !del_all)
5903 errmsg ("no addresses set");
5907 /* Construct the API message */
5908 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
5910 mp->sw_if_index = ntohl (sw_if_index);
5911 mp->is_add = is_add;
5912 mp->del_all = del_all;
5916 clib_memcpy (mp->address, &v6address, sizeof (v6address));
5920 clib_memcpy (mp->address, &v4address, sizeof (v4address));
5922 mp->address_length = address_length;
5927 /* Wait for a reply, return good/bad news */
5933 api_sw_interface_set_mpls_enable (vat_main_t * vam)
5935 unformat_input_t *i = vam->input;
5936 vl_api_sw_interface_set_mpls_enable_t *mp;
5938 u8 sw_if_index_set = 0;
5942 /* Parse args required to build the message */
5943 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5945 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5946 sw_if_index_set = 1;
5947 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5948 sw_if_index_set = 1;
5949 else if (unformat (i, "disable"))
5951 else if (unformat (i, "dis"))
5957 if (sw_if_index_set == 0)
5959 errmsg ("missing interface name or sw_if_index");
5963 /* Construct the API message */
5964 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
5966 mp->sw_if_index = ntohl (sw_if_index);
5967 mp->enable = enable;
5972 /* Wait for a reply... */
5978 api_sw_interface_set_table (vat_main_t * vam)
5980 unformat_input_t *i = vam->input;
5981 vl_api_sw_interface_set_table_t *mp;
5982 u32 sw_if_index, vrf_id = 0;
5983 u8 sw_if_index_set = 0;
5987 /* Parse args required to build the message */
5988 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5990 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5991 sw_if_index_set = 1;
5992 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5993 sw_if_index_set = 1;
5994 else if (unformat (i, "vrf %d", &vrf_id))
5996 else if (unformat (i, "ipv6"))
6002 if (sw_if_index_set == 0)
6004 errmsg ("missing interface name or sw_if_index");
6008 /* Construct the API message */
6009 M (SW_INTERFACE_SET_TABLE, mp);
6011 mp->sw_if_index = ntohl (sw_if_index);
6012 mp->is_ipv6 = is_ipv6;
6013 mp->vrf_id = ntohl (vrf_id);
6018 /* Wait for a reply... */
6023 static void vl_api_sw_interface_get_table_reply_t_handler
6024 (vl_api_sw_interface_get_table_reply_t * mp)
6026 vat_main_t *vam = &vat_main;
6028 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6030 vam->retval = ntohl (mp->retval);
6031 vam->result_ready = 1;
6035 static void vl_api_sw_interface_get_table_reply_t_handler_json
6036 (vl_api_sw_interface_get_table_reply_t * mp)
6038 vat_main_t *vam = &vat_main;
6039 vat_json_node_t node;
6041 vat_json_init_object (&node);
6042 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6043 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6045 vat_json_print (vam->ofp, &node);
6046 vat_json_free (&node);
6048 vam->retval = ntohl (mp->retval);
6049 vam->result_ready = 1;
6053 api_sw_interface_get_table (vat_main_t * vam)
6055 unformat_input_t *i = vam->input;
6056 vl_api_sw_interface_get_table_t *mp;
6058 u8 sw_if_index_set = 0;
6062 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6064 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6065 sw_if_index_set = 1;
6066 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6067 sw_if_index_set = 1;
6068 else if (unformat (i, "ipv6"))
6074 if (sw_if_index_set == 0)
6076 errmsg ("missing interface name or sw_if_index");
6080 M (SW_INTERFACE_GET_TABLE, mp);
6081 mp->sw_if_index = htonl (sw_if_index);
6082 mp->is_ipv6 = is_ipv6;
6090 api_sw_interface_set_vpath (vat_main_t * vam)
6092 unformat_input_t *i = vam->input;
6093 vl_api_sw_interface_set_vpath_t *mp;
6094 u32 sw_if_index = 0;
6095 u8 sw_if_index_set = 0;
6099 /* Parse args required to build the message */
6100 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6102 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6103 sw_if_index_set = 1;
6104 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6105 sw_if_index_set = 1;
6106 else if (unformat (i, "enable"))
6108 else if (unformat (i, "disable"))
6114 if (sw_if_index_set == 0)
6116 errmsg ("missing interface name or sw_if_index");
6120 /* Construct the API message */
6121 M (SW_INTERFACE_SET_VPATH, mp);
6123 mp->sw_if_index = ntohl (sw_if_index);
6124 mp->enable = is_enable;
6129 /* Wait for a reply... */
6135 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6137 unformat_input_t *i = vam->input;
6138 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6139 u32 sw_if_index = 0;
6140 u8 sw_if_index_set = 0;
6145 /* Parse args required to build the message */
6146 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6148 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6149 sw_if_index_set = 1;
6150 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6151 sw_if_index_set = 1;
6152 else if (unformat (i, "enable"))
6154 else if (unformat (i, "disable"))
6156 else if (unformat (i, "ip4"))
6158 else if (unformat (i, "ip6"))
6164 if (sw_if_index_set == 0)
6166 errmsg ("missing interface name or sw_if_index");
6170 /* Construct the API message */
6171 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6173 mp->sw_if_index = ntohl (sw_if_index);
6174 mp->enable = is_enable;
6175 mp->is_ipv6 = is_ipv6;
6180 /* Wait for a reply... */
6187 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6189 unformat_input_t *i = vam->input;
6190 vl_api_sw_interface_set_l2_xconnect_t *mp;
6192 u8 rx_sw_if_index_set = 0;
6194 u8 tx_sw_if_index_set = 0;
6198 /* Parse args required to build the message */
6199 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6201 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6202 rx_sw_if_index_set = 1;
6203 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6204 tx_sw_if_index_set = 1;
6205 else if (unformat (i, "rx"))
6207 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6209 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6211 rx_sw_if_index_set = 1;
6216 else if (unformat (i, "tx"))
6218 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6220 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6222 tx_sw_if_index_set = 1;
6227 else if (unformat (i, "enable"))
6229 else if (unformat (i, "disable"))
6235 if (rx_sw_if_index_set == 0)
6237 errmsg ("missing rx interface name or rx_sw_if_index");
6241 if (enable && (tx_sw_if_index_set == 0))
6243 errmsg ("missing tx interface name or tx_sw_if_index");
6247 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
6249 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6250 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6251 mp->enable = enable;
6259 api_sw_interface_set_l2_bridge (vat_main_t * vam)
6261 unformat_input_t *i = vam->input;
6262 vl_api_sw_interface_set_l2_bridge_t *mp;
6264 u8 rx_sw_if_index_set = 0;
6272 /* Parse args required to build the message */
6273 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6275 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6276 rx_sw_if_index_set = 1;
6277 else if (unformat (i, "bd_id %d", &bd_id))
6281 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6282 rx_sw_if_index_set = 1;
6283 else if (unformat (i, "shg %d", &shg))
6285 else if (unformat (i, "bvi"))
6287 else if (unformat (i, "enable"))
6289 else if (unformat (i, "disable"))
6295 if (rx_sw_if_index_set == 0)
6297 errmsg ("missing rx interface name or sw_if_index");
6301 if (enable && (bd_id_set == 0))
6303 errmsg ("missing bridge domain");
6307 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
6309 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6310 mp->bd_id = ntohl (bd_id);
6313 mp->enable = enable;
6321 api_bridge_domain_dump (vat_main_t * vam)
6323 unformat_input_t *i = vam->input;
6324 vl_api_bridge_domain_dump_t *mp;
6325 vl_api_control_ping_t *mp_ping;
6329 /* Parse args required to build the message */
6330 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6332 if (unformat (i, "bd_id %d", &bd_id))
6338 M (BRIDGE_DOMAIN_DUMP, mp);
6339 mp->bd_id = ntohl (bd_id);
6342 /* Use a control ping for synchronization */
6343 M (CONTROL_PING, mp_ping);
6351 api_bridge_domain_add_del (vat_main_t * vam)
6353 unformat_input_t *i = vam->input;
6354 vl_api_bridge_domain_add_del_t *mp;
6357 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
6361 /* Parse args required to build the message */
6362 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6364 if (unformat (i, "bd_id %d", &bd_id))
6366 else if (unformat (i, "flood %d", &flood))
6368 else if (unformat (i, "uu-flood %d", &uu_flood))
6370 else if (unformat (i, "forward %d", &forward))
6372 else if (unformat (i, "learn %d", &learn))
6374 else if (unformat (i, "arp-term %d", &arp_term))
6376 else if (unformat (i, "mac-age %d", &mac_age))
6378 else if (unformat (i, "del"))
6381 flood = uu_flood = forward = learn = 0;
6389 errmsg ("missing bridge domain");
6395 errmsg ("mac age must be less than 256 ");
6399 M (BRIDGE_DOMAIN_ADD_DEL, mp);
6401 mp->bd_id = ntohl (bd_id);
6403 mp->uu_flood = uu_flood;
6404 mp->forward = forward;
6406 mp->arp_term = arp_term;
6407 mp->is_add = is_add;
6408 mp->mac_age = (u8) mac_age;
6416 api_l2fib_flush_bd (vat_main_t * vam)
6418 unformat_input_t *i = vam->input;
6419 vl_api_l2fib_flush_bd_t *mp;
6423 /* Parse args required to build the message */
6424 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6426 if (unformat (i, "bd_id %d", &bd_id));
6433 errmsg ("missing bridge domain");
6437 M (L2FIB_FLUSH_BD, mp);
6439 mp->bd_id = htonl (bd_id);
6447 api_l2fib_flush_int (vat_main_t * vam)
6449 unformat_input_t *i = vam->input;
6450 vl_api_l2fib_flush_int_t *mp;
6451 u32 sw_if_index = ~0;
6454 /* Parse args required to build the message */
6455 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6457 if (unformat (i, "sw_if_index %d", &sw_if_index));
6459 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
6464 if (sw_if_index == ~0)
6466 errmsg ("missing interface name or sw_if_index");
6470 M (L2FIB_FLUSH_INT, mp);
6472 mp->sw_if_index = ntohl (sw_if_index);
6480 api_l2fib_add_del (vat_main_t * vam)
6482 unformat_input_t *i = vam->input;
6483 vl_api_l2fib_add_del_t *mp;
6489 u32 sw_if_index = ~0;
6490 u8 sw_if_index_set = 0;
6499 /* Parse args required to build the message */
6500 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6502 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
6504 else if (unformat (i, "bd_id %d", &bd_id))
6506 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6507 sw_if_index_set = 1;
6508 else if (unformat (i, "sw_if"))
6510 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6513 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6514 sw_if_index_set = 1;
6519 else if (unformat (i, "static"))
6521 else if (unformat (i, "filter"))
6526 else if (unformat (i, "bvi"))
6531 else if (unformat (i, "del"))
6533 else if (unformat (i, "count %d", &count))
6541 errmsg ("missing mac address");
6547 errmsg ("missing bridge domain");
6551 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
6553 errmsg ("missing interface name or sw_if_index");
6559 /* Turn on async mode */
6560 vam->async_mode = 1;
6561 vam->async_errors = 0;
6562 before = vat_time_now (vam);
6565 for (j = 0; j < count; j++)
6567 M (L2FIB_ADD_DEL, mp);
6570 mp->bd_id = ntohl (bd_id);
6571 mp->is_add = is_add;
6575 mp->sw_if_index = ntohl (sw_if_index);
6576 mp->static_mac = static_mac;
6577 mp->filter_mac = filter_mac;
6578 mp->bvi_mac = bvi_mac;
6580 increment_mac_address (&mac);
6587 vl_api_control_ping_t *mp_ping;
6590 /* Shut off async mode */
6591 vam->async_mode = 0;
6593 M (CONTROL_PING, mp_ping);
6596 timeout = vat_time_now (vam) + 1.0;
6597 while (vat_time_now (vam) < timeout)
6598 if (vam->result_ready == 1)
6603 if (vam->retval == -99)
6606 if (vam->async_errors > 0)
6608 errmsg ("%d asynchronous errors", vam->async_errors);
6611 vam->async_errors = 0;
6612 after = vat_time_now (vam);
6614 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
6615 count, after - before, count / (after - before));
6621 /* Wait for a reply... */
6625 /* Return the good/bad news */
6626 return (vam->retval);
6630 api_bridge_domain_set_mac_age (vat_main_t * vam)
6632 unformat_input_t *i = vam->input;
6633 vl_api_bridge_domain_set_mac_age_t *mp;
6638 /* Parse args required to build the message */
6639 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6641 if (unformat (i, "bd_id %d", &bd_id));
6642 else if (unformat (i, "mac-age %d", &mac_age));
6649 errmsg ("missing bridge domain");
6655 errmsg ("mac age must be less than 256 ");
6659 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
6661 mp->bd_id = htonl (bd_id);
6662 mp->mac_age = (u8) mac_age;
6670 api_l2_flags (vat_main_t * vam)
6672 unformat_input_t *i = vam->input;
6673 vl_api_l2_flags_t *mp;
6676 u8 sw_if_index_set = 0;
6680 /* Parse args required to build the message */
6681 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6683 if (unformat (i, "sw_if_index %d", &sw_if_index))
6684 sw_if_index_set = 1;
6685 else if (unformat (i, "sw_if"))
6687 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6690 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6691 sw_if_index_set = 1;
6696 else if (unformat (i, "learn"))
6698 else if (unformat (i, "forward"))
6700 else if (unformat (i, "flood"))
6702 else if (unformat (i, "uu-flood"))
6703 flags |= L2_UU_FLOOD;
6704 else if (unformat (i, "arp-term"))
6705 flags |= L2_ARP_TERM;
6706 else if (unformat (i, "off"))
6708 else if (unformat (i, "disable"))
6714 if (sw_if_index_set == 0)
6716 errmsg ("missing interface name or sw_if_index");
6722 mp->sw_if_index = ntohl (sw_if_index);
6723 mp->feature_bitmap = ntohl (flags);
6724 mp->is_set = is_set;
6732 api_bridge_flags (vat_main_t * vam)
6734 unformat_input_t *i = vam->input;
6735 vl_api_bridge_flags_t *mp;
6742 /* Parse args required to build the message */
6743 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6745 if (unformat (i, "bd_id %d", &bd_id))
6747 else if (unformat (i, "learn"))
6749 else if (unformat (i, "forward"))
6751 else if (unformat (i, "flood"))
6753 else if (unformat (i, "uu-flood"))
6754 flags |= L2_UU_FLOOD;
6755 else if (unformat (i, "arp-term"))
6756 flags |= L2_ARP_TERM;
6757 else if (unformat (i, "off"))
6759 else if (unformat (i, "disable"))
6767 errmsg ("missing bridge domain");
6771 M (BRIDGE_FLAGS, mp);
6773 mp->bd_id = ntohl (bd_id);
6774 mp->feature_bitmap = ntohl (flags);
6775 mp->is_set = is_set;
6783 api_bd_ip_mac_add_del (vat_main_t * vam)
6785 unformat_input_t *i = vam->input;
6786 vl_api_bd_ip_mac_add_del_t *mp;
6793 ip4_address_t v4addr;
6794 ip6_address_t v6addr;
6799 /* Parse args required to build the message */
6800 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6802 if (unformat (i, "bd_id %d", &bd_id))
6806 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
6810 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
6815 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
6819 else if (unformat (i, "del"))
6827 errmsg ("missing bridge domain");
6830 else if (ip_set == 0)
6832 errmsg ("missing IP address");
6835 else if (mac_set == 0)
6837 errmsg ("missing MAC address");
6841 M (BD_IP_MAC_ADD_DEL, mp);
6843 mp->bd_id = ntohl (bd_id);
6844 mp->is_ipv6 = is_ipv6;
6845 mp->is_add = is_add;
6847 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
6849 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
6850 clib_memcpy (mp->mac_address, macaddr, 6);
6857 api_tap_connect (vat_main_t * vam)
6859 unformat_input_t *i = vam->input;
6860 vl_api_tap_connect_t *mp;
6866 ip4_address_t ip4_address;
6868 int ip4_address_set = 0;
6869 ip6_address_t ip6_address;
6871 int ip6_address_set = 0;
6874 memset (mac_address, 0, sizeof (mac_address));
6876 /* Parse args required to build the message */
6877 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6879 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6883 else if (unformat (i, "random-mac"))
6885 else if (unformat (i, "tapname %s", &tap_name))
6887 else if (unformat (i, "tag %s", &tag))
6889 else if (unformat (i, "address %U/%d",
6890 unformat_ip4_address, &ip4_address, &ip4_mask_width))
6891 ip4_address_set = 1;
6892 else if (unformat (i, "address %U/%d",
6893 unformat_ip6_address, &ip6_address, &ip6_mask_width))
6894 ip6_address_set = 1;
6901 errmsg ("missing tap name");
6904 if (vec_len (tap_name) > 63)
6906 errmsg ("tap name too long");
6909 vec_add1 (tap_name, 0);
6911 if (vec_len (tag) > 63)
6913 errmsg ("tag too long");
6917 /* Construct the API message */
6918 M (TAP_CONNECT, mp);
6920 mp->use_random_mac = random_mac;
6921 clib_memcpy (mp->mac_address, mac_address, 6);
6922 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
6924 clib_memcpy (mp->tag, tag, vec_len (tag));
6926 if (ip4_address_set)
6928 mp->ip4_address_set = 1;
6929 clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address));
6930 mp->ip4_mask_width = ip4_mask_width;
6932 if (ip6_address_set)
6934 mp->ip6_address_set = 1;
6935 clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address));
6936 mp->ip6_mask_width = ip6_mask_width;
6939 vec_free (tap_name);
6945 /* Wait for a reply... */
6951 api_tap_modify (vat_main_t * vam)
6953 unformat_input_t *i = vam->input;
6954 vl_api_tap_modify_t *mp;
6959 u32 sw_if_index = ~0;
6960 u8 sw_if_index_set = 0;
6963 memset (mac_address, 0, sizeof (mac_address));
6965 /* Parse args required to build the message */
6966 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6968 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6969 sw_if_index_set = 1;
6970 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6971 sw_if_index_set = 1;
6972 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6976 else if (unformat (i, "random-mac"))
6978 else if (unformat (i, "tapname %s", &tap_name))
6984 if (sw_if_index_set == 0)
6986 errmsg ("missing vpp interface name");
6991 errmsg ("missing tap name");
6994 if (vec_len (tap_name) > 63)
6996 errmsg ("tap name too long");
6998 vec_add1 (tap_name, 0);
7000 /* Construct the API message */
7003 mp->use_random_mac = random_mac;
7004 mp->sw_if_index = ntohl (sw_if_index);
7005 clib_memcpy (mp->mac_address, mac_address, 6);
7006 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7007 vec_free (tap_name);
7012 /* Wait for a reply... */
7018 api_tap_delete (vat_main_t * vam)
7020 unformat_input_t *i = vam->input;
7021 vl_api_tap_delete_t *mp;
7022 u32 sw_if_index = ~0;
7023 u8 sw_if_index_set = 0;
7026 /* Parse args required to build the message */
7027 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7029 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7030 sw_if_index_set = 1;
7031 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7032 sw_if_index_set = 1;
7037 if (sw_if_index_set == 0)
7039 errmsg ("missing vpp interface name");
7043 /* Construct the API message */
7046 mp->sw_if_index = ntohl (sw_if_index);
7051 /* Wait for a reply... */
7057 api_ip_add_del_route (vat_main_t * vam)
7059 unformat_input_t *i = vam->input;
7060 vl_api_ip_add_del_route_t *mp;
7061 u32 sw_if_index = ~0, vrf_id = 0;
7063 u8 is_local = 0, is_drop = 0;
7064 u8 is_unreach = 0, is_prohibit = 0;
7065 u8 create_vrf_if_needed = 0;
7067 u32 next_hop_weight = 1;
7069 u8 is_multipath = 0;
7071 u8 address_length_set = 0;
7072 u32 next_hop_table_id = 0;
7073 u32 resolve_attempts = 0;
7074 u32 dst_address_length = 0;
7075 u8 next_hop_set = 0;
7076 ip4_address_t v4_dst_address, v4_next_hop_address;
7077 ip6_address_t v6_dst_address, v6_next_hop_address;
7081 u32 random_add_del = 0;
7082 u32 *random_vector = 0;
7084 u32 random_seed = 0xdeaddabe;
7085 u32 classify_table_index = ~0;
7087 u8 resolve_host = 0, resolve_attached = 0;
7088 mpls_label_t *next_hop_out_label_stack = NULL;
7089 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
7090 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
7092 /* Parse args required to build the message */
7093 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7095 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7097 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7099 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
7104 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
7109 else if (unformat (i, "/%d", &dst_address_length))
7111 address_length_set = 1;
7114 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
7115 &v4_next_hop_address))
7119 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
7120 &v6_next_hop_address))
7124 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
7126 else if (unformat (i, "weight %d", &next_hop_weight))
7128 else if (unformat (i, "drop"))
7132 else if (unformat (i, "null-send-unreach"))
7136 else if (unformat (i, "null-send-prohibit"))
7140 else if (unformat (i, "local"))
7144 else if (unformat (i, "classify %d", &classify_table_index))
7148 else if (unformat (i, "del"))
7150 else if (unformat (i, "add"))
7152 else if (unformat (i, "not-last"))
7154 else if (unformat (i, "resolve-via-host"))
7156 else if (unformat (i, "resolve-via-attached"))
7157 resolve_attached = 1;
7158 else if (unformat (i, "multipath"))
7160 else if (unformat (i, "vrf %d", &vrf_id))
7162 else if (unformat (i, "create-vrf"))
7163 create_vrf_if_needed = 1;
7164 else if (unformat (i, "count %d", &count))
7166 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
7168 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
7170 else if (unformat (i, "out-label %d", &next_hop_out_label))
7171 vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
7172 else if (unformat (i, "via-label %d", &next_hop_via_label))
7174 else if (unformat (i, "random"))
7176 else if (unformat (i, "seed %d", &random_seed))
7180 clib_warning ("parse error '%U'", format_unformat_error, i);
7185 if (!next_hop_set && !is_drop && !is_local &&
7186 !is_classify && !is_unreach && !is_prohibit &&
7187 MPLS_LABEL_INVALID == next_hop_via_label)
7190 ("next hop / local / drop / unreach / prohibit / classify not set");
7194 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
7196 errmsg ("next hop and next-hop via label set");
7199 if (address_set == 0)
7201 errmsg ("missing addresses");
7205 if (address_length_set == 0)
7207 errmsg ("missing address length");
7211 /* Generate a pile of unique, random routes */
7214 u32 this_random_address;
7215 random_hash = hash_create (count, sizeof (uword));
7217 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
7218 for (j = 0; j <= count; j++)
7222 this_random_address = random_u32 (&random_seed);
7223 this_random_address =
7224 clib_host_to_net_u32 (this_random_address);
7226 while (hash_get (random_hash, this_random_address));
7227 vec_add1 (random_vector, this_random_address);
7228 hash_set (random_hash, this_random_address, 1);
7230 hash_free (random_hash);
7231 v4_dst_address.as_u32 = random_vector[0];
7236 /* Turn on async mode */
7237 vam->async_mode = 1;
7238 vam->async_errors = 0;
7239 before = vat_time_now (vam);
7242 for (j = 0; j < count; j++)
7244 /* Construct the API message */
7245 M2 (IP_ADD_DEL_ROUTE, mp,
7246 sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
7248 mp->next_hop_sw_if_index = ntohl (sw_if_index);
7249 mp->table_id = ntohl (vrf_id);
7250 mp->create_vrf_if_needed = create_vrf_if_needed;
7252 mp->is_add = is_add;
7253 mp->is_drop = is_drop;
7254 mp->is_unreach = is_unreach;
7255 mp->is_prohibit = is_prohibit;
7256 mp->is_ipv6 = is_ipv6;
7257 mp->is_local = is_local;
7258 mp->is_classify = is_classify;
7259 mp->is_multipath = is_multipath;
7260 mp->is_resolve_host = resolve_host;
7261 mp->is_resolve_attached = resolve_attached;
7262 mp->not_last = not_last;
7263 mp->next_hop_weight = next_hop_weight;
7264 mp->dst_address_length = dst_address_length;
7265 mp->next_hop_table_id = ntohl (next_hop_table_id);
7266 mp->classify_table_index = ntohl (classify_table_index);
7267 mp->next_hop_via_label = ntohl (next_hop_via_label);
7268 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
7269 if (0 != mp->next_hop_n_out_labels)
7271 memcpy (mp->next_hop_out_label_stack,
7272 next_hop_out_label_stack,
7273 vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
7274 vec_free (next_hop_out_label_stack);
7279 clib_memcpy (mp->dst_address, &v6_dst_address,
7280 sizeof (v6_dst_address));
7282 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
7283 sizeof (v6_next_hop_address));
7284 increment_v6_address (&v6_dst_address);
7288 clib_memcpy (mp->dst_address, &v4_dst_address,
7289 sizeof (v4_dst_address));
7291 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
7292 sizeof (v4_next_hop_address));
7294 v4_dst_address.as_u32 = random_vector[j + 1];
7296 increment_v4_address (&v4_dst_address);
7300 /* If we receive SIGTERM, stop now... */
7305 /* When testing multiple add/del ops, use a control-ping to sync */
7308 vl_api_control_ping_t *mp_ping;
7312 /* Shut off async mode */
7313 vam->async_mode = 0;
7315 M (CONTROL_PING, mp_ping);
7318 timeout = vat_time_now (vam) + 1.0;
7319 while (vat_time_now (vam) < timeout)
7320 if (vam->result_ready == 1)
7325 if (vam->retval == -99)
7328 if (vam->async_errors > 0)
7330 errmsg ("%d asynchronous errors", vam->async_errors);
7333 vam->async_errors = 0;
7334 after = vat_time_now (vam);
7336 /* slim chance, but we might have eaten SIGTERM on the first iteration */
7340 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7341 count, after - before, count / (after - before));
7347 /* Wait for a reply... */
7352 /* Return the good/bad news */
7353 return (vam->retval);
7357 api_ip_mroute_add_del (vat_main_t * vam)
7359 unformat_input_t *i = vam->input;
7360 vl_api_ip_mroute_add_del_t *mp;
7361 u32 sw_if_index = ~0, vrf_id = 0;
7364 u8 create_vrf_if_needed = 0;
7367 u32 grp_address_length = 0;
7368 ip4_address_t v4_grp_address, v4_src_address;
7369 ip6_address_t v6_grp_address, v6_src_address;
7370 mfib_itf_flags_t iflags = 0;
7371 mfib_entry_flags_t eflags = 0;
7374 /* Parse args required to build the message */
7375 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7377 if (unformat (i, "sw_if_index %d", &sw_if_index))
7379 else if (unformat (i, "%U %U",
7380 unformat_ip4_address, &v4_src_address,
7381 unformat_ip4_address, &v4_grp_address))
7383 grp_address_length = 64;
7387 else if (unformat (i, "%U %U",
7388 unformat_ip6_address, &v6_src_address,
7389 unformat_ip6_address, &v6_grp_address))
7391 grp_address_length = 256;
7395 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
7397 memset (&v4_src_address, 0, sizeof (v4_src_address));
7398 grp_address_length = 32;
7402 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
7404 memset (&v6_src_address, 0, sizeof (v6_src_address));
7405 grp_address_length = 128;
7409 else if (unformat (i, "/%d", &grp_address_length))
7411 else if (unformat (i, "local"))
7415 else if (unformat (i, "del"))
7417 else if (unformat (i, "add"))
7419 else if (unformat (i, "vrf %d", &vrf_id))
7421 else if (unformat (i, "create-vrf"))
7422 create_vrf_if_needed = 1;
7423 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
7425 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
7429 clib_warning ("parse error '%U'", format_unformat_error, i);
7434 if (address_set == 0)
7436 errmsg ("missing addresses\n");
7440 /* Construct the API message */
7441 M (IP_MROUTE_ADD_DEL, mp);
7443 mp->next_hop_sw_if_index = ntohl (sw_if_index);
7444 mp->table_id = ntohl (vrf_id);
7445 mp->create_vrf_if_needed = create_vrf_if_needed;
7447 mp->is_add = is_add;
7448 mp->is_ipv6 = is_ipv6;
7449 mp->is_local = is_local;
7450 mp->itf_flags = ntohl (iflags);
7451 mp->entry_flags = ntohl (eflags);
7452 mp->grp_address_length = grp_address_length;
7453 mp->grp_address_length = ntohs (mp->grp_address_length);
7457 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
7458 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
7462 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
7463 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
7469 /* Wait for a reply... */
7475 api_mpls_route_add_del (vat_main_t * vam)
7477 unformat_input_t *i = vam->input;
7478 vl_api_mpls_route_add_del_t *mp;
7479 u32 sw_if_index = ~0, table_id = 0;
7480 u8 create_table_if_needed = 0;
7482 u32 next_hop_weight = 1;
7483 u8 is_multipath = 0;
7484 u32 next_hop_table_id = 0;
7485 u8 next_hop_set = 0;
7486 ip4_address_t v4_next_hop_address = {
7489 ip6_address_t v6_next_hop_address = { {0} };
7493 u32 classify_table_index = ~0;
7495 u8 resolve_host = 0, resolve_attached = 0;
7496 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
7497 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
7498 mpls_label_t *next_hop_out_label_stack = NULL;
7499 mpls_label_t local_label = MPLS_LABEL_INVALID;
7501 dpo_proto_t next_hop_proto = DPO_PROTO_IP4;
7503 /* Parse args required to build the message */
7504 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7506 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7508 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7510 else if (unformat (i, "%d", &local_label))
7512 else if (unformat (i, "eos"))
7514 else if (unformat (i, "non-eos"))
7516 else if (unformat (i, "via %U", unformat_ip4_address,
7517 &v4_next_hop_address))
7520 next_hop_proto = DPO_PROTO_IP4;
7522 else if (unformat (i, "via %U", unformat_ip6_address,
7523 &v6_next_hop_address))
7526 next_hop_proto = DPO_PROTO_IP6;
7528 else if (unformat (i, "weight %d", &next_hop_weight))
7530 else if (unformat (i, "create-table"))
7531 create_table_if_needed = 1;
7532 else if (unformat (i, "classify %d", &classify_table_index))
7536 else if (unformat (i, "del"))
7538 else if (unformat (i, "add"))
7540 else if (unformat (i, "resolve-via-host"))
7542 else if (unformat (i, "resolve-via-attached"))
7543 resolve_attached = 1;
7544 else if (unformat (i, "multipath"))
7546 else if (unformat (i, "count %d", &count))
7548 else if (unformat (i, "lookup-in-ip4-table %d", &next_hop_table_id))
7551 next_hop_proto = DPO_PROTO_IP4;
7553 else if (unformat (i, "lookup-in-ip6-table %d", &next_hop_table_id))
7556 next_hop_proto = DPO_PROTO_IP6;
7558 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
7560 else if (unformat (i, "via-label %d", &next_hop_via_label))
7562 else if (unformat (i, "out-label %d", &next_hop_out_label))
7563 vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label));
7566 clib_warning ("parse error '%U'", format_unformat_error, i);
7571 if (!next_hop_set && !is_classify)
7573 errmsg ("next hop / classify not set");
7577 if (MPLS_LABEL_INVALID == local_label)
7579 errmsg ("missing label");
7585 /* Turn on async mode */
7586 vam->async_mode = 1;
7587 vam->async_errors = 0;
7588 before = vat_time_now (vam);
7591 for (j = 0; j < count; j++)
7593 /* Construct the API message */
7594 M2 (MPLS_ROUTE_ADD_DEL, mp,
7595 sizeof (mpls_label_t) * vec_len (next_hop_out_label_stack));
7597 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
7598 mp->mr_table_id = ntohl (table_id);
7599 mp->mr_create_table_if_needed = create_table_if_needed;
7601 mp->mr_is_add = is_add;
7602 mp->mr_next_hop_proto = next_hop_proto;
7603 mp->mr_is_classify = is_classify;
7604 mp->mr_is_multipath = is_multipath;
7605 mp->mr_is_resolve_host = resolve_host;
7606 mp->mr_is_resolve_attached = resolve_attached;
7607 mp->mr_next_hop_weight = next_hop_weight;
7608 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
7609 mp->mr_classify_table_index = ntohl (classify_table_index);
7610 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
7611 mp->mr_label = ntohl (local_label);
7612 mp->mr_eos = is_eos;
7614 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
7615 if (0 != mp->mr_next_hop_n_out_labels)
7617 memcpy (mp->mr_next_hop_out_label_stack,
7618 next_hop_out_label_stack,
7619 vec_len (next_hop_out_label_stack) * sizeof (mpls_label_t));
7620 vec_free (next_hop_out_label_stack);
7625 if (DPO_PROTO_IP4 == next_hop_proto)
7627 clib_memcpy (mp->mr_next_hop,
7628 &v4_next_hop_address,
7629 sizeof (v4_next_hop_address));
7631 else if (DPO_PROTO_IP6 == next_hop_proto)
7634 clib_memcpy (mp->mr_next_hop,
7635 &v6_next_hop_address,
7636 sizeof (v6_next_hop_address));
7643 /* If we receive SIGTERM, stop now... */
7648 /* When testing multiple add/del ops, use a control-ping to sync */
7651 vl_api_control_ping_t *mp_ping;
7655 /* Shut off async mode */
7656 vam->async_mode = 0;
7658 M (CONTROL_PING, mp_ping);
7661 timeout = vat_time_now (vam) + 1.0;
7662 while (vat_time_now (vam) < timeout)
7663 if (vam->result_ready == 1)
7668 if (vam->retval == -99)
7671 if (vam->async_errors > 0)
7673 errmsg ("%d asynchronous errors", vam->async_errors);
7676 vam->async_errors = 0;
7677 after = vat_time_now (vam);
7679 /* slim chance, but we might have eaten SIGTERM on the first iteration */
7683 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7684 count, after - before, count / (after - before));
7690 /* Wait for a reply... */
7695 /* Return the good/bad news */
7696 return (vam->retval);
7700 api_mpls_ip_bind_unbind (vat_main_t * vam)
7702 unformat_input_t *i = vam->input;
7703 vl_api_mpls_ip_bind_unbind_t *mp;
7704 u32 ip_table_id = 0;
7705 u8 create_table_if_needed = 0;
7708 ip4_address_t v4_address;
7709 ip6_address_t v6_address;
7712 mpls_label_t local_label = MPLS_LABEL_INVALID;
7715 /* Parse args required to build the message */
7716 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7718 if (unformat (i, "%U/%d", unformat_ip4_address,
7719 &v4_address, &address_length))
7724 else if (unformat (i, "%U/%d", unformat_ip6_address,
7725 &v6_address, &address_length))
7730 else if (unformat (i, "%d", &local_label))
7732 else if (unformat (i, "create-table"))
7733 create_table_if_needed = 1;
7734 else if (unformat (i, "table-id %d", &ip_table_id))
7736 else if (unformat (i, "unbind"))
7738 else if (unformat (i, "bind"))
7742 clib_warning ("parse error '%U'", format_unformat_error, i);
7749 errmsg ("IP addres not set");
7753 if (MPLS_LABEL_INVALID == local_label)
7755 errmsg ("missing label");
7759 /* Construct the API message */
7760 M (MPLS_IP_BIND_UNBIND, mp);
7762 mp->mb_create_table_if_needed = create_table_if_needed;
7763 mp->mb_is_bind = is_bind;
7764 mp->mb_is_ip4 = is_ip4;
7765 mp->mb_ip_table_id = ntohl (ip_table_id);
7766 mp->mb_mpls_table_id = 0;
7767 mp->mb_label = ntohl (local_label);
7768 mp->mb_address_length = address_length;
7771 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
7773 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
7778 /* Wait for a reply... */
7784 api_proxy_arp_add_del (vat_main_t * vam)
7786 unformat_input_t *i = vam->input;
7787 vl_api_proxy_arp_add_del_t *mp;
7790 ip4_address_t lo, hi;
7794 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7796 if (unformat (i, "vrf %d", &vrf_id))
7798 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
7799 unformat_ip4_address, &hi))
7801 else if (unformat (i, "del"))
7805 clib_warning ("parse error '%U'", format_unformat_error, i);
7812 errmsg ("address range not set");
7816 M (PROXY_ARP_ADD_DEL, mp);
7818 mp->vrf_id = ntohl (vrf_id);
7819 mp->is_add = is_add;
7820 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
7821 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
7829 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
7831 unformat_input_t *i = vam->input;
7832 vl_api_proxy_arp_intfc_enable_disable_t *mp;
7835 u8 sw_if_index_set = 0;
7838 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7840 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7841 sw_if_index_set = 1;
7842 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7843 sw_if_index_set = 1;
7844 else if (unformat (i, "enable"))
7846 else if (unformat (i, "disable"))
7850 clib_warning ("parse error '%U'", format_unformat_error, i);
7855 if (sw_if_index_set == 0)
7857 errmsg ("missing interface name or sw_if_index");
7861 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
7863 mp->sw_if_index = ntohl (sw_if_index);
7864 mp->enable_disable = enable;
7872 api_mpls_tunnel_add_del (vat_main_t * vam)
7874 unformat_input_t *i = vam->input;
7875 vl_api_mpls_tunnel_add_del_t *mp;
7879 u32 sw_if_index = ~0;
7880 u32 next_hop_sw_if_index = ~0;
7881 u32 next_hop_proto_is_ip4 = 1;
7883 u32 next_hop_table_id = 0;
7884 ip4_address_t v4_next_hop_address = {
7887 ip6_address_t v6_next_hop_address = { {0} };
7888 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID, *labels = NULL;
7891 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7893 if (unformat (i, "add"))
7895 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
7897 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
7899 else if (unformat (i, "via %U",
7900 unformat_ip4_address, &v4_next_hop_address))
7902 next_hop_proto_is_ip4 = 1;
7904 else if (unformat (i, "via %U",
7905 unformat_ip6_address, &v6_next_hop_address))
7907 next_hop_proto_is_ip4 = 0;
7909 else if (unformat (i, "l2-only"))
7911 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
7913 else if (unformat (i, "out-label %d", &next_hop_out_label))
7914 vec_add1 (labels, ntohl (next_hop_out_label));
7917 clib_warning ("parse error '%U'", format_unformat_error, i);
7922 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (mpls_label_t) * vec_len (labels));
7924 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
7925 mp->mt_sw_if_index = ntohl (sw_if_index);
7926 mp->mt_is_add = is_add;
7927 mp->mt_l2_only = l2_only;
7928 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
7929 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
7931 mp->mt_next_hop_n_out_labels = vec_len (labels);
7933 if (0 != mp->mt_next_hop_n_out_labels)
7935 clib_memcpy (mp->mt_next_hop_out_label_stack, labels,
7936 sizeof (mpls_label_t) * mp->mt_next_hop_n_out_labels);
7940 if (next_hop_proto_is_ip4)
7942 clib_memcpy (mp->mt_next_hop,
7943 &v4_next_hop_address, sizeof (v4_next_hop_address));
7947 clib_memcpy (mp->mt_next_hop,
7948 &v6_next_hop_address, sizeof (v6_next_hop_address));
7957 api_sw_interface_set_unnumbered (vat_main_t * vam)
7959 unformat_input_t *i = vam->input;
7960 vl_api_sw_interface_set_unnumbered_t *mp;
7962 u32 unnum_sw_index = ~0;
7964 u8 sw_if_index_set = 0;
7967 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7969 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7970 sw_if_index_set = 1;
7971 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7972 sw_if_index_set = 1;
7973 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
7975 else if (unformat (i, "del"))
7979 clib_warning ("parse error '%U'", format_unformat_error, i);
7984 if (sw_if_index_set == 0)
7986 errmsg ("missing interface name or sw_if_index");
7990 M (SW_INTERFACE_SET_UNNUMBERED, mp);
7992 mp->sw_if_index = ntohl (sw_if_index);
7993 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
7994 mp->is_add = is_add;
8002 api_ip_neighbor_add_del (vat_main_t * vam)
8004 unformat_input_t *i = vam->input;
8005 vl_api_ip_neighbor_add_del_t *mp;
8007 u8 sw_if_index_set = 0;
8010 u8 is_no_fib_entry = 0;
8013 u8 v4_address_set = 0;
8014 u8 v6_address_set = 0;
8015 ip4_address_t v4address;
8016 ip6_address_t v6address;
8019 memset (mac_address, 0, sizeof (mac_address));
8021 /* Parse args required to build the message */
8022 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8024 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
8028 else if (unformat (i, "del"))
8031 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8032 sw_if_index_set = 1;
8033 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8034 sw_if_index_set = 1;
8035 else if (unformat (i, "is_static"))
8037 else if (unformat (i, "no-fib-entry"))
8038 is_no_fib_entry = 1;
8039 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
8041 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
8045 clib_warning ("parse error '%U'", format_unformat_error, i);
8050 if (sw_if_index_set == 0)
8052 errmsg ("missing interface name or sw_if_index");
8055 if (v4_address_set && v6_address_set)
8057 errmsg ("both v4 and v6 addresses set");
8060 if (!v4_address_set && !v6_address_set)
8062 errmsg ("no address set");
8066 /* Construct the API message */
8067 M (IP_NEIGHBOR_ADD_DEL, mp);
8069 mp->sw_if_index = ntohl (sw_if_index);
8070 mp->is_add = is_add;
8071 mp->is_static = is_static;
8072 mp->is_no_adj_fib = is_no_fib_entry;
8074 clib_memcpy (mp->mac_address, mac_address, 6);
8078 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
8082 /* mp->is_ipv6 = 0; via memset in M macro above */
8083 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
8089 /* Wait for a reply, return good/bad news */
8095 api_reset_vrf (vat_main_t * vam)
8097 unformat_input_t *i = vam->input;
8098 vl_api_reset_vrf_t *mp;
8104 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8106 if (unformat (i, "vrf %d", &vrf_id))
8108 else if (unformat (i, "ipv6"))
8112 clib_warning ("parse error '%U'", format_unformat_error, i);
8117 if (vrf_id_set == 0)
8119 errmsg ("missing vrf id");
8125 mp->vrf_id = ntohl (vrf_id);
8126 mp->is_ipv6 = is_ipv6;
8134 api_create_vlan_subif (vat_main_t * vam)
8136 unformat_input_t *i = vam->input;
8137 vl_api_create_vlan_subif_t *mp;
8139 u8 sw_if_index_set = 0;
8144 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8146 if (unformat (i, "sw_if_index %d", &sw_if_index))
8147 sw_if_index_set = 1;
8149 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8150 sw_if_index_set = 1;
8151 else if (unformat (i, "vlan %d", &vlan_id))
8155 clib_warning ("parse error '%U'", format_unformat_error, i);
8160 if (sw_if_index_set == 0)
8162 errmsg ("missing interface name or sw_if_index");
8166 if (vlan_id_set == 0)
8168 errmsg ("missing vlan_id");
8171 M (CREATE_VLAN_SUBIF, mp);
8173 mp->sw_if_index = ntohl (sw_if_index);
8174 mp->vlan_id = ntohl (vlan_id);
8181 #define foreach_create_subif_bit \
8188 _(outer_vlan_id_any) \
8189 _(inner_vlan_id_any)
8192 api_create_subif (vat_main_t * vam)
8194 unformat_input_t *i = vam->input;
8195 vl_api_create_subif_t *mp;
8197 u8 sw_if_index_set = 0;
8204 u32 exact_match = 0;
8205 u32 default_sub = 0;
8206 u32 outer_vlan_id_any = 0;
8207 u32 inner_vlan_id_any = 0;
8209 u16 outer_vlan_id = 0;
8210 u16 inner_vlan_id = 0;
8213 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8215 if (unformat (i, "sw_if_index %d", &sw_if_index))
8216 sw_if_index_set = 1;
8218 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8219 sw_if_index_set = 1;
8220 else if (unformat (i, "sub_id %d", &sub_id))
8222 else if (unformat (i, "outer_vlan_id %d", &tmp))
8223 outer_vlan_id = tmp;
8224 else if (unformat (i, "inner_vlan_id %d", &tmp))
8225 inner_vlan_id = tmp;
8227 #define _(a) else if (unformat (i, #a)) a = 1 ;
8228 foreach_create_subif_bit
8232 clib_warning ("parse error '%U'", format_unformat_error, i);
8237 if (sw_if_index_set == 0)
8239 errmsg ("missing interface name or sw_if_index");
8243 if (sub_id_set == 0)
8245 errmsg ("missing sub_id");
8248 M (CREATE_SUBIF, mp);
8250 mp->sw_if_index = ntohl (sw_if_index);
8251 mp->sub_id = ntohl (sub_id);
8253 #define _(a) mp->a = a;
8254 foreach_create_subif_bit;
8257 mp->outer_vlan_id = ntohs (outer_vlan_id);
8258 mp->inner_vlan_id = ntohs (inner_vlan_id);
8266 api_oam_add_del (vat_main_t * vam)
8268 unformat_input_t *i = vam->input;
8269 vl_api_oam_add_del_t *mp;
8272 ip4_address_t src, dst;
8277 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8279 if (unformat (i, "vrf %d", &vrf_id))
8281 else if (unformat (i, "src %U", unformat_ip4_address, &src))
8283 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
8285 else if (unformat (i, "del"))
8289 clib_warning ("parse error '%U'", format_unformat_error, i);
8296 errmsg ("missing src addr");
8302 errmsg ("missing dst addr");
8306 M (OAM_ADD_DEL, mp);
8308 mp->vrf_id = ntohl (vrf_id);
8309 mp->is_add = is_add;
8310 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
8311 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
8319 api_reset_fib (vat_main_t * vam)
8321 unformat_input_t *i = vam->input;
8322 vl_api_reset_fib_t *mp;
8328 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8330 if (unformat (i, "vrf %d", &vrf_id))
8332 else if (unformat (i, "ipv6"))
8336 clib_warning ("parse error '%U'", format_unformat_error, i);
8341 if (vrf_id_set == 0)
8343 errmsg ("missing vrf id");
8349 mp->vrf_id = ntohl (vrf_id);
8350 mp->is_ipv6 = is_ipv6;
8358 api_dhcp_proxy_config (vat_main_t * vam)
8360 unformat_input_t *i = vam->input;
8361 vl_api_dhcp_proxy_config_t *mp;
8363 u32 server_vrf_id = 0;
8365 u8 v4_address_set = 0;
8366 u8 v6_address_set = 0;
8367 ip4_address_t v4address;
8368 ip6_address_t v6address;
8369 u8 v4_src_address_set = 0;
8370 u8 v6_src_address_set = 0;
8371 ip4_address_t v4srcaddress;
8372 ip6_address_t v6srcaddress;
8375 /* Parse args required to build the message */
8376 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8378 if (unformat (i, "del"))
8380 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
8382 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
8384 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
8386 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
8388 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
8389 v4_src_address_set = 1;
8390 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
8391 v6_src_address_set = 1;
8396 if (v4_address_set && v6_address_set)
8398 errmsg ("both v4 and v6 server addresses set");
8401 if (!v4_address_set && !v6_address_set)
8403 errmsg ("no server addresses set");
8407 if (v4_src_address_set && v6_src_address_set)
8409 errmsg ("both v4 and v6 src addresses set");
8412 if (!v4_src_address_set && !v6_src_address_set)
8414 errmsg ("no src addresses set");
8418 if (!(v4_src_address_set && v4_address_set) &&
8419 !(v6_src_address_set && v6_address_set))
8421 errmsg ("no matching server and src addresses set");
8425 /* Construct the API message */
8426 M (DHCP_PROXY_CONFIG, mp);
8428 mp->is_add = is_add;
8429 mp->rx_vrf_id = ntohl (rx_vrf_id);
8430 mp->server_vrf_id = ntohl (server_vrf_id);
8434 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
8435 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
8439 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
8440 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
8446 /* Wait for a reply, return good/bad news */
8451 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
8452 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
8455 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
8457 vat_main_t *vam = &vat_main;
8458 u32 i, count = mp->count;
8459 vl_api_dhcp_server_t *s;
8463 "RX Table-ID %d, Source Address %U, VSS FIB-ID %d, VSS OUI %d",
8464 ntohl (mp->rx_vrf_id),
8465 format_ip6_address, mp->dhcp_src_address,
8466 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
8469 "RX Table-ID %d, Source Address %U, VSS FIB-ID %d, VSS OUI %d",
8470 ntohl (mp->rx_vrf_id),
8471 format_ip4_address, mp->dhcp_src_address,
8472 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
8474 for (i = 0; i < count; i++)
8476 s = &mp->servers[i];
8480 " Server Table-ID %d, Server Address %U",
8481 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
8484 " Server Table-ID %d, Server Address %U",
8485 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
8489 static void vl_api_dhcp_proxy_details_t_handler_json
8490 (vl_api_dhcp_proxy_details_t * mp)
8492 vat_main_t *vam = &vat_main;
8493 vat_json_node_t *node = NULL;
8494 u32 i, count = mp->count;
8496 struct in6_addr ip6;
8497 vl_api_dhcp_server_t *s;
8499 if (VAT_JSON_ARRAY != vam->json_tree.type)
8501 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8502 vat_json_init_array (&vam->json_tree);
8504 node = vat_json_array_add (&vam->json_tree);
8506 vat_json_init_object (node);
8507 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
8508 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
8509 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
8513 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
8514 vat_json_object_add_ip6 (node, "src_address", ip6);
8518 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
8519 vat_json_object_add_ip4 (node, "src_address", ip4);
8522 for (i = 0; i < count; i++)
8524 s = &mp->servers[i];
8526 vat_json_object_add_uint (node, "server-table-id",
8527 ntohl (s->server_vrf_id));
8531 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
8532 vat_json_object_add_ip4 (node, "src_address", ip4);
8536 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
8537 vat_json_object_add_ip6 (node, "server_address", ip6);
8543 api_dhcp_proxy_dump (vat_main_t * vam)
8545 unformat_input_t *i = vam->input;
8546 vl_api_control_ping_t *mp_ping;
8547 vl_api_dhcp_proxy_dump_t *mp;
8551 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8553 if (unformat (i, "ipv6"))
8557 clib_warning ("parse error '%U'", format_unformat_error, i);
8562 M (DHCP_PROXY_DUMP, mp);
8564 mp->is_ip6 = is_ipv6;
8567 /* Use a control ping for synchronization */
8568 M (CONTROL_PING, mp_ping);
8576 api_dhcp_proxy_set_vss (vat_main_t * vam)
8578 unformat_input_t *i = vam->input;
8579 vl_api_dhcp_proxy_set_vss_t *mp;
8590 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8592 if (unformat (i, "tbl_id %d", &tbl_id))
8594 if (unformat (i, "fib_id %d", &fib_id))
8596 if (unformat (i, "oui %d", &oui))
8598 else if (unformat (i, "ipv6"))
8600 else if (unformat (i, "del"))
8604 clib_warning ("parse error '%U'", format_unformat_error, i);
8609 if (tbl_id_set == 0)
8611 errmsg ("missing tbl id");
8615 if (fib_id_set == 0)
8617 errmsg ("missing fib id");
8622 errmsg ("missing oui");
8626 M (DHCP_PROXY_SET_VSS, mp);
8627 mp->tbl_id = ntohl (tbl_id);
8628 mp->fib_id = ntohl (fib_id);
8629 mp->oui = ntohl (oui);
8630 mp->is_ipv6 = is_ipv6;
8631 mp->is_add = is_add;
8639 api_dhcp_client_config (vat_main_t * vam)
8641 unformat_input_t *i = vam->input;
8642 vl_api_dhcp_client_config_t *mp;
8644 u8 sw_if_index_set = 0;
8647 u8 disable_event = 0;
8650 /* Parse args required to build the message */
8651 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8653 if (unformat (i, "del"))
8656 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8657 sw_if_index_set = 1;
8658 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8659 sw_if_index_set = 1;
8660 else if (unformat (i, "hostname %s", &hostname))
8662 else if (unformat (i, "disable_event"))
8668 if (sw_if_index_set == 0)
8670 errmsg ("missing interface name or sw_if_index");
8674 if (vec_len (hostname) > 63)
8676 errmsg ("hostname too long");
8678 vec_add1 (hostname, 0);
8680 /* Construct the API message */
8681 M (DHCP_CLIENT_CONFIG, mp);
8683 mp->sw_if_index = htonl (sw_if_index);
8684 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
8685 vec_free (hostname);
8686 mp->is_add = is_add;
8687 mp->want_dhcp_event = disable_event ? 0 : 1;
8688 mp->pid = htonl (getpid ());
8693 /* Wait for a reply, return good/bad news */
8699 api_set_ip_flow_hash (vat_main_t * vam)
8701 unformat_input_t *i = vam->input;
8702 vl_api_set_ip_flow_hash_t *mp;
8714 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8716 if (unformat (i, "vrf %d", &vrf_id))
8718 else if (unformat (i, "ipv6"))
8720 else if (unformat (i, "src"))
8722 else if (unformat (i, "dst"))
8724 else if (unformat (i, "sport"))
8726 else if (unformat (i, "dport"))
8728 else if (unformat (i, "proto"))
8730 else if (unformat (i, "reverse"))
8735 clib_warning ("parse error '%U'", format_unformat_error, i);
8740 if (vrf_id_set == 0)
8742 errmsg ("missing vrf id");
8746 M (SET_IP_FLOW_HASH, mp);
8752 mp->reverse = reverse;
8753 mp->vrf_id = ntohl (vrf_id);
8754 mp->is_ipv6 = is_ipv6;
8762 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
8764 unformat_input_t *i = vam->input;
8765 vl_api_sw_interface_ip6_enable_disable_t *mp;
8767 u8 sw_if_index_set = 0;
8771 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8773 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8774 sw_if_index_set = 1;
8775 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8776 sw_if_index_set = 1;
8777 else if (unformat (i, "enable"))
8779 else if (unformat (i, "disable"))
8783 clib_warning ("parse error '%U'", format_unformat_error, i);
8788 if (sw_if_index_set == 0)
8790 errmsg ("missing interface name or sw_if_index");
8794 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
8796 mp->sw_if_index = ntohl (sw_if_index);
8797 mp->enable = enable;
8805 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
8807 unformat_input_t *i = vam->input;
8808 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
8810 u8 sw_if_index_set = 0;
8811 u8 v6_address_set = 0;
8812 ip6_address_t v6address;
8815 /* Parse args required to build the message */
8816 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8818 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8819 sw_if_index_set = 1;
8820 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8821 sw_if_index_set = 1;
8822 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
8828 if (sw_if_index_set == 0)
8830 errmsg ("missing interface name or sw_if_index");
8833 if (!v6_address_set)
8835 errmsg ("no address set");
8839 /* Construct the API message */
8840 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, mp);
8842 mp->sw_if_index = ntohl (sw_if_index);
8843 clib_memcpy (mp->address, &v6address, sizeof (v6address));
8848 /* Wait for a reply, return good/bad news */
8854 api_ip6nd_proxy_add_del (vat_main_t * vam)
8856 unformat_input_t *i = vam->input;
8857 vl_api_ip6nd_proxy_add_del_t *mp;
8858 u32 sw_if_index = ~0;
8859 u8 v6_address_set = 0;
8860 ip6_address_t v6address;
8864 /* Parse args required to build the message */
8865 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8867 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8869 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8871 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
8873 if (unformat (i, "del"))
8877 clib_warning ("parse error '%U'", format_unformat_error, i);
8882 if (sw_if_index == ~0)
8884 errmsg ("missing interface name or sw_if_index");
8887 if (!v6_address_set)
8889 errmsg ("no address set");
8893 /* Construct the API message */
8894 M (IP6ND_PROXY_ADD_DEL, mp);
8896 mp->is_del = is_del;
8897 mp->sw_if_index = ntohl (sw_if_index);
8898 clib_memcpy (mp->address, &v6address, sizeof (v6address));
8903 /* Wait for a reply, return good/bad news */
8909 api_ip6nd_proxy_dump (vat_main_t * vam)
8911 vl_api_ip6nd_proxy_dump_t *mp;
8912 vl_api_control_ping_t *mp_ping;
8915 M (IP6ND_PROXY_DUMP, mp);
8919 /* Use a control ping for synchronization */
8920 M (CONTROL_PING, mp_ping);
8927 static void vl_api_ip6nd_proxy_details_t_handler
8928 (vl_api_ip6nd_proxy_details_t * mp)
8930 vat_main_t *vam = &vat_main;
8932 print (vam->ofp, "host %U sw_if_index %d",
8933 format_ip6_address, mp->address, ntohl (mp->sw_if_index));
8936 static void vl_api_ip6nd_proxy_details_t_handler_json
8937 (vl_api_ip6nd_proxy_details_t * mp)
8939 vat_main_t *vam = &vat_main;
8940 struct in6_addr ip6;
8941 vat_json_node_t *node = NULL;
8943 if (VAT_JSON_ARRAY != vam->json_tree.type)
8945 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8946 vat_json_init_array (&vam->json_tree);
8948 node = vat_json_array_add (&vam->json_tree);
8950 vat_json_init_object (node);
8951 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
8953 clib_memcpy (&ip6, mp->address, sizeof (ip6));
8954 vat_json_object_add_ip6 (node, "host", ip6);
8958 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
8960 unformat_input_t *i = vam->input;
8961 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
8963 u8 sw_if_index_set = 0;
8964 u32 address_length = 0;
8965 u8 v6_address_set = 0;
8966 ip6_address_t v6address;
8968 u8 no_advertise = 0;
8970 u8 no_autoconfig = 0;
8973 u32 val_lifetime = 0;
8974 u32 pref_lifetime = 0;
8977 /* Parse args required to build the message */
8978 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8980 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8981 sw_if_index_set = 1;
8982 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8983 sw_if_index_set = 1;
8984 else if (unformat (i, "%U/%d",
8985 unformat_ip6_address, &v6address, &address_length))
8987 else if (unformat (i, "val_life %d", &val_lifetime))
8989 else if (unformat (i, "pref_life %d", &pref_lifetime))
8991 else if (unformat (i, "def"))
8993 else if (unformat (i, "noadv"))
8995 else if (unformat (i, "offl"))
8997 else if (unformat (i, "noauto"))
8999 else if (unformat (i, "nolink"))
9001 else if (unformat (i, "isno"))
9005 clib_warning ("parse error '%U'", format_unformat_error, i);
9010 if (sw_if_index_set == 0)
9012 errmsg ("missing interface name or sw_if_index");
9015 if (!v6_address_set)
9017 errmsg ("no address set");
9021 /* Construct the API message */
9022 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
9024 mp->sw_if_index = ntohl (sw_if_index);
9025 clib_memcpy (mp->address, &v6address, sizeof (v6address));
9026 mp->address_length = address_length;
9027 mp->use_default = use_default;
9028 mp->no_advertise = no_advertise;
9029 mp->off_link = off_link;
9030 mp->no_autoconfig = no_autoconfig;
9031 mp->no_onlink = no_onlink;
9033 mp->val_lifetime = ntohl (val_lifetime);
9034 mp->pref_lifetime = ntohl (pref_lifetime);
9039 /* Wait for a reply, return good/bad news */
9045 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
9047 unformat_input_t *i = vam->input;
9048 vl_api_sw_interface_ip6nd_ra_config_t *mp;
9050 u8 sw_if_index_set = 0;
9055 u8 send_unicast = 0;
9058 u8 default_router = 0;
9059 u32 max_interval = 0;
9060 u32 min_interval = 0;
9062 u32 initial_count = 0;
9063 u32 initial_interval = 0;
9067 /* Parse args required to build the message */
9068 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9070 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9071 sw_if_index_set = 1;
9072 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9073 sw_if_index_set = 1;
9074 else if (unformat (i, "maxint %d", &max_interval))
9076 else if (unformat (i, "minint %d", &min_interval))
9078 else if (unformat (i, "life %d", &lifetime))
9080 else if (unformat (i, "count %d", &initial_count))
9082 else if (unformat (i, "interval %d", &initial_interval))
9084 else if (unformat (i, "suppress") || unformat (i, "surpress"))
9086 else if (unformat (i, "managed"))
9088 else if (unformat (i, "other"))
9090 else if (unformat (i, "ll"))
9092 else if (unformat (i, "send"))
9094 else if (unformat (i, "cease"))
9096 else if (unformat (i, "isno"))
9098 else if (unformat (i, "def"))
9102 clib_warning ("parse error '%U'", format_unformat_error, i);
9107 if (sw_if_index_set == 0)
9109 errmsg ("missing interface name or sw_if_index");
9113 /* Construct the API message */
9114 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
9116 mp->sw_if_index = ntohl (sw_if_index);
9117 mp->max_interval = ntohl (max_interval);
9118 mp->min_interval = ntohl (min_interval);
9119 mp->lifetime = ntohl (lifetime);
9120 mp->initial_count = ntohl (initial_count);
9121 mp->initial_interval = ntohl (initial_interval);
9122 mp->suppress = suppress;
9123 mp->managed = managed;
9125 mp->ll_option = ll_option;
9126 mp->send_unicast = send_unicast;
9129 mp->default_router = default_router;
9134 /* Wait for a reply, return good/bad news */
9140 api_set_arp_neighbor_limit (vat_main_t * vam)
9142 unformat_input_t *i = vam->input;
9143 vl_api_set_arp_neighbor_limit_t *mp;
9149 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9151 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
9153 else if (unformat (i, "ipv6"))
9157 clib_warning ("parse error '%U'", format_unformat_error, i);
9164 errmsg ("missing limit value");
9168 M (SET_ARP_NEIGHBOR_LIMIT, mp);
9170 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
9171 mp->is_ipv6 = is_ipv6;
9179 api_l2_patch_add_del (vat_main_t * vam)
9181 unformat_input_t *i = vam->input;
9182 vl_api_l2_patch_add_del_t *mp;
9184 u8 rx_sw_if_index_set = 0;
9186 u8 tx_sw_if_index_set = 0;
9190 /* Parse args required to build the message */
9191 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9193 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
9194 rx_sw_if_index_set = 1;
9195 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
9196 tx_sw_if_index_set = 1;
9197 else if (unformat (i, "rx"))
9199 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9201 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
9203 rx_sw_if_index_set = 1;
9208 else if (unformat (i, "tx"))
9210 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9212 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
9214 tx_sw_if_index_set = 1;
9219 else if (unformat (i, "del"))
9225 if (rx_sw_if_index_set == 0)
9227 errmsg ("missing rx interface name or rx_sw_if_index");
9231 if (tx_sw_if_index_set == 0)
9233 errmsg ("missing tx interface name or tx_sw_if_index");
9237 M (L2_PATCH_ADD_DEL, mp);
9239 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
9240 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
9241 mp->is_add = is_add;
9249 u8 localsid_addr[16];
9258 api_sr_localsid_add_del (vat_main_t * vam)
9260 unformat_input_t *i = vam->input;
9261 vl_api_sr_localsid_add_del_t *mp;
9264 ip6_address_t localsid;
9268 u32 fib_table = ~(u32) 0;
9269 ip6_address_t next_hop;
9271 bool nexthop_set = 0;
9275 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9277 if (unformat (i, "del"))
9279 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
9280 else if (unformat (i, "next-hop %U", unformat_ip6_address, &next_hop))
9282 else if (unformat (i, "behavior %u", &behavior));
9283 else if (unformat (i, "sw_if_index %u", &sw_if_index));
9284 else if (unformat (i, "fib-table %u", &fib_table));
9285 else if (unformat (i, "end.psp %u", &behavior));
9290 M (SR_LOCALSID_ADD_DEL, mp);
9292 clib_memcpy (mp->localsid_addr, &localsid, sizeof (mp->localsid_addr));
9294 clib_memcpy (mp->nh_addr, &next_hop, sizeof (mp->nh_addr));
9295 mp->behavior = behavior;
9296 mp->sw_if_index = ntohl (sw_if_index);
9297 mp->fib_table = ntohl (fib_table);
9298 mp->end_psp = end_psp;
9299 mp->is_del = is_del;
9307 api_ioam_enable (vat_main_t * vam)
9309 unformat_input_t *input = vam->input;
9310 vl_api_ioam_enable_t *mp;
9312 int has_trace_option = 0;
9313 int has_pot_option = 0;
9314 int has_seqno_option = 0;
9315 int has_analyse_option = 0;
9318 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9320 if (unformat (input, "trace"))
9321 has_trace_option = 1;
9322 else if (unformat (input, "pot"))
9324 else if (unformat (input, "seqno"))
9325 has_seqno_option = 1;
9326 else if (unformat (input, "analyse"))
9327 has_analyse_option = 1;
9331 M (IOAM_ENABLE, mp);
9332 mp->id = htons (id);
9333 mp->seqno = has_seqno_option;
9334 mp->analyse = has_analyse_option;
9335 mp->pot_enable = has_pot_option;
9336 mp->trace_enable = has_trace_option;
9345 api_ioam_disable (vat_main_t * vam)
9347 vl_api_ioam_disable_t *mp;
9350 M (IOAM_DISABLE, mp);
9356 #define foreach_tcp_proto_field \
9360 #define foreach_udp_proto_field \
9364 #define foreach_ip4_proto_field \
9376 u16 src_port, dst_port;
9379 #if VPP_API_TEST_BUILTIN == 0
9381 unformat_tcp_mask (unformat_input_t * input, va_list * args)
9383 u8 **maskp = va_arg (*args, u8 **);
9385 u8 found_something = 0;
9388 #define _(a) u8 a=0;
9389 foreach_tcp_proto_field;
9392 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9395 #define _(a) else if (unformat (input, #a)) a=1;
9396 foreach_tcp_proto_field
9402 #define _(a) found_something += a;
9403 foreach_tcp_proto_field;
9406 if (found_something == 0)
9409 vec_validate (mask, sizeof (*tcp) - 1);
9411 tcp = (tcp_header_t *) mask;
9413 #define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
9414 foreach_tcp_proto_field;
9422 unformat_udp_mask (unformat_input_t * input, va_list * args)
9424 u8 **maskp = va_arg (*args, u8 **);
9426 u8 found_something = 0;
9429 #define _(a) u8 a=0;
9430 foreach_udp_proto_field;
9433 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9436 #define _(a) else if (unformat (input, #a)) a=1;
9437 foreach_udp_proto_field
9443 #define _(a) found_something += a;
9444 foreach_udp_proto_field;
9447 if (found_something == 0)
9450 vec_validate (mask, sizeof (*udp) - 1);
9452 udp = (udp_header_t *) mask;
9454 #define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
9455 foreach_udp_proto_field;
9463 unformat_l4_mask (unformat_input_t * input, va_list * args)
9465 u8 **maskp = va_arg (*args, u8 **);
9466 u16 src_port = 0, dst_port = 0;
9467 tcpudp_header_t *tcpudp;
9469 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9471 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
9473 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
9475 else if (unformat (input, "src_port"))
9477 else if (unformat (input, "dst_port"))
9483 if (!src_port && !dst_port)
9487 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
9489 tcpudp = (tcpudp_header_t *) mask;
9490 tcpudp->src_port = src_port;
9491 tcpudp->dst_port = dst_port;
9499 unformat_ip4_mask (unformat_input_t * input, va_list * args)
9501 u8 **maskp = va_arg (*args, u8 **);
9503 u8 found_something = 0;
9506 #define _(a) u8 a=0;
9507 foreach_ip4_proto_field;
9513 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9515 if (unformat (input, "version"))
9517 else if (unformat (input, "hdr_length"))
9519 else if (unformat (input, "src"))
9521 else if (unformat (input, "dst"))
9523 else if (unformat (input, "proto"))
9526 #define _(a) else if (unformat (input, #a)) a=1;
9527 foreach_ip4_proto_field
9533 #define _(a) found_something += a;
9534 foreach_ip4_proto_field;
9537 if (found_something == 0)
9540 vec_validate (mask, sizeof (*ip) - 1);
9542 ip = (ip4_header_t *) mask;
9544 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
9545 foreach_ip4_proto_field;
9548 ip->ip_version_and_header_length = 0;
9551 ip->ip_version_and_header_length |= 0xF0;
9554 ip->ip_version_and_header_length |= 0x0F;
9560 #define foreach_ip6_proto_field \
9568 unformat_ip6_mask (unformat_input_t * input, va_list * args)
9570 u8 **maskp = va_arg (*args, u8 **);
9572 u8 found_something = 0;
9574 u32 ip_version_traffic_class_and_flow_label;
9576 #define _(a) u8 a=0;
9577 foreach_ip6_proto_field;
9580 u8 traffic_class = 0;
9583 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9585 if (unformat (input, "version"))
9587 else if (unformat (input, "traffic-class"))
9589 else if (unformat (input, "flow-label"))
9591 else if (unformat (input, "src"))
9593 else if (unformat (input, "dst"))
9595 else if (unformat (input, "proto"))
9598 #define _(a) else if (unformat (input, #a)) a=1;
9599 foreach_ip6_proto_field
9605 #define _(a) found_something += a;
9606 foreach_ip6_proto_field;
9609 if (found_something == 0)
9612 vec_validate (mask, sizeof (*ip) - 1);
9614 ip = (ip6_header_t *) mask;
9616 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
9617 foreach_ip6_proto_field;
9620 ip_version_traffic_class_and_flow_label = 0;
9623 ip_version_traffic_class_and_flow_label |= 0xF0000000;
9626 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
9629 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
9631 ip->ip_version_traffic_class_and_flow_label =
9632 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
9639 unformat_l3_mask (unformat_input_t * input, va_list * args)
9641 u8 **maskp = va_arg (*args, u8 **);
9643 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9645 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
9647 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
9656 unformat_l2_mask (unformat_input_t * input, va_list * args)
9658 u8 **maskp = va_arg (*args, u8 **);
9673 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9675 if (unformat (input, "src"))
9677 else if (unformat (input, "dst"))
9679 else if (unformat (input, "proto"))
9681 else if (unformat (input, "tag1"))
9683 else if (unformat (input, "tag2"))
9685 else if (unformat (input, "ignore-tag1"))
9687 else if (unformat (input, "ignore-tag2"))
9689 else if (unformat (input, "cos1"))
9691 else if (unformat (input, "cos2"))
9693 else if (unformat (input, "dot1q"))
9695 else if (unformat (input, "dot1ad"))
9700 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
9701 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
9704 if (tag1 || ignore_tag1 || cos1 || dot1q)
9706 if (tag2 || ignore_tag2 || cos2 || dot1ad)
9709 vec_validate (mask, len - 1);
9712 memset (mask, 0xff, 6);
9715 memset (mask + 6, 0xff, 6);
9719 /* inner vlan tag */
9728 mask[21] = mask[20] = 0xff;
9749 mask[16] = mask[17] = 0xff;
9759 mask[12] = mask[13] = 0xff;
9766 unformat_classify_mask (unformat_input_t * input, va_list * args)
9768 u8 **maskp = va_arg (*args, u8 **);
9769 u32 *skipp = va_arg (*args, u32 *);
9770 u32 *matchp = va_arg (*args, u32 *);
9778 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9780 if (unformat (input, "hex %U", unformat_hex_string, &mask))
9782 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
9784 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
9786 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
9800 if (mask || l2 || l3 || l4)
9804 /* "With a free Ethernet header in every package" */
9806 vec_validate (l2, 13);
9810 vec_append (mask, l3);
9815 vec_append (mask, l4);
9820 /* Scan forward looking for the first significant mask octet */
9821 for (i = 0; i < vec_len (mask); i++)
9825 /* compute (skip, match) params */
9826 *skipp = i / sizeof (u32x4);
9827 vec_delete (mask, *skipp * sizeof (u32x4), 0);
9829 /* Pad mask to an even multiple of the vector size */
9830 while (vec_len (mask) % sizeof (u32x4))
9833 match = vec_len (mask) / sizeof (u32x4);
9835 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
9837 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
9838 if (*tmp || *(tmp + 1))
9843 clib_warning ("BUG: match 0");
9845 _vec_len (mask) = match * sizeof (u32x4);
9855 #endif /* VPP_API_TEST_BUILTIN */
9857 #define foreach_l2_next \
9859 _(ethernet, ETHERNET_INPUT) \
9864 unformat_l2_next_index (unformat_input_t * input, va_list * args)
9866 u32 *miss_next_indexp = va_arg (*args, u32 *);
9871 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
9875 if (unformat (input, "%d", &tmp))
9884 *miss_next_indexp = next_index;
9888 #define foreach_ip_next \
9894 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
9896 u32 *miss_next_indexp = va_arg (*args, u32 *);
9901 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
9905 if (unformat (input, "%d", &tmp))
9914 *miss_next_indexp = next_index;
9918 #define foreach_acl_next \
9922 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
9924 u32 *miss_next_indexp = va_arg (*args, u32 *);
9929 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
9933 if (unformat (input, "permit"))
9938 else if (unformat (input, "%d", &tmp))
9947 *miss_next_indexp = next_index;
9952 unformat_policer_precolor (unformat_input_t * input, va_list * args)
9954 u32 *r = va_arg (*args, u32 *);
9956 if (unformat (input, "conform-color"))
9957 *r = POLICE_CONFORM;
9958 else if (unformat (input, "exceed-color"))
9967 api_classify_add_del_table (vat_main_t * vam)
9969 unformat_input_t *i = vam->input;
9970 vl_api_classify_add_del_table_t *mp;
9977 u32 table_index = ~0;
9978 u32 next_table_index = ~0;
9979 u32 miss_next_index = ~0;
9980 u32 memory_size = 32 << 20;
9982 u32 current_data_flag = 0;
9983 int current_data_offset = 0;
9986 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9988 if (unformat (i, "del"))
9990 else if (unformat (i, "del-chain"))
9995 else if (unformat (i, "buckets %d", &nbuckets))
9997 else if (unformat (i, "memory_size %d", &memory_size))
9999 else if (unformat (i, "skip %d", &skip))
10001 else if (unformat (i, "match %d", &match))
10003 else if (unformat (i, "table %d", &table_index))
10005 else if (unformat (i, "mask %U", unformat_classify_mask,
10006 &mask, &skip, &match))
10008 else if (unformat (i, "next-table %d", &next_table_index))
10010 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
10013 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
10016 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
10019 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
10021 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
10027 if (is_add && mask == 0)
10029 errmsg ("Mask required");
10033 if (is_add && skip == ~0)
10035 errmsg ("skip count required");
10039 if (is_add && match == ~0)
10041 errmsg ("match count required");
10045 if (!is_add && table_index == ~0)
10047 errmsg ("table index required for delete");
10051 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
10053 mp->is_add = is_add;
10054 mp->del_chain = del_chain;
10055 mp->table_index = ntohl (table_index);
10056 mp->nbuckets = ntohl (nbuckets);
10057 mp->memory_size = ntohl (memory_size);
10058 mp->skip_n_vectors = ntohl (skip);
10059 mp->match_n_vectors = ntohl (match);
10060 mp->next_table_index = ntohl (next_table_index);
10061 mp->miss_next_index = ntohl (miss_next_index);
10062 mp->current_data_flag = ntohl (current_data_flag);
10063 mp->current_data_offset = ntohl (current_data_offset);
10064 clib_memcpy (mp->mask, mask, vec_len (mask));
10073 #if VPP_API_TEST_BUILTIN == 0
10075 unformat_l4_match (unformat_input_t * input, va_list * args)
10077 u8 **matchp = va_arg (*args, u8 **);
10079 u8 *proto_header = 0;
10085 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10087 if (unformat (input, "src_port %d", &src_port))
10089 else if (unformat (input, "dst_port %d", &dst_port))
10095 h.src_port = clib_host_to_net_u16 (src_port);
10096 h.dst_port = clib_host_to_net_u16 (dst_port);
10097 vec_validate (proto_header, sizeof (h) - 1);
10098 memcpy (proto_header, &h, sizeof (h));
10100 *matchp = proto_header;
10106 unformat_ip4_match (unformat_input_t * input, va_list * args)
10108 u8 **matchp = va_arg (*args, u8 **);
10113 int hdr_length = 0;
10114 u32 hdr_length_val;
10115 int src = 0, dst = 0;
10116 ip4_address_t src_val, dst_val;
10123 int fragment_id = 0;
10124 u32 fragment_id_val;
10130 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10132 if (unformat (input, "version %d", &version_val))
10134 else if (unformat (input, "hdr_length %d", &hdr_length_val))
10136 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
10138 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
10140 else if (unformat (input, "proto %d", &proto_val))
10142 else if (unformat (input, "tos %d", &tos_val))
10144 else if (unformat (input, "length %d", &length_val))
10146 else if (unformat (input, "fragment_id %d", &fragment_id_val))
10148 else if (unformat (input, "ttl %d", &ttl_val))
10150 else if (unformat (input, "checksum %d", &checksum_val))
10156 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
10157 + ttl + checksum == 0)
10161 * Aligned because we use the real comparison functions
10163 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
10165 ip = (ip4_header_t *) match;
10167 /* These are realistically matched in practice */
10169 ip->src_address.as_u32 = src_val.as_u32;
10172 ip->dst_address.as_u32 = dst_val.as_u32;
10175 ip->protocol = proto_val;
10178 /* These are not, but they're included for completeness */
10180 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
10183 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
10189 ip->length = clib_host_to_net_u16 (length_val);
10195 ip->checksum = clib_host_to_net_u16 (checksum_val);
10202 unformat_ip6_match (unformat_input_t * input, va_list * args)
10204 u8 **matchp = va_arg (*args, u8 **);
10209 u8 traffic_class = 0;
10210 u32 traffic_class_val = 0;
10213 int src = 0, dst = 0;
10214 ip6_address_t src_val, dst_val;
10217 int payload_length = 0;
10218 u32 payload_length_val;
10221 u32 ip_version_traffic_class_and_flow_label;
10223 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10225 if (unformat (input, "version %d", &version_val))
10227 else if (unformat (input, "traffic_class %d", &traffic_class_val))
10229 else if (unformat (input, "flow_label %d", &flow_label_val))
10231 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
10233 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
10235 else if (unformat (input, "proto %d", &proto_val))
10237 else if (unformat (input, "payload_length %d", &payload_length_val))
10238 payload_length = 1;
10239 else if (unformat (input, "hop_limit %d", &hop_limit_val))
10245 if (version + traffic_class + flow_label + src + dst + proto +
10246 payload_length + hop_limit == 0)
10250 * Aligned because we use the real comparison functions
10252 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
10254 ip = (ip6_header_t *) match;
10257 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
10260 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
10263 ip->protocol = proto_val;
10265 ip_version_traffic_class_and_flow_label = 0;
10268 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
10271 ip_version_traffic_class_and_flow_label |=
10272 (traffic_class_val & 0xFF) << 20;
10275 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
10277 ip->ip_version_traffic_class_and_flow_label =
10278 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
10280 if (payload_length)
10281 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
10284 ip->hop_limit = hop_limit_val;
10291 unformat_l3_match (unformat_input_t * input, va_list * args)
10293 u8 **matchp = va_arg (*args, u8 **);
10295 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10297 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
10299 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
10308 unformat_vlan_tag (unformat_input_t * input, va_list * args)
10310 u8 *tagp = va_arg (*args, u8 *);
10313 if (unformat (input, "%d", &tag))
10315 tagp[0] = (tag >> 8) & 0x0F;
10316 tagp[1] = tag & 0xFF;
10324 unformat_l2_match (unformat_input_t * input, va_list * args)
10326 u8 **matchp = va_arg (*args, u8 **);
10339 u8 ignore_tag1 = 0;
10340 u8 ignore_tag2 = 0;
10346 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10348 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
10351 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
10353 else if (unformat (input, "proto %U",
10354 unformat_ethernet_type_host_byte_order, &proto_val))
10356 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
10358 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
10360 else if (unformat (input, "ignore-tag1"))
10362 else if (unformat (input, "ignore-tag2"))
10364 else if (unformat (input, "cos1 %d", &cos1_val))
10366 else if (unformat (input, "cos2 %d", &cos2_val))
10371 if ((src + dst + proto + tag1 + tag2 +
10372 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
10375 if (tag1 || ignore_tag1 || cos1)
10377 if (tag2 || ignore_tag2 || cos2)
10380 vec_validate_aligned (match, len - 1, sizeof (u32x4));
10383 clib_memcpy (match, dst_val, 6);
10386 clib_memcpy (match + 6, src_val, 6);
10390 /* inner vlan tag */
10391 match[19] = tag2_val[1];
10392 match[18] = tag2_val[0];
10394 match[18] |= (cos2_val & 0x7) << 5;
10397 match[21] = proto_val & 0xff;
10398 match[20] = proto_val >> 8;
10402 match[15] = tag1_val[1];
10403 match[14] = tag1_val[0];
10406 match[14] |= (cos1_val & 0x7) << 5;
10412 match[15] = tag1_val[1];
10413 match[14] = tag1_val[0];
10416 match[17] = proto_val & 0xff;
10417 match[16] = proto_val >> 8;
10420 match[14] |= (cos1_val & 0x7) << 5;
10426 match[18] |= (cos2_val & 0x7) << 5;
10428 match[14] |= (cos1_val & 0x7) << 5;
10431 match[13] = proto_val & 0xff;
10432 match[12] = proto_val >> 8;
10441 api_unformat_classify_match (unformat_input_t * input, va_list * args)
10443 u8 **matchp = va_arg (*args, u8 **);
10444 u32 skip_n_vectors = va_arg (*args, u32);
10445 u32 match_n_vectors = va_arg (*args, u32);
10452 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10454 if (unformat (input, "hex %U", unformat_hex_string, &match))
10456 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
10458 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
10460 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
10474 if (match || l2 || l3 || l4)
10476 if (l2 || l3 || l4)
10478 /* "Win a free Ethernet header in every packet" */
10480 vec_validate_aligned (l2, 13, sizeof (u32x4));
10484 vec_append_aligned (match, l3, sizeof (u32x4));
10489 vec_append_aligned (match, l4, sizeof (u32x4));
10494 /* Make sure the vector is big enough even if key is all 0's */
10495 vec_validate_aligned
10496 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
10499 /* Set size, include skipped vectors */
10500 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
10511 api_classify_add_del_session (vat_main_t * vam)
10513 unformat_input_t *i = vam->input;
10514 vl_api_classify_add_del_session_t *mp;
10516 u32 table_index = ~0;
10517 u32 hit_next_index = ~0;
10518 u32 opaque_index = ~0;
10521 u32 skip_n_vectors = 0;
10522 u32 match_n_vectors = 0;
10528 * Warning: you have to supply skip_n and match_n
10529 * because the API client cant simply look at the classify
10533 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10535 if (unformat (i, "del"))
10537 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
10540 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
10543 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
10546 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
10548 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
10550 else if (unformat (i, "opaque-index %d", &opaque_index))
10552 else if (unformat (i, "skip_n %d", &skip_n_vectors))
10554 else if (unformat (i, "match_n %d", &match_n_vectors))
10556 else if (unformat (i, "match %U", api_unformat_classify_match,
10557 &match, skip_n_vectors, match_n_vectors))
10559 else if (unformat (i, "advance %d", &advance))
10561 else if (unformat (i, "table-index %d", &table_index))
10563 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
10565 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
10567 else if (unformat (i, "action %d", &action))
10569 else if (unformat (i, "metadata %d", &metadata))
10575 if (table_index == ~0)
10577 errmsg ("Table index required");
10581 if (is_add && match == 0)
10583 errmsg ("Match value required");
10587 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
10589 mp->is_add = is_add;
10590 mp->table_index = ntohl (table_index);
10591 mp->hit_next_index = ntohl (hit_next_index);
10592 mp->opaque_index = ntohl (opaque_index);
10593 mp->advance = ntohl (advance);
10594 mp->action = action;
10595 mp->metadata = ntohl (metadata);
10596 clib_memcpy (mp->match, match, vec_len (match));
10605 api_classify_set_interface_ip_table (vat_main_t * vam)
10607 unformat_input_t *i = vam->input;
10608 vl_api_classify_set_interface_ip_table_t *mp;
10610 int sw_if_index_set;
10611 u32 table_index = ~0;
10615 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10617 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10618 sw_if_index_set = 1;
10619 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10620 sw_if_index_set = 1;
10621 else if (unformat (i, "table %d", &table_index))
10625 clib_warning ("parse error '%U'", format_unformat_error, i);
10630 if (sw_if_index_set == 0)
10632 errmsg ("missing interface name or sw_if_index");
10637 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
10639 mp->sw_if_index = ntohl (sw_if_index);
10640 mp->table_index = ntohl (table_index);
10641 mp->is_ipv6 = is_ipv6;
10649 api_classify_set_interface_l2_tables (vat_main_t * vam)
10651 unformat_input_t *i = vam->input;
10652 vl_api_classify_set_interface_l2_tables_t *mp;
10654 int sw_if_index_set;
10655 u32 ip4_table_index = ~0;
10656 u32 ip6_table_index = ~0;
10657 u32 other_table_index = ~0;
10661 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10663 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10664 sw_if_index_set = 1;
10665 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10666 sw_if_index_set = 1;
10667 else if (unformat (i, "ip4-table %d", &ip4_table_index))
10669 else if (unformat (i, "ip6-table %d", &ip6_table_index))
10671 else if (unformat (i, "other-table %d", &other_table_index))
10673 else if (unformat (i, "is-input %d", &is_input))
10677 clib_warning ("parse error '%U'", format_unformat_error, i);
10682 if (sw_if_index_set == 0)
10684 errmsg ("missing interface name or sw_if_index");
10689 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
10691 mp->sw_if_index = ntohl (sw_if_index);
10692 mp->ip4_table_index = ntohl (ip4_table_index);
10693 mp->ip6_table_index = ntohl (ip6_table_index);
10694 mp->other_table_index = ntohl (other_table_index);
10695 mp->is_input = (u8) is_input;
10703 api_set_ipfix_exporter (vat_main_t * vam)
10705 unformat_input_t *i = vam->input;
10706 vl_api_set_ipfix_exporter_t *mp;
10707 ip4_address_t collector_address;
10708 u8 collector_address_set = 0;
10709 u32 collector_port = ~0;
10710 ip4_address_t src_address;
10711 u8 src_address_set = 0;
10714 u32 template_interval = ~0;
10715 u8 udp_checksum = 0;
10718 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10720 if (unformat (i, "collector_address %U", unformat_ip4_address,
10721 &collector_address))
10722 collector_address_set = 1;
10723 else if (unformat (i, "collector_port %d", &collector_port))
10725 else if (unformat (i, "src_address %U", unformat_ip4_address,
10727 src_address_set = 1;
10728 else if (unformat (i, "vrf_id %d", &vrf_id))
10730 else if (unformat (i, "path_mtu %d", &path_mtu))
10732 else if (unformat (i, "template_interval %d", &template_interval))
10734 else if (unformat (i, "udp_checksum"))
10740 if (collector_address_set == 0)
10742 errmsg ("collector_address required");
10746 if (src_address_set == 0)
10748 errmsg ("src_address required");
10752 M (SET_IPFIX_EXPORTER, mp);
10754 memcpy (mp->collector_address, collector_address.data,
10755 sizeof (collector_address.data));
10756 mp->collector_port = htons ((u16) collector_port);
10757 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
10758 mp->vrf_id = htonl (vrf_id);
10759 mp->path_mtu = htonl (path_mtu);
10760 mp->template_interval = htonl (template_interval);
10761 mp->udp_checksum = udp_checksum;
10769 api_set_ipfix_classify_stream (vat_main_t * vam)
10771 unformat_input_t *i = vam->input;
10772 vl_api_set_ipfix_classify_stream_t *mp;
10774 u32 src_port = UDP_DST_PORT_ipfix;
10777 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10779 if (unformat (i, "domain %d", &domain_id))
10781 else if (unformat (i, "src_port %d", &src_port))
10785 errmsg ("unknown input `%U'", format_unformat_error, i);
10790 M (SET_IPFIX_CLASSIFY_STREAM, mp);
10792 mp->domain_id = htonl (domain_id);
10793 mp->src_port = htons ((u16) src_port);
10801 api_ipfix_classify_table_add_del (vat_main_t * vam)
10803 unformat_input_t *i = vam->input;
10804 vl_api_ipfix_classify_table_add_del_t *mp;
10806 u32 classify_table_index = ~0;
10808 u8 transport_protocol = 255;
10811 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10813 if (unformat (i, "add"))
10815 else if (unformat (i, "del"))
10817 else if (unformat (i, "table %d", &classify_table_index))
10819 else if (unformat (i, "ip4"))
10821 else if (unformat (i, "ip6"))
10823 else if (unformat (i, "tcp"))
10824 transport_protocol = 6;
10825 else if (unformat (i, "udp"))
10826 transport_protocol = 17;
10829 errmsg ("unknown input `%U'", format_unformat_error, i);
10836 errmsg ("expecting: add|del");
10839 if (classify_table_index == ~0)
10841 errmsg ("classifier table not specified");
10844 if (ip_version == 0)
10846 errmsg ("IP version not specified");
10850 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
10852 mp->is_add = is_add;
10853 mp->table_id = htonl (classify_table_index);
10854 mp->ip_version = ip_version;
10855 mp->transport_protocol = transport_protocol;
10863 api_get_node_index (vat_main_t * vam)
10865 unformat_input_t *i = vam->input;
10866 vl_api_get_node_index_t *mp;
10870 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10872 if (unformat (i, "node %s", &name))
10879 errmsg ("node name required");
10882 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
10884 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
10888 M (GET_NODE_INDEX, mp);
10889 clib_memcpy (mp->node_name, name, vec_len (name));
10898 api_get_next_index (vat_main_t * vam)
10900 unformat_input_t *i = vam->input;
10901 vl_api_get_next_index_t *mp;
10902 u8 *node_name = 0, *next_node_name = 0;
10905 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10907 if (unformat (i, "node-name %s", &node_name))
10909 else if (unformat (i, "next-node-name %s", &next_node_name))
10913 if (node_name == 0)
10915 errmsg ("node name required");
10918 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
10920 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
10924 if (next_node_name == 0)
10926 errmsg ("next node name required");
10929 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
10931 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
10935 M (GET_NEXT_INDEX, mp);
10936 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
10937 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
10938 vec_free (node_name);
10939 vec_free (next_node_name);
10947 api_add_node_next (vat_main_t * vam)
10949 unformat_input_t *i = vam->input;
10950 vl_api_add_node_next_t *mp;
10955 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10957 if (unformat (i, "node %s", &name))
10959 else if (unformat (i, "next %s", &next))
10966 errmsg ("node name required");
10969 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
10971 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
10976 errmsg ("next node required");
10979 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
10981 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
10985 M (ADD_NODE_NEXT, mp);
10986 clib_memcpy (mp->node_name, name, vec_len (name));
10987 clib_memcpy (mp->next_name, next, vec_len (next));
10997 api_l2tpv3_create_tunnel (vat_main_t * vam)
10999 unformat_input_t *i = vam->input;
11000 ip6_address_t client_address, our_address;
11001 int client_address_set = 0;
11002 int our_address_set = 0;
11003 u32 local_session_id = 0;
11004 u32 remote_session_id = 0;
11005 u64 local_cookie = 0;
11006 u64 remote_cookie = 0;
11007 u8 l2_sublayer_present = 0;
11008 vl_api_l2tpv3_create_tunnel_t *mp;
11011 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11013 if (unformat (i, "client_address %U", unformat_ip6_address,
11015 client_address_set = 1;
11016 else if (unformat (i, "our_address %U", unformat_ip6_address,
11018 our_address_set = 1;
11019 else if (unformat (i, "local_session_id %d", &local_session_id))
11021 else if (unformat (i, "remote_session_id %d", &remote_session_id))
11023 else if (unformat (i, "local_cookie %lld", &local_cookie))
11025 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
11027 else if (unformat (i, "l2-sublayer-present"))
11028 l2_sublayer_present = 1;
11033 if (client_address_set == 0)
11035 errmsg ("client_address required");
11039 if (our_address_set == 0)
11041 errmsg ("our_address required");
11045 M (L2TPV3_CREATE_TUNNEL, mp);
11047 clib_memcpy (mp->client_address, client_address.as_u8,
11048 sizeof (mp->client_address));
11050 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
11052 mp->local_session_id = ntohl (local_session_id);
11053 mp->remote_session_id = ntohl (remote_session_id);
11054 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
11055 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
11056 mp->l2_sublayer_present = l2_sublayer_present;
11065 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
11067 unformat_input_t *i = vam->input;
11069 u8 sw_if_index_set = 0;
11070 u64 new_local_cookie = 0;
11071 u64 new_remote_cookie = 0;
11072 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
11075 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11077 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11078 sw_if_index_set = 1;
11079 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11080 sw_if_index_set = 1;
11081 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
11083 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
11089 if (sw_if_index_set == 0)
11091 errmsg ("missing interface name or sw_if_index");
11095 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
11097 mp->sw_if_index = ntohl (sw_if_index);
11098 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
11099 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
11107 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
11109 unformat_input_t *i = vam->input;
11110 vl_api_l2tpv3_interface_enable_disable_t *mp;
11112 u8 sw_if_index_set = 0;
11113 u8 enable_disable = 1;
11116 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11118 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11119 sw_if_index_set = 1;
11120 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11121 sw_if_index_set = 1;
11122 else if (unformat (i, "enable"))
11123 enable_disable = 1;
11124 else if (unformat (i, "disable"))
11125 enable_disable = 0;
11130 if (sw_if_index_set == 0)
11132 errmsg ("missing interface name or sw_if_index");
11136 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
11138 mp->sw_if_index = ntohl (sw_if_index);
11139 mp->enable_disable = enable_disable;
11147 api_l2tpv3_set_lookup_key (vat_main_t * vam)
11149 unformat_input_t *i = vam->input;
11150 vl_api_l2tpv3_set_lookup_key_t *mp;
11154 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11156 if (unformat (i, "lookup_v6_src"))
11157 key = L2T_LOOKUP_SRC_ADDRESS;
11158 else if (unformat (i, "lookup_v6_dst"))
11159 key = L2T_LOOKUP_DST_ADDRESS;
11160 else if (unformat (i, "lookup_session_id"))
11161 key = L2T_LOOKUP_SESSION_ID;
11166 if (key == (u8) ~ 0)
11168 errmsg ("l2tp session lookup key unset");
11172 M (L2TPV3_SET_LOOKUP_KEY, mp);
11181 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
11182 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
11184 vat_main_t *vam = &vat_main;
11186 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
11187 format_ip6_address, mp->our_address,
11188 format_ip6_address, mp->client_address,
11189 clib_net_to_host_u32 (mp->sw_if_index));
11192 " local cookies %016llx %016llx remote cookie %016llx",
11193 clib_net_to_host_u64 (mp->local_cookie[0]),
11194 clib_net_to_host_u64 (mp->local_cookie[1]),
11195 clib_net_to_host_u64 (mp->remote_cookie));
11197 print (vam->ofp, " local session-id %d remote session-id %d",
11198 clib_net_to_host_u32 (mp->local_session_id),
11199 clib_net_to_host_u32 (mp->remote_session_id));
11201 print (vam->ofp, " l2 specific sublayer %s\n",
11202 mp->l2_sublayer_present ? "preset" : "absent");
11206 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
11207 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
11209 vat_main_t *vam = &vat_main;
11210 vat_json_node_t *node = NULL;
11211 struct in6_addr addr;
11213 if (VAT_JSON_ARRAY != vam->json_tree.type)
11215 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11216 vat_json_init_array (&vam->json_tree);
11218 node = vat_json_array_add (&vam->json_tree);
11220 vat_json_init_object (node);
11222 clib_memcpy (&addr, mp->our_address, sizeof (addr));
11223 vat_json_object_add_ip6 (node, "our_address", addr);
11224 clib_memcpy (&addr, mp->client_address, sizeof (addr));
11225 vat_json_object_add_ip6 (node, "client_address", addr);
11227 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
11228 vat_json_init_array (lc);
11229 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
11230 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
11231 vat_json_object_add_uint (node, "remote_cookie",
11232 clib_net_to_host_u64 (mp->remote_cookie));
11234 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
11235 vat_json_object_add_uint (node, "local_session_id",
11236 clib_net_to_host_u32 (mp->local_session_id));
11237 vat_json_object_add_uint (node, "remote_session_id",
11238 clib_net_to_host_u32 (mp->remote_session_id));
11239 vat_json_object_add_string_copy (node, "l2_sublayer",
11240 mp->l2_sublayer_present ? (u8 *) "present"
11241 : (u8 *) "absent");
11245 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
11247 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
11248 vl_api_control_ping_t *mp_ping;
11251 /* Get list of l2tpv3-tunnel interfaces */
11252 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
11255 /* Use a control ping for synchronization */
11256 M (CONTROL_PING, mp_ping);
11264 static void vl_api_sw_interface_tap_details_t_handler
11265 (vl_api_sw_interface_tap_details_t * mp)
11267 vat_main_t *vam = &vat_main;
11269 print (vam->ofp, "%-16s %d",
11270 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
11273 static void vl_api_sw_interface_tap_details_t_handler_json
11274 (vl_api_sw_interface_tap_details_t * mp)
11276 vat_main_t *vam = &vat_main;
11277 vat_json_node_t *node = NULL;
11279 if (VAT_JSON_ARRAY != vam->json_tree.type)
11281 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11282 vat_json_init_array (&vam->json_tree);
11284 node = vat_json_array_add (&vam->json_tree);
11286 vat_json_init_object (node);
11287 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11288 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
11292 api_sw_interface_tap_dump (vat_main_t * vam)
11294 vl_api_sw_interface_tap_dump_t *mp;
11295 vl_api_control_ping_t *mp_ping;
11298 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
11299 /* Get list of tap interfaces */
11300 M (SW_INTERFACE_TAP_DUMP, mp);
11303 /* Use a control ping for synchronization */
11304 M (CONTROL_PING, mp_ping);
11311 static uword unformat_vxlan_decap_next
11312 (unformat_input_t * input, va_list * args)
11314 u32 *result = va_arg (*args, u32 *);
11317 if (unformat (input, "l2"))
11318 *result = VXLAN_INPUT_NEXT_L2_INPUT;
11319 else if (unformat (input, "%d", &tmp))
11327 api_vxlan_add_del_tunnel (vat_main_t * vam)
11329 unformat_input_t *line_input = vam->input;
11330 vl_api_vxlan_add_del_tunnel_t *mp;
11331 ip46_address_t src, dst;
11333 u8 ipv4_set = 0, ipv6_set = 0;
11337 u32 mcast_sw_if_index = ~0;
11338 u32 encap_vrf_id = 0;
11339 u32 decap_next_index = ~0;
11343 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
11344 memset (&src, 0, sizeof src);
11345 memset (&dst, 0, sizeof dst);
11347 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11349 if (unformat (line_input, "del"))
11352 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
11358 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
11364 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
11370 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
11375 else if (unformat (line_input, "group %U %U",
11376 unformat_ip4_address, &dst.ip4,
11377 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
11379 grp_set = dst_set = 1;
11382 else if (unformat (line_input, "group %U",
11383 unformat_ip4_address, &dst.ip4))
11385 grp_set = dst_set = 1;
11388 else if (unformat (line_input, "group %U %U",
11389 unformat_ip6_address, &dst.ip6,
11390 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
11392 grp_set = dst_set = 1;
11395 else if (unformat (line_input, "group %U",
11396 unformat_ip6_address, &dst.ip6))
11398 grp_set = dst_set = 1;
11402 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
11404 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
11406 else if (unformat (line_input, "decap-next %U",
11407 unformat_vxlan_decap_next, &decap_next_index))
11409 else if (unformat (line_input, "vni %d", &vni))
11413 errmsg ("parse error '%U'", format_unformat_error, line_input);
11420 errmsg ("tunnel src address not specified");
11425 errmsg ("tunnel dst address not specified");
11429 if (grp_set && !ip46_address_is_multicast (&dst))
11431 errmsg ("tunnel group address not multicast");
11434 if (grp_set && mcast_sw_if_index == ~0)
11436 errmsg ("tunnel nonexistent multicast device");
11439 if (grp_set == 0 && ip46_address_is_multicast (&dst))
11441 errmsg ("tunnel dst address must be unicast");
11446 if (ipv4_set && ipv6_set)
11448 errmsg ("both IPv4 and IPv6 addresses specified");
11452 if ((vni == 0) || (vni >> 24))
11454 errmsg ("vni not specified or out of range");
11458 M (VXLAN_ADD_DEL_TUNNEL, mp);
11462 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
11463 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
11467 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
11468 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
11470 mp->encap_vrf_id = ntohl (encap_vrf_id);
11471 mp->decap_next_index = ntohl (decap_next_index);
11472 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
11473 mp->vni = ntohl (vni);
11474 mp->is_add = is_add;
11475 mp->is_ipv6 = ipv6_set;
11482 static void vl_api_vxlan_tunnel_details_t_handler
11483 (vl_api_vxlan_tunnel_details_t * mp)
11485 vat_main_t *vam = &vat_main;
11486 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
11487 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
11489 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
11490 ntohl (mp->sw_if_index),
11491 format_ip46_address, &src, IP46_TYPE_ANY,
11492 format_ip46_address, &dst, IP46_TYPE_ANY,
11493 ntohl (mp->encap_vrf_id),
11494 ntohl (mp->decap_next_index), ntohl (mp->vni),
11495 ntohl (mp->mcast_sw_if_index));
11498 static void vl_api_vxlan_tunnel_details_t_handler_json
11499 (vl_api_vxlan_tunnel_details_t * mp)
11501 vat_main_t *vam = &vat_main;
11502 vat_json_node_t *node = NULL;
11504 if (VAT_JSON_ARRAY != vam->json_tree.type)
11506 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11507 vat_json_init_array (&vam->json_tree);
11509 node = vat_json_array_add (&vam->json_tree);
11511 vat_json_init_object (node);
11512 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11515 struct in6_addr ip6;
11517 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
11518 vat_json_object_add_ip6 (node, "src_address", ip6);
11519 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
11520 vat_json_object_add_ip6 (node, "dst_address", ip6);
11524 struct in_addr ip4;
11526 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
11527 vat_json_object_add_ip4 (node, "src_address", ip4);
11528 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
11529 vat_json_object_add_ip4 (node, "dst_address", ip4);
11531 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
11532 vat_json_object_add_uint (node, "decap_next_index",
11533 ntohl (mp->decap_next_index));
11534 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
11535 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
11536 vat_json_object_add_uint (node, "mcast_sw_if_index",
11537 ntohl (mp->mcast_sw_if_index));
11541 api_vxlan_tunnel_dump (vat_main_t * vam)
11543 unformat_input_t *i = vam->input;
11544 vl_api_vxlan_tunnel_dump_t *mp;
11545 vl_api_control_ping_t *mp_ping;
11547 u8 sw_if_index_set = 0;
11550 /* Parse args required to build the message */
11551 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11553 if (unformat (i, "sw_if_index %d", &sw_if_index))
11554 sw_if_index_set = 1;
11559 if (sw_if_index_set == 0)
11564 if (!vam->json_output)
11566 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
11567 "sw_if_index", "src_address", "dst_address",
11568 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
11571 /* Get list of vxlan-tunnel interfaces */
11572 M (VXLAN_TUNNEL_DUMP, mp);
11574 mp->sw_if_index = htonl (sw_if_index);
11578 /* Use a control ping for synchronization */
11579 M (CONTROL_PING, mp_ping);
11587 api_gre_add_del_tunnel (vat_main_t * vam)
11589 unformat_input_t *line_input = vam->input;
11590 vl_api_gre_add_del_tunnel_t *mp;
11591 ip4_address_t src4, dst4;
11592 ip6_address_t src6, dst6;
11599 u32 outer_fib_id = 0;
11602 memset (&src4, 0, sizeof src4);
11603 memset (&dst4, 0, sizeof dst4);
11604 memset (&src6, 0, sizeof src6);
11605 memset (&dst6, 0, sizeof dst6);
11607 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11609 if (unformat (line_input, "del"))
11611 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
11616 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
11621 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
11626 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
11631 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
11633 else if (unformat (line_input, "teb"))
11637 errmsg ("parse error '%U'", format_unformat_error, line_input);
11644 errmsg ("tunnel src address not specified");
11649 errmsg ("tunnel dst address not specified");
11652 if (ipv4_set && ipv6_set)
11654 errmsg ("both IPv4 and IPv6 addresses specified");
11659 M (GRE_ADD_DEL_TUNNEL, mp);
11663 clib_memcpy (&mp->src_address, &src4, 4);
11664 clib_memcpy (&mp->dst_address, &dst4, 4);
11668 clib_memcpy (&mp->src_address, &src6, 16);
11669 clib_memcpy (&mp->dst_address, &dst6, 16);
11671 mp->outer_fib_id = ntohl (outer_fib_id);
11672 mp->is_add = is_add;
11674 mp->is_ipv6 = ipv6_set;
11681 static void vl_api_gre_tunnel_details_t_handler
11682 (vl_api_gre_tunnel_details_t * mp)
11684 vat_main_t *vam = &vat_main;
11685 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
11686 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
11688 print (vam->ofp, "%11d%24U%24U%6d%14d",
11689 ntohl (mp->sw_if_index),
11690 format_ip46_address, &src, IP46_TYPE_ANY,
11691 format_ip46_address, &dst, IP46_TYPE_ANY,
11692 mp->teb, ntohl (mp->outer_fib_id));
11695 static void vl_api_gre_tunnel_details_t_handler_json
11696 (vl_api_gre_tunnel_details_t * mp)
11698 vat_main_t *vam = &vat_main;
11699 vat_json_node_t *node = NULL;
11700 struct in_addr ip4;
11701 struct in6_addr ip6;
11703 if (VAT_JSON_ARRAY != vam->json_tree.type)
11705 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11706 vat_json_init_array (&vam->json_tree);
11708 node = vat_json_array_add (&vam->json_tree);
11710 vat_json_init_object (node);
11711 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11714 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
11715 vat_json_object_add_ip4 (node, "src_address", ip4);
11716 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
11717 vat_json_object_add_ip4 (node, "dst_address", ip4);
11721 clib_memcpy (&ip6, &mp->src_address, sizeof (ip6));
11722 vat_json_object_add_ip6 (node, "src_address", ip6);
11723 clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
11724 vat_json_object_add_ip6 (node, "dst_address", ip6);
11726 vat_json_object_add_uint (node, "teb", mp->teb);
11727 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
11728 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
11732 api_gre_tunnel_dump (vat_main_t * vam)
11734 unformat_input_t *i = vam->input;
11735 vl_api_gre_tunnel_dump_t *mp;
11736 vl_api_control_ping_t *mp_ping;
11738 u8 sw_if_index_set = 0;
11741 /* Parse args required to build the message */
11742 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11744 if (unformat (i, "sw_if_index %d", &sw_if_index))
11745 sw_if_index_set = 1;
11750 if (sw_if_index_set == 0)
11755 if (!vam->json_output)
11757 print (vam->ofp, "%11s%24s%24s%6s%14s",
11758 "sw_if_index", "src_address", "dst_address", "teb",
11762 /* Get list of gre-tunnel interfaces */
11763 M (GRE_TUNNEL_DUMP, mp);
11765 mp->sw_if_index = htonl (sw_if_index);
11769 /* Use a control ping for synchronization */
11770 M (CONTROL_PING, mp_ping);
11778 api_l2_fib_clear_table (vat_main_t * vam)
11780 // unformat_input_t * i = vam->input;
11781 vl_api_l2_fib_clear_table_t *mp;
11784 M (L2_FIB_CLEAR_TABLE, mp);
11792 api_l2_interface_efp_filter (vat_main_t * vam)
11794 unformat_input_t *i = vam->input;
11795 vl_api_l2_interface_efp_filter_t *mp;
11798 u8 sw_if_index_set = 0;
11801 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11803 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11804 sw_if_index_set = 1;
11805 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11806 sw_if_index_set = 1;
11807 else if (unformat (i, "enable"))
11809 else if (unformat (i, "disable"))
11813 clib_warning ("parse error '%U'", format_unformat_error, i);
11818 if (sw_if_index_set == 0)
11820 errmsg ("missing sw_if_index");
11824 M (L2_INTERFACE_EFP_FILTER, mp);
11826 mp->sw_if_index = ntohl (sw_if_index);
11827 mp->enable_disable = enable;
11834 #define foreach_vtr_op \
11835 _("disable", L2_VTR_DISABLED) \
11836 _("push-1", L2_VTR_PUSH_1) \
11837 _("push-2", L2_VTR_PUSH_2) \
11838 _("pop-1", L2_VTR_POP_1) \
11839 _("pop-2", L2_VTR_POP_2) \
11840 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
11841 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
11842 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
11843 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
11846 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
11848 unformat_input_t *i = vam->input;
11849 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
11851 u8 sw_if_index_set = 0;
11854 u32 push_dot1q = 1;
11859 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11861 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11862 sw_if_index_set = 1;
11863 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11864 sw_if_index_set = 1;
11865 else if (unformat (i, "vtr_op %d", &vtr_op))
11867 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
11870 else if (unformat (i, "push_dot1q %d", &push_dot1q))
11872 else if (unformat (i, "tag1 %d", &tag1))
11874 else if (unformat (i, "tag2 %d", &tag2))
11878 clib_warning ("parse error '%U'", format_unformat_error, i);
11883 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
11885 errmsg ("missing vtr operation or sw_if_index");
11889 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
11890 mp->sw_if_index = ntohl (sw_if_index);
11891 mp->vtr_op = ntohl (vtr_op);
11892 mp->push_dot1q = ntohl (push_dot1q);
11893 mp->tag1 = ntohl (tag1);
11894 mp->tag2 = ntohl (tag2);
11902 api_create_vhost_user_if (vat_main_t * vam)
11904 unformat_input_t *i = vam->input;
11905 vl_api_create_vhost_user_if_t *mp;
11908 u8 file_name_set = 0;
11909 u32 custom_dev_instance = ~0;
11911 u8 use_custom_mac = 0;
11915 /* Shut up coverity */
11916 memset (hwaddr, 0, sizeof (hwaddr));
11918 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11920 if (unformat (i, "socket %s", &file_name))
11924 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
11926 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
11927 use_custom_mac = 1;
11928 else if (unformat (i, "server"))
11930 else if (unformat (i, "tag %s", &tag))
11936 if (file_name_set == 0)
11938 errmsg ("missing socket file name");
11942 if (vec_len (file_name) > 255)
11944 errmsg ("socket file name too long");
11947 vec_add1 (file_name, 0);
11949 M (CREATE_VHOST_USER_IF, mp);
11951 mp->is_server = is_server;
11952 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
11953 vec_free (file_name);
11954 if (custom_dev_instance != ~0)
11957 mp->custom_dev_instance = ntohl (custom_dev_instance);
11959 mp->use_custom_mac = use_custom_mac;
11960 clib_memcpy (mp->mac_address, hwaddr, 6);
11962 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
11971 api_modify_vhost_user_if (vat_main_t * vam)
11973 unformat_input_t *i = vam->input;
11974 vl_api_modify_vhost_user_if_t *mp;
11977 u8 file_name_set = 0;
11978 u32 custom_dev_instance = ~0;
11979 u8 sw_if_index_set = 0;
11980 u32 sw_if_index = (u32) ~ 0;
11983 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11985 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11986 sw_if_index_set = 1;
11987 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11988 sw_if_index_set = 1;
11989 else if (unformat (i, "socket %s", &file_name))
11993 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
11995 else if (unformat (i, "server"))
12001 if (sw_if_index_set == 0)
12003 errmsg ("missing sw_if_index or interface name");
12007 if (file_name_set == 0)
12009 errmsg ("missing socket file name");
12013 if (vec_len (file_name) > 255)
12015 errmsg ("socket file name too long");
12018 vec_add1 (file_name, 0);
12020 M (MODIFY_VHOST_USER_IF, mp);
12022 mp->sw_if_index = ntohl (sw_if_index);
12023 mp->is_server = is_server;
12024 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
12025 vec_free (file_name);
12026 if (custom_dev_instance != ~0)
12029 mp->custom_dev_instance = ntohl (custom_dev_instance);
12038 api_delete_vhost_user_if (vat_main_t * vam)
12040 unformat_input_t *i = vam->input;
12041 vl_api_delete_vhost_user_if_t *mp;
12042 u32 sw_if_index = ~0;
12043 u8 sw_if_index_set = 0;
12046 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12048 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12049 sw_if_index_set = 1;
12050 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12051 sw_if_index_set = 1;
12056 if (sw_if_index_set == 0)
12058 errmsg ("missing sw_if_index or interface name");
12063 M (DELETE_VHOST_USER_IF, mp);
12065 mp->sw_if_index = ntohl (sw_if_index);
12072 static void vl_api_sw_interface_vhost_user_details_t_handler
12073 (vl_api_sw_interface_vhost_user_details_t * mp)
12075 vat_main_t *vam = &vat_main;
12077 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
12078 (char *) mp->interface_name,
12079 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
12080 clib_net_to_host_u64 (mp->features), mp->is_server,
12081 ntohl (mp->num_regions), (char *) mp->sock_filename);
12082 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
12085 static void vl_api_sw_interface_vhost_user_details_t_handler_json
12086 (vl_api_sw_interface_vhost_user_details_t * mp)
12088 vat_main_t *vam = &vat_main;
12089 vat_json_node_t *node = NULL;
12091 if (VAT_JSON_ARRAY != vam->json_tree.type)
12093 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12094 vat_json_init_array (&vam->json_tree);
12096 node = vat_json_array_add (&vam->json_tree);
12098 vat_json_init_object (node);
12099 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12100 vat_json_object_add_string_copy (node, "interface_name",
12101 mp->interface_name);
12102 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
12103 ntohl (mp->virtio_net_hdr_sz));
12104 vat_json_object_add_uint (node, "features",
12105 clib_net_to_host_u64 (mp->features));
12106 vat_json_object_add_uint (node, "is_server", mp->is_server);
12107 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
12108 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
12109 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
12113 api_sw_interface_vhost_user_dump (vat_main_t * vam)
12115 vl_api_sw_interface_vhost_user_dump_t *mp;
12116 vl_api_control_ping_t *mp_ping;
12119 "Interface name idx hdr_sz features server regions filename");
12121 /* Get list of vhost-user interfaces */
12122 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
12125 /* Use a control ping for synchronization */
12126 M (CONTROL_PING, mp_ping);
12134 api_show_version (vat_main_t * vam)
12136 vl_api_show_version_t *mp;
12139 M (SHOW_VERSION, mp);
12148 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
12150 unformat_input_t *line_input = vam->input;
12151 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
12152 ip4_address_t local4, remote4;
12153 ip6_address_t local6, remote6;
12155 u8 ipv4_set = 0, ipv6_set = 0;
12159 u32 mcast_sw_if_index = ~0;
12160 u32 encap_vrf_id = 0;
12161 u32 decap_vrf_id = 0;
12167 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12168 memset (&local4, 0, sizeof local4);
12169 memset (&remote4, 0, sizeof remote4);
12170 memset (&local6, 0, sizeof local6);
12171 memset (&remote6, 0, sizeof remote6);
12173 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12175 if (unformat (line_input, "del"))
12177 else if (unformat (line_input, "local %U",
12178 unformat_ip4_address, &local4))
12183 else if (unformat (line_input, "remote %U",
12184 unformat_ip4_address, &remote4))
12189 else if (unformat (line_input, "local %U",
12190 unformat_ip6_address, &local6))
12195 else if (unformat (line_input, "remote %U",
12196 unformat_ip6_address, &remote6))
12201 else if (unformat (line_input, "group %U %U",
12202 unformat_ip4_address, &remote4,
12203 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12205 grp_set = remote_set = 1;
12208 else if (unformat (line_input, "group %U",
12209 unformat_ip4_address, &remote4))
12211 grp_set = remote_set = 1;
12214 else if (unformat (line_input, "group %U %U",
12215 unformat_ip6_address, &remote6,
12216 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12218 grp_set = remote_set = 1;
12221 else if (unformat (line_input, "group %U",
12222 unformat_ip6_address, &remote6))
12224 grp_set = remote_set = 1;
12228 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12230 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12232 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
12234 else if (unformat (line_input, "vni %d", &vni))
12236 else if (unformat (line_input, "next-ip4"))
12238 else if (unformat (line_input, "next-ip6"))
12240 else if (unformat (line_input, "next-ethernet"))
12242 else if (unformat (line_input, "next-nsh"))
12246 errmsg ("parse error '%U'", format_unformat_error, line_input);
12251 if (local_set == 0)
12253 errmsg ("tunnel local address not specified");
12256 if (remote_set == 0)
12258 errmsg ("tunnel remote address not specified");
12261 if (grp_set && mcast_sw_if_index == ~0)
12263 errmsg ("tunnel nonexistent multicast device");
12266 if (ipv4_set && ipv6_set)
12268 errmsg ("both IPv4 and IPv6 addresses specified");
12274 errmsg ("vni not specified");
12278 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
12283 clib_memcpy (&mp->local, &local6, sizeof (local6));
12284 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
12288 clib_memcpy (&mp->local, &local4, sizeof (local4));
12289 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
12292 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
12293 mp->encap_vrf_id = ntohl (encap_vrf_id);
12294 mp->decap_vrf_id = ntohl (decap_vrf_id);
12295 mp->protocol = protocol;
12296 mp->vni = ntohl (vni);
12297 mp->is_add = is_add;
12298 mp->is_ipv6 = ipv6_set;
12305 static void vl_api_vxlan_gpe_tunnel_details_t_handler
12306 (vl_api_vxlan_gpe_tunnel_details_t * mp)
12308 vat_main_t *vam = &vat_main;
12309 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
12310 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
12312 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
12313 ntohl (mp->sw_if_index),
12314 format_ip46_address, &local, IP46_TYPE_ANY,
12315 format_ip46_address, &remote, IP46_TYPE_ANY,
12316 ntohl (mp->vni), mp->protocol,
12317 ntohl (mp->mcast_sw_if_index),
12318 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
12322 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
12323 (vl_api_vxlan_gpe_tunnel_details_t * mp)
12325 vat_main_t *vam = &vat_main;
12326 vat_json_node_t *node = NULL;
12327 struct in_addr ip4;
12328 struct in6_addr ip6;
12330 if (VAT_JSON_ARRAY != vam->json_tree.type)
12332 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12333 vat_json_init_array (&vam->json_tree);
12335 node = vat_json_array_add (&vam->json_tree);
12337 vat_json_init_object (node);
12338 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12341 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
12342 vat_json_object_add_ip6 (node, "local", ip6);
12343 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
12344 vat_json_object_add_ip6 (node, "remote", ip6);
12348 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
12349 vat_json_object_add_ip4 (node, "local", ip4);
12350 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
12351 vat_json_object_add_ip4 (node, "remote", ip4);
12353 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
12354 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
12355 vat_json_object_add_uint (node, "mcast_sw_if_index",
12356 ntohl (mp->mcast_sw_if_index));
12357 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
12358 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
12359 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
12363 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
12365 unformat_input_t *i = vam->input;
12366 vl_api_vxlan_gpe_tunnel_dump_t *mp;
12367 vl_api_control_ping_t *mp_ping;
12369 u8 sw_if_index_set = 0;
12372 /* Parse args required to build the message */
12373 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12375 if (unformat (i, "sw_if_index %d", &sw_if_index))
12376 sw_if_index_set = 1;
12381 if (sw_if_index_set == 0)
12386 if (!vam->json_output)
12388 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
12389 "sw_if_index", "local", "remote", "vni",
12390 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
12393 /* Get list of vxlan-tunnel interfaces */
12394 M (VXLAN_GPE_TUNNEL_DUMP, mp);
12396 mp->sw_if_index = htonl (sw_if_index);
12400 /* Use a control ping for synchronization */
12401 M (CONTROL_PING, mp_ping);
12410 format_l2_fib_mac_address (u8 * s, va_list * args)
12412 u8 *a = va_arg (*args, u8 *);
12414 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
12415 a[2], a[3], a[4], a[5], a[6], a[7]);
12418 static void vl_api_l2_fib_table_details_t_handler
12419 (vl_api_l2_fib_table_details_t * mp)
12421 vat_main_t *vam = &vat_main;
12423 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
12425 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
12426 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
12430 static void vl_api_l2_fib_table_details_t_handler_json
12431 (vl_api_l2_fib_table_details_t * mp)
12433 vat_main_t *vam = &vat_main;
12434 vat_json_node_t *node = NULL;
12436 if (VAT_JSON_ARRAY != vam->json_tree.type)
12438 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12439 vat_json_init_array (&vam->json_tree);
12441 node = vat_json_array_add (&vam->json_tree);
12443 vat_json_init_object (node);
12444 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
12445 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
12446 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12447 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
12448 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
12449 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
12453 api_l2_fib_table_dump (vat_main_t * vam)
12455 unformat_input_t *i = vam->input;
12456 vl_api_l2_fib_table_dump_t *mp;
12457 vl_api_control_ping_t *mp_ping;
12462 /* Parse args required to build the message */
12463 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12465 if (unformat (i, "bd_id %d", &bd_id))
12471 if (bd_id_set == 0)
12473 errmsg ("missing bridge domain");
12477 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
12479 /* Get list of l2 fib entries */
12480 M (L2_FIB_TABLE_DUMP, mp);
12482 mp->bd_id = ntohl (bd_id);
12485 /* Use a control ping for synchronization */
12486 M (CONTROL_PING, mp_ping);
12495 api_interface_name_renumber (vat_main_t * vam)
12497 unformat_input_t *line_input = vam->input;
12498 vl_api_interface_name_renumber_t *mp;
12499 u32 sw_if_index = ~0;
12500 u32 new_show_dev_instance = ~0;
12503 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12505 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
12508 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12510 else if (unformat (line_input, "new_show_dev_instance %d",
12511 &new_show_dev_instance))
12517 if (sw_if_index == ~0)
12519 errmsg ("missing interface name or sw_if_index");
12523 if (new_show_dev_instance == ~0)
12525 errmsg ("missing new_show_dev_instance");
12529 M (INTERFACE_NAME_RENUMBER, mp);
12531 mp->sw_if_index = ntohl (sw_if_index);
12532 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
12540 api_want_ip4_arp_events (vat_main_t * vam)
12542 unformat_input_t *line_input = vam->input;
12543 vl_api_want_ip4_arp_events_t *mp;
12544 ip4_address_t address;
12545 int address_set = 0;
12546 u32 enable_disable = 1;
12549 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12551 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
12553 else if (unformat (line_input, "del"))
12554 enable_disable = 0;
12559 if (address_set == 0)
12561 errmsg ("missing addresses");
12565 M (WANT_IP4_ARP_EVENTS, mp);
12566 mp->enable_disable = enable_disable;
12567 mp->pid = htonl (getpid ());
12568 mp->address = address.as_u32;
12576 api_want_ip6_nd_events (vat_main_t * vam)
12578 unformat_input_t *line_input = vam->input;
12579 vl_api_want_ip6_nd_events_t *mp;
12580 ip6_address_t address;
12581 int address_set = 0;
12582 u32 enable_disable = 1;
12585 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12587 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
12589 else if (unformat (line_input, "del"))
12590 enable_disable = 0;
12595 if (address_set == 0)
12597 errmsg ("missing addresses");
12601 M (WANT_IP6_ND_EVENTS, mp);
12602 mp->enable_disable = enable_disable;
12603 mp->pid = htonl (getpid ());
12604 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
12612 api_want_l2_macs_events (vat_main_t * vam)
12614 unformat_input_t *line_input = vam->input;
12615 vl_api_want_l2_macs_events_t *mp;
12616 u8 enable_disable = 1;
12617 u32 scan_delay = 0;
12618 u32 max_macs_in_event = 0;
12619 u32 learn_limit = 0;
12622 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12624 if (unformat (line_input, "learn-limit %d", &learn_limit))
12626 else if (unformat (line_input, "scan-delay %d", &scan_delay))
12628 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
12630 else if (unformat (line_input, "disable"))
12631 enable_disable = 0;
12636 M (WANT_L2_MACS_EVENTS, mp);
12637 mp->enable_disable = enable_disable;
12638 mp->pid = htonl (getpid ());
12639 mp->learn_limit = htonl (learn_limit);
12640 mp->scan_delay = (u8) scan_delay;
12641 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
12648 api_input_acl_set_interface (vat_main_t * vam)
12650 unformat_input_t *i = vam->input;
12651 vl_api_input_acl_set_interface_t *mp;
12653 int sw_if_index_set;
12654 u32 ip4_table_index = ~0;
12655 u32 ip6_table_index = ~0;
12656 u32 l2_table_index = ~0;
12660 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12662 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12663 sw_if_index_set = 1;
12664 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12665 sw_if_index_set = 1;
12666 else if (unformat (i, "del"))
12668 else if (unformat (i, "ip4-table %d", &ip4_table_index))
12670 else if (unformat (i, "ip6-table %d", &ip6_table_index))
12672 else if (unformat (i, "l2-table %d", &l2_table_index))
12676 clib_warning ("parse error '%U'", format_unformat_error, i);
12681 if (sw_if_index_set == 0)
12683 errmsg ("missing interface name or sw_if_index");
12687 M (INPUT_ACL_SET_INTERFACE, mp);
12689 mp->sw_if_index = ntohl (sw_if_index);
12690 mp->ip4_table_index = ntohl (ip4_table_index);
12691 mp->ip6_table_index = ntohl (ip6_table_index);
12692 mp->l2_table_index = ntohl (l2_table_index);
12693 mp->is_add = is_add;
12701 api_ip_address_dump (vat_main_t * vam)
12703 unformat_input_t *i = vam->input;
12704 vl_api_ip_address_dump_t *mp;
12705 vl_api_control_ping_t *mp_ping;
12706 u32 sw_if_index = ~0;
12707 u8 sw_if_index_set = 0;
12712 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12714 if (unformat (i, "sw_if_index %d", &sw_if_index))
12715 sw_if_index_set = 1;
12717 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12718 sw_if_index_set = 1;
12719 else if (unformat (i, "ipv4"))
12721 else if (unformat (i, "ipv6"))
12727 if (ipv4_set && ipv6_set)
12729 errmsg ("ipv4 and ipv6 flags cannot be both set");
12733 if ((!ipv4_set) && (!ipv6_set))
12735 errmsg ("no ipv4 nor ipv6 flag set");
12739 if (sw_if_index_set == 0)
12741 errmsg ("missing interface name or sw_if_index");
12745 vam->current_sw_if_index = sw_if_index;
12746 vam->is_ipv6 = ipv6_set;
12748 M (IP_ADDRESS_DUMP, mp);
12749 mp->sw_if_index = ntohl (sw_if_index);
12750 mp->is_ipv6 = ipv6_set;
12753 /* Use a control ping for synchronization */
12754 M (CONTROL_PING, mp_ping);
12762 api_ip_dump (vat_main_t * vam)
12764 vl_api_ip_dump_t *mp;
12765 vl_api_control_ping_t *mp_ping;
12766 unformat_input_t *in = vam->input;
12773 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
12775 if (unformat (in, "ipv4"))
12777 else if (unformat (in, "ipv6"))
12783 if (ipv4_set && ipv6_set)
12785 errmsg ("ipv4 and ipv6 flags cannot be both set");
12789 if ((!ipv4_set) && (!ipv6_set))
12791 errmsg ("no ipv4 nor ipv6 flag set");
12795 is_ipv6 = ipv6_set;
12796 vam->is_ipv6 = is_ipv6;
12798 /* free old data */
12799 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
12801 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
12803 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
12806 mp->is_ipv6 = ipv6_set;
12809 /* Use a control ping for synchronization */
12810 M (CONTROL_PING, mp_ping);
12818 api_ipsec_spd_add_del (vat_main_t * vam)
12820 unformat_input_t *i = vam->input;
12821 vl_api_ipsec_spd_add_del_t *mp;
12826 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12828 if (unformat (i, "spd_id %d", &spd_id))
12830 else if (unformat (i, "del"))
12834 clib_warning ("parse error '%U'", format_unformat_error, i);
12840 errmsg ("spd_id must be set");
12844 M (IPSEC_SPD_ADD_DEL, mp);
12846 mp->spd_id = ntohl (spd_id);
12847 mp->is_add = is_add;
12855 api_ipsec_interface_add_del_spd (vat_main_t * vam)
12857 unformat_input_t *i = vam->input;
12858 vl_api_ipsec_interface_add_del_spd_t *mp;
12860 u8 sw_if_index_set = 0;
12861 u32 spd_id = (u32) ~ 0;
12865 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12867 if (unformat (i, "del"))
12869 else if (unformat (i, "spd_id %d", &spd_id))
12872 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12873 sw_if_index_set = 1;
12874 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12875 sw_if_index_set = 1;
12878 clib_warning ("parse error '%U'", format_unformat_error, i);
12884 if (spd_id == (u32) ~ 0)
12886 errmsg ("spd_id must be set");
12890 if (sw_if_index_set == 0)
12892 errmsg ("missing interface name or sw_if_index");
12896 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
12898 mp->spd_id = ntohl (spd_id);
12899 mp->sw_if_index = ntohl (sw_if_index);
12900 mp->is_add = is_add;
12908 api_ipsec_spd_add_del_entry (vat_main_t * vam)
12910 unformat_input_t *i = vam->input;
12911 vl_api_ipsec_spd_add_del_entry_t *mp;
12912 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
12913 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
12915 u32 rport_start = 0, rport_stop = (u32) ~ 0;
12916 u32 lport_start = 0, lport_stop = (u32) ~ 0;
12917 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
12918 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
12921 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
12922 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
12923 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
12924 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
12925 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
12926 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
12928 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12930 if (unformat (i, "del"))
12932 if (unformat (i, "outbound"))
12934 if (unformat (i, "inbound"))
12936 else if (unformat (i, "spd_id %d", &spd_id))
12938 else if (unformat (i, "sa_id %d", &sa_id))
12940 else if (unformat (i, "priority %d", &priority))
12942 else if (unformat (i, "protocol %d", &protocol))
12944 else if (unformat (i, "lport_start %d", &lport_start))
12946 else if (unformat (i, "lport_stop %d", &lport_stop))
12948 else if (unformat (i, "rport_start %d", &rport_start))
12950 else if (unformat (i, "rport_stop %d", &rport_stop))
12954 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
12960 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
12967 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
12973 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
12980 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
12986 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
12993 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
12999 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
13005 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
13007 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
13009 clib_warning ("unsupported action: 'resolve'");
13015 clib_warning ("parse error '%U'", format_unformat_error, i);
13021 M (IPSEC_SPD_ADD_DEL_ENTRY, mp);
13023 mp->spd_id = ntohl (spd_id);
13024 mp->priority = ntohl (priority);
13025 mp->is_outbound = is_outbound;
13027 mp->is_ipv6 = is_ipv6;
13028 if (is_ipv6 || is_ip_any)
13030 clib_memcpy (mp->remote_address_start, &raddr6_start,
13031 sizeof (ip6_address_t));
13032 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
13033 sizeof (ip6_address_t));
13034 clib_memcpy (mp->local_address_start, &laddr6_start,
13035 sizeof (ip6_address_t));
13036 clib_memcpy (mp->local_address_stop, &laddr6_stop,
13037 sizeof (ip6_address_t));
13041 clib_memcpy (mp->remote_address_start, &raddr4_start,
13042 sizeof (ip4_address_t));
13043 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
13044 sizeof (ip4_address_t));
13045 clib_memcpy (mp->local_address_start, &laddr4_start,
13046 sizeof (ip4_address_t));
13047 clib_memcpy (mp->local_address_stop, &laddr4_stop,
13048 sizeof (ip4_address_t));
13050 mp->protocol = (u8) protocol;
13051 mp->local_port_start = ntohs ((u16) lport_start);
13052 mp->local_port_stop = ntohs ((u16) lport_stop);
13053 mp->remote_port_start = ntohs ((u16) rport_start);
13054 mp->remote_port_stop = ntohs ((u16) rport_stop);
13055 mp->policy = (u8) policy;
13056 mp->sa_id = ntohl (sa_id);
13057 mp->is_add = is_add;
13058 mp->is_ip_any = is_ip_any;
13065 api_ipsec_sad_add_del_entry (vat_main_t * vam)
13067 unformat_input_t *i = vam->input;
13068 vl_api_ipsec_sad_add_del_entry_t *mp;
13069 u32 sad_id = 0, spi = 0;
13070 u8 *ck = 0, *ik = 0;
13073 u8 protocol = IPSEC_PROTOCOL_AH;
13074 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
13075 u32 crypto_alg = 0, integ_alg = 0;
13076 ip4_address_t tun_src4;
13077 ip4_address_t tun_dst4;
13078 ip6_address_t tun_src6;
13079 ip6_address_t tun_dst6;
13082 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13084 if (unformat (i, "del"))
13086 else if (unformat (i, "sad_id %d", &sad_id))
13088 else if (unformat (i, "spi %d", &spi))
13090 else if (unformat (i, "esp"))
13091 protocol = IPSEC_PROTOCOL_ESP;
13092 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
13095 is_tunnel_ipv6 = 0;
13097 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
13100 is_tunnel_ipv6 = 0;
13102 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
13105 is_tunnel_ipv6 = 1;
13107 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
13110 is_tunnel_ipv6 = 1;
13114 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
13116 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
13117 crypto_alg >= IPSEC_CRYPTO_N_ALG)
13119 clib_warning ("unsupported crypto-alg: '%U'",
13120 format_ipsec_crypto_alg, crypto_alg);
13124 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
13128 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
13130 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
13131 integ_alg >= IPSEC_INTEG_N_ALG)
13133 clib_warning ("unsupported integ-alg: '%U'",
13134 format_ipsec_integ_alg, integ_alg);
13138 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
13142 clib_warning ("parse error '%U'", format_unformat_error, i);
13148 M (IPSEC_SAD_ADD_DEL_ENTRY, mp);
13150 mp->sad_id = ntohl (sad_id);
13151 mp->is_add = is_add;
13152 mp->protocol = protocol;
13153 mp->spi = ntohl (spi);
13154 mp->is_tunnel = is_tunnel;
13155 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
13156 mp->crypto_algorithm = crypto_alg;
13157 mp->integrity_algorithm = integ_alg;
13158 mp->crypto_key_length = vec_len (ck);
13159 mp->integrity_key_length = vec_len (ik);
13161 if (mp->crypto_key_length > sizeof (mp->crypto_key))
13162 mp->crypto_key_length = sizeof (mp->crypto_key);
13164 if (mp->integrity_key_length > sizeof (mp->integrity_key))
13165 mp->integrity_key_length = sizeof (mp->integrity_key);
13168 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
13170 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
13174 if (is_tunnel_ipv6)
13176 clib_memcpy (mp->tunnel_src_address, &tun_src6,
13177 sizeof (ip6_address_t));
13178 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
13179 sizeof (ip6_address_t));
13183 clib_memcpy (mp->tunnel_src_address, &tun_src4,
13184 sizeof (ip4_address_t));
13185 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
13186 sizeof (ip4_address_t));
13196 api_ipsec_sa_set_key (vat_main_t * vam)
13198 unformat_input_t *i = vam->input;
13199 vl_api_ipsec_sa_set_key_t *mp;
13201 u8 *ck = 0, *ik = 0;
13204 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13206 if (unformat (i, "sa_id %d", &sa_id))
13208 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
13210 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
13214 clib_warning ("parse error '%U'", format_unformat_error, i);
13219 M (IPSEC_SA_SET_KEY, mp);
13221 mp->sa_id = ntohl (sa_id);
13222 mp->crypto_key_length = vec_len (ck);
13223 mp->integrity_key_length = vec_len (ik);
13225 if (mp->crypto_key_length > sizeof (mp->crypto_key))
13226 mp->crypto_key_length = sizeof (mp->crypto_key);
13228 if (mp->integrity_key_length > sizeof (mp->integrity_key))
13229 mp->integrity_key_length = sizeof (mp->integrity_key);
13232 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
13234 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
13242 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
13244 unformat_input_t *i = vam->input;
13245 vl_api_ipsec_tunnel_if_add_del_t *mp;
13246 u32 local_spi = 0, remote_spi = 0;
13247 u32 crypto_alg = 0, integ_alg = 0;
13248 u8 *lck = NULL, *rck = NULL;
13249 u8 *lik = NULL, *rik = NULL;
13250 ip4_address_t local_ip = { {0} };
13251 ip4_address_t remote_ip = { {0} };
13254 u8 anti_replay = 0;
13257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13259 if (unformat (i, "del"))
13261 else if (unformat (i, "esn"))
13263 else if (unformat (i, "anti_replay"))
13265 else if (unformat (i, "local_spi %d", &local_spi))
13267 else if (unformat (i, "remote_spi %d", &remote_spi))
13269 else if (unformat (i, "local_ip %U", unformat_ip4_address, &local_ip))
13271 else if (unformat (i, "remote_ip %U", unformat_ip4_address, &remote_ip))
13273 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
13276 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
13278 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
13280 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
13284 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
13286 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
13287 crypto_alg >= IPSEC_CRYPTO_N_ALG)
13289 errmsg ("unsupported crypto-alg: '%U'\n",
13290 format_ipsec_crypto_alg, crypto_alg);
13296 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
13298 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
13299 integ_alg >= IPSEC_INTEG_N_ALG)
13301 errmsg ("unsupported integ-alg: '%U'\n",
13302 format_ipsec_integ_alg, integ_alg);
13308 errmsg ("parse error '%U'\n", format_unformat_error, i);
13313 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
13315 mp->is_add = is_add;
13317 mp->anti_replay = anti_replay;
13319 clib_memcpy (mp->local_ip, &local_ip, sizeof (ip4_address_t));
13320 clib_memcpy (mp->remote_ip, &remote_ip, sizeof (ip4_address_t));
13322 mp->local_spi = htonl (local_spi);
13323 mp->remote_spi = htonl (remote_spi);
13324 mp->crypto_alg = (u8) crypto_alg;
13326 mp->local_crypto_key_len = 0;
13329 mp->local_crypto_key_len = vec_len (lck);
13330 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
13331 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
13332 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
13335 mp->remote_crypto_key_len = 0;
13338 mp->remote_crypto_key_len = vec_len (rck);
13339 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
13340 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
13341 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
13344 mp->integ_alg = (u8) integ_alg;
13346 mp->local_integ_key_len = 0;
13349 mp->local_integ_key_len = vec_len (lik);
13350 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
13351 mp->local_integ_key_len = sizeof (mp->local_integ_key);
13352 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
13355 mp->remote_integ_key_len = 0;
13358 mp->remote_integ_key_len = vec_len (rik);
13359 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
13360 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
13361 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
13370 api_ikev2_profile_add_del (vat_main_t * vam)
13372 unformat_input_t *i = vam->input;
13373 vl_api_ikev2_profile_add_del_t *mp;
13378 const char *valid_chars = "a-zA-Z0-9_";
13380 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13382 if (unformat (i, "del"))
13384 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
13385 vec_add1 (name, 0);
13388 errmsg ("parse error '%U'", format_unformat_error, i);
13393 if (!vec_len (name))
13395 errmsg ("profile name must be specified");
13399 if (vec_len (name) > 64)
13401 errmsg ("profile name too long");
13405 M (IKEV2_PROFILE_ADD_DEL, mp);
13407 clib_memcpy (mp->name, name, vec_len (name));
13408 mp->is_add = is_add;
13417 api_ikev2_profile_set_auth (vat_main_t * vam)
13419 unformat_input_t *i = vam->input;
13420 vl_api_ikev2_profile_set_auth_t *mp;
13423 u32 auth_method = 0;
13427 const char *valid_chars = "a-zA-Z0-9_";
13429 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13431 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
13432 vec_add1 (name, 0);
13433 else if (unformat (i, "auth_method %U",
13434 unformat_ikev2_auth_method, &auth_method))
13436 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
13438 else if (unformat (i, "auth_data %v", &data))
13442 errmsg ("parse error '%U'", format_unformat_error, i);
13447 if (!vec_len (name))
13449 errmsg ("profile name must be specified");
13453 if (vec_len (name) > 64)
13455 errmsg ("profile name too long");
13459 if (!vec_len (data))
13461 errmsg ("auth_data must be specified");
13467 errmsg ("auth_method must be specified");
13471 M (IKEV2_PROFILE_SET_AUTH, mp);
13473 mp->is_hex = is_hex;
13474 mp->auth_method = (u8) auth_method;
13475 mp->data_len = vec_len (data);
13476 clib_memcpy (mp->name, name, vec_len (name));
13477 clib_memcpy (mp->data, data, vec_len (data));
13487 api_ikev2_profile_set_id (vat_main_t * vam)
13489 unformat_input_t *i = vam->input;
13490 vl_api_ikev2_profile_set_id_t *mp;
13498 const char *valid_chars = "a-zA-Z0-9_";
13500 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13502 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
13503 vec_add1 (name, 0);
13504 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
13506 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
13508 data = vec_new (u8, 4);
13509 clib_memcpy (data, ip4.as_u8, 4);
13511 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
13513 else if (unformat (i, "id_data %v", &data))
13515 else if (unformat (i, "local"))
13517 else if (unformat (i, "remote"))
13521 errmsg ("parse error '%U'", format_unformat_error, i);
13526 if (!vec_len (name))
13528 errmsg ("profile name must be specified");
13532 if (vec_len (name) > 64)
13534 errmsg ("profile name too long");
13538 if (!vec_len (data))
13540 errmsg ("id_data must be specified");
13546 errmsg ("id_type must be specified");
13550 M (IKEV2_PROFILE_SET_ID, mp);
13552 mp->is_local = is_local;
13553 mp->id_type = (u8) id_type;
13554 mp->data_len = vec_len (data);
13555 clib_memcpy (mp->name, name, vec_len (name));
13556 clib_memcpy (mp->data, data, vec_len (data));
13566 api_ikev2_profile_set_ts (vat_main_t * vam)
13568 unformat_input_t *i = vam->input;
13569 vl_api_ikev2_profile_set_ts_t *mp;
13572 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
13573 ip4_address_t start_addr, end_addr;
13575 const char *valid_chars = "a-zA-Z0-9_";
13578 start_addr.as_u32 = 0;
13579 end_addr.as_u32 = (u32) ~ 0;
13581 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13583 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
13584 vec_add1 (name, 0);
13585 else if (unformat (i, "protocol %d", &proto))
13587 else if (unformat (i, "start_port %d", &start_port))
13589 else if (unformat (i, "end_port %d", &end_port))
13592 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
13594 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
13596 else if (unformat (i, "local"))
13598 else if (unformat (i, "remote"))
13602 errmsg ("parse error '%U'", format_unformat_error, i);
13607 if (!vec_len (name))
13609 errmsg ("profile name must be specified");
13613 if (vec_len (name) > 64)
13615 errmsg ("profile name too long");
13619 M (IKEV2_PROFILE_SET_TS, mp);
13621 mp->is_local = is_local;
13622 mp->proto = (u8) proto;
13623 mp->start_port = (u16) start_port;
13624 mp->end_port = (u16) end_port;
13625 mp->start_addr = start_addr.as_u32;
13626 mp->end_addr = end_addr.as_u32;
13627 clib_memcpy (mp->name, name, vec_len (name));
13636 api_ikev2_set_local_key (vat_main_t * vam)
13638 unformat_input_t *i = vam->input;
13639 vl_api_ikev2_set_local_key_t *mp;
13643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13645 if (unformat (i, "file %v", &file))
13646 vec_add1 (file, 0);
13649 errmsg ("parse error '%U'", format_unformat_error, i);
13654 if (!vec_len (file))
13656 errmsg ("RSA key file must be specified");
13660 if (vec_len (file) > 256)
13662 errmsg ("file name too long");
13666 M (IKEV2_SET_LOCAL_KEY, mp);
13668 clib_memcpy (mp->key_file, file, vec_len (file));
13677 api_ikev2_set_responder (vat_main_t * vam)
13679 unformat_input_t *i = vam->input;
13680 vl_api_ikev2_set_responder_t *mp;
13683 u32 sw_if_index = ~0;
13684 ip4_address_t address;
13686 const char *valid_chars = "a-zA-Z0-9_";
13688 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13691 (i, "%U interface %d address %U", unformat_token, valid_chars,
13692 &name, &sw_if_index, unformat_ip4_address, &address))
13693 vec_add1 (name, 0);
13696 errmsg ("parse error '%U'", format_unformat_error, i);
13701 if (!vec_len (name))
13703 errmsg ("profile name must be specified");
13707 if (vec_len (name) > 64)
13709 errmsg ("profile name too long");
13713 M (IKEV2_SET_RESPONDER, mp);
13715 clib_memcpy (mp->name, name, vec_len (name));
13718 mp->sw_if_index = sw_if_index;
13719 clib_memcpy (mp->address, &address, sizeof (address));
13727 api_ikev2_set_ike_transforms (vat_main_t * vam)
13729 unformat_input_t *i = vam->input;
13730 vl_api_ikev2_set_ike_transforms_t *mp;
13733 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
13735 const char *valid_chars = "a-zA-Z0-9_";
13737 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13739 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
13740 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
13741 vec_add1 (name, 0);
13744 errmsg ("parse error '%U'", format_unformat_error, i);
13749 if (!vec_len (name))
13751 errmsg ("profile name must be specified");
13755 if (vec_len (name) > 64)
13757 errmsg ("profile name too long");
13761 M (IKEV2_SET_IKE_TRANSFORMS, mp);
13763 clib_memcpy (mp->name, name, vec_len (name));
13765 mp->crypto_alg = crypto_alg;
13766 mp->crypto_key_size = crypto_key_size;
13767 mp->integ_alg = integ_alg;
13768 mp->dh_group = dh_group;
13777 api_ikev2_set_esp_transforms (vat_main_t * vam)
13779 unformat_input_t *i = vam->input;
13780 vl_api_ikev2_set_esp_transforms_t *mp;
13783 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
13785 const char *valid_chars = "a-zA-Z0-9_";
13787 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13789 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
13790 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
13791 vec_add1 (name, 0);
13794 errmsg ("parse error '%U'", format_unformat_error, i);
13799 if (!vec_len (name))
13801 errmsg ("profile name must be specified");
13805 if (vec_len (name) > 64)
13807 errmsg ("profile name too long");
13811 M (IKEV2_SET_ESP_TRANSFORMS, mp);
13813 clib_memcpy (mp->name, name, vec_len (name));
13815 mp->crypto_alg = crypto_alg;
13816 mp->crypto_key_size = crypto_key_size;
13817 mp->integ_alg = integ_alg;
13818 mp->dh_group = dh_group;
13826 api_ikev2_set_sa_lifetime (vat_main_t * vam)
13828 unformat_input_t *i = vam->input;
13829 vl_api_ikev2_set_sa_lifetime_t *mp;
13832 u64 lifetime, lifetime_maxdata;
13833 u32 lifetime_jitter, handover;
13835 const char *valid_chars = "a-zA-Z0-9_";
13837 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13839 if (unformat (i, "%U %lu %u %u %lu", unformat_token, valid_chars, &name,
13840 &lifetime, &lifetime_jitter, &handover,
13841 &lifetime_maxdata))
13842 vec_add1 (name, 0);
13845 errmsg ("parse error '%U'", format_unformat_error, i);
13850 if (!vec_len (name))
13852 errmsg ("profile name must be specified");
13856 if (vec_len (name) > 64)
13858 errmsg ("profile name too long");
13862 M (IKEV2_SET_SA_LIFETIME, mp);
13864 clib_memcpy (mp->name, name, vec_len (name));
13866 mp->lifetime = lifetime;
13867 mp->lifetime_jitter = lifetime_jitter;
13868 mp->handover = handover;
13869 mp->lifetime_maxdata = lifetime_maxdata;
13877 api_ikev2_initiate_sa_init (vat_main_t * vam)
13879 unformat_input_t *i = vam->input;
13880 vl_api_ikev2_initiate_sa_init_t *mp;
13884 const char *valid_chars = "a-zA-Z0-9_";
13886 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13888 if (unformat (i, "%U", unformat_token, valid_chars, &name))
13889 vec_add1 (name, 0);
13892 errmsg ("parse error '%U'", format_unformat_error, i);
13897 if (!vec_len (name))
13899 errmsg ("profile name must be specified");
13903 if (vec_len (name) > 64)
13905 errmsg ("profile name too long");
13909 M (IKEV2_INITIATE_SA_INIT, mp);
13911 clib_memcpy (mp->name, name, vec_len (name));
13920 api_ikev2_initiate_del_ike_sa (vat_main_t * vam)
13922 unformat_input_t *i = vam->input;
13923 vl_api_ikev2_initiate_del_ike_sa_t *mp;
13928 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13930 if (unformat (i, "%lx", &ispi))
13934 errmsg ("parse error '%U'", format_unformat_error, i);
13939 M (IKEV2_INITIATE_DEL_IKE_SA, mp);
13949 api_ikev2_initiate_del_child_sa (vat_main_t * vam)
13951 unformat_input_t *i = vam->input;
13952 vl_api_ikev2_initiate_del_child_sa_t *mp;
13957 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13959 if (unformat (i, "%x", &ispi))
13963 errmsg ("parse error '%U'", format_unformat_error, i);
13968 M (IKEV2_INITIATE_DEL_CHILD_SA, mp);
13978 api_ikev2_initiate_rekey_child_sa (vat_main_t * vam)
13980 unformat_input_t *i = vam->input;
13981 vl_api_ikev2_initiate_rekey_child_sa_t *mp;
13986 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13988 if (unformat (i, "%x", &ispi))
13992 errmsg ("parse error '%U'", format_unformat_error, i);
13997 M (IKEV2_INITIATE_REKEY_CHILD_SA, mp);
14010 api_map_add_domain (vat_main_t * vam)
14012 unformat_input_t *i = vam->input;
14013 vl_api_map_add_domain_t *mp;
14015 ip4_address_t ip4_prefix;
14016 ip6_address_t ip6_prefix;
14017 ip6_address_t ip6_src;
14018 u32 num_m_args = 0;
14019 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
14020 0, psid_length = 0;
14021 u8 is_translation = 0;
14023 u32 ip6_src_len = 128;
14026 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14028 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
14029 &ip4_prefix, &ip4_prefix_len))
14031 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
14032 &ip6_prefix, &ip6_prefix_len))
14036 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
14039 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
14041 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
14043 else if (unformat (i, "psid-offset %d", &psid_offset))
14045 else if (unformat (i, "psid-len %d", &psid_length))
14047 else if (unformat (i, "mtu %d", &mtu))
14049 else if (unformat (i, "map-t"))
14050 is_translation = 1;
14053 clib_warning ("parse error '%U'", format_unformat_error, i);
14058 if (num_m_args < 3)
14060 errmsg ("mandatory argument(s) missing");
14064 /* Construct the API message */
14065 M (MAP_ADD_DOMAIN, mp);
14067 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
14068 mp->ip4_prefix_len = ip4_prefix_len;
14070 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
14071 mp->ip6_prefix_len = ip6_prefix_len;
14073 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
14074 mp->ip6_src_prefix_len = ip6_src_len;
14076 mp->ea_bits_len = ea_bits_len;
14077 mp->psid_offset = psid_offset;
14078 mp->psid_length = psid_length;
14079 mp->is_translation = is_translation;
14080 mp->mtu = htons (mtu);
14085 /* Wait for a reply, return good/bad news */
14091 api_map_del_domain (vat_main_t * vam)
14093 unformat_input_t *i = vam->input;
14094 vl_api_map_del_domain_t *mp;
14096 u32 num_m_args = 0;
14100 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14102 if (unformat (i, "index %d", &index))
14106 clib_warning ("parse error '%U'", format_unformat_error, i);
14111 if (num_m_args != 1)
14113 errmsg ("mandatory argument(s) missing");
14117 /* Construct the API message */
14118 M (MAP_DEL_DOMAIN, mp);
14120 mp->index = ntohl (index);
14125 /* Wait for a reply, return good/bad news */
14131 api_map_add_del_rule (vat_main_t * vam)
14133 unformat_input_t *i = vam->input;
14134 vl_api_map_add_del_rule_t *mp;
14136 ip6_address_t ip6_dst;
14137 u32 num_m_args = 0, index, psid = 0;
14140 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14142 if (unformat (i, "index %d", &index))
14144 else if (unformat (i, "psid %d", &psid))
14146 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
14148 else if (unformat (i, "del"))
14154 clib_warning ("parse error '%U'", format_unformat_error, i);
14159 /* Construct the API message */
14160 M (MAP_ADD_DEL_RULE, mp);
14162 mp->index = ntohl (index);
14163 mp->is_add = is_add;
14164 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
14165 mp->psid = ntohs (psid);
14170 /* Wait for a reply, return good/bad news */
14176 api_map_domain_dump (vat_main_t * vam)
14178 vl_api_map_domain_dump_t *mp;
14179 vl_api_control_ping_t *mp_ping;
14182 /* Construct the API message */
14183 M (MAP_DOMAIN_DUMP, mp);
14188 /* Use a control ping for synchronization */
14189 M (CONTROL_PING, mp_ping);
14197 api_map_rule_dump (vat_main_t * vam)
14199 unformat_input_t *i = vam->input;
14200 vl_api_map_rule_dump_t *mp;
14201 vl_api_control_ping_t *mp_ping;
14202 u32 domain_index = ~0;
14205 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14207 if (unformat (i, "index %u", &domain_index))
14213 if (domain_index == ~0)
14215 clib_warning ("parse error: domain index expected");
14219 /* Construct the API message */
14220 M (MAP_RULE_DUMP, mp);
14222 mp->domain_index = htonl (domain_index);
14227 /* Use a control ping for synchronization */
14228 M (CONTROL_PING, mp_ping);
14235 static void vl_api_map_add_domain_reply_t_handler
14236 (vl_api_map_add_domain_reply_t * mp)
14238 vat_main_t *vam = &vat_main;
14239 i32 retval = ntohl (mp->retval);
14241 if (vam->async_mode)
14243 vam->async_errors += (retval < 0);
14247 vam->retval = retval;
14248 vam->result_ready = 1;
14252 static void vl_api_map_add_domain_reply_t_handler_json
14253 (vl_api_map_add_domain_reply_t * mp)
14255 vat_main_t *vam = &vat_main;
14256 vat_json_node_t node;
14258 vat_json_init_object (&node);
14259 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
14260 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
14262 vat_json_print (vam->ofp, &node);
14263 vat_json_free (&node);
14265 vam->retval = ntohl (mp->retval);
14266 vam->result_ready = 1;
14270 api_get_first_msg_id (vat_main_t * vam)
14272 vl_api_get_first_msg_id_t *mp;
14273 unformat_input_t *i = vam->input;
14278 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14280 if (unformat (i, "client %s", &name))
14288 errmsg ("missing client name");
14291 vec_add1 (name, 0);
14293 if (vec_len (name) > 63)
14295 errmsg ("client name too long");
14299 M (GET_FIRST_MSG_ID, mp);
14300 clib_memcpy (mp->name, name, vec_len (name));
14307 api_cop_interface_enable_disable (vat_main_t * vam)
14309 unformat_input_t *line_input = vam->input;
14310 vl_api_cop_interface_enable_disable_t *mp;
14311 u32 sw_if_index = ~0;
14312 u8 enable_disable = 1;
14315 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14317 if (unformat (line_input, "disable"))
14318 enable_disable = 0;
14319 if (unformat (line_input, "enable"))
14320 enable_disable = 1;
14321 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
14322 vam, &sw_if_index))
14324 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14330 if (sw_if_index == ~0)
14332 errmsg ("missing interface name or sw_if_index");
14336 /* Construct the API message */
14337 M (COP_INTERFACE_ENABLE_DISABLE, mp);
14338 mp->sw_if_index = ntohl (sw_if_index);
14339 mp->enable_disable = enable_disable;
14343 /* Wait for the reply */
14349 api_cop_whitelist_enable_disable (vat_main_t * vam)
14351 unformat_input_t *line_input = vam->input;
14352 vl_api_cop_whitelist_enable_disable_t *mp;
14353 u32 sw_if_index = ~0;
14354 u8 ip4 = 0, ip6 = 0, default_cop = 0;
14358 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14360 if (unformat (line_input, "ip4"))
14362 else if (unformat (line_input, "ip6"))
14364 else if (unformat (line_input, "default"))
14366 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
14367 vam, &sw_if_index))
14369 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14371 else if (unformat (line_input, "fib-id %d", &fib_id))
14377 if (sw_if_index == ~0)
14379 errmsg ("missing interface name or sw_if_index");
14383 /* Construct the API message */
14384 M (COP_WHITELIST_ENABLE_DISABLE, mp);
14385 mp->sw_if_index = ntohl (sw_if_index);
14386 mp->fib_id = ntohl (fib_id);
14389 mp->default_cop = default_cop;
14393 /* Wait for the reply */
14399 api_get_node_graph (vat_main_t * vam)
14401 vl_api_get_node_graph_t *mp;
14404 M (GET_NODE_GRAPH, mp);
14408 /* Wait for the reply */
14414 /** Used for parsing LISP eids */
14415 typedef CLIB_PACKED(struct{
14416 u8 addr[16]; /**< eid address */
14417 u32 len; /**< prefix length if IP */
14418 u8 type; /**< type of eid */
14423 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
14425 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
14427 memset (a, 0, sizeof (a[0]));
14429 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
14431 a->type = 0; /* ipv4 type */
14433 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
14435 a->type = 1; /* ipv6 type */
14437 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
14439 a->type = 2; /* mac type */
14441 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
14443 a->type = 3; /* NSH type */
14444 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
14445 nsh->spi = clib_host_to_net_u32 (nsh->spi);
14452 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
14461 lisp_eid_size_vat (u8 type)
14478 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
14480 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
14484 api_one_add_del_locator_set (vat_main_t * vam)
14486 unformat_input_t *input = vam->input;
14487 vl_api_one_add_del_locator_set_t *mp;
14489 u8 *locator_set_name = NULL;
14490 u8 locator_set_name_set = 0;
14491 vl_api_local_locator_t locator, *locators = 0;
14492 u32 sw_if_index, priority, weight;
14496 /* Parse args required to build the message */
14497 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14499 if (unformat (input, "del"))
14503 else if (unformat (input, "locator-set %s", &locator_set_name))
14505 locator_set_name_set = 1;
14507 else if (unformat (input, "sw_if_index %u p %u w %u",
14508 &sw_if_index, &priority, &weight))
14510 locator.sw_if_index = htonl (sw_if_index);
14511 locator.priority = priority;
14512 locator.weight = weight;
14513 vec_add1 (locators, locator);
14517 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
14518 &sw_if_index, &priority, &weight))
14520 locator.sw_if_index = htonl (sw_if_index);
14521 locator.priority = priority;
14522 locator.weight = weight;
14523 vec_add1 (locators, locator);
14529 if (locator_set_name_set == 0)
14531 errmsg ("missing locator-set name");
14532 vec_free (locators);
14536 if (vec_len (locator_set_name) > 64)
14538 errmsg ("locator-set name too long");
14539 vec_free (locator_set_name);
14540 vec_free (locators);
14543 vec_add1 (locator_set_name, 0);
14545 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
14547 /* Construct the API message */
14548 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
14550 mp->is_add = is_add;
14551 clib_memcpy (mp->locator_set_name, locator_set_name,
14552 vec_len (locator_set_name));
14553 vec_free (locator_set_name);
14555 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
14557 clib_memcpy (mp->locators, locators, data_len);
14558 vec_free (locators);
14563 /* Wait for a reply... */
14568 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
14571 api_one_add_del_locator (vat_main_t * vam)
14573 unformat_input_t *input = vam->input;
14574 vl_api_one_add_del_locator_t *mp;
14575 u32 tmp_if_index = ~0;
14576 u32 sw_if_index = ~0;
14577 u8 sw_if_index_set = 0;
14578 u8 sw_if_index_if_name_set = 0;
14580 u8 priority_set = 0;
14584 u8 *locator_set_name = NULL;
14585 u8 locator_set_name_set = 0;
14588 /* Parse args required to build the message */
14589 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14591 if (unformat (input, "del"))
14595 else if (unformat (input, "locator-set %s", &locator_set_name))
14597 locator_set_name_set = 1;
14599 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
14602 sw_if_index_if_name_set = 1;
14603 sw_if_index = tmp_if_index;
14605 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
14607 sw_if_index_set = 1;
14608 sw_if_index = tmp_if_index;
14610 else if (unformat (input, "p %d", &priority))
14614 else if (unformat (input, "w %d", &weight))
14622 if (locator_set_name_set == 0)
14624 errmsg ("missing locator-set name");
14628 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
14630 errmsg ("missing sw_if_index");
14631 vec_free (locator_set_name);
14635 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
14637 errmsg ("cannot use both params interface name and sw_if_index");
14638 vec_free (locator_set_name);
14642 if (priority_set == 0)
14644 errmsg ("missing locator-set priority");
14645 vec_free (locator_set_name);
14649 if (weight_set == 0)
14651 errmsg ("missing locator-set weight");
14652 vec_free (locator_set_name);
14656 if (vec_len (locator_set_name) > 64)
14658 errmsg ("locator-set name too long");
14659 vec_free (locator_set_name);
14662 vec_add1 (locator_set_name, 0);
14664 /* Construct the API message */
14665 M (ONE_ADD_DEL_LOCATOR, mp);
14667 mp->is_add = is_add;
14668 mp->sw_if_index = ntohl (sw_if_index);
14669 mp->priority = priority;
14670 mp->weight = weight;
14671 clib_memcpy (mp->locator_set_name, locator_set_name,
14672 vec_len (locator_set_name));
14673 vec_free (locator_set_name);
14678 /* Wait for a reply... */
14683 #define api_lisp_add_del_locator api_one_add_del_locator
14686 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
14688 u32 *key_id = va_arg (*args, u32 *);
14691 if (unformat (input, "%s", &s))
14693 if (!strcmp ((char *) s, "sha1"))
14694 key_id[0] = HMAC_SHA_1_96;
14695 else if (!strcmp ((char *) s, "sha256"))
14696 key_id[0] = HMAC_SHA_256_128;
14699 clib_warning ("invalid key_id: '%s'", s);
14700 key_id[0] = HMAC_NO_KEY;
14711 api_one_add_del_local_eid (vat_main_t * vam)
14713 unformat_input_t *input = vam->input;
14714 vl_api_one_add_del_local_eid_t *mp;
14717 lisp_eid_vat_t _eid, *eid = &_eid;
14718 u8 *locator_set_name = 0;
14719 u8 locator_set_name_set = 0;
14725 /* Parse args required to build the message */
14726 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14728 if (unformat (input, "del"))
14732 else if (unformat (input, "vni %d", &vni))
14736 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
14740 else if (unformat (input, "locator-set %s", &locator_set_name))
14742 locator_set_name_set = 1;
14744 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
14746 else if (unformat (input, "secret-key %_%v%_", &key))
14752 if (locator_set_name_set == 0)
14754 errmsg ("missing locator-set name");
14760 errmsg ("EID address not set!");
14761 vec_free (locator_set_name);
14765 if (key && (0 == key_id))
14767 errmsg ("invalid key_id!");
14771 if (vec_len (key) > 64)
14773 errmsg ("key too long");
14778 if (vec_len (locator_set_name) > 64)
14780 errmsg ("locator-set name too long");
14781 vec_free (locator_set_name);
14784 vec_add1 (locator_set_name, 0);
14786 /* Construct the API message */
14787 M (ONE_ADD_DEL_LOCAL_EID, mp);
14789 mp->is_add = is_add;
14790 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
14791 mp->eid_type = eid->type;
14792 mp->prefix_len = eid->len;
14793 mp->vni = clib_host_to_net_u32 (vni);
14794 mp->key_id = clib_host_to_net_u16 (key_id);
14795 clib_memcpy (mp->locator_set_name, locator_set_name,
14796 vec_len (locator_set_name));
14797 clib_memcpy (mp->key, key, vec_len (key));
14799 vec_free (locator_set_name);
14805 /* Wait for a reply... */
14810 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
14813 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
14815 u32 dp_table = 0, vni = 0;;
14816 unformat_input_t *input = vam->input;
14817 vl_api_gpe_add_del_fwd_entry_t *mp;
14819 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
14820 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
14821 u8 rmt_eid_set = 0, lcl_eid_set = 0;
14822 u32 action = ~0, w;
14823 ip4_address_t rmt_rloc4, lcl_rloc4;
14824 ip6_address_t rmt_rloc6, lcl_rloc6;
14825 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
14828 memset (&rloc, 0, sizeof (rloc));
14830 /* Parse args required to build the message */
14831 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14833 if (unformat (input, "del"))
14835 else if (unformat (input, "add"))
14837 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
14841 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
14845 else if (unformat (input, "vrf %d", &dp_table))
14847 else if (unformat (input, "bd %d", &dp_table))
14849 else if (unformat (input, "vni %d", &vni))
14851 else if (unformat (input, "w %d", &w))
14855 errmsg ("No RLOC configured for setting priority/weight!");
14858 curr_rloc->weight = w;
14860 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
14861 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
14865 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
14867 vec_add1 (lcl_locs, rloc);
14869 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
14870 vec_add1 (rmt_locs, rloc);
14871 /* weight saved in rmt loc */
14872 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
14874 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
14875 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
14878 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
14880 vec_add1 (lcl_locs, rloc);
14882 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
14883 vec_add1 (rmt_locs, rloc);
14884 /* weight saved in rmt loc */
14885 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
14887 else if (unformat (input, "action %d", &action))
14893 clib_warning ("parse error '%U'", format_unformat_error, input);
14900 errmsg ("remote eid addresses not set");
14904 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
14906 errmsg ("eid types don't match");
14910 if (0 == rmt_locs && (u32) ~ 0 == action)
14912 errmsg ("action not set for negative mapping");
14916 /* Construct the API message */
14917 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
14918 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
14920 mp->is_add = is_add;
14921 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
14922 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
14923 mp->eid_type = rmt_eid->type;
14924 mp->dp_table = clib_host_to_net_u32 (dp_table);
14925 mp->vni = clib_host_to_net_u32 (vni);
14926 mp->rmt_len = rmt_eid->len;
14927 mp->lcl_len = lcl_eid->len;
14928 mp->action = action;
14930 if (0 != rmt_locs && 0 != lcl_locs)
14932 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
14933 clib_memcpy (mp->locs, lcl_locs,
14934 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
14936 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
14937 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
14938 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
14940 vec_free (lcl_locs);
14941 vec_free (rmt_locs);
14946 /* Wait for a reply... */
14952 api_one_add_del_map_server (vat_main_t * vam)
14954 unformat_input_t *input = vam->input;
14955 vl_api_one_add_del_map_server_t *mp;
14959 ip4_address_t ipv4;
14960 ip6_address_t ipv6;
14963 /* Parse args required to build the message */
14964 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14966 if (unformat (input, "del"))
14970 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
14974 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
14982 if (ipv4_set && ipv6_set)
14984 errmsg ("both eid v4 and v6 addresses set");
14988 if (!ipv4_set && !ipv6_set)
14990 errmsg ("eid addresses not set");
14994 /* Construct the API message */
14995 M (ONE_ADD_DEL_MAP_SERVER, mp);
14997 mp->is_add = is_add;
15001 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
15006 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
15012 /* Wait for a reply... */
15017 #define api_lisp_add_del_map_server api_one_add_del_map_server
15020 api_one_add_del_map_resolver (vat_main_t * vam)
15022 unformat_input_t *input = vam->input;
15023 vl_api_one_add_del_map_resolver_t *mp;
15027 ip4_address_t ipv4;
15028 ip6_address_t ipv6;
15031 /* Parse args required to build the message */
15032 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15034 if (unformat (input, "del"))
15038 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
15042 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
15050 if (ipv4_set && ipv6_set)
15052 errmsg ("both eid v4 and v6 addresses set");
15056 if (!ipv4_set && !ipv6_set)
15058 errmsg ("eid addresses not set");
15062 /* Construct the API message */
15063 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
15065 mp->is_add = is_add;
15069 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
15074 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
15080 /* Wait for a reply... */
15085 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
15088 api_lisp_gpe_enable_disable (vat_main_t * vam)
15090 unformat_input_t *input = vam->input;
15091 vl_api_gpe_enable_disable_t *mp;
15096 /* Parse args required to build the message */
15097 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15099 if (unformat (input, "enable"))
15104 else if (unformat (input, "disable"))
15115 errmsg ("Value not set");
15119 /* Construct the API message */
15120 M (GPE_ENABLE_DISABLE, mp);
15127 /* Wait for a reply... */
15133 api_one_rloc_probe_enable_disable (vat_main_t * vam)
15135 unformat_input_t *input = vam->input;
15136 vl_api_one_rloc_probe_enable_disable_t *mp;
15141 /* Parse args required to build the message */
15142 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15144 if (unformat (input, "enable"))
15149 else if (unformat (input, "disable"))
15157 errmsg ("Value not set");
15161 /* Construct the API message */
15162 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
15164 mp->is_enabled = is_en;
15169 /* Wait for a reply... */
15174 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
15177 api_one_map_register_enable_disable (vat_main_t * vam)
15179 unformat_input_t *input = vam->input;
15180 vl_api_one_map_register_enable_disable_t *mp;
15185 /* Parse args required to build the message */
15186 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15188 if (unformat (input, "enable"))
15193 else if (unformat (input, "disable"))
15201 errmsg ("Value not set");
15205 /* Construct the API message */
15206 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
15208 mp->is_enabled = is_en;
15213 /* Wait for a reply... */
15218 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
15221 api_one_enable_disable (vat_main_t * vam)
15223 unformat_input_t *input = vam->input;
15224 vl_api_one_enable_disable_t *mp;
15229 /* Parse args required to build the message */
15230 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15232 if (unformat (input, "enable"))
15237 else if (unformat (input, "disable"))
15247 errmsg ("Value not set");
15251 /* Construct the API message */
15252 M (ONE_ENABLE_DISABLE, mp);
15259 /* Wait for a reply... */
15264 #define api_lisp_enable_disable api_one_enable_disable
15267 api_show_one_map_register_state (vat_main_t * vam)
15269 vl_api_show_one_map_register_state_t *mp;
15272 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
15277 /* wait for reply */
15282 #define api_show_lisp_map_register_state api_show_one_map_register_state
15285 api_show_one_rloc_probe_state (vat_main_t * vam)
15287 vl_api_show_one_rloc_probe_state_t *mp;
15290 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
15295 /* wait for reply */
15300 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
15303 api_one_add_del_l2_arp_entry (vat_main_t * vam)
15305 vl_api_one_add_del_l2_arp_entry_t *mp;
15306 unformat_input_t *input = vam->input;
15311 u8 mac[6] = { 0, };
15312 u32 ip4 = 0, bd = ~0;
15315 /* Parse args required to build the message */
15316 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15318 if (unformat (input, "del"))
15320 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
15322 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
15324 else if (unformat (input, "bd %d", &bd))
15328 errmsg ("parse error '%U'", format_unformat_error, input);
15333 if (!bd_set || !ip_set || (!mac_set && is_add))
15335 errmsg ("Missing BD, IP or MAC!");
15339 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
15340 mp->is_add = is_add;
15341 clib_memcpy (mp->mac, mac, 6);
15342 mp->bd = clib_host_to_net_u32 (bd);
15348 /* wait for reply */
15354 api_one_l2_arp_bd_get (vat_main_t * vam)
15356 vl_api_one_l2_arp_bd_get_t *mp;
15359 M (ONE_L2_ARP_BD_GET, mp);
15364 /* wait for reply */
15370 api_one_l2_arp_entries_get (vat_main_t * vam)
15372 vl_api_one_l2_arp_entries_get_t *mp;
15373 unformat_input_t *input = vam->input;
15378 /* Parse args required to build the message */
15379 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15381 if (unformat (input, "bd %d", &bd))
15385 errmsg ("parse error '%U'", format_unformat_error, input);
15392 errmsg ("Expected bridge domain!");
15396 M (ONE_L2_ARP_ENTRIES_GET, mp);
15397 mp->bd = clib_host_to_net_u32 (bd);
15402 /* wait for reply */
15408 api_one_stats_enable_disable (vat_main_t * vam)
15410 vl_api_one_stats_enable_disable_t *mp;
15411 unformat_input_t *input = vam->input;
15416 /* Parse args required to build the message */
15417 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15419 if (unformat (input, "enable"))
15424 else if (unformat (input, "disable"))
15434 errmsg ("Value not set");
15438 M (ONE_STATS_ENABLE_DISABLE, mp);
15444 /* wait for reply */
15450 api_show_one_stats_enable_disable (vat_main_t * vam)
15452 vl_api_show_one_stats_enable_disable_t *mp;
15455 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
15460 /* wait for reply */
15466 api_show_one_map_request_mode (vat_main_t * vam)
15468 vl_api_show_one_map_request_mode_t *mp;
15471 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
15476 /* wait for reply */
15481 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
15484 api_one_map_request_mode (vat_main_t * vam)
15486 unformat_input_t *input = vam->input;
15487 vl_api_one_map_request_mode_t *mp;
15491 /* Parse args required to build the message */
15492 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15494 if (unformat (input, "dst-only"))
15496 else if (unformat (input, "src-dst"))
15500 errmsg ("parse error '%U'", format_unformat_error, input);
15505 M (ONE_MAP_REQUEST_MODE, mp);
15512 /* wait for reply */
15517 #define api_lisp_map_request_mode api_one_map_request_mode
15520 * Enable/disable ONE proxy ITR.
15522 * @param vam vpp API test context
15523 * @return return code
15526 api_one_pitr_set_locator_set (vat_main_t * vam)
15528 u8 ls_name_set = 0;
15529 unformat_input_t *input = vam->input;
15530 vl_api_one_pitr_set_locator_set_t *mp;
15535 /* Parse args required to build the message */
15536 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15538 if (unformat (input, "del"))
15540 else if (unformat (input, "locator-set %s", &ls_name))
15544 errmsg ("parse error '%U'", format_unformat_error, input);
15551 errmsg ("locator-set name not set!");
15555 M (ONE_PITR_SET_LOCATOR_SET, mp);
15557 mp->is_add = is_add;
15558 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
15559 vec_free (ls_name);
15564 /* wait for reply */
15569 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
15572 api_one_nsh_set_locator_set (vat_main_t * vam)
15574 u8 ls_name_set = 0;
15575 unformat_input_t *input = vam->input;
15576 vl_api_one_nsh_set_locator_set_t *mp;
15581 /* Parse args required to build the message */
15582 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15584 if (unformat (input, "del"))
15586 else if (unformat (input, "ls %s", &ls_name))
15590 errmsg ("parse error '%U'", format_unformat_error, input);
15595 if (!ls_name_set && is_add)
15597 errmsg ("locator-set name not set!");
15601 M (ONE_NSH_SET_LOCATOR_SET, mp);
15603 mp->is_add = is_add;
15604 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
15605 vec_free (ls_name);
15610 /* wait for reply */
15616 api_show_one_pitr (vat_main_t * vam)
15618 vl_api_show_one_pitr_t *mp;
15621 if (!vam->json_output)
15623 print (vam->ofp, "%=20s", "lisp status:");
15626 M (SHOW_ONE_PITR, mp);
15630 /* Wait for a reply... */
15635 #define api_show_lisp_pitr api_show_one_pitr
15638 api_one_use_petr (vat_main_t * vam)
15640 unformat_input_t *input = vam->input;
15641 vl_api_one_use_petr_t *mp;
15646 memset (&ip, 0, sizeof (ip));
15648 /* Parse args required to build the message */
15649 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15651 if (unformat (input, "disable"))
15654 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
15657 ip_addr_version (&ip) = IP4;
15660 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
15663 ip_addr_version (&ip) = IP6;
15667 errmsg ("parse error '%U'", format_unformat_error, input);
15672 M (ONE_USE_PETR, mp);
15674 mp->is_add = is_add;
15677 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
15679 clib_memcpy (mp->address, &ip, 4);
15681 clib_memcpy (mp->address, &ip, 16);
15687 /* wait for reply */
15692 #define api_lisp_use_petr api_one_use_petr
15695 api_show_one_nsh_mapping (vat_main_t * vam)
15697 vl_api_show_one_use_petr_t *mp;
15700 if (!vam->json_output)
15702 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
15705 M (SHOW_ONE_NSH_MAPPING, mp);
15709 /* Wait for a reply... */
15715 api_show_one_use_petr (vat_main_t * vam)
15717 vl_api_show_one_use_petr_t *mp;
15720 if (!vam->json_output)
15722 print (vam->ofp, "%=20s", "Proxy-ETR status:");
15725 M (SHOW_ONE_USE_PETR, mp);
15729 /* Wait for a reply... */
15734 #define api_show_lisp_use_petr api_show_one_use_petr
15737 * Add/delete mapping between vni and vrf
15740 api_one_eid_table_add_del_map (vat_main_t * vam)
15742 unformat_input_t *input = vam->input;
15743 vl_api_one_eid_table_add_del_map_t *mp;
15744 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
15745 u32 vni, vrf, bd_index;
15748 /* Parse args required to build the message */
15749 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15751 if (unformat (input, "del"))
15753 else if (unformat (input, "vrf %d", &vrf))
15755 else if (unformat (input, "bd_index %d", &bd_index))
15757 else if (unformat (input, "vni %d", &vni))
15763 if (!vni_set || (!vrf_set && !bd_index_set))
15765 errmsg ("missing arguments!");
15769 if (vrf_set && bd_index_set)
15771 errmsg ("error: both vrf and bd entered!");
15775 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
15777 mp->is_add = is_add;
15778 mp->vni = htonl (vni);
15779 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
15780 mp->is_l2 = bd_index_set;
15785 /* wait for reply */
15790 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
15793 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
15795 u32 *action = va_arg (*args, u32 *);
15798 if (unformat (input, "%s", &s))
15800 if (!strcmp ((char *) s, "no-action"))
15802 else if (!strcmp ((char *) s, "natively-forward"))
15804 else if (!strcmp ((char *) s, "send-map-request"))
15806 else if (!strcmp ((char *) s, "drop"))
15810 clib_warning ("invalid action: '%s'", s);
15822 * Add/del remote mapping to/from ONE control plane
15824 * @param vam vpp API test context
15825 * @return return code
15828 api_one_add_del_remote_mapping (vat_main_t * vam)
15830 unformat_input_t *input = vam->input;
15831 vl_api_one_add_del_remote_mapping_t *mp;
15833 lisp_eid_vat_t _eid, *eid = &_eid;
15834 lisp_eid_vat_t _seid, *seid = &_seid;
15835 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
15836 u32 action = ~0, p, w, data_len;
15837 ip4_address_t rloc4;
15838 ip6_address_t rloc6;
15839 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
15842 memset (&rloc, 0, sizeof (rloc));
15844 /* Parse args required to build the message */
15845 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15847 if (unformat (input, "del-all"))
15851 else if (unformat (input, "del"))
15855 else if (unformat (input, "add"))
15859 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
15863 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
15867 else if (unformat (input, "vni %d", &vni))
15871 else if (unformat (input, "p %d w %d", &p, &w))
15875 errmsg ("No RLOC configured for setting priority/weight!");
15878 curr_rloc->priority = p;
15879 curr_rloc->weight = w;
15881 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
15884 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
15885 vec_add1 (rlocs, rloc);
15886 curr_rloc = &rlocs[vec_len (rlocs) - 1];
15888 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
15891 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
15892 vec_add1 (rlocs, rloc);
15893 curr_rloc = &rlocs[vec_len (rlocs) - 1];
15895 else if (unformat (input, "action %U",
15896 unformat_negative_mapping_action, &action))
15902 clib_warning ("parse error '%U'", format_unformat_error, input);
15909 errmsg ("missing params!");
15913 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
15915 errmsg ("no action set for negative map-reply!");
15919 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
15921 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
15922 mp->is_add = is_add;
15923 mp->vni = htonl (vni);
15924 mp->action = (u8) action;
15925 mp->is_src_dst = seid_set;
15926 mp->eid_len = eid->len;
15927 mp->seid_len = seid->len;
15928 mp->del_all = del_all;
15929 mp->eid_type = eid->type;
15930 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
15931 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
15933 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
15934 clib_memcpy (mp->rlocs, rlocs, data_len);
15940 /* Wait for a reply... */
15945 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
15948 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
15949 * forwarding entries in data-plane accordingly.
15951 * @param vam vpp API test context
15952 * @return return code
15955 api_one_add_del_adjacency (vat_main_t * vam)
15957 unformat_input_t *input = vam->input;
15958 vl_api_one_add_del_adjacency_t *mp;
15960 ip4_address_t leid4, reid4;
15961 ip6_address_t leid6, reid6;
15962 u8 reid_mac[6] = { 0 };
15963 u8 leid_mac[6] = { 0 };
15964 u8 reid_type, leid_type;
15965 u32 leid_len = 0, reid_len = 0, len;
15969 leid_type = reid_type = (u8) ~ 0;
15971 /* Parse args required to build the message */
15972 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15974 if (unformat (input, "del"))
15978 else if (unformat (input, "add"))
15982 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
15985 reid_type = 0; /* ipv4 */
15988 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
15991 reid_type = 1; /* ipv6 */
15994 else if (unformat (input, "reid %U", unformat_ethernet_address,
15997 reid_type = 2; /* mac */
15999 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
16002 leid_type = 0; /* ipv4 */
16005 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
16008 leid_type = 1; /* ipv6 */
16011 else if (unformat (input, "leid %U", unformat_ethernet_address,
16014 leid_type = 2; /* mac */
16016 else if (unformat (input, "vni %d", &vni))
16022 errmsg ("parse error '%U'", format_unformat_error, input);
16027 if ((u8) ~ 0 == reid_type)
16029 errmsg ("missing params!");
16033 if (leid_type != reid_type)
16035 errmsg ("remote and local EIDs are of different types!");
16039 M (ONE_ADD_DEL_ADJACENCY, mp);
16040 mp->is_add = is_add;
16041 mp->vni = htonl (vni);
16042 mp->leid_len = leid_len;
16043 mp->reid_len = reid_len;
16044 mp->eid_type = reid_type;
16046 switch (mp->eid_type)
16049 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
16050 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
16053 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
16054 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
16057 clib_memcpy (mp->leid, leid_mac, 6);
16058 clib_memcpy (mp->reid, reid_mac, 6);
16061 errmsg ("unknown EID type %d!", mp->eid_type);
16068 /* Wait for a reply... */
16073 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
16076 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
16078 u32 *mode = va_arg (*args, u32 *);
16080 if (unformat (input, "lisp"))
16082 else if (unformat (input, "vxlan"))
16091 api_gpe_get_encap_mode (vat_main_t * vam)
16093 vl_api_gpe_get_encap_mode_t *mp;
16096 /* Construct the API message */
16097 M (GPE_GET_ENCAP_MODE, mp);
16102 /* Wait for a reply... */
16108 api_gpe_set_encap_mode (vat_main_t * vam)
16110 unformat_input_t *input = vam->input;
16111 vl_api_gpe_set_encap_mode_t *mp;
16115 /* Parse args required to build the message */
16116 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16118 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
16124 /* Construct the API message */
16125 M (GPE_SET_ENCAP_MODE, mp);
16132 /* Wait for a reply... */
16138 api_lisp_gpe_add_del_iface (vat_main_t * vam)
16140 unformat_input_t *input = vam->input;
16141 vl_api_gpe_add_del_iface_t *mp;
16142 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
16143 u32 dp_table = 0, vni = 0;
16146 /* Parse args required to build the message */
16147 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16149 if (unformat (input, "up"))
16154 else if (unformat (input, "down"))
16159 else if (unformat (input, "table_id %d", &dp_table))
16163 else if (unformat (input, "bd_id %d", &dp_table))
16168 else if (unformat (input, "vni %d", &vni))
16176 if (action_set == 0)
16178 errmsg ("Action not set");
16181 if (dp_table_set == 0 || vni_set == 0)
16183 errmsg ("vni and dp_table must be set");
16187 /* Construct the API message */
16188 M (GPE_ADD_DEL_IFACE, mp);
16190 mp->is_add = is_add;
16191 mp->dp_table = clib_host_to_net_u32 (dp_table);
16193 mp->vni = clib_host_to_net_u32 (vni);
16198 /* Wait for a reply... */
16204 api_one_map_register_fallback_threshold (vat_main_t * vam)
16206 unformat_input_t *input = vam->input;
16207 vl_api_one_map_register_fallback_threshold_t *mp;
16212 /* Parse args required to build the message */
16213 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16215 if (unformat (input, "%u", &value))
16219 clib_warning ("parse error '%U'", format_unformat_error, input);
16226 errmsg ("fallback threshold value is missing!");
16230 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
16231 mp->value = clib_host_to_net_u32 (value);
16236 /* Wait for a reply... */
16242 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
16244 vl_api_show_one_map_register_fallback_threshold_t *mp;
16247 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
16252 /* Wait for a reply... */
16258 api_one_map_register_set_ttl (vat_main_t * vam)
16260 unformat_input_t *input = vam->input;
16261 vl_api_one_map_register_set_ttl_t *mp;
16266 /* Parse args required to build the message */
16267 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16269 if (unformat (input, "%u", &ttl))
16273 clib_warning ("parse error '%U'", format_unformat_error, input);
16280 errmsg ("TTL value missing!");
16284 M (ONE_MAP_REGISTER_SET_TTL, mp);
16285 mp->ttl = clib_host_to_net_u32 (ttl);
16290 /* Wait for a reply... */
16296 api_show_one_map_register_ttl (vat_main_t * vam)
16298 vl_api_show_one_map_register_ttl_t *mp;
16301 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
16306 /* Wait for a reply... */
16312 * Add/del map request itr rlocs from ONE control plane and updates
16314 * @param vam vpp API test context
16315 * @return return code
16318 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
16320 unformat_input_t *input = vam->input;
16321 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
16322 u8 *locator_set_name = 0;
16323 u8 locator_set_name_set = 0;
16327 /* Parse args required to build the message */
16328 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16330 if (unformat (input, "del"))
16334 else if (unformat (input, "%_%v%_", &locator_set_name))
16336 locator_set_name_set = 1;
16340 clib_warning ("parse error '%U'", format_unformat_error, input);
16345 if (is_add && !locator_set_name_set)
16347 errmsg ("itr-rloc is not set!");
16351 if (is_add && vec_len (locator_set_name) > 64)
16353 errmsg ("itr-rloc locator-set name too long");
16354 vec_free (locator_set_name);
16358 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
16359 mp->is_add = is_add;
16362 clib_memcpy (mp->locator_set_name, locator_set_name,
16363 vec_len (locator_set_name));
16367 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
16369 vec_free (locator_set_name);
16374 /* Wait for a reply... */
16379 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
16382 api_one_locator_dump (vat_main_t * vam)
16384 unformat_input_t *input = vam->input;
16385 vl_api_one_locator_dump_t *mp;
16386 vl_api_control_ping_t *mp_ping;
16387 u8 is_index_set = 0, is_name_set = 0;
16392 /* Parse args required to build the message */
16393 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16395 if (unformat (input, "ls_name %_%v%_", &ls_name))
16399 else if (unformat (input, "ls_index %d", &ls_index))
16405 errmsg ("parse error '%U'", format_unformat_error, input);
16410 if (!is_index_set && !is_name_set)
16412 errmsg ("error: expected one of index or name!");
16416 if (is_index_set && is_name_set)
16418 errmsg ("error: only one param expected!");
16422 if (vec_len (ls_name) > 62)
16424 errmsg ("error: locator set name too long!");
16428 if (!vam->json_output)
16430 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
16433 M (ONE_LOCATOR_DUMP, mp);
16434 mp->is_index_set = is_index_set;
16437 mp->ls_index = clib_host_to_net_u32 (ls_index);
16440 vec_add1 (ls_name, 0);
16441 strncpy ((char *) mp->ls_name, (char *) ls_name,
16442 sizeof (mp->ls_name) - 1);
16448 /* Use a control ping for synchronization */
16449 M (CONTROL_PING, mp_ping);
16452 /* Wait for a reply... */
16457 #define api_lisp_locator_dump api_one_locator_dump
16460 api_one_locator_set_dump (vat_main_t * vam)
16462 vl_api_one_locator_set_dump_t *mp;
16463 vl_api_control_ping_t *mp_ping;
16464 unformat_input_t *input = vam->input;
16468 /* Parse args required to build the message */
16469 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16471 if (unformat (input, "local"))
16475 else if (unformat (input, "remote"))
16481 errmsg ("parse error '%U'", format_unformat_error, input);
16486 if (!vam->json_output)
16488 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
16491 M (ONE_LOCATOR_SET_DUMP, mp);
16493 mp->filter = filter;
16498 /* Use a control ping for synchronization */
16499 M (CONTROL_PING, mp_ping);
16502 /* Wait for a reply... */
16507 #define api_lisp_locator_set_dump api_one_locator_set_dump
16510 api_one_eid_table_map_dump (vat_main_t * vam)
16514 unformat_input_t *input = vam->input;
16515 vl_api_one_eid_table_map_dump_t *mp;
16516 vl_api_control_ping_t *mp_ping;
16519 /* Parse args required to build the message */
16520 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16522 if (unformat (input, "l2"))
16527 else if (unformat (input, "l3"))
16534 errmsg ("parse error '%U'", format_unformat_error, input);
16541 errmsg ("expected one of 'l2' or 'l3' parameter!");
16545 if (!vam->json_output)
16547 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
16550 M (ONE_EID_TABLE_MAP_DUMP, mp);
16556 /* Use a control ping for synchronization */
16557 M (CONTROL_PING, mp_ping);
16560 /* Wait for a reply... */
16565 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
16568 api_one_eid_table_vni_dump (vat_main_t * vam)
16570 vl_api_one_eid_table_vni_dump_t *mp;
16571 vl_api_control_ping_t *mp_ping;
16574 if (!vam->json_output)
16576 print (vam->ofp, "VNI");
16579 M (ONE_EID_TABLE_VNI_DUMP, mp);
16584 /* Use a control ping for synchronization */
16585 M (CONTROL_PING, mp_ping);
16588 /* Wait for a reply... */
16593 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
16596 api_one_eid_table_dump (vat_main_t * vam)
16598 unformat_input_t *i = vam->input;
16599 vl_api_one_eid_table_dump_t *mp;
16600 vl_api_control_ping_t *mp_ping;
16601 struct in_addr ip4;
16602 struct in6_addr ip6;
16604 u8 eid_type = ~0, eid_set = 0;
16605 u32 prefix_length = ~0, t, vni = 0;
16608 lisp_nsh_api_t nsh;
16610 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16612 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
16618 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
16624 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
16629 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
16634 else if (unformat (i, "vni %d", &t))
16638 else if (unformat (i, "local"))
16642 else if (unformat (i, "remote"))
16648 errmsg ("parse error '%U'", format_unformat_error, i);
16653 if (!vam->json_output)
16655 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
16656 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
16659 M (ONE_EID_TABLE_DUMP, mp);
16661 mp->filter = filter;
16665 mp->vni = htonl (vni);
16666 mp->eid_type = eid_type;
16670 mp->prefix_length = prefix_length;
16671 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
16674 mp->prefix_length = prefix_length;
16675 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
16678 clib_memcpy (mp->eid, mac, sizeof (mac));
16681 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
16684 errmsg ("unknown EID type %d!", eid_type);
16692 /* Use a control ping for synchronization */
16693 M (CONTROL_PING, mp_ping);
16696 /* Wait for a reply... */
16701 #define api_lisp_eid_table_dump api_one_eid_table_dump
16704 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
16706 unformat_input_t *i = vam->input;
16707 vl_api_gpe_fwd_entries_get_t *mp;
16712 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16714 if (unformat (i, "vni %d", &vni))
16720 errmsg ("parse error '%U'", format_unformat_error, i);
16727 errmsg ("vni not set!");
16731 if (!vam->json_output)
16733 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
16737 M (GPE_FWD_ENTRIES_GET, mp);
16738 mp->vni = clib_host_to_net_u32 (vni);
16743 /* Wait for a reply... */
16748 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
16749 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
16750 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
16751 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
16752 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
16753 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
16754 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
16755 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
16758 api_one_adjacencies_get (vat_main_t * vam)
16760 unformat_input_t *i = vam->input;
16761 vl_api_one_adjacencies_get_t *mp;
16766 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16768 if (unformat (i, "vni %d", &vni))
16774 errmsg ("parse error '%U'", format_unformat_error, i);
16781 errmsg ("vni not set!");
16785 if (!vam->json_output)
16787 print (vam->ofp, "%s %40s", "leid", "reid");
16790 M (ONE_ADJACENCIES_GET, mp);
16791 mp->vni = clib_host_to_net_u32 (vni);
16796 /* Wait for a reply... */
16801 #define api_lisp_adjacencies_get api_one_adjacencies_get
16804 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
16806 unformat_input_t *i = vam->input;
16807 vl_api_gpe_native_fwd_rpaths_get_t *mp;
16809 u8 ip_family_set = 0, is_ip4 = 1;
16811 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16813 if (unformat (i, "ip4"))
16818 else if (unformat (i, "ip6"))
16825 errmsg ("parse error '%U'", format_unformat_error, i);
16830 if (!ip_family_set)
16832 errmsg ("ip family not set!");
16836 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
16837 mp->is_ip4 = is_ip4;
16842 /* Wait for a reply... */
16848 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
16850 vl_api_gpe_fwd_entry_vnis_get_t *mp;
16853 if (!vam->json_output)
16855 print (vam->ofp, "VNIs");
16858 M (GPE_FWD_ENTRY_VNIS_GET, mp);
16863 /* Wait for a reply... */
16869 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
16871 unformat_input_t *i = vam->input;
16872 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
16874 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
16875 struct in_addr ip4;
16876 struct in6_addr ip6;
16877 u32 table_id = 0, nh_sw_if_index = ~0;
16879 memset (&ip4, 0, sizeof (ip4));
16880 memset (&ip6, 0, sizeof (ip6));
16882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16884 if (unformat (i, "del"))
16886 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
16887 api_unformat_sw_if_index, vam, &nh_sw_if_index))
16892 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
16893 api_unformat_sw_if_index, vam, &nh_sw_if_index))
16898 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
16902 nh_sw_if_index = ~0;
16904 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
16908 nh_sw_if_index = ~0;
16910 else if (unformat (i, "table %d", &table_id))
16914 errmsg ("parse error '%U'", format_unformat_error, i);
16921 errmsg ("nh addr not set!");
16925 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
16926 mp->is_add = is_add;
16927 mp->table_id = clib_host_to_net_u32 (table_id);
16928 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
16929 mp->is_ip4 = is_ip4;
16931 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
16933 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
16938 /* Wait for a reply... */
16944 api_one_map_server_dump (vat_main_t * vam)
16946 vl_api_one_map_server_dump_t *mp;
16947 vl_api_control_ping_t *mp_ping;
16950 if (!vam->json_output)
16952 print (vam->ofp, "%=20s", "Map server");
16955 M (ONE_MAP_SERVER_DUMP, mp);
16959 /* Use a control ping for synchronization */
16960 M (CONTROL_PING, mp_ping);
16963 /* Wait for a reply... */
16968 #define api_lisp_map_server_dump api_one_map_server_dump
16971 api_one_map_resolver_dump (vat_main_t * vam)
16973 vl_api_one_map_resolver_dump_t *mp;
16974 vl_api_control_ping_t *mp_ping;
16977 if (!vam->json_output)
16979 print (vam->ofp, "%=20s", "Map resolver");
16982 M (ONE_MAP_RESOLVER_DUMP, mp);
16986 /* Use a control ping for synchronization */
16987 M (CONTROL_PING, mp_ping);
16990 /* Wait for a reply... */
16995 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
16998 api_one_stats_flush (vat_main_t * vam)
17000 vl_api_one_stats_flush_t *mp;
17003 M (ONE_STATS_FLUSH, mp);
17010 api_one_stats_dump (vat_main_t * vam)
17012 vl_api_one_stats_dump_t *mp;
17013 vl_api_control_ping_t *mp_ping;
17016 M (ONE_STATS_DUMP, mp);
17020 /* Use a control ping for synchronization */
17021 M (CONTROL_PING, mp_ping);
17024 /* Wait for a reply... */
17030 api_show_one_status (vat_main_t * vam)
17032 vl_api_show_one_status_t *mp;
17035 if (!vam->json_output)
17037 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
17040 M (SHOW_ONE_STATUS, mp);
17043 /* Wait for a reply... */
17048 #define api_show_lisp_status api_show_one_status
17051 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
17053 vl_api_gpe_fwd_entry_path_dump_t *mp;
17054 vl_api_control_ping_t *mp_ping;
17055 unformat_input_t *i = vam->input;
17056 u32 fwd_entry_index = ~0;
17059 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17061 if (unformat (i, "index %d", &fwd_entry_index))
17067 if (~0 == fwd_entry_index)
17069 errmsg ("no index specified!");
17073 if (!vam->json_output)
17075 print (vam->ofp, "first line");
17078 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
17082 /* Use a control ping for synchronization */
17083 M (CONTROL_PING, mp_ping);
17086 /* Wait for a reply... */
17092 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
17094 vl_api_one_get_map_request_itr_rlocs_t *mp;
17097 if (!vam->json_output)
17099 print (vam->ofp, "%=20s", "itr-rlocs:");
17102 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
17105 /* Wait for a reply... */
17110 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
17113 api_af_packet_create (vat_main_t * vam)
17115 unformat_input_t *i = vam->input;
17116 vl_api_af_packet_create_t *mp;
17117 u8 *host_if_name = 0;
17119 u8 random_hw_addr = 1;
17122 memset (hw_addr, 0, sizeof (hw_addr));
17124 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17126 if (unformat (i, "name %s", &host_if_name))
17127 vec_add1 (host_if_name, 0);
17128 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
17129 random_hw_addr = 0;
17134 if (!vec_len (host_if_name))
17136 errmsg ("host-interface name must be specified");
17140 if (vec_len (host_if_name) > 64)
17142 errmsg ("host-interface name too long");
17146 M (AF_PACKET_CREATE, mp);
17148 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
17149 clib_memcpy (mp->hw_addr, hw_addr, 6);
17150 mp->use_random_hw_addr = random_hw_addr;
17151 vec_free (host_if_name);
17159 fprintf (vam->ofp ? vam->ofp : stderr,
17160 " new sw_if_index = %d\n", vam->sw_if_index);
17167 api_af_packet_delete (vat_main_t * vam)
17169 unformat_input_t *i = vam->input;
17170 vl_api_af_packet_delete_t *mp;
17171 u8 *host_if_name = 0;
17174 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17176 if (unformat (i, "name %s", &host_if_name))
17177 vec_add1 (host_if_name, 0);
17182 if (!vec_len (host_if_name))
17184 errmsg ("host-interface name must be specified");
17188 if (vec_len (host_if_name) > 64)
17190 errmsg ("host-interface name too long");
17194 M (AF_PACKET_DELETE, mp);
17196 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
17197 vec_free (host_if_name);
17205 api_policer_add_del (vat_main_t * vam)
17207 unformat_input_t *i = vam->input;
17208 vl_api_policer_add_del_t *mp;
17218 u8 color_aware = 0;
17219 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
17222 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
17223 conform_action.dscp = 0;
17224 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
17225 exceed_action.dscp = 0;
17226 violate_action.action_type = SSE2_QOS_ACTION_DROP;
17227 violate_action.dscp = 0;
17229 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17231 if (unformat (i, "del"))
17233 else if (unformat (i, "name %s", &name))
17234 vec_add1 (name, 0);
17235 else if (unformat (i, "cir %u", &cir))
17237 else if (unformat (i, "eir %u", &eir))
17239 else if (unformat (i, "cb %u", &cb))
17241 else if (unformat (i, "eb %u", &eb))
17243 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
17246 else if (unformat (i, "round_type %U", unformat_policer_round_type,
17249 else if (unformat (i, "type %U", unformat_policer_type, &type))
17251 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
17254 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
17257 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
17260 else if (unformat (i, "color-aware"))
17266 if (!vec_len (name))
17268 errmsg ("policer name must be specified");
17272 if (vec_len (name) > 64)
17274 errmsg ("policer name too long");
17278 M (POLICER_ADD_DEL, mp);
17280 clib_memcpy (mp->name, name, vec_len (name));
17282 mp->is_add = is_add;
17287 mp->rate_type = rate_type;
17288 mp->round_type = round_type;
17290 mp->conform_action_type = conform_action.action_type;
17291 mp->conform_dscp = conform_action.dscp;
17292 mp->exceed_action_type = exceed_action.action_type;
17293 mp->exceed_dscp = exceed_action.dscp;
17294 mp->violate_action_type = violate_action.action_type;
17295 mp->violate_dscp = violate_action.dscp;
17296 mp->color_aware = color_aware;
17304 api_policer_dump (vat_main_t * vam)
17306 unformat_input_t *i = vam->input;
17307 vl_api_policer_dump_t *mp;
17308 vl_api_control_ping_t *mp_ping;
17309 u8 *match_name = 0;
17310 u8 match_name_valid = 0;
17313 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17315 if (unformat (i, "name %s", &match_name))
17317 vec_add1 (match_name, 0);
17318 match_name_valid = 1;
17324 M (POLICER_DUMP, mp);
17325 mp->match_name_valid = match_name_valid;
17326 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
17327 vec_free (match_name);
17331 /* Use a control ping for synchronization */
17332 M (CONTROL_PING, mp_ping);
17335 /* Wait for a reply... */
17341 api_policer_classify_set_interface (vat_main_t * vam)
17343 unformat_input_t *i = vam->input;
17344 vl_api_policer_classify_set_interface_t *mp;
17346 int sw_if_index_set;
17347 u32 ip4_table_index = ~0;
17348 u32 ip6_table_index = ~0;
17349 u32 l2_table_index = ~0;
17353 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17355 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
17356 sw_if_index_set = 1;
17357 else if (unformat (i, "sw_if_index %d", &sw_if_index))
17358 sw_if_index_set = 1;
17359 else if (unformat (i, "del"))
17361 else if (unformat (i, "ip4-table %d", &ip4_table_index))
17363 else if (unformat (i, "ip6-table %d", &ip6_table_index))
17365 else if (unformat (i, "l2-table %d", &l2_table_index))
17369 clib_warning ("parse error '%U'", format_unformat_error, i);
17374 if (sw_if_index_set == 0)
17376 errmsg ("missing interface name or sw_if_index");
17380 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
17382 mp->sw_if_index = ntohl (sw_if_index);
17383 mp->ip4_table_index = ntohl (ip4_table_index);
17384 mp->ip6_table_index = ntohl (ip6_table_index);
17385 mp->l2_table_index = ntohl (l2_table_index);
17386 mp->is_add = is_add;
17394 api_policer_classify_dump (vat_main_t * vam)
17396 unformat_input_t *i = vam->input;
17397 vl_api_policer_classify_dump_t *mp;
17398 vl_api_control_ping_t *mp_ping;
17399 u8 type = POLICER_CLASSIFY_N_TABLES;
17402 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
17406 errmsg ("classify table type must be specified");
17410 if (!vam->json_output)
17412 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
17415 M (POLICER_CLASSIFY_DUMP, mp);
17420 /* Use a control ping for synchronization */
17421 M (CONTROL_PING, mp_ping);
17424 /* Wait for a reply... */
17430 api_netmap_create (vat_main_t * vam)
17432 unformat_input_t *i = vam->input;
17433 vl_api_netmap_create_t *mp;
17436 u8 random_hw_addr = 1;
17441 memset (hw_addr, 0, sizeof (hw_addr));
17443 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17445 if (unformat (i, "name %s", &if_name))
17446 vec_add1 (if_name, 0);
17447 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
17448 random_hw_addr = 0;
17449 else if (unformat (i, "pipe"))
17451 else if (unformat (i, "master"))
17453 else if (unformat (i, "slave"))
17459 if (!vec_len (if_name))
17461 errmsg ("interface name must be specified");
17465 if (vec_len (if_name) > 64)
17467 errmsg ("interface name too long");
17471 M (NETMAP_CREATE, mp);
17473 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
17474 clib_memcpy (mp->hw_addr, hw_addr, 6);
17475 mp->use_random_hw_addr = random_hw_addr;
17476 mp->is_pipe = is_pipe;
17477 mp->is_master = is_master;
17478 vec_free (if_name);
17486 api_netmap_delete (vat_main_t * vam)
17488 unformat_input_t *i = vam->input;
17489 vl_api_netmap_delete_t *mp;
17493 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17495 if (unformat (i, "name %s", &if_name))
17496 vec_add1 (if_name, 0);
17501 if (!vec_len (if_name))
17503 errmsg ("interface name must be specified");
17507 if (vec_len (if_name) > 64)
17509 errmsg ("interface name too long");
17513 M (NETMAP_DELETE, mp);
17515 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
17516 vec_free (if_name);
17524 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path2_t * fp)
17526 if (fp->afi == IP46_TYPE_IP6)
17528 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17529 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17530 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17531 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17532 format_ip6_address, fp->next_hop);
17533 else if (fp->afi == IP46_TYPE_IP4)
17535 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17536 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17537 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17538 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17539 format_ip4_address, fp->next_hop);
17543 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
17544 vl_api_fib_path2_t * fp)
17546 struct in_addr ip4;
17547 struct in6_addr ip6;
17549 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
17550 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
17551 vat_json_object_add_uint (node, "is_local", fp->is_local);
17552 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
17553 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
17554 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
17555 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
17556 if (fp->afi == IP46_TYPE_IP4)
17558 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
17559 vat_json_object_add_ip4 (node, "next_hop", ip4);
17561 else if (fp->afi == IP46_TYPE_IP6)
17563 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
17564 vat_json_object_add_ip6 (node, "next_hop", ip6);
17569 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
17571 vat_main_t *vam = &vat_main;
17572 int count = ntohl (mp->mt_count);
17573 vl_api_fib_path2_t *fp;
17576 print (vam->ofp, "[%d]: sw_if_index %d via:",
17577 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
17579 for (i = 0; i < count; i++)
17581 vl_api_mpls_fib_path_print (vam, fp);
17585 print (vam->ofp, "");
17588 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
17589 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
17592 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
17594 vat_main_t *vam = &vat_main;
17595 vat_json_node_t *node = NULL;
17596 int count = ntohl (mp->mt_count);
17597 vl_api_fib_path2_t *fp;
17600 if (VAT_JSON_ARRAY != vam->json_tree.type)
17602 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
17603 vat_json_init_array (&vam->json_tree);
17605 node = vat_json_array_add (&vam->json_tree);
17607 vat_json_init_object (node);
17608 vat_json_object_add_uint (node, "tunnel_index",
17609 ntohl (mp->mt_tunnel_index));
17610 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
17612 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
17615 for (i = 0; i < count; i++)
17617 vl_api_mpls_fib_path_json_print (node, fp);
17623 api_mpls_tunnel_dump (vat_main_t * vam)
17625 vl_api_mpls_tunnel_dump_t *mp;
17626 vl_api_control_ping_t *mp_ping;
17630 /* Parse args required to build the message */
17631 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
17633 if (!unformat (vam->input, "tunnel_index %d", &index))
17640 print (vam->ofp, " tunnel_index %d", index);
17642 M (MPLS_TUNNEL_DUMP, mp);
17643 mp->tunnel_index = htonl (index);
17646 /* Use a control ping for synchronization */
17647 M (CONTROL_PING, mp_ping);
17654 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
17655 #define vl_api_mpls_fib_details_t_print vl_noop_handler
17659 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
17661 vat_main_t *vam = &vat_main;
17662 int count = ntohl (mp->count);
17663 vl_api_fib_path2_t *fp;
17667 "table-id %d, label %u, ess_bit %u",
17668 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
17670 for (i = 0; i < count; i++)
17672 vl_api_mpls_fib_path_print (vam, fp);
17677 static void vl_api_mpls_fib_details_t_handler_json
17678 (vl_api_mpls_fib_details_t * mp)
17680 vat_main_t *vam = &vat_main;
17681 int count = ntohl (mp->count);
17682 vat_json_node_t *node = NULL;
17683 vl_api_fib_path2_t *fp;
17686 if (VAT_JSON_ARRAY != vam->json_tree.type)
17688 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
17689 vat_json_init_array (&vam->json_tree);
17691 node = vat_json_array_add (&vam->json_tree);
17693 vat_json_init_object (node);
17694 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
17695 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
17696 vat_json_object_add_uint (node, "label", ntohl (mp->label));
17697 vat_json_object_add_uint (node, "path_count", count);
17699 for (i = 0; i < count; i++)
17701 vl_api_mpls_fib_path_json_print (node, fp);
17707 api_mpls_fib_dump (vat_main_t * vam)
17709 vl_api_mpls_fib_dump_t *mp;
17710 vl_api_control_ping_t *mp_ping;
17713 M (MPLS_FIB_DUMP, mp);
17716 /* Use a control ping for synchronization */
17717 M (CONTROL_PING, mp_ping);
17724 #define vl_api_ip_fib_details_t_endian vl_noop_handler
17725 #define vl_api_ip_fib_details_t_print vl_noop_handler
17728 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
17730 vat_main_t *vam = &vat_main;
17731 int count = ntohl (mp->count);
17732 vl_api_fib_path_t *fp;
17736 "table-id %d, prefix %U/%d",
17737 ntohl (mp->table_id), format_ip4_address, mp->address,
17738 mp->address_length);
17740 for (i = 0; i < count; i++)
17742 if (fp->afi == IP46_TYPE_IP6)
17744 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17745 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17746 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17747 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17748 format_ip6_address, fp->next_hop);
17749 else if (fp->afi == IP46_TYPE_IP4)
17751 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17752 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17753 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17754 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17755 format_ip4_address, fp->next_hop);
17760 static void vl_api_ip_fib_details_t_handler_json
17761 (vl_api_ip_fib_details_t * mp)
17763 vat_main_t *vam = &vat_main;
17764 int count = ntohl (mp->count);
17765 vat_json_node_t *node = NULL;
17766 struct in_addr ip4;
17767 struct in6_addr ip6;
17768 vl_api_fib_path_t *fp;
17771 if (VAT_JSON_ARRAY != vam->json_tree.type)
17773 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
17774 vat_json_init_array (&vam->json_tree);
17776 node = vat_json_array_add (&vam->json_tree);
17778 vat_json_init_object (node);
17779 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
17780 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
17781 vat_json_object_add_ip4 (node, "prefix", ip4);
17782 vat_json_object_add_uint (node, "mask_length", mp->address_length);
17783 vat_json_object_add_uint (node, "path_count", count);
17785 for (i = 0; i < count; i++)
17787 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
17788 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
17789 vat_json_object_add_uint (node, "is_local", fp->is_local);
17790 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
17791 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
17792 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
17793 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
17794 if (fp->afi == IP46_TYPE_IP4)
17796 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
17797 vat_json_object_add_ip4 (node, "next_hop", ip4);
17799 else if (fp->afi == IP46_TYPE_IP6)
17801 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
17802 vat_json_object_add_ip6 (node, "next_hop", ip6);
17808 api_ip_fib_dump (vat_main_t * vam)
17810 vl_api_ip_fib_dump_t *mp;
17811 vl_api_control_ping_t *mp_ping;
17814 M (IP_FIB_DUMP, mp);
17817 /* Use a control ping for synchronization */
17818 M (CONTROL_PING, mp_ping);
17826 api_ip_mfib_dump (vat_main_t * vam)
17828 vl_api_ip_mfib_dump_t *mp;
17829 vl_api_control_ping_t *mp_ping;
17832 M (IP_MFIB_DUMP, mp);
17835 /* Use a control ping for synchronization */
17836 M (CONTROL_PING, mp_ping);
17843 static void vl_api_ip_neighbor_details_t_handler
17844 (vl_api_ip_neighbor_details_t * mp)
17846 vat_main_t *vam = &vat_main;
17848 print (vam->ofp, "%c %U %U",
17849 (mp->is_static) ? 'S' : 'D',
17850 format_ethernet_address, &mp->mac_address,
17851 (mp->is_ipv6) ? format_ip6_address : format_ip4_address,
17855 static void vl_api_ip_neighbor_details_t_handler_json
17856 (vl_api_ip_neighbor_details_t * mp)
17859 vat_main_t *vam = &vat_main;
17860 vat_json_node_t *node;
17861 struct in_addr ip4;
17862 struct in6_addr ip6;
17864 if (VAT_JSON_ARRAY != vam->json_tree.type)
17866 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
17867 vat_json_init_array (&vam->json_tree);
17869 node = vat_json_array_add (&vam->json_tree);
17871 vat_json_init_object (node);
17872 vat_json_object_add_string_copy (node, "flag",
17873 (mp->is_static) ? (u8 *) "static" : (u8 *)
17876 vat_json_object_add_string_copy (node, "link_layer",
17877 format (0, "%U", format_ethernet_address,
17878 &mp->mac_address));
17882 clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6));
17883 vat_json_object_add_ip6 (node, "ip_address", ip6);
17887 clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4));
17888 vat_json_object_add_ip4 (node, "ip_address", ip4);
17893 api_ip_neighbor_dump (vat_main_t * vam)
17895 unformat_input_t *i = vam->input;
17896 vl_api_ip_neighbor_dump_t *mp;
17897 vl_api_control_ping_t *mp_ping;
17899 u32 sw_if_index = ~0;
17902 /* Parse args required to build the message */
17903 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17905 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
17907 else if (unformat (i, "sw_if_index %d", &sw_if_index))
17909 else if (unformat (i, "ip6"))
17915 if (sw_if_index == ~0)
17917 errmsg ("missing interface name or sw_if_index");
17921 M (IP_NEIGHBOR_DUMP, mp);
17922 mp->is_ipv6 = (u8) is_ipv6;
17923 mp->sw_if_index = ntohl (sw_if_index);
17926 /* Use a control ping for synchronization */
17927 M (CONTROL_PING, mp_ping);
17934 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
17935 #define vl_api_ip6_fib_details_t_print vl_noop_handler
17938 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
17940 vat_main_t *vam = &vat_main;
17941 int count = ntohl (mp->count);
17942 vl_api_fib_path_t *fp;
17946 "table-id %d, prefix %U/%d",
17947 ntohl (mp->table_id), format_ip6_address, mp->address,
17948 mp->address_length);
17950 for (i = 0; i < count; i++)
17952 if (fp->afi == IP46_TYPE_IP6)
17954 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17955 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17956 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17957 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17958 format_ip6_address, fp->next_hop);
17959 else if (fp->afi == IP46_TYPE_IP4)
17961 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
17962 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
17963 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
17964 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
17965 format_ip4_address, fp->next_hop);
17970 static void vl_api_ip6_fib_details_t_handler_json
17971 (vl_api_ip6_fib_details_t * mp)
17973 vat_main_t *vam = &vat_main;
17974 int count = ntohl (mp->count);
17975 vat_json_node_t *node = NULL;
17976 struct in_addr ip4;
17977 struct in6_addr ip6;
17978 vl_api_fib_path_t *fp;
17981 if (VAT_JSON_ARRAY != vam->json_tree.type)
17983 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
17984 vat_json_init_array (&vam->json_tree);
17986 node = vat_json_array_add (&vam->json_tree);
17988 vat_json_init_object (node);
17989 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
17990 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
17991 vat_json_object_add_ip6 (node, "prefix", ip6);
17992 vat_json_object_add_uint (node, "mask_length", mp->address_length);
17993 vat_json_object_add_uint (node, "path_count", count);
17995 for (i = 0; i < count; i++)
17997 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
17998 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
17999 vat_json_object_add_uint (node, "is_local", fp->is_local);
18000 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
18001 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
18002 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
18003 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
18004 if (fp->afi == IP46_TYPE_IP4)
18006 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
18007 vat_json_object_add_ip4 (node, "next_hop", ip4);
18009 else if (fp->afi == IP46_TYPE_IP6)
18011 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
18012 vat_json_object_add_ip6 (node, "next_hop", ip6);
18018 api_ip6_fib_dump (vat_main_t * vam)
18020 vl_api_ip6_fib_dump_t *mp;
18021 vl_api_control_ping_t *mp_ping;
18024 M (IP6_FIB_DUMP, mp);
18027 /* Use a control ping for synchronization */
18028 M (CONTROL_PING, mp_ping);
18036 api_ip6_mfib_dump (vat_main_t * vam)
18038 vl_api_ip6_mfib_dump_t *mp;
18039 vl_api_control_ping_t *mp_ping;
18042 M (IP6_MFIB_DUMP, mp);
18045 /* Use a control ping for synchronization */
18046 M (CONTROL_PING, mp_ping);
18054 api_classify_table_ids (vat_main_t * vam)
18056 vl_api_classify_table_ids_t *mp;
18059 /* Construct the API message */
18060 M (CLASSIFY_TABLE_IDS, mp);
18069 api_classify_table_by_interface (vat_main_t * vam)
18071 unformat_input_t *input = vam->input;
18072 vl_api_classify_table_by_interface_t *mp;
18074 u32 sw_if_index = ~0;
18076 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18078 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
18080 else if (unformat (input, "sw_if_index %d", &sw_if_index))
18085 if (sw_if_index == ~0)
18087 errmsg ("missing interface name or sw_if_index");
18091 /* Construct the API message */
18092 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
18094 mp->sw_if_index = ntohl (sw_if_index);
18102 api_classify_table_info (vat_main_t * vam)
18104 unformat_input_t *input = vam->input;
18105 vl_api_classify_table_info_t *mp;
18109 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18111 if (unformat (input, "table_id %d", &table_id))
18116 if (table_id == ~0)
18118 errmsg ("missing table id");
18122 /* Construct the API message */
18123 M (CLASSIFY_TABLE_INFO, mp);
18125 mp->table_id = ntohl (table_id);
18133 api_classify_session_dump (vat_main_t * vam)
18135 unformat_input_t *input = vam->input;
18136 vl_api_classify_session_dump_t *mp;
18137 vl_api_control_ping_t *mp_ping;
18141 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18143 if (unformat (input, "table_id %d", &table_id))
18148 if (table_id == ~0)
18150 errmsg ("missing table id");
18154 /* Construct the API message */
18155 M (CLASSIFY_SESSION_DUMP, mp);
18157 mp->table_id = ntohl (table_id);
18160 /* Use a control ping for synchronization */
18161 M (CONTROL_PING, mp_ping);
18169 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
18171 vat_main_t *vam = &vat_main;
18173 print (vam->ofp, "collector_address %U, collector_port %d, "
18174 "src_address %U, vrf_id %d, path_mtu %u, "
18175 "template_interval %u, udp_checksum %d",
18176 format_ip4_address, mp->collector_address,
18177 ntohs (mp->collector_port),
18178 format_ip4_address, mp->src_address,
18179 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
18180 ntohl (mp->template_interval), mp->udp_checksum);
18183 vam->result_ready = 1;
18187 vl_api_ipfix_exporter_details_t_handler_json
18188 (vl_api_ipfix_exporter_details_t * mp)
18190 vat_main_t *vam = &vat_main;
18191 vat_json_node_t node;
18192 struct in_addr collector_address;
18193 struct in_addr src_address;
18195 vat_json_init_object (&node);
18196 clib_memcpy (&collector_address, &mp->collector_address,
18197 sizeof (collector_address));
18198 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
18199 vat_json_object_add_uint (&node, "collector_port",
18200 ntohs (mp->collector_port));
18201 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
18202 vat_json_object_add_ip4 (&node, "src_address", src_address);
18203 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
18204 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
18205 vat_json_object_add_uint (&node, "template_interval",
18206 ntohl (mp->template_interval));
18207 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
18209 vat_json_print (vam->ofp, &node);
18210 vat_json_free (&node);
18212 vam->result_ready = 1;
18216 api_ipfix_exporter_dump (vat_main_t * vam)
18218 vl_api_ipfix_exporter_dump_t *mp;
18221 /* Construct the API message */
18222 M (IPFIX_EXPORTER_DUMP, mp);
18231 api_ipfix_classify_stream_dump (vat_main_t * vam)
18233 vl_api_ipfix_classify_stream_dump_t *mp;
18236 /* Construct the API message */
18237 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
18248 vl_api_ipfix_classify_stream_details_t_handler
18249 (vl_api_ipfix_classify_stream_details_t * mp)
18251 vat_main_t *vam = &vat_main;
18252 print (vam->ofp, "domain_id %d, src_port %d",
18253 ntohl (mp->domain_id), ntohs (mp->src_port));
18255 vam->result_ready = 1;
18259 vl_api_ipfix_classify_stream_details_t_handler_json
18260 (vl_api_ipfix_classify_stream_details_t * mp)
18262 vat_main_t *vam = &vat_main;
18263 vat_json_node_t node;
18265 vat_json_init_object (&node);
18266 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
18267 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
18269 vat_json_print (vam->ofp, &node);
18270 vat_json_free (&node);
18272 vam->result_ready = 1;
18276 api_ipfix_classify_table_dump (vat_main_t * vam)
18278 vl_api_ipfix_classify_table_dump_t *mp;
18279 vl_api_control_ping_t *mp_ping;
18282 if (!vam->json_output)
18284 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
18285 "transport_protocol");
18288 /* Construct the API message */
18289 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
18294 /* Use a control ping for synchronization */
18295 M (CONTROL_PING, mp_ping);
18303 vl_api_ipfix_classify_table_details_t_handler
18304 (vl_api_ipfix_classify_table_details_t * mp)
18306 vat_main_t *vam = &vat_main;
18307 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
18308 mp->transport_protocol);
18312 vl_api_ipfix_classify_table_details_t_handler_json
18313 (vl_api_ipfix_classify_table_details_t * mp)
18315 vat_json_node_t *node = NULL;
18316 vat_main_t *vam = &vat_main;
18318 if (VAT_JSON_ARRAY != vam->json_tree.type)
18320 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18321 vat_json_init_array (&vam->json_tree);
18324 node = vat_json_array_add (&vam->json_tree);
18325 vat_json_init_object (node);
18327 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
18328 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
18329 vat_json_object_add_uint (node, "transport_protocol",
18330 mp->transport_protocol);
18334 api_sw_interface_span_enable_disable (vat_main_t * vam)
18336 unformat_input_t *i = vam->input;
18337 vl_api_sw_interface_span_enable_disable_t *mp;
18338 u32 src_sw_if_index = ~0;
18339 u32 dst_sw_if_index = ~0;
18344 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18347 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
18349 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
18353 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
18355 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
18357 else if (unformat (i, "disable"))
18359 else if (unformat (i, "rx"))
18361 else if (unformat (i, "tx"))
18363 else if (unformat (i, "both"))
18365 else if (unformat (i, "l2"))
18371 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
18373 mp->sw_if_index_from = htonl (src_sw_if_index);
18374 mp->sw_if_index_to = htonl (dst_sw_if_index);
18384 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
18387 vat_main_t *vam = &vat_main;
18388 u8 *sw_if_from_name = 0;
18389 u8 *sw_if_to_name = 0;
18390 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
18391 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
18392 char *states[] = { "none", "rx", "tx", "both" };
18396 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
18398 if ((u32) p->value[0] == sw_if_index_from)
18400 sw_if_from_name = (u8 *)(p->key);
18404 if ((u32) p->value[0] == sw_if_index_to)
18406 sw_if_to_name = (u8 *)(p->key);
18407 if (sw_if_from_name)
18412 print (vam->ofp, "%20s => %20s (%s)",
18413 sw_if_from_name, sw_if_to_name, states[mp->state]);
18417 vl_api_sw_interface_span_details_t_handler_json
18418 (vl_api_sw_interface_span_details_t * mp)
18420 vat_main_t *vam = &vat_main;
18421 vat_json_node_t *node = NULL;
18422 u8 *sw_if_from_name = 0;
18423 u8 *sw_if_to_name = 0;
18424 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
18425 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
18429 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
18431 if ((u32) p->value[0] == sw_if_index_from)
18433 sw_if_from_name = (u8 *)(p->key);
18437 if ((u32) p->value[0] == sw_if_index_to)
18439 sw_if_to_name = (u8 *)(p->key);
18440 if (sw_if_from_name)
18446 if (VAT_JSON_ARRAY != vam->json_tree.type)
18448 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18449 vat_json_init_array (&vam->json_tree);
18451 node = vat_json_array_add (&vam->json_tree);
18453 vat_json_init_object (node);
18454 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
18455 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
18456 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
18457 if (0 != sw_if_to_name)
18459 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
18461 vat_json_object_add_uint (node, "state", mp->state);
18465 api_sw_interface_span_dump (vat_main_t * vam)
18467 unformat_input_t *input = vam->input;
18468 vl_api_sw_interface_span_dump_t *mp;
18469 vl_api_control_ping_t *mp_ping;
18473 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18475 if (unformat (input, "l2"))
18481 M (SW_INTERFACE_SPAN_DUMP, mp);
18485 /* Use a control ping for synchronization */
18486 M (CONTROL_PING, mp_ping);
18494 api_pg_create_interface (vat_main_t * vam)
18496 unformat_input_t *input = vam->input;
18497 vl_api_pg_create_interface_t *mp;
18501 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18503 if (unformat (input, "if_id %d", &if_id))
18510 errmsg ("missing pg interface index");
18514 /* Construct the API message */
18515 M (PG_CREATE_INTERFACE, mp);
18517 mp->interface_id = ntohl (if_id);
18525 api_pg_capture (vat_main_t * vam)
18527 unformat_input_t *input = vam->input;
18528 vl_api_pg_capture_t *mp;
18533 u8 pcap_file_set = 0;
18536 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18538 if (unformat (input, "if_id %d", &if_id))
18540 else if (unformat (input, "pcap %s", &pcap_file))
18542 else if (unformat (input, "count %d", &count))
18544 else if (unformat (input, "disable"))
18551 errmsg ("missing pg interface index");
18554 if (pcap_file_set > 0)
18556 if (vec_len (pcap_file) > 255)
18558 errmsg ("pcap file name is too long");
18563 u32 name_len = vec_len (pcap_file);
18564 /* Construct the API message */
18565 M (PG_CAPTURE, mp);
18567 mp->interface_id = ntohl (if_id);
18568 mp->is_enabled = enable;
18569 mp->count = ntohl (count);
18570 mp->pcap_name_length = ntohl (name_len);
18571 if (pcap_file_set != 0)
18573 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
18575 vec_free (pcap_file);
18583 api_pg_enable_disable (vat_main_t * vam)
18585 unformat_input_t *input = vam->input;
18586 vl_api_pg_enable_disable_t *mp;
18589 u8 stream_name_set = 0;
18590 u8 *stream_name = 0;
18592 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18594 if (unformat (input, "stream %s", &stream_name))
18595 stream_name_set = 1;
18596 else if (unformat (input, "disable"))
18602 if (stream_name_set > 0)
18604 if (vec_len (stream_name) > 255)
18606 errmsg ("stream name too long");
18611 u32 name_len = vec_len (stream_name);
18612 /* Construct the API message */
18613 M (PG_ENABLE_DISABLE, mp);
18615 mp->is_enabled = enable;
18616 if (stream_name_set != 0)
18618 mp->stream_name_length = ntohl (name_len);
18619 clib_memcpy (mp->stream_name, stream_name, name_len);
18621 vec_free (stream_name);
18629 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
18631 unformat_input_t *input = vam->input;
18632 vl_api_ip_source_and_port_range_check_add_del_t *mp;
18634 u16 *low_ports = 0;
18635 u16 *high_ports = 0;
18638 ip4_address_t ip4_addr;
18639 ip6_address_t ip6_addr;
18648 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18650 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
18656 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
18661 else if (unformat (input, "vrf %d", &vrf_id))
18663 else if (unformat (input, "del"))
18665 else if (unformat (input, "port %d", &tmp))
18667 if (tmp == 0 || tmp > 65535)
18669 errmsg ("port %d out of range", tmp);
18673 this_hi = this_low + 1;
18674 vec_add1 (low_ports, this_low);
18675 vec_add1 (high_ports, this_hi);
18677 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
18679 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
18681 errmsg ("incorrect range parameters");
18685 /* Note: in debug CLI +1 is added to high before
18686 passing to real fn that does "the work"
18687 (ip_source_and_port_range_check_add_del).
18688 This fn is a wrapper around the binary API fn a
18689 control plane will call, which expects this increment
18690 to have occurred. Hence letting the binary API control
18691 plane fn do the increment for consistency between VAT
18692 and other control planes.
18695 vec_add1 (low_ports, this_low);
18696 vec_add1 (high_ports, this_hi);
18702 if (prefix_set == 0)
18704 errmsg ("<address>/<mask> not specified");
18710 errmsg ("VRF ID required, not specified");
18717 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
18721 if (vec_len (low_ports) == 0)
18723 errmsg ("At least one port or port range required");
18727 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
18729 mp->is_add = is_add;
18734 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
18739 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
18742 mp->mask_length = length;
18743 mp->number_of_ranges = vec_len (low_ports);
18745 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
18746 vec_free (low_ports);
18748 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
18749 vec_free (high_ports);
18751 mp->vrf_id = ntohl (vrf_id);
18759 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
18761 unformat_input_t *input = vam->input;
18762 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
18763 u32 sw_if_index = ~0;
18765 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
18766 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
18770 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18772 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
18774 else if (unformat (input, "sw_if_index %d", &sw_if_index))
18776 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
18778 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
18780 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
18782 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
18784 else if (unformat (input, "del"))
18790 if (sw_if_index == ~0)
18792 errmsg ("Interface required but not specified");
18798 errmsg ("VRF ID required but not specified");
18802 if (tcp_out_vrf_id == 0
18803 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
18806 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
18810 /* Construct the API message */
18811 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
18813 mp->sw_if_index = ntohl (sw_if_index);
18814 mp->is_add = is_add;
18815 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
18816 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
18817 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
18818 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
18823 /* Wait for a reply... */
18829 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
18831 unformat_input_t *i = vam->input;
18832 vl_api_ipsec_gre_add_del_tunnel_t *mp;
18833 u32 local_sa_id = 0;
18834 u32 remote_sa_id = 0;
18835 ip4_address_t src_address;
18836 ip4_address_t dst_address;
18840 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18842 if (unformat (i, "local_sa %d", &local_sa_id))
18844 else if (unformat (i, "remote_sa %d", &remote_sa_id))
18846 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
18848 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
18850 else if (unformat (i, "del"))
18854 clib_warning ("parse error '%U'", format_unformat_error, i);
18859 M (IPSEC_GRE_ADD_DEL_TUNNEL, mp);
18861 mp->local_sa_id = ntohl (local_sa_id);
18862 mp->remote_sa_id = ntohl (remote_sa_id);
18863 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
18864 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
18865 mp->is_add = is_add;
18873 api_punt (vat_main_t * vam)
18875 unformat_input_t *i = vam->input;
18883 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18885 if (unformat (i, "ip %d", &ipv))
18887 else if (unformat (i, "protocol %d", &protocol))
18889 else if (unformat (i, "port %d", &port))
18891 else if (unformat (i, "del"))
18895 clib_warning ("parse error '%U'", format_unformat_error, i);
18902 mp->is_add = (u8) is_add;
18903 mp->ipv = (u8) ipv;
18904 mp->l4_protocol = (u8) protocol;
18905 mp->l4_port = htons ((u16) port);
18912 static void vl_api_ipsec_gre_tunnel_details_t_handler
18913 (vl_api_ipsec_gre_tunnel_details_t * mp)
18915 vat_main_t *vam = &vat_main;
18917 print (vam->ofp, "%11d%15U%15U%14d%14d",
18918 ntohl (mp->sw_if_index),
18919 format_ip4_address, &mp->src_address,
18920 format_ip4_address, &mp->dst_address,
18921 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
18924 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
18925 (vl_api_ipsec_gre_tunnel_details_t * mp)
18927 vat_main_t *vam = &vat_main;
18928 vat_json_node_t *node = NULL;
18929 struct in_addr ip4;
18931 if (VAT_JSON_ARRAY != vam->json_tree.type)
18933 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18934 vat_json_init_array (&vam->json_tree);
18936 node = vat_json_array_add (&vam->json_tree);
18938 vat_json_init_object (node);
18939 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
18940 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
18941 vat_json_object_add_ip4 (node, "src_address", ip4);
18942 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
18943 vat_json_object_add_ip4 (node, "dst_address", ip4);
18944 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
18945 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
18949 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
18951 unformat_input_t *i = vam->input;
18952 vl_api_ipsec_gre_tunnel_dump_t *mp;
18953 vl_api_control_ping_t *mp_ping;
18955 u8 sw_if_index_set = 0;
18958 /* Parse args required to build the message */
18959 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18961 if (unformat (i, "sw_if_index %d", &sw_if_index))
18962 sw_if_index_set = 1;
18967 if (sw_if_index_set == 0)
18972 if (!vam->json_output)
18974 print (vam->ofp, "%11s%15s%15s%14s%14s",
18975 "sw_if_index", "src_address", "dst_address",
18976 "local_sa_id", "remote_sa_id");
18979 /* Get list of gre-tunnel interfaces */
18980 M (IPSEC_GRE_TUNNEL_DUMP, mp);
18982 mp->sw_if_index = htonl (sw_if_index);
18986 /* Use a control ping for synchronization */
18987 M (CONTROL_PING, mp_ping);
18995 api_delete_subif (vat_main_t * vam)
18997 unformat_input_t *i = vam->input;
18998 vl_api_delete_subif_t *mp;
18999 u32 sw_if_index = ~0;
19002 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19004 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19006 if (unformat (i, "sw_if_index %d", &sw_if_index))
19012 if (sw_if_index == ~0)
19014 errmsg ("missing sw_if_index");
19018 /* Construct the API message */
19019 M (DELETE_SUBIF, mp);
19020 mp->sw_if_index = ntohl (sw_if_index);
19027 #define foreach_pbb_vtr_op \
19028 _("disable", L2_VTR_DISABLED) \
19029 _("pop", L2_VTR_POP_2) \
19030 _("push", L2_VTR_PUSH_2)
19033 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
19035 unformat_input_t *i = vam->input;
19036 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
19037 u32 sw_if_index = ~0, vtr_op = ~0;
19038 u16 outer_tag = ~0;
19039 u8 dmac[6], smac[6];
19040 u8 dmac_set = 0, smac_set = 0;
19046 /* Shut up coverity */
19047 memset (dmac, 0, sizeof (dmac));
19048 memset (smac, 0, sizeof (smac));
19050 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19052 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19054 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19056 else if (unformat (i, "vtr_op %d", &vtr_op))
19058 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
19061 else if (unformat (i, "translate_pbb_stag"))
19063 if (unformat (i, "%d", &tmp))
19065 vtr_op = L2_VTR_TRANSLATE_2_1;
19071 ("translate_pbb_stag operation requires outer tag definition");
19075 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
19077 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
19079 else if (unformat (i, "sid %d", &sid))
19081 else if (unformat (i, "vlanid %d", &tmp))
19085 clib_warning ("parse error '%U'", format_unformat_error, i);
19090 if ((sw_if_index == ~0) || (vtr_op == ~0))
19092 errmsg ("missing sw_if_index or vtr operation");
19095 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
19096 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
19099 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
19103 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
19104 mp->sw_if_index = ntohl (sw_if_index);
19105 mp->vtr_op = ntohl (vtr_op);
19106 mp->outer_tag = ntohs (outer_tag);
19107 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
19108 clib_memcpy (mp->b_smac, smac, sizeof (smac));
19109 mp->b_vlanid = ntohs (vlanid);
19110 mp->i_sid = ntohl (sid);
19118 api_flow_classify_set_interface (vat_main_t * vam)
19120 unformat_input_t *i = vam->input;
19121 vl_api_flow_classify_set_interface_t *mp;
19123 int sw_if_index_set;
19124 u32 ip4_table_index = ~0;
19125 u32 ip6_table_index = ~0;
19129 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19131 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19132 sw_if_index_set = 1;
19133 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19134 sw_if_index_set = 1;
19135 else if (unformat (i, "del"))
19137 else if (unformat (i, "ip4-table %d", &ip4_table_index))
19139 else if (unformat (i, "ip6-table %d", &ip6_table_index))
19143 clib_warning ("parse error '%U'", format_unformat_error, i);
19148 if (sw_if_index_set == 0)
19150 errmsg ("missing interface name or sw_if_index");
19154 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
19156 mp->sw_if_index = ntohl (sw_if_index);
19157 mp->ip4_table_index = ntohl (ip4_table_index);
19158 mp->ip6_table_index = ntohl (ip6_table_index);
19159 mp->is_add = is_add;
19167 api_flow_classify_dump (vat_main_t * vam)
19169 unformat_input_t *i = vam->input;
19170 vl_api_flow_classify_dump_t *mp;
19171 vl_api_control_ping_t *mp_ping;
19172 u8 type = FLOW_CLASSIFY_N_TABLES;
19175 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
19179 errmsg ("classify table type must be specified");
19183 if (!vam->json_output)
19185 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
19188 M (FLOW_CLASSIFY_DUMP, mp);
19193 /* Use a control ping for synchronization */
19194 M (CONTROL_PING, mp_ping);
19197 /* Wait for a reply... */
19203 api_feature_enable_disable (vat_main_t * vam)
19205 unformat_input_t *i = vam->input;
19206 vl_api_feature_enable_disable_t *mp;
19208 u8 *feature_name = 0;
19209 u32 sw_if_index = ~0;
19213 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19215 if (unformat (i, "arc_name %s", &arc_name))
19217 else if (unformat (i, "feature_name %s", &feature_name))
19220 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19222 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19224 else if (unformat (i, "disable"))
19232 errmsg ("missing arc name");
19235 if (vec_len (arc_name) > 63)
19237 errmsg ("arc name too long");
19240 if (feature_name == 0)
19242 errmsg ("missing feature name");
19245 if (vec_len (feature_name) > 63)
19247 errmsg ("feature name too long");
19250 if (sw_if_index == ~0)
19252 errmsg ("missing interface name or sw_if_index");
19256 /* Construct the API message */
19257 M (FEATURE_ENABLE_DISABLE, mp);
19258 mp->sw_if_index = ntohl (sw_if_index);
19259 mp->enable = enable;
19260 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
19261 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
19262 vec_free (arc_name);
19263 vec_free (feature_name);
19271 api_sw_interface_tag_add_del (vat_main_t * vam)
19273 unformat_input_t *i = vam->input;
19274 vl_api_sw_interface_tag_add_del_t *mp;
19275 u32 sw_if_index = ~0;
19280 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19282 if (unformat (i, "tag %s", &tag))
19284 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19286 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19288 else if (unformat (i, "del"))
19294 if (sw_if_index == ~0)
19296 errmsg ("missing interface name or sw_if_index");
19300 if (enable && (tag == 0))
19302 errmsg ("no tag specified");
19306 /* Construct the API message */
19307 M (SW_INTERFACE_TAG_ADD_DEL, mp);
19308 mp->sw_if_index = ntohl (sw_if_index);
19309 mp->is_add = enable;
19311 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
19319 static void vl_api_l2_xconnect_details_t_handler
19320 (vl_api_l2_xconnect_details_t * mp)
19322 vat_main_t *vam = &vat_main;
19324 print (vam->ofp, "%15d%15d",
19325 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
19328 static void vl_api_l2_xconnect_details_t_handler_json
19329 (vl_api_l2_xconnect_details_t * mp)
19331 vat_main_t *vam = &vat_main;
19332 vat_json_node_t *node = NULL;
19334 if (VAT_JSON_ARRAY != vam->json_tree.type)
19336 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19337 vat_json_init_array (&vam->json_tree);
19339 node = vat_json_array_add (&vam->json_tree);
19341 vat_json_init_object (node);
19342 vat_json_object_add_uint (node, "rx_sw_if_index",
19343 ntohl (mp->rx_sw_if_index));
19344 vat_json_object_add_uint (node, "tx_sw_if_index",
19345 ntohl (mp->tx_sw_if_index));
19349 api_l2_xconnect_dump (vat_main_t * vam)
19351 vl_api_l2_xconnect_dump_t *mp;
19352 vl_api_control_ping_t *mp_ping;
19355 if (!vam->json_output)
19357 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
19360 M (L2_XCONNECT_DUMP, mp);
19364 /* Use a control ping for synchronization */
19365 M (CONTROL_PING, mp_ping);
19373 api_sw_interface_set_mtu (vat_main_t * vam)
19375 unformat_input_t *i = vam->input;
19376 vl_api_sw_interface_set_mtu_t *mp;
19377 u32 sw_if_index = ~0;
19381 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19383 if (unformat (i, "mtu %d", &mtu))
19385 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19387 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19393 if (sw_if_index == ~0)
19395 errmsg ("missing interface name or sw_if_index");
19401 errmsg ("no mtu specified");
19405 /* Construct the API message */
19406 M (SW_INTERFACE_SET_MTU, mp);
19407 mp->sw_if_index = ntohl (sw_if_index);
19408 mp->mtu = ntohs ((u16) mtu);
19416 api_p2p_ethernet_add (vat_main_t * vam)
19418 unformat_input_t *i = vam->input;
19419 vl_api_p2p_ethernet_add_t *mp;
19420 u32 parent_if_index = ~0;
19426 memset (remote_mac, 0, sizeof (remote_mac));
19427 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19429 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
19431 else if (unformat (i, "sw_if_index %d", &parent_if_index))
19435 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
19437 else if (unformat (i, "sub_id %d", &sub_id))
19441 clib_warning ("parse error '%U'", format_unformat_error, i);
19446 if (parent_if_index == ~0)
19448 errmsg ("missing interface name or sw_if_index");
19453 errmsg ("missing remote mac address");
19458 errmsg ("missing sub-interface id");
19462 M (P2P_ETHERNET_ADD, mp);
19463 mp->parent_if_index = ntohl (parent_if_index);
19464 mp->subif_id = ntohl (sub_id);
19465 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
19473 api_p2p_ethernet_del (vat_main_t * vam)
19475 unformat_input_t *i = vam->input;
19476 vl_api_p2p_ethernet_del_t *mp;
19477 u32 parent_if_index = ~0;
19482 memset (remote_mac, 0, sizeof (remote_mac));
19483 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19485 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
19487 else if (unformat (i, "sw_if_index %d", &parent_if_index))
19491 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
19495 clib_warning ("parse error '%U'", format_unformat_error, i);
19500 if (parent_if_index == ~0)
19502 errmsg ("missing interface name or sw_if_index");
19507 errmsg ("missing remote mac address");
19511 M (P2P_ETHERNET_DEL, mp);
19512 mp->parent_if_index = ntohl (parent_if_index);
19513 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
19521 api_lldp_config (vat_main_t * vam)
19523 unformat_input_t *i = vam->input;
19524 vl_api_lldp_config_t *mp;
19526 int tx_interval = 0;
19527 u8 *sys_name = NULL;
19530 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19532 if (unformat (i, "system-name %s", &sys_name))
19534 else if (unformat (i, "tx-hold %d", &tx_hold))
19536 else if (unformat (i, "tx-interval %d", &tx_interval))
19540 clib_warning ("parse error '%U'", format_unformat_error, i);
19545 vec_add1 (sys_name, 0);
19547 M (LLDP_CONFIG, mp);
19548 mp->tx_hold = htonl (tx_hold);
19549 mp->tx_interval = htonl (tx_interval);
19550 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
19551 vec_free (sys_name);
19559 api_sw_interface_set_lldp (vat_main_t * vam)
19561 unformat_input_t *i = vam->input;
19562 vl_api_sw_interface_set_lldp_t *mp;
19563 u32 sw_if_index = ~0;
19565 u8 *port_desc = NULL;
19568 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19570 if (unformat (i, "disable"))
19573 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19575 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19577 else if (unformat (i, "port-desc %s", &port_desc))
19583 if (sw_if_index == ~0)
19585 errmsg ("missing interface name or sw_if_index");
19589 /* Construct the API message */
19590 vec_add1 (port_desc, 0);
19591 M (SW_INTERFACE_SET_LLDP, mp);
19592 mp->sw_if_index = ntohl (sw_if_index);
19593 mp->enable = enable;
19594 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
19595 vec_free (port_desc);
19603 q_or_quit (vat_main_t * vam)
19605 #if VPP_API_TEST_BUILTIN == 0
19606 longjmp (vam->jump_buf, 1);
19608 return 0; /* not so much */
19612 q (vat_main_t * vam)
19614 return q_or_quit (vam);
19618 quit (vat_main_t * vam)
19620 return q_or_quit (vam);
19624 comment (vat_main_t * vam)
19630 cmd_cmp (void *a1, void *a2)
19635 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
19639 help (vat_main_t * vam)
19644 unformat_input_t *i = vam->input;
19647 if (unformat (i, "%s", &name))
19651 vec_add1 (name, 0);
19653 hs = hash_get_mem (vam->help_by_name, name);
19655 print (vam->ofp, "usage: %s %s", name, hs[0]);
19657 print (vam->ofp, "No such msg / command '%s'", name);
19662 print (vam->ofp, "Help is available for the following:");
19665 hash_foreach_pair (p, vam->function_by_name,
19667 vec_add1 (cmds, (u8 *)(p->key));
19671 vec_sort_with_function (cmds, cmd_cmp);
19673 for (j = 0; j < vec_len (cmds); j++)
19674 print (vam->ofp, "%s", cmds[j]);
19681 set (vat_main_t * vam)
19683 u8 *name = 0, *value = 0;
19684 unformat_input_t *i = vam->input;
19686 if (unformat (i, "%s", &name))
19688 /* The input buffer is a vector, not a string. */
19689 value = vec_dup (i->buffer);
19690 vec_delete (value, i->index, 0);
19691 /* Almost certainly has a trailing newline */
19692 if (value[vec_len (value) - 1] == '\n')
19693 value[vec_len (value) - 1] = 0;
19694 /* Make sure it's a proper string, one way or the other */
19695 vec_add1 (value, 0);
19696 (void) clib_macro_set_value (&vam->macro_main,
19697 (char *) name, (char *) value);
19700 errmsg ("usage: set <name> <value>");
19708 unset (vat_main_t * vam)
19712 if (unformat (vam->input, "%s", &name))
19713 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
19714 errmsg ("unset: %s wasn't set", name);
19727 macro_sort_cmp (void *a1, void *a2)
19729 macro_sort_t *s1 = a1;
19730 macro_sort_t *s2 = a2;
19732 return strcmp ((char *) (s1->name), (char *) (s2->name));
19736 dump_macro_table (vat_main_t * vam)
19738 macro_sort_t *sort_me = 0, *sm;
19743 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
19745 vec_add2 (sort_me, sm, 1);
19746 sm->name = (u8 *)(p->key);
19747 sm->value = (u8 *) (p->value[0]);
19751 vec_sort_with_function (sort_me, macro_sort_cmp);
19753 if (vec_len (sort_me))
19754 print (vam->ofp, "%-15s%s", "Name", "Value");
19756 print (vam->ofp, "The macro table is empty...");
19758 for (i = 0; i < vec_len (sort_me); i++)
19759 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
19764 dump_node_table (vat_main_t * vam)
19767 vlib_node_t *node, *next_node;
19769 if (vec_len (vam->graph_nodes) == 0)
19771 print (vam->ofp, "Node table empty, issue get_node_graph...");
19775 for (i = 0; i < vec_len (vam->graph_nodes); i++)
19777 node = vam->graph_nodes[i];
19778 print (vam->ofp, "[%d] %s", i, node->name);
19779 for (j = 0; j < vec_len (node->next_nodes); j++)
19781 if (node->next_nodes[j] != ~0)
19783 next_node = vam->graph_nodes[node->next_nodes[j]];
19784 print (vam->ofp, " [%d] %s", j, next_node->name);
19792 value_sort_cmp (void *a1, void *a2)
19794 name_sort_t *n1 = a1;
19795 name_sort_t *n2 = a2;
19797 if (n1->value < n2->value)
19799 if (n1->value > n2->value)
19806 dump_msg_api_table (vat_main_t * vam)
19808 api_main_t *am = &api_main;
19809 name_sort_t *nses = 0, *ns;
19814 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
19816 vec_add2 (nses, ns, 1);
19817 ns->name = (u8 *)(hp->key);
19818 ns->value = (u32) hp->value[0];
19822 vec_sort_with_function (nses, value_sort_cmp);
19824 for (i = 0; i < vec_len (nses); i++)
19825 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
19831 get_msg_id (vat_main_t * vam)
19836 if (unformat (vam->input, "%s", &name_and_crc))
19838 message_index = vl_api_get_msg_index (name_and_crc);
19839 if (message_index == ~0)
19841 print (vam->ofp, " '%s' not found", name_and_crc);
19844 print (vam->ofp, " '%s' has message index %d",
19845 name_and_crc, message_index);
19848 errmsg ("name_and_crc required...");
19853 search_node_table (vat_main_t * vam)
19855 unformat_input_t *line_input = vam->input;
19858 vlib_node_t *node, *next_node;
19861 if (vam->graph_node_index_by_name == 0)
19863 print (vam->ofp, "Node table empty, issue get_node_graph...");
19867 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
19869 if (unformat (line_input, "%s", &node_to_find))
19871 vec_add1 (node_to_find, 0);
19872 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
19875 print (vam->ofp, "%s not found...", node_to_find);
19878 node = vam->graph_nodes[p[0]];
19879 print (vam->ofp, "[%d] %s", p[0], node->name);
19880 for (j = 0; j < vec_len (node->next_nodes); j++)
19882 if (node->next_nodes[j] != ~0)
19884 next_node = vam->graph_nodes[node->next_nodes[j]];
19885 print (vam->ofp, " [%d] %s", j, next_node->name);
19892 clib_warning ("parse error '%U'", format_unformat_error,
19898 vec_free (node_to_find);
19907 script (vat_main_t * vam)
19909 #if (VPP_API_TEST_BUILTIN==0)
19911 char *save_current_file;
19912 unformat_input_t save_input;
19913 jmp_buf save_jump_buf;
19914 u32 save_line_number;
19916 FILE *new_fp, *save_ifp;
19918 if (unformat (vam->input, "%s", &s))
19920 new_fp = fopen ((char *) s, "r");
19923 errmsg ("Couldn't open script file %s", s);
19930 errmsg ("Missing script name");
19934 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
19935 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
19936 save_ifp = vam->ifp;
19937 save_line_number = vam->input_line_number;
19938 save_current_file = (char *) vam->current_file;
19940 vam->input_line_number = 0;
19942 vam->current_file = s;
19945 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
19946 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
19947 vam->ifp = save_ifp;
19948 vam->input_line_number = save_line_number;
19949 vam->current_file = (u8 *) save_current_file;
19954 clib_warning ("use the exec command...");
19960 echo (vat_main_t * vam)
19962 print (vam->ofp, "%v", vam->input->buffer);
19966 /* List of API message constructors, CLI names map to api_xxx */
19967 #define foreach_vpe_api_msg \
19968 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
19969 _(sw_interface_dump,"") \
19970 _(sw_interface_set_flags, \
19971 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
19972 _(sw_interface_add_del_address, \
19973 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
19974 _(sw_interface_set_table, \
19975 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
19976 _(sw_interface_set_mpls_enable, \
19977 "<intfc> | sw_if_index [disable | dis]") \
19978 _(sw_interface_set_vpath, \
19979 "<intfc> | sw_if_index <id> enable | disable") \
19980 _(sw_interface_set_vxlan_bypass, \
19981 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
19982 _(sw_interface_set_l2_xconnect, \
19983 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
19984 "enable | disable") \
19985 _(sw_interface_set_l2_bridge, \
19986 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
19987 "[shg <split-horizon-group>] [bvi]\n" \
19988 "enable | disable") \
19989 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
19990 _(bridge_domain_add_del, \
19991 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [del]\n") \
19992 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
19994 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
19995 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
19996 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
19998 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
20000 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
20002 "tapname <name> mac <mac-addr> | random-mac [tag <string>]") \
20004 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
20006 "<vpp-if-name> | sw_if_index <id>") \
20007 _(sw_interface_tap_dump, "") \
20008 _(ip_add_del_route, \
20009 "<addr>/<mask> via <addr> [table-id <n>]\n" \
20010 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
20011 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
20012 "[multipath] [count <n>]") \
20013 _(ip_mroute_add_del, \
20014 "<src> <grp>/<mask> [table-id <n>]\n" \
20015 "[<intfc> | sw_if_index <id>] [local] [del]") \
20016 _(mpls_route_add_del, \
20017 "<label> <eos> via <addr> [table-id <n>]\n" \
20018 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
20019 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
20020 "[multipath] [count <n>]") \
20021 _(mpls_ip_bind_unbind, \
20022 "<label> <addr/len>") \
20023 _(mpls_tunnel_add_del, \
20024 " via <addr> [table-id <n>]\n" \
20025 "sw_if_index <id>] [l2] [del]") \
20026 _(proxy_arp_add_del, \
20027 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
20028 _(proxy_arp_intfc_enable_disable, \
20029 "<intfc> | sw_if_index <id> enable | disable") \
20030 _(sw_interface_set_unnumbered, \
20031 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
20032 _(ip_neighbor_add_del, \
20033 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
20034 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
20035 _(reset_vrf, "vrf <id> [ipv6]") \
20036 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
20037 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
20038 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
20039 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
20040 "[outer_vlan_id_any][inner_vlan_id_any]") \
20041 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
20042 _(reset_fib, "vrf <n> [ipv6]") \
20043 _(dhcp_proxy_config, \
20044 "svr <v46-address> src <v46-address>\n" \
20045 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
20046 _(dhcp_proxy_set_vss, \
20047 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
20048 _(dhcp_proxy_dump, "ip6") \
20049 _(dhcp_client_config, \
20050 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
20051 _(set_ip_flow_hash, \
20052 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
20053 _(sw_interface_ip6_enable_disable, \
20054 "<intfc> | sw_if_index <id> enable | disable") \
20055 _(sw_interface_ip6_set_link_local_address, \
20056 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
20057 _(ip6nd_proxy_add_del, \
20058 "<intfc> | sw_if_index <id> <ip6-address>") \
20059 _(ip6nd_proxy_dump, "") \
20060 _(sw_interface_ip6nd_ra_prefix, \
20061 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
20062 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
20063 "[nolink] [isno]") \
20064 _(sw_interface_ip6nd_ra_config, \
20065 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
20066 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
20067 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
20068 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
20069 _(l2_patch_add_del, \
20070 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
20071 "enable | disable") \
20072 _(sr_localsid_add_del, \
20073 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
20074 "fib-table <num> (end.psp) sw_if_index <num>") \
20075 _(classify_add_del_table, \
20076 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
20077 " [del] [del-chain] mask <mask-value>\n" \
20078 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
20079 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
20080 _(classify_add_del_session, \
20081 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
20082 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
20083 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
20084 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
20085 _(classify_set_interface_ip_table, \
20086 "<intfc> | sw_if_index <nn> table <nn>") \
20087 _(classify_set_interface_l2_tables, \
20088 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
20089 " [other-table <nn>]") \
20090 _(get_node_index, "node <node-name") \
20091 _(add_node_next, "node <node-name> next <next-node-name>") \
20092 _(l2tpv3_create_tunnel, \
20093 "client_address <ip6-addr> our_address <ip6-addr>\n" \
20094 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
20095 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
20096 _(l2tpv3_set_tunnel_cookies, \
20097 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
20098 "[new_remote_cookie <nn>]\n") \
20099 _(l2tpv3_interface_enable_disable, \
20100 "<intfc> | sw_if_index <nn> enable | disable") \
20101 _(l2tpv3_set_lookup_key, \
20102 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
20103 _(sw_if_l2tpv3_tunnel_dump, "") \
20104 _(vxlan_add_del_tunnel, \
20105 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
20106 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
20107 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
20108 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
20109 _(gre_add_del_tunnel, \
20110 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [teb] [del]\n") \
20111 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
20112 _(l2_fib_clear_table, "") \
20113 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
20114 _(l2_interface_vlan_tag_rewrite, \
20115 "<intfc> | sw_if_index <nn> \n" \
20116 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
20117 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
20118 _(create_vhost_user_if, \
20119 "socket <filename> [server] [renumber <dev_instance>] " \
20120 "[mac <mac_address>]") \
20121 _(modify_vhost_user_if, \
20122 "<intfc> | sw_if_index <nn> socket <filename>\n" \
20123 "[server] [renumber <dev_instance>]") \
20124 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
20125 _(sw_interface_vhost_user_dump, "") \
20126 _(show_version, "") \
20127 _(vxlan_gpe_add_del_tunnel, \
20128 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
20129 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
20130 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
20131 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
20132 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
20133 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
20134 _(interface_name_renumber, \
20135 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
20136 _(input_acl_set_interface, \
20137 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
20138 " [l2-table <nn>] [del]") \
20139 _(want_ip4_arp_events, "address <ip4-address> [del]") \
20140 _(want_ip6_nd_events, "address <ip6-address> [del]") \
20141 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
20142 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
20143 _(ip_dump, "ipv4 | ipv6") \
20144 _(ipsec_spd_add_del, "spd_id <n> [del]") \
20145 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
20147 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
20148 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
20149 " integ_alg <alg> integ_key <hex>") \
20150 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
20151 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
20152 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
20153 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
20154 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
20155 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
20156 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
20157 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
20158 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n") \
20159 _(ikev2_profile_add_del, "name <profile_name> [del]") \
20160 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
20161 "(auth_data 0x<data> | auth_data <data>)") \
20162 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
20163 "(id_data 0x<data> | id_data <data>) (local|remote)") \
20164 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
20165 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
20166 "(local|remote)") \
20167 _(ikev2_set_local_key, "file <absolute_file_path>") \
20168 _(ikev2_set_responder, "<profile_name> interface <interface> address <addr>") \
20169 _(ikev2_set_ike_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
20170 _(ikev2_set_esp_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
20171 _(ikev2_set_sa_lifetime, "<profile_name> <seconds> <jitter> <handover> <max bytes>") \
20172 _(ikev2_initiate_sa_init, "<profile_name>") \
20173 _(ikev2_initiate_del_ike_sa, "<ispi>") \
20174 _(ikev2_initiate_del_child_sa, "<ispi>") \
20175 _(ikev2_initiate_rekey_child_sa, "<ispi>") \
20176 _(delete_loopback,"sw_if_index <nn>") \
20177 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
20178 _(map_add_domain, \
20179 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
20180 "ip6-src <ip6addr> " \
20181 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
20182 _(map_del_domain, "index <n>") \
20183 _(map_add_del_rule, \
20184 "index <n> psid <n> dst <ip6addr> [del]") \
20185 _(map_domain_dump, "") \
20186 _(map_rule_dump, "index <map-domain>") \
20187 _(want_interface_events, "enable|disable") \
20188 _(want_stats,"enable|disable") \
20189 _(get_first_msg_id, "client <name>") \
20190 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
20191 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
20192 "fib-id <nn> [ip4][ip6][default]") \
20193 _(get_node_graph, " ") \
20194 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
20195 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
20196 _(ioam_disable, "") \
20197 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
20198 " sw_if_index <sw_if_index> p <priority> " \
20199 "w <weight>] [del]") \
20200 _(one_add_del_locator, "locator-set <locator_name> " \
20201 "iface <intf> | sw_if_index <sw_if_index> " \
20202 "p <priority> w <weight> [del]") \
20203 _(one_add_del_local_eid,"vni <vni> eid " \
20204 "<ipv4|ipv6>/<prefix> | <L2 address> " \
20205 "locator-set <locator_name> [del]" \
20206 "[key-id sha1|sha256 secret-key <secret-key>]")\
20207 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
20208 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
20209 _(one_enable_disable, "enable|disable") \
20210 _(one_map_register_enable_disable, "enable|disable") \
20211 _(one_map_register_fallback_threshold, "<value>") \
20212 _(one_rloc_probe_enable_disable, "enable|disable") \
20213 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
20215 "rloc <locator> p <prio> " \
20216 "w <weight> [rloc <loc> ... ] " \
20217 "action <action> [del-all]") \
20218 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
20220 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
20221 _(one_use_petr, "ip-address> | disable") \
20222 _(one_map_request_mode, "src-dst|dst-only") \
20223 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
20224 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
20225 _(one_locator_set_dump, "[local | remote]") \
20226 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
20227 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
20228 "[local] | [remote]") \
20229 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
20230 _(one_l2_arp_bd_get, "") \
20231 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
20232 _(one_stats_enable_disable, "enable|disalbe") \
20233 _(show_one_stats_enable_disable, "") \
20234 _(one_eid_table_vni_dump, "") \
20235 _(one_eid_table_map_dump, "l2|l3") \
20236 _(one_map_resolver_dump, "") \
20237 _(one_map_server_dump, "") \
20238 _(one_adjacencies_get, "vni <vni>") \
20239 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
20240 _(show_one_rloc_probe_state, "") \
20241 _(show_one_map_register_state, "") \
20242 _(show_one_status, "") \
20243 _(one_stats_dump, "") \
20244 _(one_stats_flush, "") \
20245 _(one_get_map_request_itr_rlocs, "") \
20246 _(one_map_register_set_ttl, "<ttl>") \
20247 _(show_one_nsh_mapping, "") \
20248 _(show_one_pitr, "") \
20249 _(show_one_use_petr, "") \
20250 _(show_one_map_request_mode, "") \
20251 _(show_one_map_register_ttl, "") \
20252 _(show_one_map_register_fallback_threshold, "") \
20253 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
20254 " sw_if_index <sw_if_index> p <priority> " \
20255 "w <weight>] [del]") \
20256 _(lisp_add_del_locator, "locator-set <locator_name> " \
20257 "iface <intf> | sw_if_index <sw_if_index> " \
20258 "p <priority> w <weight> [del]") \
20259 _(lisp_add_del_local_eid,"vni <vni> eid " \
20260 "<ipv4|ipv6>/<prefix> | <L2 address> " \
20261 "locator-set <locator_name> [del]" \
20262 "[key-id sha1|sha256 secret-key <secret-key>]") \
20263 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
20264 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
20265 _(lisp_enable_disable, "enable|disable") \
20266 _(lisp_map_register_enable_disable, "enable|disable") \
20267 _(lisp_rloc_probe_enable_disable, "enable|disable") \
20268 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
20270 "rloc <locator> p <prio> " \
20271 "w <weight> [rloc <loc> ... ] " \
20272 "action <action> [del-all]") \
20273 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
20275 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
20276 _(lisp_use_petr, "<ip-address> | disable") \
20277 _(lisp_map_request_mode, "src-dst|dst-only") \
20278 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
20279 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
20280 _(lisp_locator_set_dump, "[local | remote]") \
20281 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
20282 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
20283 "[local] | [remote]") \
20284 _(lisp_eid_table_vni_dump, "") \
20285 _(lisp_eid_table_map_dump, "l2|l3") \
20286 _(lisp_map_resolver_dump, "") \
20287 _(lisp_map_server_dump, "") \
20288 _(lisp_adjacencies_get, "vni <vni>") \
20289 _(gpe_fwd_entry_vnis_get, "") \
20290 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
20291 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
20292 "[table <table-id>]") \
20293 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
20294 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
20295 _(gpe_set_encap_mode, "lisp|vxlan") \
20296 _(gpe_get_encap_mode, "") \
20297 _(lisp_gpe_add_del_iface, "up|down") \
20298 _(lisp_gpe_enable_disable, "enable|disable") \
20299 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
20300 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
20301 _(show_lisp_rloc_probe_state, "") \
20302 _(show_lisp_map_register_state, "") \
20303 _(show_lisp_status, "") \
20304 _(lisp_get_map_request_itr_rlocs, "") \
20305 _(show_lisp_pitr, "") \
20306 _(show_lisp_use_petr, "") \
20307 _(show_lisp_map_request_mode, "") \
20308 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
20309 _(af_packet_delete, "name <host interface name>") \
20310 _(policer_add_del, "name <policer name> <params> [del]") \
20311 _(policer_dump, "[name <policer name>]") \
20312 _(policer_classify_set_interface, \
20313 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
20314 " [l2-table <nn>] [del]") \
20315 _(policer_classify_dump, "type [ip4|ip6|l2]") \
20316 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
20317 "[master|slave]") \
20318 _(netmap_delete, "name <interface name>") \
20319 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
20320 _(mpls_fib_dump, "") \
20321 _(classify_table_ids, "") \
20322 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
20323 _(classify_table_info, "table_id <nn>") \
20324 _(classify_session_dump, "table_id <nn>") \
20325 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
20326 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
20327 "[template_interval <nn>] [udp_checksum]") \
20328 _(ipfix_exporter_dump, "") \
20329 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
20330 _(ipfix_classify_stream_dump, "") \
20331 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
20332 _(ipfix_classify_table_dump, "") \
20333 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
20334 _(sw_interface_span_dump, "[l2]") \
20335 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
20336 _(pg_create_interface, "if_id <nn>") \
20337 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
20338 _(pg_enable_disable, "[stream <id>] disable") \
20339 _(ip_source_and_port_range_check_add_del, \
20340 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
20341 _(ip_source_and_port_range_check_interface_add_del, \
20342 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
20343 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
20344 _(ipsec_gre_add_del_tunnel, \
20345 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
20346 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
20347 _(delete_subif,"<intfc> | sw_if_index <nn>") \
20348 _(l2_interface_pbb_tag_rewrite, \
20349 "<intfc> | sw_if_index <nn> \n" \
20350 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
20351 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
20352 _(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
20353 _(flow_classify_set_interface, \
20354 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
20355 _(flow_classify_dump, "type [ip4|ip6]") \
20356 _(ip_fib_dump, "") \
20357 _(ip_mfib_dump, "") \
20358 _(ip6_fib_dump, "") \
20359 _(ip6_mfib_dump, "") \
20360 _(feature_enable_disable, "arc_name <arc_name> " \
20361 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
20362 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
20364 _(l2_xconnect_dump, "") \
20365 _(sw_interface_set_mtu, "<intfc> | sw_if_index <nn> mtu <nn>") \
20366 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
20367 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
20368 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
20369 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
20370 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
20371 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>] [disable]")
20373 /* List of command functions, CLI names map directly to functions */
20374 #define foreach_cli_function \
20375 _(comment, "usage: comment <ignore-rest-of-line>") \
20376 _(dump_interface_table, "usage: dump_interface_table") \
20377 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
20378 _(dump_ipv4_table, "usage: dump_ipv4_table") \
20379 _(dump_ipv6_table, "usage: dump_ipv6_table") \
20380 _(dump_stats_table, "usage: dump_stats_table") \
20381 _(dump_macro_table, "usage: dump_macro_table ") \
20382 _(dump_node_table, "usage: dump_node_table") \
20383 _(dump_msg_api_table, "usage: dump_msg_api_table") \
20384 _(get_msg_id, "usage: get_msg_id name_and_crc") \
20385 _(echo, "usage: echo <message>") \
20386 _(exec, "usage: exec <vpe-debug-CLI-command>") \
20387 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
20388 _(help, "usage: help") \
20389 _(q, "usage: quit") \
20390 _(quit, "usage: quit") \
20391 _(search_node_table, "usage: search_node_table <name>...") \
20392 _(set, "usage: set <variable-name> <value>") \
20393 _(script, "usage: script <file-name>") \
20394 _(unset, "usage: unset <variable-name>")
20396 static void vl_api_##n##_t_handler_uni \
20397 (vl_api_##n##_t * mp) \
20399 vat_main_t * vam = &vat_main; \
20400 if (vam->json_output) { \
20401 vl_api_##n##_t_handler_json(mp); \
20403 vl_api_##n##_t_handler(mp); \
20406 foreach_vpe_api_reply_msg;
20407 #if VPP_API_TEST_BUILTIN == 0
20408 foreach_standalone_reply_msg;
20413 vat_api_hookup (vat_main_t * vam)
20416 vl_msg_api_set_handlers(VL_API_##N, #n, \
20417 vl_api_##n##_t_handler_uni, \
20419 vl_api_##n##_t_endian, \
20420 vl_api_##n##_t_print, \
20421 sizeof(vl_api_##n##_t), 1);
20422 foreach_vpe_api_reply_msg;
20423 #if VPP_API_TEST_BUILTIN == 0
20424 foreach_standalone_reply_msg;
20428 #if (VPP_API_TEST_BUILTIN==0)
20429 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
20431 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
20433 vam->function_by_name = hash_create_string (0, sizeof (uword));
20435 vam->help_by_name = hash_create_string (0, sizeof (uword));
20438 /* API messages we can send */
20439 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
20440 foreach_vpe_api_msg;
20444 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
20445 foreach_vpe_api_msg;
20448 /* CLI functions */
20449 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
20450 foreach_cli_function;
20454 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
20455 foreach_cli_function;
20459 #if VPP_API_TEST_BUILTIN
20460 static clib_error_t *
20461 vat_api_hookup_shim (vlib_main_t * vm)
20463 vat_api_hookup (&vat_main);
20467 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
20471 * fd.io coding-style-patch-verification: ON
20474 * eval: (c-set-style "gnu")