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 <vppinfra/socket.h>
22 #include <vlibapi/api.h>
23 #include <vlibmemory/api.h>
24 #include <vnet/ip/ip.h>
25 #include <vnet/ip/ip_neighbor.h>
26 #include <vnet/l2/l2_input.h>
27 #include <vnet/l2tp/l2tp.h>
28 #include <vnet/vxlan/vxlan.h>
29 #include <vnet/geneve/geneve.h>
30 #include <vnet/gre/gre.h>
31 #include <vnet/vxlan-gpe/vxlan_gpe.h>
32 #include <vnet/lisp-gpe/lisp_gpe.h>
34 #include <vpp/api/vpe_msg_enum.h>
35 #include <vnet/l2/l2_classify.h>
36 #include <vnet/l2/l2_vtr.h>
37 #include <vnet/classify/in_out_acl.h>
38 #include <vnet/classify/policer_classify.h>
39 #include <vnet/classify/flow_classify.h>
40 #include <vnet/mpls/mpls.h>
41 #include <vnet/ipsec/ipsec.h>
42 #include <vnet/ipsec/ikev2.h>
44 #include <vnet/cop/cop.h>
45 #include <vnet/ip/ip6_hop_by_hop.h>
46 #include <vnet/ip/ip_source_and_port_range_check.h>
47 #include <vnet/policer/xlate.h>
48 #include <vnet/span/span.h>
49 #include <vnet/policer/policer.h>
50 #include <vnet/policer/police.h>
51 #include <vnet/mfib/mfib_types.h>
52 #include <vnet/dhcp/dhcp_proxy.h>
53 #include <vnet/bonding/node.h>
54 #include <vnet/qos/qos_types.h>
55 #include "vat/json_format.h"
60 #define vl_typedefs /* define message structures */
61 #include <vpp/api/vpe_all_api_h.h>
64 /* declare message handlers for each api */
66 #define vl_endianfun /* define message structures */
67 #include <vpp/api/vpe_all_api_h.h>
70 /* instantiate all the print functions we know about */
71 #define vl_print(handle, ...)
73 #include <vpp/api/vpe_all_api_h.h>
76 #define __plugin_msg_base 0
77 #include <vlibapi/vat_helper_macros.h>
79 #if VPP_API_TEST_BUILTIN == 0
89 vat_socket_connect (vat_main_t * vam)
91 vam->socket_client_main = &socket_client_main;
92 return vl_socket_client_connect ((char *) vam->socket_name, "vpp_api_test",
93 0 /* default socket rx, tx buffer */ );
95 #else /* vpp built-in case, we don't do sockets... */
97 vat_socket_connect (vat_main_t * vam)
103 vl_socket_client_read (int wait)
109 vl_socket_client_write ()
115 vl_socket_client_msg_alloc (int nbytes)
123 vat_time_now (vat_main_t * vam)
125 #if VPP_API_TEST_BUILTIN
126 return vlib_time_now (vam->vlib_main);
128 return clib_time_now (&vam->clib_time);
133 errmsg (char *fmt, ...)
135 vat_main_t *vam = &vat_main;
140 s = va_format (0, fmt, &va);
145 #if VPP_API_TEST_BUILTIN
146 vlib_cli_output (vam->vlib_main, (char *) s);
149 if (vam->ifp != stdin)
150 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
151 vam->input_line_number);
152 fformat (vam->ofp, (char *) s);
160 #if VPP_API_TEST_BUILTIN == 0
162 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
164 vat_main_t *vam = va_arg (*args, vat_main_t *);
165 u32 *result = va_arg (*args, u32 *);
169 if (!unformat (input, "%s", &if_name))
172 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
180 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
185 /* Parse an IP4 address %d.%d.%d.%d. */
187 unformat_ip4_address (unformat_input_t * input, va_list * args)
189 u8 *result = va_arg (*args, u8 *);
192 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
195 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
207 unformat_ethernet_address (unformat_input_t * input, va_list * args)
209 u8 *result = va_arg (*args, u8 *);
212 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
213 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
217 for (i = 0; i < 6; i++)
218 if (a[i] >= (1 << 8))
221 for (i = 0; i < 6; i++)
227 /* Returns ethernet type as an int in host byte order. */
229 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
232 u16 *result = va_arg (*args, u16 *);
236 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
238 if (type >= (1 << 16))
246 /* Parse an IP6 address. */
248 unformat_ip6_address (unformat_input_t * input, va_list * args)
250 ip6_address_t *result = va_arg (*args, ip6_address_t *);
252 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
253 uword c, n_colon, double_colon_index;
255 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
256 double_colon_index = ARRAY_LEN (hex_quads);
257 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
260 if (c >= '0' && c <= '9')
262 else if (c >= 'a' && c <= 'f')
263 hex_digit = c + 10 - 'a';
264 else if (c >= 'A' && c <= 'F')
265 hex_digit = c + 10 - 'A';
266 else if (c == ':' && n_colon < 2)
270 unformat_put_input (input);
274 /* Too many hex quads. */
275 if (n_hex_quads >= ARRAY_LEN (hex_quads))
280 hex_quad = (hex_quad << 4) | hex_digit;
282 /* Hex quad must fit in 16 bits. */
283 if (n_hex_digits >= 4)
290 /* Save position of :: */
293 /* More than one :: ? */
294 if (double_colon_index < ARRAY_LEN (hex_quads))
296 double_colon_index = n_hex_quads;
299 if (n_colon > 0 && n_hex_digits > 0)
301 hex_quads[n_hex_quads++] = hex_quad;
307 if (n_hex_digits > 0)
308 hex_quads[n_hex_quads++] = hex_quad;
313 /* Expand :: to appropriate number of zero hex quads. */
314 if (double_colon_index < ARRAY_LEN (hex_quads))
316 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
318 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
319 hex_quads[n_zero + i] = hex_quads[i];
321 for (i = 0; i < n_zero; i++)
322 hex_quads[double_colon_index + i] = 0;
324 n_hex_quads = ARRAY_LEN (hex_quads);
327 /* Too few hex quads given. */
328 if (n_hex_quads < ARRAY_LEN (hex_quads))
331 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
332 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
339 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
341 u32 *r = va_arg (*args, u32 *);
344 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
345 foreach_ipsec_policy_action
353 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
355 u32 *r = va_arg (*args, u32 *);
358 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
359 foreach_ipsec_crypto_alg
367 format_ipsec_crypto_alg (u8 * s, va_list * args)
369 u32 i = va_arg (*args, u32);
374 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
375 foreach_ipsec_crypto_alg
378 return format (s, "unknown");
380 return format (s, "%s", t);
384 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
386 u32 *r = va_arg (*args, u32 *);
389 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
390 foreach_ipsec_integ_alg
398 format_ipsec_integ_alg (u8 * s, va_list * args)
400 u32 i = va_arg (*args, u32);
405 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
406 foreach_ipsec_integ_alg
409 return format (s, "unknown");
411 return format (s, "%s", t);
415 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
417 u32 *r = va_arg (*args, u32 *);
420 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
421 foreach_ikev2_auth_method
429 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
431 u32 *r = va_arg (*args, u32 *);
434 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
435 foreach_ikev2_id_type
441 #else /* VPP_API_TEST_BUILTIN == 1 */
443 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
445 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
446 vnet_main_t *vnm = vnet_get_main ();
447 u32 *result = va_arg (*args, u32 *);
449 return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result);
453 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
455 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
456 vnet_main_t *vnm = vnet_get_main ();
457 u32 *result = va_arg (*args, u32 *);
459 return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result);
462 #endif /* VPP_API_TEST_BUILTIN */
465 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
467 u8 *r = va_arg (*args, u8 *);
469 if (unformat (input, "kbps"))
470 *r = SSE2_QOS_RATE_KBPS;
471 else if (unformat (input, "pps"))
472 *r = SSE2_QOS_RATE_PPS;
479 unformat_policer_round_type (unformat_input_t * input, va_list * args)
481 u8 *r = va_arg (*args, u8 *);
483 if (unformat (input, "closest"))
484 *r = SSE2_QOS_ROUND_TO_CLOSEST;
485 else if (unformat (input, "up"))
486 *r = SSE2_QOS_ROUND_TO_UP;
487 else if (unformat (input, "down"))
488 *r = SSE2_QOS_ROUND_TO_DOWN;
495 unformat_policer_type (unformat_input_t * input, va_list * args)
497 u8 *r = va_arg (*args, u8 *);
499 if (unformat (input, "1r2c"))
500 *r = SSE2_QOS_POLICER_TYPE_1R2C;
501 else if (unformat (input, "1r3c"))
502 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
503 else if (unformat (input, "2r3c-2698"))
504 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
505 else if (unformat (input, "2r3c-4115"))
506 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
507 else if (unformat (input, "2r3c-mef5cf1"))
508 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
515 unformat_dscp (unformat_input_t * input, va_list * va)
517 u8 *r = va_arg (*va, u8 *);
520 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
529 unformat_policer_action_type (unformat_input_t * input, va_list * va)
531 sse2_qos_pol_action_params_st *a
532 = va_arg (*va, sse2_qos_pol_action_params_st *);
534 if (unformat (input, "drop"))
535 a->action_type = SSE2_QOS_ACTION_DROP;
536 else if (unformat (input, "transmit"))
537 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
538 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
539 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
546 unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
548 u32 *r = va_arg (*va, u32 *);
551 if (unformat (input, "ip4"))
552 tid = POLICER_CLASSIFY_TABLE_IP4;
553 else if (unformat (input, "ip6"))
554 tid = POLICER_CLASSIFY_TABLE_IP6;
555 else if (unformat (input, "l2"))
556 tid = POLICER_CLASSIFY_TABLE_L2;
565 unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
567 u32 *r = va_arg (*va, u32 *);
570 if (unformat (input, "ip4"))
571 tid = FLOW_CLASSIFY_TABLE_IP4;
572 else if (unformat (input, "ip6"))
573 tid = FLOW_CLASSIFY_TABLE_IP6;
581 static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
582 static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
583 static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
584 static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
586 #if (VPP_API_TEST_BUILTIN==0)
588 unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
590 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
591 mfib_itf_attribute_t attr;
594 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
596 if (unformat (input, mfib_itf_flag_long_names[attr]))
597 *iflags |= (1 << attr);
599 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
601 if (unformat (input, mfib_itf_flag_names[attr]))
602 *iflags |= (1 << attr);
605 return (old == *iflags ? 0 : 1);
609 unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
611 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
612 mfib_entry_attribute_t attr;
615 FOR_EACH_MFIB_ATTRIBUTE (attr)
617 if (unformat (input, mfib_flag_long_names[attr]))
618 *eflags |= (1 << attr);
620 FOR_EACH_MFIB_ATTRIBUTE (attr)
622 if (unformat (input, mfib_flag_names[attr]))
623 *eflags |= (1 << attr);
626 return (old == *eflags ? 0 : 1);
630 format_ip4_address (u8 * s, va_list * args)
632 u8 *a = va_arg (*args, u8 *);
633 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
637 format_ip6_address (u8 * s, va_list * args)
639 ip6_address_t *a = va_arg (*args, ip6_address_t *);
640 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
642 i_max_n_zero = ARRAY_LEN (a->as_u16);
644 i_first_zero = i_max_n_zero;
646 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
648 u32 is_zero = a->as_u16[i] == 0;
649 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
655 if ((!is_zero && n_zeros > max_n_zeros)
656 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
658 i_max_n_zero = i_first_zero;
659 max_n_zeros = n_zeros;
660 i_first_zero = ARRAY_LEN (a->as_u16);
665 last_double_colon = 0;
666 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
668 if (i == i_max_n_zero && max_n_zeros > 1)
670 s = format (s, "::");
671 i += max_n_zeros - 1;
672 last_double_colon = 1;
676 s = format (s, "%s%x",
677 (last_double_colon || i == 0) ? "" : ":",
678 clib_net_to_host_u16 (a->as_u16[i]));
679 last_double_colon = 0;
686 /* Format an IP46 address. */
688 format_ip46_address (u8 * s, va_list * args)
690 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
691 ip46_type_t type = va_arg (*args, ip46_type_t);
697 is_ip4 = ip46_address_is_ip4 (ip46);
708 format (s, "%U", format_ip4_address, &ip46->ip4) :
709 format (s, "%U", format_ip6_address, &ip46->ip6);
713 format_ethernet_address (u8 * s, va_list * args)
715 u8 *a = va_arg (*args, u8 *);
717 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
718 a[0], a[1], a[2], a[3], a[4], a[5]);
723 increment_v4_address (ip4_address_t * a)
727 v = ntohl (a->as_u32) + 1;
728 a->as_u32 = ntohl (v);
732 increment_v6_address (ip6_address_t * a)
736 v0 = clib_net_to_host_u64 (a->as_u64[0]);
737 v1 = clib_net_to_host_u64 (a->as_u64[1]);
742 a->as_u64[0] = clib_net_to_host_u64 (v0);
743 a->as_u64[1] = clib_net_to_host_u64 (v1);
747 increment_mac_address (u8 * mac)
749 u64 tmp = *((u64 *) mac);
750 tmp = clib_net_to_host_u64 (tmp);
751 tmp += 1 << 16; /* skip unused (least significant) octets */
752 tmp = clib_host_to_net_u64 (tmp);
754 clib_memcpy (mac, &tmp, 6);
757 static void vl_api_create_loopback_reply_t_handler
758 (vl_api_create_loopback_reply_t * mp)
760 vat_main_t *vam = &vat_main;
761 i32 retval = ntohl (mp->retval);
763 vam->retval = retval;
764 vam->regenerate_interface_table = 1;
765 vam->sw_if_index = ntohl (mp->sw_if_index);
766 vam->result_ready = 1;
769 static void vl_api_create_loopback_reply_t_handler_json
770 (vl_api_create_loopback_reply_t * mp)
772 vat_main_t *vam = &vat_main;
773 vat_json_node_t node;
775 vat_json_init_object (&node);
776 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
777 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
779 vat_json_print (vam->ofp, &node);
780 vat_json_free (&node);
781 vam->retval = ntohl (mp->retval);
782 vam->result_ready = 1;
785 static void vl_api_create_loopback_instance_reply_t_handler
786 (vl_api_create_loopback_instance_reply_t * mp)
788 vat_main_t *vam = &vat_main;
789 i32 retval = ntohl (mp->retval);
791 vam->retval = retval;
792 vam->regenerate_interface_table = 1;
793 vam->sw_if_index = ntohl (mp->sw_if_index);
794 vam->result_ready = 1;
797 static void vl_api_create_loopback_instance_reply_t_handler_json
798 (vl_api_create_loopback_instance_reply_t * mp)
800 vat_main_t *vam = &vat_main;
801 vat_json_node_t node;
803 vat_json_init_object (&node);
804 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
805 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
807 vat_json_print (vam->ofp, &node);
808 vat_json_free (&node);
809 vam->retval = ntohl (mp->retval);
810 vam->result_ready = 1;
813 static void vl_api_af_packet_create_reply_t_handler
814 (vl_api_af_packet_create_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_af_packet_create_reply_t_handler_json
826 (vl_api_af_packet_create_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_create_vlan_subif_reply_t_handler
843 (vl_api_create_vlan_subif_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->sw_if_index = ntohl (mp->sw_if_index);
851 vam->result_ready = 1;
854 static void vl_api_create_vlan_subif_reply_t_handler_json
855 (vl_api_create_vlan_subif_reply_t * mp)
857 vat_main_t *vam = &vat_main;
858 vat_json_node_t node;
860 vat_json_init_object (&node);
861 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
862 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
864 vat_json_print (vam->ofp, &node);
865 vat_json_free (&node);
867 vam->retval = ntohl (mp->retval);
868 vam->result_ready = 1;
871 static void vl_api_create_subif_reply_t_handler
872 (vl_api_create_subif_reply_t * mp)
874 vat_main_t *vam = &vat_main;
875 i32 retval = ntohl (mp->retval);
877 vam->retval = retval;
878 vam->regenerate_interface_table = 1;
879 vam->sw_if_index = ntohl (mp->sw_if_index);
880 vam->result_ready = 1;
883 static void vl_api_create_subif_reply_t_handler_json
884 (vl_api_create_subif_reply_t * mp)
886 vat_main_t *vam = &vat_main;
887 vat_json_node_t node;
889 vat_json_init_object (&node);
890 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
891 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
893 vat_json_print (vam->ofp, &node);
894 vat_json_free (&node);
896 vam->retval = ntohl (mp->retval);
897 vam->result_ready = 1;
900 static void vl_api_interface_name_renumber_reply_t_handler
901 (vl_api_interface_name_renumber_reply_t * mp)
903 vat_main_t *vam = &vat_main;
904 i32 retval = ntohl (mp->retval);
906 vam->retval = retval;
907 vam->regenerate_interface_table = 1;
908 vam->result_ready = 1;
911 static void vl_api_interface_name_renumber_reply_t_handler_json
912 (vl_api_interface_name_renumber_reply_t * mp)
914 vat_main_t *vam = &vat_main;
915 vat_json_node_t node;
917 vat_json_init_object (&node);
918 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
920 vat_json_print (vam->ofp, &node);
921 vat_json_free (&node);
923 vam->retval = ntohl (mp->retval);
924 vam->result_ready = 1;
928 * Special-case: build the interface table, maintain
929 * the next loopback sw_if_index vbl.
931 static void vl_api_sw_interface_details_t_handler
932 (vl_api_sw_interface_details_t * mp)
934 vat_main_t *vam = &vat_main;
935 u8 *s = format (0, "%s%c", mp->interface_name, 0);
937 hash_set_mem (vam->sw_if_index_by_interface_name, s,
938 ntohl (mp->sw_if_index));
940 /* In sub interface case, fill the sub interface table entry */
941 if (mp->sw_if_index != mp->sup_sw_if_index)
943 sw_interface_subif_t *sub = NULL;
945 vec_add2 (vam->sw_if_subif_table, sub, 1);
947 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
948 strncpy ((char *) sub->interface_name, (char *) s,
949 vec_len (sub->interface_name));
950 sub->sw_if_index = ntohl (mp->sw_if_index);
951 sub->sub_id = ntohl (mp->sub_id);
953 sub->sub_dot1ad = mp->sub_dot1ad;
954 sub->sub_number_of_tags = mp->sub_number_of_tags;
955 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
956 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
957 sub->sub_exact_match = mp->sub_exact_match;
958 sub->sub_default = mp->sub_default;
959 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
960 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
962 /* vlan tag rewrite */
963 sub->vtr_op = ntohl (mp->vtr_op);
964 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
965 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
966 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
970 static void vl_api_sw_interface_details_t_handler_json
971 (vl_api_sw_interface_details_t * mp)
973 vat_main_t *vam = &vat_main;
974 vat_json_node_t *node = NULL;
976 if (VAT_JSON_ARRAY != vam->json_tree.type)
978 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
979 vat_json_init_array (&vam->json_tree);
981 node = vat_json_array_add (&vam->json_tree);
983 vat_json_init_object (node);
984 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
985 vat_json_object_add_uint (node, "sup_sw_if_index",
986 ntohl (mp->sup_sw_if_index));
987 vat_json_object_add_uint (node, "l2_address_length",
988 ntohl (mp->l2_address_length));
989 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
990 sizeof (mp->l2_address));
991 vat_json_object_add_string_copy (node, "interface_name",
993 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
994 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
995 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
996 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
997 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
998 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
999 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
1000 vat_json_object_add_uint (node, "sub_number_of_tags",
1001 mp->sub_number_of_tags);
1002 vat_json_object_add_uint (node, "sub_outer_vlan_id",
1003 ntohs (mp->sub_outer_vlan_id));
1004 vat_json_object_add_uint (node, "sub_inner_vlan_id",
1005 ntohs (mp->sub_inner_vlan_id));
1006 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
1007 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
1008 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
1009 mp->sub_outer_vlan_id_any);
1010 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
1011 mp->sub_inner_vlan_id_any);
1012 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
1013 vat_json_object_add_uint (node, "vtr_push_dot1q",
1014 ntohl (mp->vtr_push_dot1q));
1015 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
1016 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
1019 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
1021 format_ethernet_address,
1023 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
1025 format_ethernet_address,
1027 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
1028 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
1032 #if VPP_API_TEST_BUILTIN == 0
1033 static void vl_api_sw_interface_event_t_handler
1034 (vl_api_sw_interface_event_t * mp)
1036 vat_main_t *vam = &vat_main;
1037 if (vam->interface_event_display)
1038 errmsg ("interface flags: sw_if_index %d %s %s",
1039 ntohl (mp->sw_if_index),
1040 mp->admin_up_down ? "admin-up" : "admin-down",
1041 mp->link_up_down ? "link-up" : "link-down");
1045 static void vl_api_sw_interface_event_t_handler_json
1046 (vl_api_sw_interface_event_t * mp)
1048 /* JSON output not supported */
1052 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
1054 vat_main_t *vam = &vat_main;
1055 i32 retval = ntohl (mp->retval);
1057 vam->retval = retval;
1058 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
1059 vam->result_ready = 1;
1063 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
1065 vat_main_t *vam = &vat_main;
1066 vat_json_node_t node;
1067 api_main_t *am = &api_main;
1071 vat_json_init_object (&node);
1072 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1073 vat_json_object_add_uint (&node, "reply_in_shmem",
1074 ntohl (mp->reply_in_shmem));
1075 /* Toss the shared-memory original... */
1076 pthread_mutex_lock (&am->vlib_rp->mutex);
1077 oldheap = svm_push_data_heap (am->vlib_rp);
1079 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1082 svm_pop_heap (oldheap);
1083 pthread_mutex_unlock (&am->vlib_rp->mutex);
1085 vat_json_print (vam->ofp, &node);
1086 vat_json_free (&node);
1088 vam->retval = ntohl (mp->retval);
1089 vam->result_ready = 1;
1093 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
1095 vat_main_t *vam = &vat_main;
1096 i32 retval = ntohl (mp->retval);
1097 u32 length = ntohl (mp->length);
1099 vec_reset_length (vam->cmd_reply);
1101 vam->retval = retval;
1104 vec_validate (vam->cmd_reply, length);
1105 clib_memcpy ((char *) (vam->cmd_reply), mp->reply, length);
1106 vam->cmd_reply[length] = 0;
1108 vam->result_ready = 1;
1112 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
1114 vat_main_t *vam = &vat_main;
1115 vat_json_node_t node;
1117 vec_reset_length (vam->cmd_reply);
1119 vat_json_init_object (&node);
1120 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1121 vat_json_object_add_string_copy (&node, "reply", mp->reply);
1123 vat_json_print (vam->ofp, &node);
1124 vat_json_free (&node);
1126 vam->retval = ntohl (mp->retval);
1127 vam->result_ready = 1;
1130 static void vl_api_classify_add_del_table_reply_t_handler
1131 (vl_api_classify_add_del_table_reply_t * mp)
1133 vat_main_t *vam = &vat_main;
1134 i32 retval = ntohl (mp->retval);
1135 if (vam->async_mode)
1137 vam->async_errors += (retval < 0);
1141 vam->retval = retval;
1143 ((mp->new_table_index != 0xFFFFFFFF) ||
1144 (mp->skip_n_vectors != 0xFFFFFFFF) ||
1145 (mp->match_n_vectors != 0xFFFFFFFF)))
1147 * Note: this is just barely thread-safe, depends on
1148 * the main thread spinning waiting for an answer...
1150 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d",
1151 ntohl (mp->new_table_index),
1152 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
1153 vam->result_ready = 1;
1157 static void vl_api_classify_add_del_table_reply_t_handler_json
1158 (vl_api_classify_add_del_table_reply_t * mp)
1160 vat_main_t *vam = &vat_main;
1161 vat_json_node_t node;
1163 vat_json_init_object (&node);
1164 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1165 vat_json_object_add_uint (&node, "new_table_index",
1166 ntohl (mp->new_table_index));
1167 vat_json_object_add_uint (&node, "skip_n_vectors",
1168 ntohl (mp->skip_n_vectors));
1169 vat_json_object_add_uint (&node, "match_n_vectors",
1170 ntohl (mp->match_n_vectors));
1172 vat_json_print (vam->ofp, &node);
1173 vat_json_free (&node);
1175 vam->retval = ntohl (mp->retval);
1176 vam->result_ready = 1;
1179 static void vl_api_get_node_index_reply_t_handler
1180 (vl_api_get_node_index_reply_t * mp)
1182 vat_main_t *vam = &vat_main;
1183 i32 retval = ntohl (mp->retval);
1184 if (vam->async_mode)
1186 vam->async_errors += (retval < 0);
1190 vam->retval = retval;
1192 errmsg ("node index %d", ntohl (mp->node_index));
1193 vam->result_ready = 1;
1197 static void vl_api_get_node_index_reply_t_handler_json
1198 (vl_api_get_node_index_reply_t * mp)
1200 vat_main_t *vam = &vat_main;
1201 vat_json_node_t node;
1203 vat_json_init_object (&node);
1204 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1205 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1207 vat_json_print (vam->ofp, &node);
1208 vat_json_free (&node);
1210 vam->retval = ntohl (mp->retval);
1211 vam->result_ready = 1;
1214 static void vl_api_get_next_index_reply_t_handler
1215 (vl_api_get_next_index_reply_t * mp)
1217 vat_main_t *vam = &vat_main;
1218 i32 retval = ntohl (mp->retval);
1219 if (vam->async_mode)
1221 vam->async_errors += (retval < 0);
1225 vam->retval = retval;
1227 errmsg ("next node index %d", ntohl (mp->next_index));
1228 vam->result_ready = 1;
1232 static void vl_api_get_next_index_reply_t_handler_json
1233 (vl_api_get_next_index_reply_t * mp)
1235 vat_main_t *vam = &vat_main;
1236 vat_json_node_t node;
1238 vat_json_init_object (&node);
1239 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1240 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1242 vat_json_print (vam->ofp, &node);
1243 vat_json_free (&node);
1245 vam->retval = ntohl (mp->retval);
1246 vam->result_ready = 1;
1249 static void vl_api_add_node_next_reply_t_handler
1250 (vl_api_add_node_next_reply_t * mp)
1252 vat_main_t *vam = &vat_main;
1253 i32 retval = ntohl (mp->retval);
1254 if (vam->async_mode)
1256 vam->async_errors += (retval < 0);
1260 vam->retval = retval;
1262 errmsg ("next index %d", ntohl (mp->next_index));
1263 vam->result_ready = 1;
1267 static void vl_api_add_node_next_reply_t_handler_json
1268 (vl_api_add_node_next_reply_t * mp)
1270 vat_main_t *vam = &vat_main;
1271 vat_json_node_t node;
1273 vat_json_init_object (&node);
1274 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1275 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1277 vat_json_print (vam->ofp, &node);
1278 vat_json_free (&node);
1280 vam->retval = ntohl (mp->retval);
1281 vam->result_ready = 1;
1284 static void vl_api_show_version_reply_t_handler
1285 (vl_api_show_version_reply_t * mp)
1287 vat_main_t *vam = &vat_main;
1288 i32 retval = ntohl (mp->retval);
1292 errmsg (" program: %s", mp->program);
1293 errmsg (" version: %s", mp->version);
1294 errmsg (" build date: %s", mp->build_date);
1295 errmsg ("build directory: %s", mp->build_directory);
1297 vam->retval = retval;
1298 vam->result_ready = 1;
1301 static void vl_api_show_version_reply_t_handler_json
1302 (vl_api_show_version_reply_t * mp)
1304 vat_main_t *vam = &vat_main;
1305 vat_json_node_t node;
1307 vat_json_init_object (&node);
1308 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1309 vat_json_object_add_string_copy (&node, "program", mp->program);
1310 vat_json_object_add_string_copy (&node, "version", mp->version);
1311 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1312 vat_json_object_add_string_copy (&node, "build_directory",
1313 mp->build_directory);
1315 vat_json_print (vam->ofp, &node);
1316 vat_json_free (&node);
1318 vam->retval = ntohl (mp->retval);
1319 vam->result_ready = 1;
1323 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1325 u32 sw_if_index = ntohl (mp->sw_if_index);
1326 errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n",
1327 mp->mac_ip ? "mac/ip binding" : "address resolution",
1328 ntohl (mp->pid), format_ip4_address, &mp->address,
1329 format_ethernet_address, mp->new_mac, sw_if_index);
1333 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1335 /* JSON output not supported */
1339 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1341 u32 sw_if_index = ntohl (mp->sw_if_index);
1342 errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n",
1343 mp->mac_ip ? "mac/ip binding" : "address resolution",
1344 ntohl (mp->pid), format_ip6_address, mp->address,
1345 format_ethernet_address, mp->new_mac, sw_if_index);
1349 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1351 /* JSON output not supported */
1355 vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1357 u32 n_macs = ntohl (mp->n_macs);
1358 errmsg ("L2MAC event recived with pid %d cl-idx %d for %d macs: \n",
1359 ntohl (mp->pid), mp->client_index, n_macs);
1361 for (i = 0; i < n_macs; i++)
1363 vl_api_mac_entry_t *mac = &mp->mac[i];
1364 errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
1365 i + 1, ntohl (mac->sw_if_index),
1366 format_ethernet_address, mac->mac_addr, mac->action);
1373 vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1375 /* JSON output not supported */
1378 #define vl_api_bridge_domain_details_t_endian vl_noop_handler
1379 #define vl_api_bridge_domain_details_t_print vl_noop_handler
1382 * Special-case: build the bridge domain table, maintain
1383 * the next bd id vbl.
1385 static void vl_api_bridge_domain_details_t_handler
1386 (vl_api_bridge_domain_details_t * mp)
1388 vat_main_t *vam = &vat_main;
1389 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1392 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s",
1393 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1395 print (vam->ofp, "%3d %3d %3d %3d %3d %3d",
1396 ntohl (mp->bd_id), mp->learn, mp->forward,
1397 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1401 vl_api_bridge_domain_sw_if_t *sw_ifs;
1402 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1405 sw_ifs = mp->sw_if_details;
1406 for (i = 0; i < n_sw_ifs; i++)
1412 sw_if_index = ntohl (sw_ifs->sw_if_index);
1415 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1417 if ((u32) p->value[0] == sw_if_index)
1419 sw_if_name = (u8 *)(p->key);
1424 print (vam->ofp, "%7d %3d %s", sw_if_index,
1425 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1426 "sw_if_index not found!");
1433 static void vl_api_bridge_domain_details_t_handler_json
1434 (vl_api_bridge_domain_details_t * mp)
1436 vat_main_t *vam = &vat_main;
1437 vat_json_node_t *node, *array = NULL;
1438 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1440 if (VAT_JSON_ARRAY != vam->json_tree.type)
1442 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1443 vat_json_init_array (&vam->json_tree);
1445 node = vat_json_array_add (&vam->json_tree);
1447 vat_json_init_object (node);
1448 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1449 vat_json_object_add_uint (node, "flood", mp->flood);
1450 vat_json_object_add_uint (node, "forward", mp->forward);
1451 vat_json_object_add_uint (node, "learn", mp->learn);
1452 vat_json_object_add_uint (node, "bvi_sw_if_index",
1453 ntohl (mp->bvi_sw_if_index));
1454 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
1455 array = vat_json_object_add (node, "sw_if");
1456 vat_json_init_array (array);
1462 vl_api_bridge_domain_sw_if_t *sw_ifs;
1465 sw_ifs = mp->sw_if_details;
1466 for (i = 0; i < n_sw_ifs; i++)
1468 node = vat_json_array_add (array);
1469 vat_json_init_object (node);
1470 vat_json_object_add_uint (node, "sw_if_index",
1471 ntohl (sw_ifs->sw_if_index));
1472 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1478 static void vl_api_control_ping_reply_t_handler
1479 (vl_api_control_ping_reply_t * mp)
1481 vat_main_t *vam = &vat_main;
1482 i32 retval = ntohl (mp->retval);
1483 if (vam->async_mode)
1485 vam->async_errors += (retval < 0);
1489 vam->retval = retval;
1490 vam->result_ready = 1;
1492 if (vam->socket_client_main)
1493 vam->socket_client_main->control_pings_outstanding--;
1496 static void vl_api_control_ping_reply_t_handler_json
1497 (vl_api_control_ping_reply_t * mp)
1499 vat_main_t *vam = &vat_main;
1500 i32 retval = ntohl (mp->retval);
1502 if (VAT_JSON_NONE != vam->json_tree.type)
1504 vat_json_print (vam->ofp, &vam->json_tree);
1505 vat_json_free (&vam->json_tree);
1506 vam->json_tree.type = VAT_JSON_NONE;
1511 vat_json_init_array (&vam->json_tree);
1512 vat_json_print (vam->ofp, &vam->json_tree);
1513 vam->json_tree.type = VAT_JSON_NONE;
1516 vam->retval = retval;
1517 vam->result_ready = 1;
1521 vl_api_bridge_domain_set_mac_age_reply_t_handler
1522 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1524 vat_main_t *vam = &vat_main;
1525 i32 retval = ntohl (mp->retval);
1526 if (vam->async_mode)
1528 vam->async_errors += (retval < 0);
1532 vam->retval = retval;
1533 vam->result_ready = 1;
1537 static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1538 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1540 vat_main_t *vam = &vat_main;
1541 vat_json_node_t node;
1543 vat_json_init_object (&node);
1544 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1546 vat_json_print (vam->ofp, &node);
1547 vat_json_free (&node);
1549 vam->retval = ntohl (mp->retval);
1550 vam->result_ready = 1;
1554 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1556 vat_main_t *vam = &vat_main;
1557 i32 retval = ntohl (mp->retval);
1558 if (vam->async_mode)
1560 vam->async_errors += (retval < 0);
1564 vam->retval = retval;
1565 vam->result_ready = 1;
1569 static void vl_api_l2_flags_reply_t_handler_json
1570 (vl_api_l2_flags_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, "resulting_feature_bitmap",
1578 ntohl (mp->resulting_feature_bitmap));
1580 vat_json_print (vam->ofp, &node);
1581 vat_json_free (&node);
1583 vam->retval = ntohl (mp->retval);
1584 vam->result_ready = 1;
1587 static void vl_api_bridge_flags_reply_t_handler
1588 (vl_api_bridge_flags_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->result_ready = 1;
1603 static void vl_api_bridge_flags_reply_t_handler_json
1604 (vl_api_bridge_flags_reply_t * mp)
1606 vat_main_t *vam = &vat_main;
1607 vat_json_node_t node;
1609 vat_json_init_object (&node);
1610 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1611 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1612 ntohl (mp->resulting_feature_bitmap));
1614 vat_json_print (vam->ofp, &node);
1615 vat_json_free (&node);
1617 vam->retval = ntohl (mp->retval);
1618 vam->result_ready = 1;
1621 static void vl_api_tap_connect_reply_t_handler
1622 (vl_api_tap_connect_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->sw_if_index = ntohl (mp->sw_if_index);
1634 vam->result_ready = 1;
1639 static void vl_api_tap_connect_reply_t_handler_json
1640 (vl_api_tap_connect_reply_t * mp)
1642 vat_main_t *vam = &vat_main;
1643 vat_json_node_t node;
1645 vat_json_init_object (&node);
1646 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1647 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1649 vat_json_print (vam->ofp, &node);
1650 vat_json_free (&node);
1652 vam->retval = ntohl (mp->retval);
1653 vam->result_ready = 1;
1658 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1660 vat_main_t *vam = &vat_main;
1661 i32 retval = ntohl (mp->retval);
1662 if (vam->async_mode)
1664 vam->async_errors += (retval < 0);
1668 vam->retval = retval;
1669 vam->sw_if_index = ntohl (mp->sw_if_index);
1670 vam->result_ready = 1;
1674 static void vl_api_tap_modify_reply_t_handler_json
1675 (vl_api_tap_modify_reply_t * mp)
1677 vat_main_t *vam = &vat_main;
1678 vat_json_node_t node;
1680 vat_json_init_object (&node);
1681 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1682 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1684 vat_json_print (vam->ofp, &node);
1685 vat_json_free (&node);
1687 vam->retval = ntohl (mp->retval);
1688 vam->result_ready = 1;
1692 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1694 vat_main_t *vam = &vat_main;
1695 i32 retval = ntohl (mp->retval);
1696 if (vam->async_mode)
1698 vam->async_errors += (retval < 0);
1702 vam->retval = retval;
1703 vam->result_ready = 1;
1707 static void vl_api_tap_delete_reply_t_handler_json
1708 (vl_api_tap_delete_reply_t * mp)
1710 vat_main_t *vam = &vat_main;
1711 vat_json_node_t node;
1713 vat_json_init_object (&node);
1714 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1716 vat_json_print (vam->ofp, &node);
1717 vat_json_free (&node);
1719 vam->retval = ntohl (mp->retval);
1720 vam->result_ready = 1;
1724 vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp)
1726 vat_main_t *vam = &vat_main;
1727 i32 retval = ntohl (mp->retval);
1728 if (vam->async_mode)
1730 vam->async_errors += (retval < 0);
1734 vam->retval = retval;
1735 vam->sw_if_index = ntohl (mp->sw_if_index);
1736 vam->result_ready = 1;
1741 static void vl_api_tap_create_v2_reply_t_handler_json
1742 (vl_api_tap_create_v2_reply_t * mp)
1744 vat_main_t *vam = &vat_main;
1745 vat_json_node_t node;
1747 vat_json_init_object (&node);
1748 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1749 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1751 vat_json_print (vam->ofp, &node);
1752 vat_json_free (&node);
1754 vam->retval = ntohl (mp->retval);
1755 vam->result_ready = 1;
1760 vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp)
1762 vat_main_t *vam = &vat_main;
1763 i32 retval = ntohl (mp->retval);
1764 if (vam->async_mode)
1766 vam->async_errors += (retval < 0);
1770 vam->retval = retval;
1771 vam->result_ready = 1;
1775 static void vl_api_tap_delete_v2_reply_t_handler_json
1776 (vl_api_tap_delete_v2_reply_t * mp)
1778 vat_main_t *vam = &vat_main;
1779 vat_json_node_t node;
1781 vat_json_init_object (&node);
1782 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1784 vat_json_print (vam->ofp, &node);
1785 vat_json_free (&node);
1787 vam->retval = ntohl (mp->retval);
1788 vam->result_ready = 1;
1792 vl_api_bond_create_reply_t_handler (vl_api_bond_create_reply_t * mp)
1794 vat_main_t *vam = &vat_main;
1795 i32 retval = ntohl (mp->retval);
1797 if (vam->async_mode)
1799 vam->async_errors += (retval < 0);
1803 vam->retval = retval;
1804 vam->sw_if_index = ntohl (mp->sw_if_index);
1805 vam->result_ready = 1;
1809 static void vl_api_bond_create_reply_t_handler_json
1810 (vl_api_bond_create_reply_t * mp)
1812 vat_main_t *vam = &vat_main;
1813 vat_json_node_t node;
1815 vat_json_init_object (&node);
1816 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1817 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1819 vat_json_print (vam->ofp, &node);
1820 vat_json_free (&node);
1822 vam->retval = ntohl (mp->retval);
1823 vam->result_ready = 1;
1827 vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp)
1829 vat_main_t *vam = &vat_main;
1830 i32 retval = ntohl (mp->retval);
1832 if (vam->async_mode)
1834 vam->async_errors += (retval < 0);
1838 vam->retval = retval;
1839 vam->result_ready = 1;
1843 static void vl_api_bond_delete_reply_t_handler_json
1844 (vl_api_bond_delete_reply_t * mp)
1846 vat_main_t *vam = &vat_main;
1847 vat_json_node_t node;
1849 vat_json_init_object (&node);
1850 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1852 vat_json_print (vam->ofp, &node);
1853 vat_json_free (&node);
1855 vam->retval = ntohl (mp->retval);
1856 vam->result_ready = 1;
1860 vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
1862 vat_main_t *vam = &vat_main;
1863 i32 retval = ntohl (mp->retval);
1865 if (vam->async_mode)
1867 vam->async_errors += (retval < 0);
1871 vam->retval = retval;
1872 vam->result_ready = 1;
1876 static void vl_api_bond_enslave_reply_t_handler_json
1877 (vl_api_bond_enslave_reply_t * mp)
1879 vat_main_t *vam = &vat_main;
1880 vat_json_node_t node;
1882 vat_json_init_object (&node);
1883 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1885 vat_json_print (vam->ofp, &node);
1886 vat_json_free (&node);
1888 vam->retval = ntohl (mp->retval);
1889 vam->result_ready = 1;
1893 vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
1896 vat_main_t *vam = &vat_main;
1897 i32 retval = ntohl (mp->retval);
1899 if (vam->async_mode)
1901 vam->async_errors += (retval < 0);
1905 vam->retval = retval;
1906 vam->result_ready = 1;
1910 static void vl_api_bond_detach_slave_reply_t_handler_json
1911 (vl_api_bond_detach_slave_reply_t * mp)
1913 vat_main_t *vam = &vat_main;
1914 vat_json_node_t node;
1916 vat_json_init_object (&node);
1917 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1919 vat_json_print (vam->ofp, &node);
1920 vat_json_free (&node);
1922 vam->retval = ntohl (mp->retval);
1923 vam->result_ready = 1;
1926 static void vl_api_sw_interface_bond_details_t_handler
1927 (vl_api_sw_interface_bond_details_t * mp)
1929 vat_main_t *vam = &vat_main;
1932 "%-16s %-12d %-12U %-13U %-14u %-14u",
1933 mp->interface_name, ntohl (mp->sw_if_index),
1934 format_bond_mode, mp->mode, format_bond_load_balance, mp->lb,
1935 ntohl (mp->active_slaves), ntohl (mp->slaves));
1938 static void vl_api_sw_interface_bond_details_t_handler_json
1939 (vl_api_sw_interface_bond_details_t * mp)
1941 vat_main_t *vam = &vat_main;
1942 vat_json_node_t *node = NULL;
1944 if (VAT_JSON_ARRAY != vam->json_tree.type)
1946 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1947 vat_json_init_array (&vam->json_tree);
1949 node = vat_json_array_add (&vam->json_tree);
1951 vat_json_init_object (node);
1952 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1953 vat_json_object_add_string_copy (node, "interface_name",
1954 mp->interface_name);
1955 vat_json_object_add_uint (node, "mode", mp->mode);
1956 vat_json_object_add_uint (node, "load_balance", mp->lb);
1957 vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
1958 vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
1962 api_sw_interface_bond_dump (vat_main_t * vam)
1964 vl_api_sw_interface_bond_dump_t *mp;
1965 vl_api_control_ping_t *mp_ping;
1969 "\n%-16s %-12s %-12s %-13s %-14s %-14s",
1970 "interface name", "sw_if_index", "mode", "load balance",
1971 "active slaves", "slaves");
1973 /* Get list of bond interfaces */
1974 M (SW_INTERFACE_BOND_DUMP, mp);
1977 /* Use a control ping for synchronization */
1978 MPING (CONTROL_PING, mp_ping);
1985 static void vl_api_sw_interface_slave_details_t_handler
1986 (vl_api_sw_interface_slave_details_t * mp)
1988 vat_main_t *vam = &vat_main;
1991 "%-25s %-12d %-12d %d", mp->interface_name,
1992 ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout);
1995 static void vl_api_sw_interface_slave_details_t_handler_json
1996 (vl_api_sw_interface_slave_details_t * mp)
1998 vat_main_t *vam = &vat_main;
1999 vat_json_node_t *node = NULL;
2001 if (VAT_JSON_ARRAY != vam->json_tree.type)
2003 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2004 vat_json_init_array (&vam->json_tree);
2006 node = vat_json_array_add (&vam->json_tree);
2008 vat_json_init_object (node);
2009 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2010 vat_json_object_add_string_copy (node, "interface_name",
2011 mp->interface_name);
2012 vat_json_object_add_uint (node, "passive", mp->is_passive);
2013 vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout);
2017 api_sw_interface_slave_dump (vat_main_t * vam)
2019 unformat_input_t *i = vam->input;
2020 vl_api_sw_interface_slave_dump_t *mp;
2021 vl_api_control_ping_t *mp_ping;
2022 u32 sw_if_index = ~0;
2023 u8 sw_if_index_set = 0;
2026 /* Parse args required to build the message */
2027 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2029 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2030 sw_if_index_set = 1;
2031 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2032 sw_if_index_set = 1;
2037 if (sw_if_index_set == 0)
2039 errmsg ("missing vpp interface name. ");
2044 "\n%-25s %-12s %-12s %s",
2045 "slave interface name", "sw_if_index", "passive", "long_timeout");
2047 /* Get list of bond interfaces */
2048 M (SW_INTERFACE_SLAVE_DUMP, mp);
2049 mp->sw_if_index = ntohl (sw_if_index);
2052 /* Use a control ping for synchronization */
2053 MPING (CONTROL_PING, mp_ping);
2060 static void vl_api_mpls_tunnel_add_del_reply_t_handler
2061 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2063 vat_main_t *vam = &vat_main;
2064 i32 retval = ntohl (mp->retval);
2065 if (vam->async_mode)
2067 vam->async_errors += (retval < 0);
2071 vam->retval = retval;
2072 vam->result_ready = 1;
2076 static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
2077 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2079 vat_main_t *vam = &vat_main;
2080 vat_json_node_t node;
2082 vat_json_init_object (&node);
2083 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2084 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
2085 ntohl (mp->sw_if_index));
2087 vat_json_print (vam->ofp, &node);
2088 vat_json_free (&node);
2090 vam->retval = ntohl (mp->retval);
2091 vam->result_ready = 1;
2094 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
2095 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2097 vat_main_t *vam = &vat_main;
2098 i32 retval = ntohl (mp->retval);
2099 if (vam->async_mode)
2101 vam->async_errors += (retval < 0);
2105 vam->retval = retval;
2106 vam->sw_if_index = ntohl (mp->sw_if_index);
2107 vam->result_ready = 1;
2111 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
2112 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2114 vat_main_t *vam = &vat_main;
2115 vat_json_node_t node;
2117 vat_json_init_object (&node);
2118 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2119 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2121 vat_json_print (vam->ofp, &node);
2122 vat_json_free (&node);
2124 vam->retval = ntohl (mp->retval);
2125 vam->result_ready = 1;
2128 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
2129 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2131 vat_main_t *vam = &vat_main;
2132 i32 retval = ntohl (mp->retval);
2133 if (vam->async_mode)
2135 vam->async_errors += (retval < 0);
2139 vam->retval = retval;
2140 vam->result_ready = 1;
2144 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
2145 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2147 vat_main_t *vam = &vat_main;
2148 vat_json_node_t node;
2150 vat_json_init_object (&node);
2151 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2152 vat_json_object_add_uint (&node, "fwd_entry_index",
2153 clib_net_to_host_u32 (mp->fwd_entry_index));
2155 vat_json_print (vam->ofp, &node);
2156 vat_json_free (&node);
2158 vam->retval = ntohl (mp->retval);
2159 vam->result_ready = 1;
2163 format_lisp_transport_protocol (u8 * s, va_list * args)
2165 u32 proto = va_arg (*args, u32);
2170 return format (s, "udp");
2172 return format (s, "api");
2179 static void vl_api_one_get_transport_protocol_reply_t_handler
2180 (vl_api_one_get_transport_protocol_reply_t * mp)
2182 vat_main_t *vam = &vat_main;
2183 i32 retval = ntohl (mp->retval);
2184 if (vam->async_mode)
2186 vam->async_errors += (retval < 0);
2190 u32 proto = mp->protocol;
2191 print (vam->ofp, "Transport protocol: %U",
2192 format_lisp_transport_protocol, proto);
2193 vam->retval = retval;
2194 vam->result_ready = 1;
2198 static void vl_api_one_get_transport_protocol_reply_t_handler_json
2199 (vl_api_one_get_transport_protocol_reply_t * mp)
2201 vat_main_t *vam = &vat_main;
2202 vat_json_node_t node;
2205 s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
2208 vat_json_init_object (&node);
2209 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2210 vat_json_object_add_string_copy (&node, "transport-protocol", s);
2213 vat_json_print (vam->ofp, &node);
2214 vat_json_free (&node);
2216 vam->retval = ntohl (mp->retval);
2217 vam->result_ready = 1;
2220 static void vl_api_one_add_del_locator_set_reply_t_handler
2221 (vl_api_one_add_del_locator_set_reply_t * mp)
2223 vat_main_t *vam = &vat_main;
2224 i32 retval = ntohl (mp->retval);
2225 if (vam->async_mode)
2227 vam->async_errors += (retval < 0);
2231 vam->retval = retval;
2232 vam->result_ready = 1;
2236 static void vl_api_one_add_del_locator_set_reply_t_handler_json
2237 (vl_api_one_add_del_locator_set_reply_t * mp)
2239 vat_main_t *vam = &vat_main;
2240 vat_json_node_t node;
2242 vat_json_init_object (&node);
2243 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2244 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
2246 vat_json_print (vam->ofp, &node);
2247 vat_json_free (&node);
2249 vam->retval = ntohl (mp->retval);
2250 vam->result_ready = 1;
2253 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
2254 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2256 vat_main_t *vam = &vat_main;
2257 i32 retval = ntohl (mp->retval);
2258 if (vam->async_mode)
2260 vam->async_errors += (retval < 0);
2264 vam->retval = retval;
2265 vam->sw_if_index = ntohl (mp->sw_if_index);
2266 vam->result_ready = 1;
2268 vam->regenerate_interface_table = 1;
2271 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
2272 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2274 vat_main_t *vam = &vat_main;
2275 vat_json_node_t node;
2277 vat_json_init_object (&node);
2278 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2279 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2281 vat_json_print (vam->ofp, &node);
2282 vat_json_free (&node);
2284 vam->retval = ntohl (mp->retval);
2285 vam->result_ready = 1;
2288 static void vl_api_vxlan_offload_rx_reply_t_handler
2289 (vl_api_vxlan_offload_rx_reply_t * mp)
2291 vat_main_t *vam = &vat_main;
2292 i32 retval = ntohl (mp->retval);
2293 if (vam->async_mode)
2295 vam->async_errors += (retval < 0);
2299 vam->retval = retval;
2300 vam->result_ready = 1;
2304 static void vl_api_vxlan_offload_rx_reply_t_handler_json
2305 (vl_api_vxlan_offload_rx_reply_t * mp)
2307 vat_main_t *vam = &vat_main;
2308 vat_json_node_t node;
2310 vat_json_init_object (&node);
2311 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2313 vat_json_print (vam->ofp, &node);
2314 vat_json_free (&node);
2316 vam->retval = ntohl (mp->retval);
2317 vam->result_ready = 1;
2320 static void vl_api_geneve_add_del_tunnel_reply_t_handler
2321 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2323 vat_main_t *vam = &vat_main;
2324 i32 retval = ntohl (mp->retval);
2325 if (vam->async_mode)
2327 vam->async_errors += (retval < 0);
2331 vam->retval = retval;
2332 vam->sw_if_index = ntohl (mp->sw_if_index);
2333 vam->result_ready = 1;
2337 static void vl_api_geneve_add_del_tunnel_reply_t_handler_json
2338 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2340 vat_main_t *vam = &vat_main;
2341 vat_json_node_t node;
2343 vat_json_init_object (&node);
2344 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2345 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2347 vat_json_print (vam->ofp, &node);
2348 vat_json_free (&node);
2350 vam->retval = ntohl (mp->retval);
2351 vam->result_ready = 1;
2354 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
2355 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2357 vat_main_t *vam = &vat_main;
2358 i32 retval = ntohl (mp->retval);
2359 if (vam->async_mode)
2361 vam->async_errors += (retval < 0);
2365 vam->retval = retval;
2366 vam->sw_if_index = ntohl (mp->sw_if_index);
2367 vam->result_ready = 1;
2369 vam->regenerate_interface_table = 1;
2372 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
2373 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2375 vat_main_t *vam = &vat_main;
2376 vat_json_node_t node;
2378 vat_json_init_object (&node);
2379 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2380 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2382 vat_json_print (vam->ofp, &node);
2383 vat_json_free (&node);
2385 vam->retval = ntohl (mp->retval);
2386 vam->result_ready = 1;
2389 static void vl_api_gre_add_del_tunnel_reply_t_handler
2390 (vl_api_gre_add_del_tunnel_reply_t * mp)
2392 vat_main_t *vam = &vat_main;
2393 i32 retval = ntohl (mp->retval);
2394 if (vam->async_mode)
2396 vam->async_errors += (retval < 0);
2400 vam->retval = retval;
2401 vam->sw_if_index = ntohl (mp->sw_if_index);
2402 vam->result_ready = 1;
2406 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
2407 (vl_api_gre_add_del_tunnel_reply_t * mp)
2409 vat_main_t *vam = &vat_main;
2410 vat_json_node_t node;
2412 vat_json_init_object (&node);
2413 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2414 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2416 vat_json_print (vam->ofp, &node);
2417 vat_json_free (&node);
2419 vam->retval = ntohl (mp->retval);
2420 vam->result_ready = 1;
2423 static void vl_api_create_vhost_user_if_reply_t_handler
2424 (vl_api_create_vhost_user_if_reply_t * mp)
2426 vat_main_t *vam = &vat_main;
2427 i32 retval = ntohl (mp->retval);
2428 if (vam->async_mode)
2430 vam->async_errors += (retval < 0);
2434 vam->retval = retval;
2435 vam->sw_if_index = ntohl (mp->sw_if_index);
2436 vam->result_ready = 1;
2438 vam->regenerate_interface_table = 1;
2441 static void vl_api_create_vhost_user_if_reply_t_handler_json
2442 (vl_api_create_vhost_user_if_reply_t * mp)
2444 vat_main_t *vam = &vat_main;
2445 vat_json_node_t node;
2447 vat_json_init_object (&node);
2448 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2449 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2451 vat_json_print (vam->ofp, &node);
2452 vat_json_free (&node);
2454 vam->retval = ntohl (mp->retval);
2455 vam->result_ready = 1;
2458 static void vl_api_dns_resolve_name_reply_t_handler
2459 (vl_api_dns_resolve_name_reply_t * mp)
2461 vat_main_t *vam = &vat_main;
2462 i32 retval = ntohl (mp->retval);
2463 if (vam->async_mode)
2465 vam->async_errors += (retval < 0);
2469 vam->retval = retval;
2470 vam->result_ready = 1;
2475 clib_warning ("ip4 address %U", format_ip4_address,
2476 (ip4_address_t *) mp->ip4_address);
2478 clib_warning ("ip6 address %U", format_ip6_address,
2479 (ip6_address_t *) mp->ip6_address);
2482 clib_warning ("retval %d", retval);
2486 static void vl_api_dns_resolve_name_reply_t_handler_json
2487 (vl_api_dns_resolve_name_reply_t * mp)
2489 clib_warning ("not implemented");
2492 static void vl_api_dns_resolve_ip_reply_t_handler
2493 (vl_api_dns_resolve_ip_reply_t * mp)
2495 vat_main_t *vam = &vat_main;
2496 i32 retval = ntohl (mp->retval);
2497 if (vam->async_mode)
2499 vam->async_errors += (retval < 0);
2503 vam->retval = retval;
2504 vam->result_ready = 1;
2508 clib_warning ("canonical name %s", mp->name);
2511 clib_warning ("retval %d", retval);
2515 static void vl_api_dns_resolve_ip_reply_t_handler_json
2516 (vl_api_dns_resolve_ip_reply_t * mp)
2518 clib_warning ("not implemented");
2522 static void vl_api_ip_address_details_t_handler
2523 (vl_api_ip_address_details_t * mp)
2525 vat_main_t *vam = &vat_main;
2526 static ip_address_details_t empty_ip_address_details = { {0} };
2527 ip_address_details_t *address = NULL;
2528 ip_details_t *current_ip_details = NULL;
2529 ip_details_t *details = NULL;
2531 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
2533 if (!details || vam->current_sw_if_index >= vec_len (details)
2534 || !details[vam->current_sw_if_index].present)
2536 errmsg ("ip address details arrived but not stored");
2537 errmsg ("ip_dump should be called first");
2541 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
2543 #define addresses (current_ip_details->addr)
2545 vec_validate_init_empty (addresses, vec_len (addresses),
2546 empty_ip_address_details);
2548 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
2550 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
2551 address->prefix_length = mp->prefix_length;
2555 static void vl_api_ip_address_details_t_handler_json
2556 (vl_api_ip_address_details_t * mp)
2558 vat_main_t *vam = &vat_main;
2559 vat_json_node_t *node = NULL;
2560 struct in6_addr ip6;
2563 if (VAT_JSON_ARRAY != vam->json_tree.type)
2565 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2566 vat_json_init_array (&vam->json_tree);
2568 node = vat_json_array_add (&vam->json_tree);
2570 vat_json_init_object (node);
2573 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
2574 vat_json_object_add_ip6 (node, "ip", ip6);
2578 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
2579 vat_json_object_add_ip4 (node, "ip", ip4);
2581 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
2585 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
2587 vat_main_t *vam = &vat_main;
2588 static ip_details_t empty_ip_details = { 0 };
2589 ip_details_t *ip = NULL;
2590 u32 sw_if_index = ~0;
2592 sw_if_index = ntohl (mp->sw_if_index);
2594 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2595 sw_if_index, empty_ip_details);
2597 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2604 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
2606 vat_main_t *vam = &vat_main;
2608 if (VAT_JSON_ARRAY != vam->json_tree.type)
2610 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2611 vat_json_init_array (&vam->json_tree);
2613 vat_json_array_add_uint (&vam->json_tree,
2614 clib_net_to_host_u32 (mp->sw_if_index));
2618 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
2620 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
2621 "router_addr %U host_mac %U",
2622 ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4",
2624 format_ip4_address, &mp->lease.host_address,
2625 format_ip4_address, &mp->lease.router_address,
2626 format_ethernet_address, mp->lease.host_mac);
2629 static void vl_api_dhcp_compl_event_t_handler_json
2630 (vl_api_dhcp_compl_event_t * mp)
2632 /* JSON output not supported */
2636 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
2639 vat_main_t *vam = &vat_main;
2640 static u64 default_counter = 0;
2642 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
2644 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
2645 sw_if_index, default_counter);
2646 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
2650 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
2651 interface_counter_t counter)
2653 vat_main_t *vam = &vat_main;
2654 static interface_counter_t default_counter = { 0, };
2656 vec_validate_init_empty (vam->combined_interface_counters,
2657 vnet_counter_type, NULL);
2658 vec_validate_init_empty (vam->combined_interface_counters
2659 [vnet_counter_type], sw_if_index, default_counter);
2660 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
2663 static void vl_api_vnet_interface_simple_counters_t_handler
2664 (vl_api_vnet_interface_simple_counters_t * mp)
2669 static void vl_api_vnet_interface_combined_counters_t_handler
2670 (vl_api_vnet_interface_combined_counters_t * mp)
2675 static void vl_api_vnet_interface_simple_counters_t_handler_json
2676 (vl_api_vnet_interface_simple_counters_t * mp)
2681 u32 first_sw_if_index;
2684 count = ntohl (mp->count);
2685 first_sw_if_index = ntohl (mp->first_sw_if_index);
2687 v_packets = (u64 *) & mp->data;
2688 for (i = 0; i < count; i++)
2690 packets = clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
2691 set_simple_interface_counter (mp->vnet_counter_type,
2692 first_sw_if_index + i, packets);
2697 static void vl_api_vnet_interface_combined_counters_t_handler_json
2698 (vl_api_vnet_interface_combined_counters_t * mp)
2700 interface_counter_t counter;
2702 u32 first_sw_if_index;
2706 count = ntohl (mp->count);
2707 first_sw_if_index = ntohl (mp->first_sw_if_index);
2709 v = (vlib_counter_t *) & mp->data;
2710 for (i = 0; i < count; i++)
2713 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
2715 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
2716 set_combined_interface_counter (mp->vnet_counter_type,
2717 first_sw_if_index + i, counter);
2723 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2725 vat_main_t *vam = &vat_main;
2728 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
2730 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
2739 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2741 vat_main_t *vam = &vat_main;
2744 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2746 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2754 static void vl_api_vnet_ip4_fib_counters_t_handler
2755 (vl_api_vnet_ip4_fib_counters_t * mp)
2760 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2761 (vl_api_vnet_ip4_fib_counters_t * mp)
2763 vat_main_t *vam = &vat_main;
2764 vl_api_ip4_fib_counter_t *v;
2765 ip4_fib_counter_t *counter;
2772 vrf_id = ntohl (mp->vrf_id);
2773 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2774 if (~0 == vrf_index)
2776 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2777 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2778 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2779 vec_validate (vam->ip4_fib_counters, vrf_index);
2780 vam->ip4_fib_counters[vrf_index] = NULL;
2783 vec_free (vam->ip4_fib_counters[vrf_index]);
2784 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2785 count = ntohl (mp->count);
2786 for (i = 0; i < count; i++)
2788 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2789 counter = &vam->ip4_fib_counters[vrf_index][i];
2790 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2791 counter->address = ip4;
2792 counter->address_length = v->address_length;
2793 counter->packets = clib_net_to_host_u64 (v->packets);
2794 counter->bytes = clib_net_to_host_u64 (v->bytes);
2799 static void vl_api_vnet_ip4_nbr_counters_t_handler
2800 (vl_api_vnet_ip4_nbr_counters_t * mp)
2805 static void vl_api_vnet_ip4_nbr_counters_t_handler_json
2806 (vl_api_vnet_ip4_nbr_counters_t * mp)
2808 vat_main_t *vam = &vat_main;
2809 vl_api_ip4_nbr_counter_t *v;
2810 ip4_nbr_counter_t *counter;
2815 sw_if_index = ntohl (mp->sw_if_index);
2816 count = ntohl (mp->count);
2817 vec_validate (vam->ip4_nbr_counters, sw_if_index);
2820 vec_free (vam->ip4_nbr_counters[sw_if_index]);
2822 v = (vl_api_ip4_nbr_counter_t *) & mp->c;
2823 for (i = 0; i < count; i++)
2825 vec_validate (vam->ip4_nbr_counters[sw_if_index], i);
2826 counter = &vam->ip4_nbr_counters[sw_if_index][i];
2827 counter->address.s_addr = v->address;
2828 counter->packets = clib_net_to_host_u64 (v->packets);
2829 counter->bytes = clib_net_to_host_u64 (v->bytes);
2830 counter->linkt = v->link_type;
2835 static void vl_api_vnet_ip6_fib_counters_t_handler
2836 (vl_api_vnet_ip6_fib_counters_t * mp)
2841 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2842 (vl_api_vnet_ip6_fib_counters_t * mp)
2844 vat_main_t *vam = &vat_main;
2845 vl_api_ip6_fib_counter_t *v;
2846 ip6_fib_counter_t *counter;
2847 struct in6_addr ip6;
2853 vrf_id = ntohl (mp->vrf_id);
2854 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2855 if (~0 == vrf_index)
2857 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2858 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2859 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2860 vec_validate (vam->ip6_fib_counters, vrf_index);
2861 vam->ip6_fib_counters[vrf_index] = NULL;
2864 vec_free (vam->ip6_fib_counters[vrf_index]);
2865 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2866 count = ntohl (mp->count);
2867 for (i = 0; i < count; i++)
2869 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2870 counter = &vam->ip6_fib_counters[vrf_index][i];
2871 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2872 counter->address = ip6;
2873 counter->address_length = v->address_length;
2874 counter->packets = clib_net_to_host_u64 (v->packets);
2875 counter->bytes = clib_net_to_host_u64 (v->bytes);
2880 static void vl_api_vnet_ip6_nbr_counters_t_handler
2881 (vl_api_vnet_ip6_nbr_counters_t * mp)
2886 static void vl_api_vnet_ip6_nbr_counters_t_handler_json
2887 (vl_api_vnet_ip6_nbr_counters_t * mp)
2889 vat_main_t *vam = &vat_main;
2890 vl_api_ip6_nbr_counter_t *v;
2891 ip6_nbr_counter_t *counter;
2892 struct in6_addr ip6;
2897 sw_if_index = ntohl (mp->sw_if_index);
2898 count = ntohl (mp->count);
2899 vec_validate (vam->ip6_nbr_counters, sw_if_index);
2902 vec_free (vam->ip6_nbr_counters[sw_if_index]);
2904 v = (vl_api_ip6_nbr_counter_t *) & mp->c;
2905 for (i = 0; i < count; i++)
2907 vec_validate (vam->ip6_nbr_counters[sw_if_index], i);
2908 counter = &vam->ip6_nbr_counters[sw_if_index][i];
2909 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2910 counter->address = ip6;
2911 counter->packets = clib_net_to_host_u64 (v->packets);
2912 counter->bytes = clib_net_to_host_u64 (v->bytes);
2917 static void vl_api_get_first_msg_id_reply_t_handler
2918 (vl_api_get_first_msg_id_reply_t * mp)
2920 vat_main_t *vam = &vat_main;
2921 i32 retval = ntohl (mp->retval);
2923 if (vam->async_mode)
2925 vam->async_errors += (retval < 0);
2929 vam->retval = retval;
2930 vam->result_ready = 1;
2934 errmsg ("first message id %d", ntohs (mp->first_msg_id));
2938 static void vl_api_get_first_msg_id_reply_t_handler_json
2939 (vl_api_get_first_msg_id_reply_t * mp)
2941 vat_main_t *vam = &vat_main;
2942 vat_json_node_t node;
2944 vat_json_init_object (&node);
2945 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2946 vat_json_object_add_uint (&node, "first_msg_id",
2947 (uint) ntohs (mp->first_msg_id));
2949 vat_json_print (vam->ofp, &node);
2950 vat_json_free (&node);
2952 vam->retval = ntohl (mp->retval);
2953 vam->result_ready = 1;
2956 static void vl_api_get_node_graph_reply_t_handler
2957 (vl_api_get_node_graph_reply_t * mp)
2959 vat_main_t *vam = &vat_main;
2960 api_main_t *am = &api_main;
2961 i32 retval = ntohl (mp->retval);
2962 u8 *pvt_copy, *reply;
2967 if (vam->async_mode)
2969 vam->async_errors += (retval < 0);
2973 vam->retval = retval;
2974 vam->result_ready = 1;
2977 /* "Should never happen..." */
2981 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2982 pvt_copy = vec_dup (reply);
2984 /* Toss the shared-memory original... */
2985 pthread_mutex_lock (&am->vlib_rp->mutex);
2986 oldheap = svm_push_data_heap (am->vlib_rp);
2990 svm_pop_heap (oldheap);
2991 pthread_mutex_unlock (&am->vlib_rp->mutex);
2993 if (vam->graph_nodes)
2995 hash_free (vam->graph_node_index_by_name);
2997 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
2999 node = vam->graph_nodes[0][i];
3000 vec_free (node->name);
3001 vec_free (node->next_nodes);
3004 vec_free (vam->graph_nodes[0]);
3005 vec_free (vam->graph_nodes);
3008 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
3009 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
3010 vec_free (pvt_copy);
3012 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
3014 node = vam->graph_nodes[0][i];
3015 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
3019 static void vl_api_get_node_graph_reply_t_handler_json
3020 (vl_api_get_node_graph_reply_t * mp)
3022 vat_main_t *vam = &vat_main;
3023 api_main_t *am = &api_main;
3025 vat_json_node_t node;
3028 /* $$$$ make this real? */
3029 vat_json_init_object (&node);
3030 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3031 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
3033 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
3035 /* Toss the shared-memory original... */
3036 pthread_mutex_lock (&am->vlib_rp->mutex);
3037 oldheap = svm_push_data_heap (am->vlib_rp);
3041 svm_pop_heap (oldheap);
3042 pthread_mutex_unlock (&am->vlib_rp->mutex);
3044 vat_json_print (vam->ofp, &node);
3045 vat_json_free (&node);
3047 vam->retval = ntohl (mp->retval);
3048 vam->result_ready = 1;
3052 vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
3054 vat_main_t *vam = &vat_main;
3059 s = format (s, "%=16d%=16d%=16d",
3060 ntohl (mp->sw_if_index), mp->priority, mp->weight);
3064 s = format (s, "%=16U%=16d%=16d",
3065 mp->is_ipv6 ? format_ip6_address :
3067 mp->ip_address, mp->priority, mp->weight);
3070 print (vam->ofp, "%v", s);
3075 vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
3077 vat_main_t *vam = &vat_main;
3078 vat_json_node_t *node = NULL;
3079 struct in6_addr ip6;
3082 if (VAT_JSON_ARRAY != vam->json_tree.type)
3084 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3085 vat_json_init_array (&vam->json_tree);
3087 node = vat_json_array_add (&vam->json_tree);
3088 vat_json_init_object (node);
3090 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
3091 vat_json_object_add_uint (node, "priority", mp->priority);
3092 vat_json_object_add_uint (node, "weight", mp->weight);
3095 vat_json_object_add_uint (node, "sw_if_index",
3096 clib_net_to_host_u32 (mp->sw_if_index));
3101 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
3102 vat_json_object_add_ip6 (node, "address", ip6);
3106 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
3107 vat_json_object_add_ip4 (node, "address", ip4);
3113 vl_api_one_locator_set_details_t_handler (vl_api_one_locator_set_details_t *
3116 vat_main_t *vam = &vat_main;
3119 ls_name = format (0, "%s", mp->ls_name);
3121 print (vam->ofp, "%=10d%=15v", clib_net_to_host_u32 (mp->ls_index),
3127 vl_api_one_locator_set_details_t_handler_json
3128 (vl_api_one_locator_set_details_t * mp)
3130 vat_main_t *vam = &vat_main;
3131 vat_json_node_t *node = 0;
3134 ls_name = format (0, "%s", mp->ls_name);
3135 vec_add1 (ls_name, 0);
3137 if (VAT_JSON_ARRAY != vam->json_tree.type)
3139 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3140 vat_json_init_array (&vam->json_tree);
3142 node = vat_json_array_add (&vam->json_tree);
3144 vat_json_init_object (node);
3145 vat_json_object_add_string_copy (node, "ls_name", ls_name);
3146 vat_json_object_add_uint (node, "ls_index",
3147 clib_net_to_host_u32 (mp->ls_index));
3155 } __attribute__ ((__packed__)) lisp_nsh_api_t;
3158 unformat_nsh_address (unformat_input_t * input, va_list * args)
3160 lisp_nsh_api_t *nsh = va_arg (*args, lisp_nsh_api_t *);
3161 return unformat (input, "SPI:%d SI:%d", &nsh->spi, &nsh->si);
3165 format_nsh_address_vat (u8 * s, va_list * args)
3167 nsh_t *a = va_arg (*args, nsh_t *);
3168 return format (s, "SPI:%d SI:%d", clib_net_to_host_u32 (a->spi), a->si);
3172 format_lisp_flat_eid (u8 * s, va_list * args)
3174 u32 type = va_arg (*args, u32);
3175 u8 *eid = va_arg (*args, u8 *);
3176 u32 eid_len = va_arg (*args, u32);
3181 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
3183 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
3185 return format (s, "%U", format_ethernet_address, eid);
3187 return format (s, "%U", format_nsh_address_vat, eid);
3193 format_lisp_eid_vat (u8 * s, va_list * args)
3195 u32 type = va_arg (*args, u32);
3196 u8 *eid = va_arg (*args, u8 *);
3197 u32 eid_len = va_arg (*args, u32);
3198 u8 *seid = va_arg (*args, u8 *);
3199 u32 seid_len = va_arg (*args, u32);
3200 u32 is_src_dst = va_arg (*args, u32);
3203 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
3205 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
3211 vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
3213 vat_main_t *vam = &vat_main;
3214 u8 *s = 0, *eid = 0;
3216 if (~0 == mp->locator_set_index)
3217 s = format (0, "action: %d", mp->action);
3219 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
3221 eid = format (0, "%U", format_lisp_eid_vat,
3225 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3228 print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
3229 clib_net_to_host_u32 (mp->vni),
3231 mp->is_local ? "local" : "remote",
3232 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
3233 clib_net_to_host_u16 (mp->key_id), mp->key);
3240 vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
3243 vat_main_t *vam = &vat_main;
3244 vat_json_node_t *node = 0;
3247 if (VAT_JSON_ARRAY != vam->json_tree.type)
3249 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3250 vat_json_init_array (&vam->json_tree);
3252 node = vat_json_array_add (&vam->json_tree);
3254 vat_json_init_object (node);
3255 if (~0 == mp->locator_set_index)
3256 vat_json_object_add_uint (node, "action", mp->action);
3258 vat_json_object_add_uint (node, "locator_set_index",
3259 clib_net_to_host_u32 (mp->locator_set_index));
3261 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
3262 if (mp->eid_type == 3)
3264 vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
3265 vat_json_init_object (nsh_json);
3266 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
3267 vat_json_object_add_uint (nsh_json, "spi",
3268 clib_net_to_host_u32 (nsh->spi));
3269 vat_json_object_add_uint (nsh_json, "si", nsh->si);
3273 eid = format (0, "%U", format_lisp_eid_vat,
3277 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3279 vat_json_object_add_string_copy (node, "eid", eid);
3282 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3283 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
3284 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
3288 vat_json_object_add_uint (node, "key_id",
3289 clib_net_to_host_u16 (mp->key_id));
3290 vat_json_object_add_string_copy (node, "key", mp->key);
3295 vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
3297 vat_main_t *vam = &vat_main;
3298 u8 *seid = 0, *deid = 0;
3299 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3301 deid = format (0, "%U", format_lisp_eid_vat,
3302 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3304 seid = format (0, "%U", format_lisp_eid_vat,
3305 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3311 format_ip_address_fcn = format_ip4_address;
3313 format_ip_address_fcn = format_ip6_address;
3316 print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
3317 clib_net_to_host_u32 (mp->vni),
3319 format_ip_address_fcn, mp->lloc,
3320 format_ip_address_fcn, mp->rloc,
3321 clib_net_to_host_u32 (mp->pkt_count),
3322 clib_net_to_host_u32 (mp->bytes));
3329 vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
3331 struct in6_addr ip6;
3333 vat_main_t *vam = &vat_main;
3334 vat_json_node_t *node = 0;
3335 u8 *deid = 0, *seid = 0;
3337 if (VAT_JSON_ARRAY != vam->json_tree.type)
3339 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3340 vat_json_init_array (&vam->json_tree);
3342 node = vat_json_array_add (&vam->json_tree);
3344 vat_json_init_object (node);
3345 deid = format (0, "%U", format_lisp_eid_vat,
3346 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3348 seid = format (0, "%U", format_lisp_eid_vat,
3349 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3354 vat_json_object_add_string_copy (node, "seid", seid);
3355 vat_json_object_add_string_copy (node, "deid", deid);
3356 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3360 clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
3361 vat_json_object_add_ip4 (node, "lloc", ip4);
3362 clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
3363 vat_json_object_add_ip4 (node, "rloc", ip4);
3367 clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
3368 vat_json_object_add_ip6 (node, "lloc", ip6);
3369 clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
3370 vat_json_object_add_ip6 (node, "rloc", ip6);
3372 vat_json_object_add_uint (node, "pkt_count",
3373 clib_net_to_host_u32 (mp->pkt_count));
3374 vat_json_object_add_uint (node, "bytes", clib_net_to_host_u32 (mp->bytes));
3381 vl_api_one_eid_table_map_details_t_handler
3382 (vl_api_one_eid_table_map_details_t * mp)
3384 vat_main_t *vam = &vat_main;
3386 u8 *line = format (0, "%=10d%=10d",
3387 clib_net_to_host_u32 (mp->vni),
3388 clib_net_to_host_u32 (mp->dp_table));
3389 print (vam->ofp, "%v", line);
3394 vl_api_one_eid_table_map_details_t_handler_json
3395 (vl_api_one_eid_table_map_details_t * mp)
3397 vat_main_t *vam = &vat_main;
3398 vat_json_node_t *node = NULL;
3400 if (VAT_JSON_ARRAY != vam->json_tree.type)
3402 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3403 vat_json_init_array (&vam->json_tree);
3405 node = vat_json_array_add (&vam->json_tree);
3406 vat_json_init_object (node);
3407 vat_json_object_add_uint (node, "dp_table",
3408 clib_net_to_host_u32 (mp->dp_table));
3409 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3413 vl_api_one_eid_table_vni_details_t_handler
3414 (vl_api_one_eid_table_vni_details_t * mp)
3416 vat_main_t *vam = &vat_main;
3418 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
3419 print (vam->ofp, "%v", line);
3424 vl_api_one_eid_table_vni_details_t_handler_json
3425 (vl_api_one_eid_table_vni_details_t * mp)
3427 vat_main_t *vam = &vat_main;
3428 vat_json_node_t *node = NULL;
3430 if (VAT_JSON_ARRAY != vam->json_tree.type)
3432 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3433 vat_json_init_array (&vam->json_tree);
3435 node = vat_json_array_add (&vam->json_tree);
3436 vat_json_init_object (node);
3437 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3441 vl_api_show_one_map_register_fallback_threshold_reply_t_handler
3442 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3444 vat_main_t *vam = &vat_main;
3445 int retval = clib_net_to_host_u32 (mp->retval);
3447 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3448 print (vam->ofp, "fallback threshold value: %d", mp->value);
3450 vam->retval = retval;
3451 vam->result_ready = 1;
3455 vl_api_show_one_map_register_fallback_threshold_reply_t_handler_json
3456 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3458 vat_main_t *vam = &vat_main;
3459 vat_json_node_t _node, *node = &_node;
3460 int retval = clib_net_to_host_u32 (mp->retval);
3462 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3463 vat_json_init_object (node);
3464 vat_json_object_add_uint (node, "value", mp->value);
3466 vat_json_print (vam->ofp, node);
3467 vat_json_free (node);
3469 vam->retval = retval;
3470 vam->result_ready = 1;
3474 vl_api_show_one_map_register_state_reply_t_handler
3475 (vl_api_show_one_map_register_state_reply_t * mp)
3477 vat_main_t *vam = &vat_main;
3478 int retval = clib_net_to_host_u32 (mp->retval);
3480 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3482 vam->retval = retval;
3483 vam->result_ready = 1;
3487 vl_api_show_one_map_register_state_reply_t_handler_json
3488 (vl_api_show_one_map_register_state_reply_t * mp)
3490 vat_main_t *vam = &vat_main;
3491 vat_json_node_t _node, *node = &_node;
3492 int retval = clib_net_to_host_u32 (mp->retval);
3494 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3496 vat_json_init_object (node);
3497 vat_json_object_add_string_copy (node, "state", s);
3499 vat_json_print (vam->ofp, node);
3500 vat_json_free (node);
3502 vam->retval = retval;
3503 vam->result_ready = 1;
3508 vl_api_show_one_rloc_probe_state_reply_t_handler
3509 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3511 vat_main_t *vam = &vat_main;
3512 int retval = clib_net_to_host_u32 (mp->retval);
3517 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3519 vam->retval = retval;
3520 vam->result_ready = 1;
3524 vl_api_show_one_rloc_probe_state_reply_t_handler_json
3525 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3527 vat_main_t *vam = &vat_main;
3528 vat_json_node_t _node, *node = &_node;
3529 int retval = clib_net_to_host_u32 (mp->retval);
3531 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3532 vat_json_init_object (node);
3533 vat_json_object_add_string_copy (node, "state", s);
3535 vat_json_print (vam->ofp, node);
3536 vat_json_free (node);
3538 vam->retval = retval;
3539 vam->result_ready = 1;
3544 vl_api_show_one_stats_enable_disable_reply_t_handler
3545 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3547 vat_main_t *vam = &vat_main;
3548 int retval = clib_net_to_host_u32 (mp->retval);
3553 print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
3555 vam->retval = retval;
3556 vam->result_ready = 1;
3560 vl_api_show_one_stats_enable_disable_reply_t_handler_json
3561 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3563 vat_main_t *vam = &vat_main;
3564 vat_json_node_t _node, *node = &_node;
3565 int retval = clib_net_to_host_u32 (mp->retval);
3567 u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
3568 vat_json_init_object (node);
3569 vat_json_object_add_string_copy (node, "state", s);
3571 vat_json_print (vam->ofp, node);
3572 vat_json_free (node);
3574 vam->retval = retval;
3575 vam->result_ready = 1;
3580 api_gpe_fwd_entry_net_to_host (vl_api_gpe_fwd_entry_t * e)
3582 e->dp_table = clib_net_to_host_u32 (e->dp_table);
3583 e->fwd_entry_index = clib_net_to_host_u32 (e->fwd_entry_index);
3584 e->vni = clib_net_to_host_u32 (e->vni);
3588 gpe_fwd_entries_get_reply_t_net_to_host
3589 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3593 mp->count = clib_net_to_host_u32 (mp->count);
3594 for (i = 0; i < mp->count; i++)
3596 api_gpe_fwd_entry_net_to_host (&mp->entries[i]);
3601 format_gpe_encap_mode (u8 * s, va_list * args)
3603 u32 mode = va_arg (*args, u32);
3608 return format (s, "lisp");
3610 return format (s, "vxlan");
3616 vl_api_gpe_get_encap_mode_reply_t_handler
3617 (vl_api_gpe_get_encap_mode_reply_t * mp)
3619 vat_main_t *vam = &vat_main;
3621 print (vam->ofp, "gpe mode: %U", format_gpe_encap_mode, mp->encap_mode);
3622 vam->retval = ntohl (mp->retval);
3623 vam->result_ready = 1;
3627 vl_api_gpe_get_encap_mode_reply_t_handler_json
3628 (vl_api_gpe_get_encap_mode_reply_t * mp)
3630 vat_main_t *vam = &vat_main;
3631 vat_json_node_t node;
3633 u8 *encap_mode = format (0, "%U", format_gpe_encap_mode, mp->encap_mode);
3634 vec_add1 (encap_mode, 0);
3636 vat_json_init_object (&node);
3637 vat_json_object_add_string_copy (&node, "gpe_mode", encap_mode);
3639 vec_free (encap_mode);
3640 vat_json_print (vam->ofp, &node);
3641 vat_json_free (&node);
3643 vam->retval = ntohl (mp->retval);
3644 vam->result_ready = 1;
3648 vl_api_gpe_fwd_entry_path_details_t_handler
3649 (vl_api_gpe_fwd_entry_path_details_t * mp)
3651 vat_main_t *vam = &vat_main;
3652 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3654 if (mp->lcl_loc.is_ip4)
3655 format_ip_address_fcn = format_ip4_address;
3657 format_ip_address_fcn = format_ip6_address;
3659 print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
3660 format_ip_address_fcn, &mp->lcl_loc,
3661 format_ip_address_fcn, &mp->rmt_loc);
3665 lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
3667 struct in6_addr ip6;
3672 clib_memcpy (&ip4, loc->addr, sizeof (ip4));
3673 vat_json_object_add_ip4 (n, "address", ip4);
3677 clib_memcpy (&ip6, loc->addr, sizeof (ip6));
3678 vat_json_object_add_ip6 (n, "address", ip6);
3680 vat_json_object_add_uint (n, "weight", loc->weight);
3684 vl_api_gpe_fwd_entry_path_details_t_handler_json
3685 (vl_api_gpe_fwd_entry_path_details_t * mp)
3687 vat_main_t *vam = &vat_main;
3688 vat_json_node_t *node = NULL;
3689 vat_json_node_t *loc_node;
3691 if (VAT_JSON_ARRAY != vam->json_tree.type)
3693 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3694 vat_json_init_array (&vam->json_tree);
3696 node = vat_json_array_add (&vam->json_tree);
3697 vat_json_init_object (node);
3699 loc_node = vat_json_object_add (node, "local_locator");
3700 vat_json_init_object (loc_node);
3701 lisp_fill_locator_node (loc_node, &mp->lcl_loc);
3703 loc_node = vat_json_object_add (node, "remote_locator");
3704 vat_json_init_object (loc_node);
3705 lisp_fill_locator_node (loc_node, &mp->rmt_loc);
3709 vl_api_gpe_fwd_entries_get_reply_t_handler
3710 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3712 vat_main_t *vam = &vat_main;
3714 int retval = clib_net_to_host_u32 (mp->retval);
3715 vl_api_gpe_fwd_entry_t *e;
3720 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3722 for (i = 0; i < mp->count; i++)
3724 e = &mp->entries[i];
3725 print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
3726 format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
3727 format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
3731 vam->retval = retval;
3732 vam->result_ready = 1;
3736 vl_api_gpe_fwd_entries_get_reply_t_handler_json
3737 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3740 vat_main_t *vam = &vat_main;
3741 vat_json_node_t *e = 0, root;
3743 int retval = clib_net_to_host_u32 (mp->retval);
3744 vl_api_gpe_fwd_entry_t *fwd;
3749 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3750 vat_json_init_array (&root);
3752 for (i = 0; i < mp->count; i++)
3754 e = vat_json_array_add (&root);
3755 fwd = &mp->entries[i];
3757 vat_json_init_object (e);
3758 vat_json_object_add_int (e, "fwd_entry_index", fwd->fwd_entry_index);
3759 vat_json_object_add_int (e, "dp_table", fwd->dp_table);
3760 vat_json_object_add_int (e, "vni", fwd->vni);
3761 vat_json_object_add_int (e, "action", fwd->action);
3763 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
3764 fwd->leid_prefix_len);
3766 vat_json_object_add_string_copy (e, "leid", s);
3769 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
3770 fwd->reid_prefix_len);
3772 vat_json_object_add_string_copy (e, "reid", s);
3776 vat_json_print (vam->ofp, &root);
3777 vat_json_free (&root);
3780 vam->retval = retval;
3781 vam->result_ready = 1;
3785 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler
3786 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3788 vat_main_t *vam = &vat_main;
3790 int retval = clib_net_to_host_u32 (mp->retval);
3791 vl_api_gpe_native_fwd_rpath_t *r;
3796 n = clib_net_to_host_u32 (mp->count);
3798 for (i = 0; i < n; i++)
3800 r = &mp->entries[i];
3801 print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
3802 clib_net_to_host_u32 (r->fib_index),
3803 clib_net_to_host_u32 (r->nh_sw_if_index),
3804 r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
3808 vam->retval = retval;
3809 vam->result_ready = 1;
3813 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler_json
3814 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3816 vat_main_t *vam = &vat_main;
3817 vat_json_node_t root, *e;
3819 int retval = clib_net_to_host_u32 (mp->retval);
3820 vl_api_gpe_native_fwd_rpath_t *r;
3826 n = clib_net_to_host_u32 (mp->count);
3827 vat_json_init_array (&root);
3829 for (i = 0; i < n; i++)
3831 e = vat_json_array_add (&root);
3832 vat_json_init_object (e);
3833 r = &mp->entries[i];
3835 format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
3838 vat_json_object_add_string_copy (e, "ip4", s);
3841 vat_json_object_add_uint (e, "fib_index",
3842 clib_net_to_host_u32 (r->fib_index));
3843 vat_json_object_add_uint (e, "nh_sw_if_index",
3844 clib_net_to_host_u32 (r->nh_sw_if_index));
3847 vat_json_print (vam->ofp, &root);
3848 vat_json_free (&root);
3851 vam->retval = retval;
3852 vam->result_ready = 1;
3856 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler
3857 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3859 vat_main_t *vam = &vat_main;
3861 int retval = clib_net_to_host_u32 (mp->retval);
3866 n = clib_net_to_host_u32 (mp->count);
3868 for (i = 0; i < n; i++)
3869 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->vnis[i]));
3872 vam->retval = retval;
3873 vam->result_ready = 1;
3877 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler_json
3878 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3880 vat_main_t *vam = &vat_main;
3881 vat_json_node_t root;
3883 int retval = clib_net_to_host_u32 (mp->retval);
3888 n = clib_net_to_host_u32 (mp->count);
3889 vat_json_init_array (&root);
3891 for (i = 0; i < n; i++)
3892 vat_json_array_add_uint (&root, clib_net_to_host_u32 (mp->vnis[i]));
3894 vat_json_print (vam->ofp, &root);
3895 vat_json_free (&root);
3898 vam->retval = retval;
3899 vam->result_ready = 1;
3903 vl_api_one_ndp_entries_get_reply_t_handler
3904 (vl_api_one_ndp_entries_get_reply_t * mp)
3906 vat_main_t *vam = &vat_main;
3908 int retval = clib_net_to_host_u32 (mp->retval);
3913 n = clib_net_to_host_u32 (mp->count);
3915 for (i = 0; i < n; i++)
3916 print (vam->ofp, "%U -> %U", format_ip6_address, &mp->entries[i].ip6,
3917 format_ethernet_address, mp->entries[i].mac);
3920 vam->retval = retval;
3921 vam->result_ready = 1;
3925 vl_api_one_ndp_entries_get_reply_t_handler_json
3926 (vl_api_one_ndp_entries_get_reply_t * mp)
3929 vat_main_t *vam = &vat_main;
3930 vat_json_node_t *e = 0, root;
3932 int retval = clib_net_to_host_u32 (mp->retval);
3933 vl_api_one_ndp_entry_t *arp_entry;
3938 n = clib_net_to_host_u32 (mp->count);
3939 vat_json_init_array (&root);
3941 for (i = 0; i < n; i++)
3943 e = vat_json_array_add (&root);
3944 arp_entry = &mp->entries[i];
3946 vat_json_init_object (e);
3947 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3950 vat_json_object_add_string_copy (e, "mac", s);
3953 s = format (0, "%U", format_ip6_address, &arp_entry->ip6);
3955 vat_json_object_add_string_copy (e, "ip6", s);
3959 vat_json_print (vam->ofp, &root);
3960 vat_json_free (&root);
3963 vam->retval = retval;
3964 vam->result_ready = 1;
3968 vl_api_one_l2_arp_entries_get_reply_t_handler
3969 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3971 vat_main_t *vam = &vat_main;
3973 int retval = clib_net_to_host_u32 (mp->retval);
3978 n = clib_net_to_host_u32 (mp->count);
3980 for (i = 0; i < n; i++)
3981 print (vam->ofp, "%U -> %U", format_ip4_address, &mp->entries[i].ip4,
3982 format_ethernet_address, mp->entries[i].mac);
3985 vam->retval = retval;
3986 vam->result_ready = 1;
3990 vl_api_one_l2_arp_entries_get_reply_t_handler_json
3991 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3994 vat_main_t *vam = &vat_main;
3995 vat_json_node_t *e = 0, root;
3997 int retval = clib_net_to_host_u32 (mp->retval);
3998 vl_api_one_l2_arp_entry_t *arp_entry;
4003 n = clib_net_to_host_u32 (mp->count);
4004 vat_json_init_array (&root);
4006 for (i = 0; i < n; i++)
4008 e = vat_json_array_add (&root);
4009 arp_entry = &mp->entries[i];
4011 vat_json_init_object (e);
4012 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
4015 vat_json_object_add_string_copy (e, "mac", s);
4018 s = format (0, "%U", format_ip4_address, &arp_entry->ip4);
4020 vat_json_object_add_string_copy (e, "ip4", s);
4024 vat_json_print (vam->ofp, &root);
4025 vat_json_free (&root);
4028 vam->retval = retval;
4029 vam->result_ready = 1;
4033 vl_api_one_ndp_bd_get_reply_t_handler (vl_api_one_ndp_bd_get_reply_t * mp)
4035 vat_main_t *vam = &vat_main;
4037 int retval = clib_net_to_host_u32 (mp->retval);
4042 n = clib_net_to_host_u32 (mp->count);
4044 for (i = 0; i < n; i++)
4046 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
4050 vam->retval = retval;
4051 vam->result_ready = 1;
4055 vl_api_one_ndp_bd_get_reply_t_handler_json
4056 (vl_api_one_ndp_bd_get_reply_t * mp)
4058 vat_main_t *vam = &vat_main;
4059 vat_json_node_t root;
4061 int retval = clib_net_to_host_u32 (mp->retval);
4066 n = clib_net_to_host_u32 (mp->count);
4067 vat_json_init_array (&root);
4069 for (i = 0; i < n; i++)
4071 vat_json_array_add_uint (&root,
4072 clib_net_to_host_u32 (mp->bridge_domains[i]));
4075 vat_json_print (vam->ofp, &root);
4076 vat_json_free (&root);
4079 vam->retval = retval;
4080 vam->result_ready = 1;
4084 vl_api_one_l2_arp_bd_get_reply_t_handler
4085 (vl_api_one_l2_arp_bd_get_reply_t * mp)
4087 vat_main_t *vam = &vat_main;
4089 int retval = clib_net_to_host_u32 (mp->retval);
4094 n = clib_net_to_host_u32 (mp->count);
4096 for (i = 0; i < n; i++)
4098 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
4102 vam->retval = retval;
4103 vam->result_ready = 1;
4107 vl_api_one_l2_arp_bd_get_reply_t_handler_json
4108 (vl_api_one_l2_arp_bd_get_reply_t * mp)
4110 vat_main_t *vam = &vat_main;
4111 vat_json_node_t root;
4113 int retval = clib_net_to_host_u32 (mp->retval);
4118 n = clib_net_to_host_u32 (mp->count);
4119 vat_json_init_array (&root);
4121 for (i = 0; i < n; i++)
4123 vat_json_array_add_uint (&root,
4124 clib_net_to_host_u32 (mp->bridge_domains[i]));
4127 vat_json_print (vam->ofp, &root);
4128 vat_json_free (&root);
4131 vam->retval = retval;
4132 vam->result_ready = 1;
4136 vl_api_one_adjacencies_get_reply_t_handler
4137 (vl_api_one_adjacencies_get_reply_t * mp)
4139 vat_main_t *vam = &vat_main;
4141 int retval = clib_net_to_host_u32 (mp->retval);
4142 vl_api_one_adjacency_t *a;
4147 n = clib_net_to_host_u32 (mp->count);
4149 for (i = 0; i < n; i++)
4151 a = &mp->adjacencies[i];
4152 print (vam->ofp, "%U %40U",
4153 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
4154 format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
4158 vam->retval = retval;
4159 vam->result_ready = 1;
4163 vl_api_one_adjacencies_get_reply_t_handler_json
4164 (vl_api_one_adjacencies_get_reply_t * mp)
4167 vat_main_t *vam = &vat_main;
4168 vat_json_node_t *e = 0, root;
4170 int retval = clib_net_to_host_u32 (mp->retval);
4171 vl_api_one_adjacency_t *a;
4176 n = clib_net_to_host_u32 (mp->count);
4177 vat_json_init_array (&root);
4179 for (i = 0; i < n; i++)
4181 e = vat_json_array_add (&root);
4182 a = &mp->adjacencies[i];
4184 vat_json_init_object (e);
4185 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
4186 a->leid_prefix_len);
4188 vat_json_object_add_string_copy (e, "leid", s);
4191 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
4192 a->reid_prefix_len);
4194 vat_json_object_add_string_copy (e, "reid", s);
4198 vat_json_print (vam->ofp, &root);
4199 vat_json_free (&root);
4202 vam->retval = retval;
4203 vam->result_ready = 1;
4207 vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
4209 vat_main_t *vam = &vat_main;
4211 print (vam->ofp, "%=20U",
4212 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4217 vl_api_one_map_server_details_t_handler_json
4218 (vl_api_one_map_server_details_t * mp)
4220 vat_main_t *vam = &vat_main;
4221 vat_json_node_t *node = NULL;
4222 struct in6_addr ip6;
4225 if (VAT_JSON_ARRAY != vam->json_tree.type)
4227 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4228 vat_json_init_array (&vam->json_tree);
4230 node = vat_json_array_add (&vam->json_tree);
4232 vat_json_init_object (node);
4235 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4236 vat_json_object_add_ip6 (node, "map-server", ip6);
4240 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4241 vat_json_object_add_ip4 (node, "map-server", ip4);
4246 vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
4249 vat_main_t *vam = &vat_main;
4251 print (vam->ofp, "%=20U",
4252 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4257 vl_api_one_map_resolver_details_t_handler_json
4258 (vl_api_one_map_resolver_details_t * mp)
4260 vat_main_t *vam = &vat_main;
4261 vat_json_node_t *node = NULL;
4262 struct in6_addr ip6;
4265 if (VAT_JSON_ARRAY != vam->json_tree.type)
4267 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4268 vat_json_init_array (&vam->json_tree);
4270 node = vat_json_array_add (&vam->json_tree);
4272 vat_json_init_object (node);
4275 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4276 vat_json_object_add_ip6 (node, "map resolver", ip6);
4280 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4281 vat_json_object_add_ip4 (node, "map resolver", ip4);
4286 vl_api_show_one_status_reply_t_handler (vl_api_show_one_status_reply_t * mp)
4288 vat_main_t *vam = &vat_main;
4289 i32 retval = ntohl (mp->retval);
4293 print (vam->ofp, "feature: %s\ngpe: %s",
4294 mp->feature_status ? "enabled" : "disabled",
4295 mp->gpe_status ? "enabled" : "disabled");
4298 vam->retval = retval;
4299 vam->result_ready = 1;
4303 vl_api_show_one_status_reply_t_handler_json
4304 (vl_api_show_one_status_reply_t * mp)
4306 vat_main_t *vam = &vat_main;
4307 vat_json_node_t node;
4308 u8 *gpe_status = NULL;
4309 u8 *feature_status = NULL;
4311 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
4312 feature_status = format (0, "%s",
4313 mp->feature_status ? "enabled" : "disabled");
4314 vec_add1 (gpe_status, 0);
4315 vec_add1 (feature_status, 0);
4317 vat_json_init_object (&node);
4318 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
4319 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
4321 vec_free (gpe_status);
4322 vec_free (feature_status);
4324 vat_json_print (vam->ofp, &node);
4325 vat_json_free (&node);
4327 vam->retval = ntohl (mp->retval);
4328 vam->result_ready = 1;
4332 vl_api_one_get_map_request_itr_rlocs_reply_t_handler
4333 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4335 vat_main_t *vam = &vat_main;
4336 i32 retval = ntohl (mp->retval);
4340 print (vam->ofp, "%=20s", mp->locator_set_name);
4343 vam->retval = retval;
4344 vam->result_ready = 1;
4348 vl_api_one_get_map_request_itr_rlocs_reply_t_handler_json
4349 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4351 vat_main_t *vam = &vat_main;
4352 vat_json_node_t *node = NULL;
4354 if (VAT_JSON_ARRAY != vam->json_tree.type)
4356 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4357 vat_json_init_array (&vam->json_tree);
4359 node = vat_json_array_add (&vam->json_tree);
4361 vat_json_init_object (node);
4362 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
4364 vat_json_print (vam->ofp, node);
4365 vat_json_free (node);
4367 vam->retval = ntohl (mp->retval);
4368 vam->result_ready = 1;
4372 format_lisp_map_request_mode (u8 * s, va_list * args)
4374 u32 mode = va_arg (*args, u32);
4379 return format (0, "dst-only");
4381 return format (0, "src-dst");
4387 vl_api_show_one_map_request_mode_reply_t_handler
4388 (vl_api_show_one_map_request_mode_reply_t * mp)
4390 vat_main_t *vam = &vat_main;
4391 i32 retval = ntohl (mp->retval);
4395 u32 mode = mp->mode;
4396 print (vam->ofp, "map_request_mode: %U",
4397 format_lisp_map_request_mode, mode);
4400 vam->retval = retval;
4401 vam->result_ready = 1;
4405 vl_api_show_one_map_request_mode_reply_t_handler_json
4406 (vl_api_show_one_map_request_mode_reply_t * mp)
4408 vat_main_t *vam = &vat_main;
4409 vat_json_node_t node;
4414 s = format (0, "%U", format_lisp_map_request_mode, mode);
4417 vat_json_init_object (&node);
4418 vat_json_object_add_string_copy (&node, "map_request_mode", s);
4419 vat_json_print (vam->ofp, &node);
4420 vat_json_free (&node);
4423 vam->retval = ntohl (mp->retval);
4424 vam->result_ready = 1;
4428 vl_api_one_show_xtr_mode_reply_t_handler
4429 (vl_api_one_show_xtr_mode_reply_t * mp)
4431 vat_main_t *vam = &vat_main;
4432 i32 retval = ntohl (mp->retval);
4436 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4439 vam->retval = retval;
4440 vam->result_ready = 1;
4444 vl_api_one_show_xtr_mode_reply_t_handler_json
4445 (vl_api_one_show_xtr_mode_reply_t * mp)
4447 vat_main_t *vam = &vat_main;
4448 vat_json_node_t node;
4451 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4452 vec_add1 (status, 0);
4454 vat_json_init_object (&node);
4455 vat_json_object_add_string_copy (&node, "status", status);
4459 vat_json_print (vam->ofp, &node);
4460 vat_json_free (&node);
4462 vam->retval = ntohl (mp->retval);
4463 vam->result_ready = 1;
4467 vl_api_one_show_pitr_mode_reply_t_handler
4468 (vl_api_one_show_pitr_mode_reply_t * mp)
4470 vat_main_t *vam = &vat_main;
4471 i32 retval = ntohl (mp->retval);
4475 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4478 vam->retval = retval;
4479 vam->result_ready = 1;
4483 vl_api_one_show_pitr_mode_reply_t_handler_json
4484 (vl_api_one_show_pitr_mode_reply_t * mp)
4486 vat_main_t *vam = &vat_main;
4487 vat_json_node_t node;
4490 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4491 vec_add1 (status, 0);
4493 vat_json_init_object (&node);
4494 vat_json_object_add_string_copy (&node, "status", status);
4498 vat_json_print (vam->ofp, &node);
4499 vat_json_free (&node);
4501 vam->retval = ntohl (mp->retval);
4502 vam->result_ready = 1;
4506 vl_api_one_show_petr_mode_reply_t_handler
4507 (vl_api_one_show_petr_mode_reply_t * mp)
4509 vat_main_t *vam = &vat_main;
4510 i32 retval = ntohl (mp->retval);
4514 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4517 vam->retval = retval;
4518 vam->result_ready = 1;
4522 vl_api_one_show_petr_mode_reply_t_handler_json
4523 (vl_api_one_show_petr_mode_reply_t * mp)
4525 vat_main_t *vam = &vat_main;
4526 vat_json_node_t node;
4529 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4530 vec_add1 (status, 0);
4532 vat_json_init_object (&node);
4533 vat_json_object_add_string_copy (&node, "status", status);
4537 vat_json_print (vam->ofp, &node);
4538 vat_json_free (&node);
4540 vam->retval = ntohl (mp->retval);
4541 vam->result_ready = 1;
4545 vl_api_show_one_use_petr_reply_t_handler
4546 (vl_api_show_one_use_petr_reply_t * mp)
4548 vat_main_t *vam = &vat_main;
4549 i32 retval = ntohl (mp->retval);
4553 print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
4556 print (vam->ofp, "Proxy-ETR address; %U",
4557 mp->is_ip4 ? format_ip4_address : format_ip6_address,
4562 vam->retval = retval;
4563 vam->result_ready = 1;
4567 vl_api_show_one_use_petr_reply_t_handler_json
4568 (vl_api_show_one_use_petr_reply_t * mp)
4570 vat_main_t *vam = &vat_main;
4571 vat_json_node_t node;
4574 struct in6_addr ip6;
4576 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4577 vec_add1 (status, 0);
4579 vat_json_init_object (&node);
4580 vat_json_object_add_string_copy (&node, "status", status);
4585 clib_memcpy (&ip6, mp->address, sizeof (ip6));
4586 vat_json_object_add_ip6 (&node, "address", ip6);
4590 clib_memcpy (&ip4, mp->address, sizeof (ip4));
4591 vat_json_object_add_ip4 (&node, "address", ip4);
4597 vat_json_print (vam->ofp, &node);
4598 vat_json_free (&node);
4600 vam->retval = ntohl (mp->retval);
4601 vam->result_ready = 1;
4605 vl_api_show_one_nsh_mapping_reply_t_handler
4606 (vl_api_show_one_nsh_mapping_reply_t * mp)
4608 vat_main_t *vam = &vat_main;
4609 i32 retval = ntohl (mp->retval);
4613 print (vam->ofp, "%-20s%-16s",
4614 mp->is_set ? "set" : "not-set",
4615 mp->is_set ? (char *) mp->locator_set_name : "");
4618 vam->retval = retval;
4619 vam->result_ready = 1;
4623 vl_api_show_one_nsh_mapping_reply_t_handler_json
4624 (vl_api_show_one_nsh_mapping_reply_t * mp)
4626 vat_main_t *vam = &vat_main;
4627 vat_json_node_t node;
4630 status = format (0, "%s", mp->is_set ? "yes" : "no");
4631 vec_add1 (status, 0);
4633 vat_json_init_object (&node);
4634 vat_json_object_add_string_copy (&node, "is_set", status);
4637 vat_json_object_add_string_copy (&node, "locator_set",
4638 mp->locator_set_name);
4643 vat_json_print (vam->ofp, &node);
4644 vat_json_free (&node);
4646 vam->retval = ntohl (mp->retval);
4647 vam->result_ready = 1;
4651 vl_api_show_one_map_register_ttl_reply_t_handler
4652 (vl_api_show_one_map_register_ttl_reply_t * mp)
4654 vat_main_t *vam = &vat_main;
4655 i32 retval = ntohl (mp->retval);
4657 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4661 print (vam->ofp, "ttl: %u", mp->ttl);
4664 vam->retval = retval;
4665 vam->result_ready = 1;
4669 vl_api_show_one_map_register_ttl_reply_t_handler_json
4670 (vl_api_show_one_map_register_ttl_reply_t * mp)
4672 vat_main_t *vam = &vat_main;
4673 vat_json_node_t node;
4675 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4676 vat_json_init_object (&node);
4677 vat_json_object_add_uint (&node, "ttl", mp->ttl);
4679 vat_json_print (vam->ofp, &node);
4680 vat_json_free (&node);
4682 vam->retval = ntohl (mp->retval);
4683 vam->result_ready = 1;
4687 vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
4689 vat_main_t *vam = &vat_main;
4690 i32 retval = ntohl (mp->retval);
4694 print (vam->ofp, "%-20s%-16s",
4695 mp->status ? "enabled" : "disabled",
4696 mp->status ? (char *) mp->locator_set_name : "");
4699 vam->retval = retval;
4700 vam->result_ready = 1;
4704 vl_api_show_one_pitr_reply_t_handler_json (vl_api_show_one_pitr_reply_t * mp)
4706 vat_main_t *vam = &vat_main;
4707 vat_json_node_t node;
4710 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4711 vec_add1 (status, 0);
4713 vat_json_init_object (&node);
4714 vat_json_object_add_string_copy (&node, "status", status);
4717 vat_json_object_add_string_copy (&node, "locator_set",
4718 mp->locator_set_name);
4723 vat_json_print (vam->ofp, &node);
4724 vat_json_free (&node);
4726 vam->retval = ntohl (mp->retval);
4727 vam->result_ready = 1;
4731 format_policer_type (u8 * s, va_list * va)
4733 u32 i = va_arg (*va, u32);
4735 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
4736 s = format (s, "1r2c");
4737 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
4738 s = format (s, "1r3c");
4739 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
4740 s = format (s, "2r3c-2698");
4741 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
4742 s = format (s, "2r3c-4115");
4743 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
4744 s = format (s, "2r3c-mef5cf1");
4746 s = format (s, "ILLEGAL");
4751 format_policer_rate_type (u8 * s, va_list * va)
4753 u32 i = va_arg (*va, u32);
4755 if (i == SSE2_QOS_RATE_KBPS)
4756 s = format (s, "kbps");
4757 else if (i == SSE2_QOS_RATE_PPS)
4758 s = format (s, "pps");
4760 s = format (s, "ILLEGAL");
4765 format_policer_round_type (u8 * s, va_list * va)
4767 u32 i = va_arg (*va, u32);
4769 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
4770 s = format (s, "closest");
4771 else if (i == SSE2_QOS_ROUND_TO_UP)
4772 s = format (s, "up");
4773 else if (i == SSE2_QOS_ROUND_TO_DOWN)
4774 s = format (s, "down");
4776 s = format (s, "ILLEGAL");
4781 format_policer_action_type (u8 * s, va_list * va)
4783 u32 i = va_arg (*va, u32);
4785 if (i == SSE2_QOS_ACTION_DROP)
4786 s = format (s, "drop");
4787 else if (i == SSE2_QOS_ACTION_TRANSMIT)
4788 s = format (s, "transmit");
4789 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4790 s = format (s, "mark-and-transmit");
4792 s = format (s, "ILLEGAL");
4797 format_dscp (u8 * s, va_list * va)
4799 u32 i = va_arg (*va, u32);
4804 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
4808 return format (s, "ILLEGAL");
4810 s = format (s, "%s", t);
4815 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
4817 vat_main_t *vam = &vat_main;
4818 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
4820 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4821 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4823 conform_dscp_str = format (0, "");
4825 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4826 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4828 exceed_dscp_str = format (0, "");
4830 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4831 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4833 violate_dscp_str = format (0, "");
4835 print (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
4836 "rate type %U, round type %U, %s rate, %s color-aware, "
4837 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
4838 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
4839 "conform action %U%s, exceed action %U%s, violate action %U%s",
4841 format_policer_type, mp->type,
4844 clib_net_to_host_u64 (mp->cb),
4845 clib_net_to_host_u64 (mp->eb),
4846 format_policer_rate_type, mp->rate_type,
4847 format_policer_round_type, mp->round_type,
4848 mp->single_rate ? "single" : "dual",
4849 mp->color_aware ? "is" : "not",
4850 ntohl (mp->cir_tokens_per_period),
4851 ntohl (mp->pir_tokens_per_period),
4853 ntohl (mp->current_limit),
4854 ntohl (mp->current_bucket),
4855 ntohl (mp->extended_limit),
4856 ntohl (mp->extended_bucket),
4857 clib_net_to_host_u64 (mp->last_update_time),
4858 format_policer_action_type, mp->conform_action_type,
4860 format_policer_action_type, mp->exceed_action_type,
4862 format_policer_action_type, mp->violate_action_type,
4865 vec_free (conform_dscp_str);
4866 vec_free (exceed_dscp_str);
4867 vec_free (violate_dscp_str);
4870 static void vl_api_policer_details_t_handler_json
4871 (vl_api_policer_details_t * mp)
4873 vat_main_t *vam = &vat_main;
4874 vat_json_node_t *node;
4875 u8 *rate_type_str, *round_type_str, *type_str;
4876 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
4878 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
4880 format (0, "%U", format_policer_round_type, mp->round_type);
4881 type_str = format (0, "%U", format_policer_type, mp->type);
4882 conform_action_str = format (0, "%U", format_policer_action_type,
4883 mp->conform_action_type);
4884 exceed_action_str = format (0, "%U", format_policer_action_type,
4885 mp->exceed_action_type);
4886 violate_action_str = format (0, "%U", format_policer_action_type,
4887 mp->violate_action_type);
4889 if (VAT_JSON_ARRAY != vam->json_tree.type)
4891 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4892 vat_json_init_array (&vam->json_tree);
4894 node = vat_json_array_add (&vam->json_tree);
4896 vat_json_init_object (node);
4897 vat_json_object_add_string_copy (node, "name", mp->name);
4898 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
4899 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
4900 vat_json_object_add_uint (node, "cb", clib_net_to_host_u64 (mp->cb));
4901 vat_json_object_add_uint (node, "eb", clib_net_to_host_u64 (mp->eb));
4902 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
4903 vat_json_object_add_string_copy (node, "round_type", round_type_str);
4904 vat_json_object_add_string_copy (node, "type", type_str);
4905 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
4906 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
4907 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
4908 vat_json_object_add_uint (node, "cir_tokens_per_period",
4909 ntohl (mp->cir_tokens_per_period));
4910 vat_json_object_add_uint (node, "eir_tokens_per_period",
4911 ntohl (mp->pir_tokens_per_period));
4912 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
4913 vat_json_object_add_uint (node, "current_bucket",
4914 ntohl (mp->current_bucket));
4915 vat_json_object_add_uint (node, "extended_limit",
4916 ntohl (mp->extended_limit));
4917 vat_json_object_add_uint (node, "extended_bucket",
4918 ntohl (mp->extended_bucket));
4919 vat_json_object_add_uint (node, "last_update_time",
4920 ntohl (mp->last_update_time));
4921 vat_json_object_add_string_copy (node, "conform_action",
4922 conform_action_str);
4923 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4925 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4926 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
4927 vec_free (dscp_str);
4929 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
4930 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4932 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4933 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
4934 vec_free (dscp_str);
4936 vat_json_object_add_string_copy (node, "violate_action",
4937 violate_action_str);
4938 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4940 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4941 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
4942 vec_free (dscp_str);
4945 vec_free (rate_type_str);
4946 vec_free (round_type_str);
4947 vec_free (type_str);
4948 vec_free (conform_action_str);
4949 vec_free (exceed_action_str);
4950 vec_free (violate_action_str);
4954 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
4957 vat_main_t *vam = &vat_main;
4958 int i, count = ntohl (mp->count);
4961 print (vam->ofp, "classify table ids (%d) : ", count);
4962 for (i = 0; i < count; i++)
4964 print (vam->ofp, "%d", ntohl (mp->ids[i]));
4965 print (vam->ofp, (i < count - 1) ? "," : "");
4967 vam->retval = ntohl (mp->retval);
4968 vam->result_ready = 1;
4972 vl_api_classify_table_ids_reply_t_handler_json
4973 (vl_api_classify_table_ids_reply_t * mp)
4975 vat_main_t *vam = &vat_main;
4976 int i, count = ntohl (mp->count);
4980 vat_json_node_t node;
4982 vat_json_init_object (&node);
4983 for (i = 0; i < count; i++)
4985 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
4987 vat_json_print (vam->ofp, &node);
4988 vat_json_free (&node);
4990 vam->retval = ntohl (mp->retval);
4991 vam->result_ready = 1;
4995 vl_api_classify_table_by_interface_reply_t_handler
4996 (vl_api_classify_table_by_interface_reply_t * mp)
4998 vat_main_t *vam = &vat_main;
5001 table_id = ntohl (mp->l2_table_id);
5003 print (vam->ofp, "l2 table id : %d", table_id);
5005 print (vam->ofp, "l2 table id : No input ACL tables configured");
5006 table_id = ntohl (mp->ip4_table_id);
5008 print (vam->ofp, "ip4 table id : %d", table_id);
5010 print (vam->ofp, "ip4 table id : No input ACL tables configured");
5011 table_id = ntohl (mp->ip6_table_id);
5013 print (vam->ofp, "ip6 table id : %d", table_id);
5015 print (vam->ofp, "ip6 table id : No input ACL tables configured");
5016 vam->retval = ntohl (mp->retval);
5017 vam->result_ready = 1;
5021 vl_api_classify_table_by_interface_reply_t_handler_json
5022 (vl_api_classify_table_by_interface_reply_t * mp)
5024 vat_main_t *vam = &vat_main;
5025 vat_json_node_t node;
5027 vat_json_init_object (&node);
5029 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
5030 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
5031 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
5033 vat_json_print (vam->ofp, &node);
5034 vat_json_free (&node);
5036 vam->retval = ntohl (mp->retval);
5037 vam->result_ready = 1;
5040 static void vl_api_policer_add_del_reply_t_handler
5041 (vl_api_policer_add_del_reply_t * mp)
5043 vat_main_t *vam = &vat_main;
5044 i32 retval = ntohl (mp->retval);
5045 if (vam->async_mode)
5047 vam->async_errors += (retval < 0);
5051 vam->retval = retval;
5052 vam->result_ready = 1;
5053 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
5055 * Note: this is just barely thread-safe, depends on
5056 * the main thread spinning waiting for an answer...
5058 errmsg ("policer index %d", ntohl (mp->policer_index));
5062 static void vl_api_policer_add_del_reply_t_handler_json
5063 (vl_api_policer_add_del_reply_t * mp)
5065 vat_main_t *vam = &vat_main;
5066 vat_json_node_t node;
5068 vat_json_init_object (&node);
5069 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
5070 vat_json_object_add_uint (&node, "policer_index",
5071 ntohl (mp->policer_index));
5073 vat_json_print (vam->ofp, &node);
5074 vat_json_free (&node);
5076 vam->retval = ntohl (mp->retval);
5077 vam->result_ready = 1;
5080 /* Format hex dump. */
5082 format_hex_bytes (u8 * s, va_list * va)
5084 u8 *bytes = va_arg (*va, u8 *);
5085 int n_bytes = va_arg (*va, int);
5088 /* Print short or long form depending on byte count. */
5089 uword short_form = n_bytes <= 32;
5090 u32 indent = format_get_indent (s);
5095 for (i = 0; i < n_bytes; i++)
5097 if (!short_form && (i % 32) == 0)
5098 s = format (s, "%08x: ", i);
5099 s = format (s, "%02x", bytes[i]);
5100 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
5101 s = format (s, "\n%U", format_white_space, indent);
5108 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
5111 vat_main_t *vam = &vat_main;
5112 i32 retval = ntohl (mp->retval);
5115 print (vam->ofp, "classify table info :");
5116 print (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d",
5117 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
5118 ntohl (mp->miss_next_index));
5119 print (vam->ofp, "nbuckets: %d skip: %d match: %d",
5120 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
5121 ntohl (mp->match_n_vectors));
5122 print (vam->ofp, "mask: %U", format_hex_bytes, mp->mask,
5123 ntohl (mp->mask_length));
5125 vam->retval = retval;
5126 vam->result_ready = 1;
5130 vl_api_classify_table_info_reply_t_handler_json
5131 (vl_api_classify_table_info_reply_t * mp)
5133 vat_main_t *vam = &vat_main;
5134 vat_json_node_t node;
5136 i32 retval = ntohl (mp->retval);
5139 vat_json_init_object (&node);
5141 vat_json_object_add_int (&node, "sessions",
5142 ntohl (mp->active_sessions));
5143 vat_json_object_add_int (&node, "nexttbl",
5144 ntohl (mp->next_table_index));
5145 vat_json_object_add_int (&node, "nextnode",
5146 ntohl (mp->miss_next_index));
5147 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
5148 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
5149 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
5150 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
5151 ntohl (mp->mask_length), 0);
5152 vat_json_object_add_string_copy (&node, "mask", s);
5154 vat_json_print (vam->ofp, &node);
5155 vat_json_free (&node);
5157 vam->retval = ntohl (mp->retval);
5158 vam->result_ready = 1;
5162 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
5165 vat_main_t *vam = &vat_main;
5167 print (vam->ofp, "next_index: %d advance: %d opaque: %d ",
5168 ntohl (mp->hit_next_index), ntohl (mp->advance),
5169 ntohl (mp->opaque_index));
5170 print (vam->ofp, "mask: %U", format_hex_bytes, mp->match,
5171 ntohl (mp->match_length));
5175 vl_api_classify_session_details_t_handler_json
5176 (vl_api_classify_session_details_t * mp)
5178 vat_main_t *vam = &vat_main;
5179 vat_json_node_t *node = NULL;
5181 if (VAT_JSON_ARRAY != vam->json_tree.type)
5183 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5184 vat_json_init_array (&vam->json_tree);
5186 node = vat_json_array_add (&vam->json_tree);
5188 vat_json_init_object (node);
5189 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
5190 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
5191 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
5193 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
5195 vat_json_object_add_string_copy (node, "match", s);
5198 static void vl_api_pg_create_interface_reply_t_handler
5199 (vl_api_pg_create_interface_reply_t * mp)
5201 vat_main_t *vam = &vat_main;
5203 vam->retval = ntohl (mp->retval);
5204 vam->result_ready = 1;
5207 static void vl_api_pg_create_interface_reply_t_handler_json
5208 (vl_api_pg_create_interface_reply_t * mp)
5210 vat_main_t *vam = &vat_main;
5211 vat_json_node_t node;
5213 i32 retval = ntohl (mp->retval);
5216 vat_json_init_object (&node);
5218 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
5220 vat_json_print (vam->ofp, &node);
5221 vat_json_free (&node);
5223 vam->retval = ntohl (mp->retval);
5224 vam->result_ready = 1;
5227 static void vl_api_policer_classify_details_t_handler
5228 (vl_api_policer_classify_details_t * mp)
5230 vat_main_t *vam = &vat_main;
5232 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5233 ntohl (mp->table_index));
5236 static void vl_api_policer_classify_details_t_handler_json
5237 (vl_api_policer_classify_details_t * mp)
5239 vat_main_t *vam = &vat_main;
5240 vat_json_node_t *node;
5242 if (VAT_JSON_ARRAY != vam->json_tree.type)
5244 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5245 vat_json_init_array (&vam->json_tree);
5247 node = vat_json_array_add (&vam->json_tree);
5249 vat_json_init_object (node);
5250 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5251 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5254 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
5255 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5257 vat_main_t *vam = &vat_main;
5258 i32 retval = ntohl (mp->retval);
5259 if (vam->async_mode)
5261 vam->async_errors += (retval < 0);
5265 vam->retval = retval;
5266 vam->sw_if_index = ntohl (mp->sw_if_index);
5267 vam->result_ready = 1;
5269 vam->regenerate_interface_table = 1;
5272 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
5273 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5275 vat_main_t *vam = &vat_main;
5276 vat_json_node_t node;
5278 vat_json_init_object (&node);
5279 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
5280 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
5282 vat_json_print (vam->ofp, &node);
5283 vat_json_free (&node);
5285 vam->retval = ntohl (mp->retval);
5286 vam->result_ready = 1;
5289 static void vl_api_flow_classify_details_t_handler
5290 (vl_api_flow_classify_details_t * mp)
5292 vat_main_t *vam = &vat_main;
5294 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5295 ntohl (mp->table_index));
5298 static void vl_api_flow_classify_details_t_handler_json
5299 (vl_api_flow_classify_details_t * mp)
5301 vat_main_t *vam = &vat_main;
5302 vat_json_node_t *node;
5304 if (VAT_JSON_ARRAY != vam->json_tree.type)
5306 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5307 vat_json_init_array (&vam->json_tree);
5309 node = vat_json_array_add (&vam->json_tree);
5311 vat_json_init_object (node);
5312 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5313 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5316 #define vl_api_vnet_interface_simple_counters_t_endian vl_noop_handler
5317 #define vl_api_vnet_interface_simple_counters_t_print vl_noop_handler
5318 #define vl_api_vnet_interface_combined_counters_t_endian vl_noop_handler
5319 #define vl_api_vnet_interface_combined_counters_t_print vl_noop_handler
5320 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
5321 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
5322 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
5323 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
5324 #define vl_api_vnet_ip4_nbr_counters_t_endian vl_noop_handler
5325 #define vl_api_vnet_ip4_nbr_counters_t_print vl_noop_handler
5326 #define vl_api_vnet_ip6_nbr_counters_t_endian vl_noop_handler
5327 #define vl_api_vnet_ip6_nbr_counters_t_print vl_noop_handler
5328 #define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler
5329 #define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler
5330 #define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler
5331 #define vl_api_one_l2_arp_entries_get_reply_t_endian vl_noop_handler
5332 #define vl_api_one_l2_arp_entries_get_reply_t_print vl_noop_handler
5333 #define vl_api_one_l2_arp_bd_get_reply_t_endian vl_noop_handler
5334 #define vl_api_one_ndp_bd_get_reply_t_endian vl_noop_handler
5335 #define vl_api_one_ndp_bd_get_reply_t_print vl_noop_handler
5336 #define vl_api_one_ndp_entries_get_reply_t_print vl_noop_handler
5337 #define vl_api_one_ndp_entries_get_reply_t_endian vl_noop_handler
5340 * Generate boilerplate reply handlers, which
5341 * dig the return value out of the xxx_reply_t API message,
5342 * stick it into vam->retval, and set vam->result_ready
5344 * Could also do this by pointing N message decode slots at
5345 * a single function, but that could break in subtle ways.
5348 #define foreach_standard_reply_retval_handler \
5349 _(sw_interface_set_flags_reply) \
5350 _(sw_interface_add_del_address_reply) \
5351 _(sw_interface_set_rx_mode_reply) \
5352 _(sw_interface_set_rx_placement_reply) \
5353 _(sw_interface_set_table_reply) \
5354 _(sw_interface_set_mpls_enable_reply) \
5355 _(sw_interface_set_vpath_reply) \
5356 _(sw_interface_set_vxlan_bypass_reply) \
5357 _(sw_interface_set_geneve_bypass_reply) \
5358 _(sw_interface_set_vxlan_gpe_bypass_reply) \
5359 _(sw_interface_set_l2_bridge_reply) \
5360 _(bridge_domain_add_del_reply) \
5361 _(sw_interface_set_l2_xconnect_reply) \
5362 _(l2fib_add_del_reply) \
5363 _(l2fib_flush_int_reply) \
5364 _(l2fib_flush_bd_reply) \
5365 _(ip_add_del_route_reply) \
5366 _(ip_table_add_del_reply) \
5367 _(ip_mroute_add_del_reply) \
5368 _(mpls_route_add_del_reply) \
5369 _(mpls_table_add_del_reply) \
5370 _(mpls_ip_bind_unbind_reply) \
5371 _(bier_route_add_del_reply) \
5372 _(bier_table_add_del_reply) \
5373 _(proxy_arp_add_del_reply) \
5374 _(proxy_arp_intfc_enable_disable_reply) \
5375 _(sw_interface_set_unnumbered_reply) \
5376 _(ip_neighbor_add_del_reply) \
5377 _(oam_add_del_reply) \
5378 _(reset_fib_reply) \
5379 _(dhcp_proxy_config_reply) \
5380 _(dhcp_proxy_set_vss_reply) \
5381 _(dhcp_client_config_reply) \
5382 _(set_ip_flow_hash_reply) \
5383 _(sw_interface_ip6_enable_disable_reply) \
5384 _(sw_interface_ip6_set_link_local_address_reply) \
5385 _(ip6nd_proxy_add_del_reply) \
5386 _(sw_interface_ip6nd_ra_prefix_reply) \
5387 _(sw_interface_ip6nd_ra_config_reply) \
5388 _(set_arp_neighbor_limit_reply) \
5389 _(l2_patch_add_del_reply) \
5390 _(sr_mpls_policy_add_reply) \
5391 _(sr_mpls_policy_mod_reply) \
5392 _(sr_mpls_policy_del_reply) \
5393 _(sr_policy_add_reply) \
5394 _(sr_policy_mod_reply) \
5395 _(sr_policy_del_reply) \
5396 _(sr_localsid_add_del_reply) \
5397 _(sr_steering_add_del_reply) \
5398 _(classify_add_del_session_reply) \
5399 _(classify_set_interface_ip_table_reply) \
5400 _(classify_set_interface_l2_tables_reply) \
5401 _(l2tpv3_set_tunnel_cookies_reply) \
5402 _(l2tpv3_interface_enable_disable_reply) \
5403 _(l2tpv3_set_lookup_key_reply) \
5404 _(l2_fib_clear_table_reply) \
5405 _(l2_interface_efp_filter_reply) \
5406 _(l2_interface_vlan_tag_rewrite_reply) \
5407 _(modify_vhost_user_if_reply) \
5408 _(delete_vhost_user_if_reply) \
5409 _(ip_probe_neighbor_reply) \
5410 _(ip_scan_neighbor_enable_disable_reply) \
5411 _(want_ip4_arp_events_reply) \
5412 _(want_ip6_nd_events_reply) \
5413 _(want_l2_macs_events_reply) \
5414 _(input_acl_set_interface_reply) \
5415 _(ipsec_spd_add_del_reply) \
5416 _(ipsec_interface_add_del_spd_reply) \
5417 _(ipsec_spd_add_del_entry_reply) \
5418 _(ipsec_sad_add_del_entry_reply) \
5419 _(ipsec_sa_set_key_reply) \
5420 _(ipsec_tunnel_if_add_del_reply) \
5421 _(ipsec_tunnel_if_set_key_reply) \
5422 _(ipsec_tunnel_if_set_sa_reply) \
5423 _(ikev2_profile_add_del_reply) \
5424 _(ikev2_profile_set_auth_reply) \
5425 _(ikev2_profile_set_id_reply) \
5426 _(ikev2_profile_set_ts_reply) \
5427 _(ikev2_set_local_key_reply) \
5428 _(ikev2_set_responder_reply) \
5429 _(ikev2_set_ike_transforms_reply) \
5430 _(ikev2_set_esp_transforms_reply) \
5431 _(ikev2_set_sa_lifetime_reply) \
5432 _(ikev2_initiate_sa_init_reply) \
5433 _(ikev2_initiate_del_ike_sa_reply) \
5434 _(ikev2_initiate_del_child_sa_reply) \
5435 _(ikev2_initiate_rekey_child_sa_reply) \
5436 _(delete_loopback_reply) \
5437 _(bd_ip_mac_add_del_reply) \
5438 _(want_interface_events_reply) \
5439 _(want_stats_reply) \
5440 _(cop_interface_enable_disable_reply) \
5441 _(cop_whitelist_enable_disable_reply) \
5442 _(sw_interface_clear_stats_reply) \
5443 _(ioam_enable_reply) \
5444 _(ioam_disable_reply) \
5445 _(one_add_del_locator_reply) \
5446 _(one_add_del_local_eid_reply) \
5447 _(one_add_del_remote_mapping_reply) \
5448 _(one_add_del_adjacency_reply) \
5449 _(one_add_del_map_resolver_reply) \
5450 _(one_add_del_map_server_reply) \
5451 _(one_enable_disable_reply) \
5452 _(one_rloc_probe_enable_disable_reply) \
5453 _(one_map_register_enable_disable_reply) \
5454 _(one_map_register_set_ttl_reply) \
5455 _(one_set_transport_protocol_reply) \
5456 _(one_map_register_fallback_threshold_reply) \
5457 _(one_pitr_set_locator_set_reply) \
5458 _(one_map_request_mode_reply) \
5459 _(one_add_del_map_request_itr_rlocs_reply) \
5460 _(one_eid_table_add_del_map_reply) \
5461 _(one_use_petr_reply) \
5462 _(one_stats_enable_disable_reply) \
5463 _(one_add_del_l2_arp_entry_reply) \
5464 _(one_add_del_ndp_entry_reply) \
5465 _(one_stats_flush_reply) \
5466 _(one_enable_disable_xtr_mode_reply) \
5467 _(one_enable_disable_pitr_mode_reply) \
5468 _(one_enable_disable_petr_mode_reply) \
5469 _(gpe_enable_disable_reply) \
5470 _(gpe_set_encap_mode_reply) \
5471 _(gpe_add_del_iface_reply) \
5472 _(gpe_add_del_native_fwd_rpath_reply) \
5473 _(af_packet_delete_reply) \
5474 _(policer_classify_set_interface_reply) \
5475 _(netmap_create_reply) \
5476 _(netmap_delete_reply) \
5477 _(set_ipfix_exporter_reply) \
5478 _(set_ipfix_classify_stream_reply) \
5479 _(ipfix_classify_table_add_del_reply) \
5480 _(flow_classify_set_interface_reply) \
5481 _(sw_interface_span_enable_disable_reply) \
5482 _(pg_capture_reply) \
5483 _(pg_enable_disable_reply) \
5484 _(ip_source_and_port_range_check_add_del_reply) \
5485 _(ip_source_and_port_range_check_interface_add_del_reply)\
5486 _(delete_subif_reply) \
5487 _(l2_interface_pbb_tag_rewrite_reply) \
5489 _(feature_enable_disable_reply) \
5490 _(sw_interface_tag_add_del_reply) \
5491 _(hw_interface_set_mtu_reply) \
5492 _(p2p_ethernet_add_reply) \
5493 _(p2p_ethernet_del_reply) \
5494 _(lldp_config_reply) \
5495 _(sw_interface_set_lldp_reply) \
5496 _(tcp_configure_src_addresses_reply) \
5497 _(dns_enable_disable_reply) \
5498 _(dns_name_server_add_del_reply) \
5499 _(session_rule_add_del_reply) \
5500 _(ip_container_proxy_add_del_reply) \
5501 _(output_acl_set_interface_reply) \
5502 _(qos_record_enable_disable_reply)
5505 static void vl_api_##n##_t_handler \
5506 (vl_api_##n##_t * mp) \
5508 vat_main_t * vam = &vat_main; \
5509 i32 retval = ntohl(mp->retval); \
5510 if (vam->async_mode) { \
5511 vam->async_errors += (retval < 0); \
5513 vam->retval = retval; \
5514 vam->result_ready = 1; \
5517 foreach_standard_reply_retval_handler;
5521 static void vl_api_##n##_t_handler_json \
5522 (vl_api_##n##_t * mp) \
5524 vat_main_t * vam = &vat_main; \
5525 vat_json_node_t node; \
5526 vat_json_init_object(&node); \
5527 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5528 vat_json_print(vam->ofp, &node); \
5529 vam->retval = ntohl(mp->retval); \
5530 vam->result_ready = 1; \
5532 foreach_standard_reply_retval_handler;
5536 * Table of message reply handlers, must include boilerplate handlers
5540 #define foreach_vpe_api_reply_msg \
5541 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
5542 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
5543 _(SW_INTERFACE_DETAILS, sw_interface_details) \
5544 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5545 _(CONTROL_PING_REPLY, control_ping_reply) \
5546 _(CLI_REPLY, cli_reply) \
5547 _(CLI_INBAND_REPLY, cli_inband_reply) \
5548 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5549 sw_interface_add_del_address_reply) \
5550 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
5551 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
5552 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5553 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5554 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5555 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
5556 _(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
5557 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
5558 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5559 sw_interface_set_l2_xconnect_reply) \
5560 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5561 sw_interface_set_l2_bridge_reply) \
5562 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5563 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
5564 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
5565 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
5566 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5567 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
5568 _(L2_FLAGS_REPLY, l2_flags_reply) \
5569 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
5570 _(TAP_CONNECT_REPLY, tap_connect_reply) \
5571 _(TAP_MODIFY_REPLY, tap_modify_reply) \
5572 _(TAP_DELETE_REPLY, tap_delete_reply) \
5573 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
5574 _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5575 _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5576 _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
5577 _(BOND_CREATE_REPLY, bond_create_reply) \
5578 _(BOND_DELETE_REPLY, bond_delete_reply) \
5579 _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5580 _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5581 _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5582 _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
5583 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
5584 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
5585 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
5586 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
5587 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5588 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
5589 _(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5590 _(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
5591 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5592 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5593 proxy_arp_intfc_enable_disable_reply) \
5594 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5595 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5596 sw_interface_set_unnumbered_reply) \
5597 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
5598 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5599 _(CREATE_SUBIF_REPLY, create_subif_reply) \
5600 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
5601 _(RESET_FIB_REPLY, reset_fib_reply) \
5602 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
5603 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
5604 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
5605 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5606 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5607 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5608 sw_interface_ip6_enable_disable_reply) \
5609 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
5610 sw_interface_ip6_set_link_local_address_reply) \
5611 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5612 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
5613 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5614 sw_interface_ip6nd_ra_prefix_reply) \
5615 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5616 sw_interface_ip6nd_ra_config_reply) \
5617 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5618 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
5619 _(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5620 _(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5621 _(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
5622 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5623 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5624 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5625 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5626 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
5627 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5628 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5629 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5630 classify_set_interface_ip_table_reply) \
5631 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5632 classify_set_interface_l2_tables_reply) \
5633 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5634 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5635 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5636 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5637 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5638 l2tpv3_interface_enable_disable_reply) \
5639 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5640 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5641 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
5642 _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
5643 _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
5644 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
5645 _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
5646 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
5647 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5648 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5649 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5650 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5651 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5652 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5653 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5654 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5655 _(SHOW_VERSION_REPLY, show_version_reply) \
5656 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
5657 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
5658 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5659 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
5660 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
5661 _(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
5662 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5663 _(IP4_ARP_EVENT, ip4_arp_event) \
5664 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5665 _(IP6_ND_EVENT, ip6_nd_event) \
5666 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5667 _(L2_MACS_EVENT, l2_macs_event) \
5668 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5669 _(IP_ADDRESS_DETAILS, ip_address_details) \
5670 _(IP_DETAILS, ip_details) \
5671 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5672 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
5673 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
5674 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
5675 _(IPSEC_SA_DETAILS, ipsec_sa_details) \
5676 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
5677 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
5678 _(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \
5679 _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
5680 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
5681 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
5682 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
5683 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
5684 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
5685 _(IKEV2_SET_RESPONDER_REPLY, ikev2_set_responder_reply) \
5686 _(IKEV2_SET_IKE_TRANSFORMS_REPLY, ikev2_set_ike_transforms_reply) \
5687 _(IKEV2_SET_ESP_TRANSFORMS_REPLY, ikev2_set_esp_transforms_reply) \
5688 _(IKEV2_SET_SA_LIFETIME_REPLY, ikev2_set_sa_lifetime_reply) \
5689 _(IKEV2_INITIATE_SA_INIT_REPLY, ikev2_initiate_sa_init_reply) \
5690 _(IKEV2_INITIATE_DEL_IKE_SA_REPLY, ikev2_initiate_del_ike_sa_reply) \
5691 _(IKEV2_INITIATE_DEL_CHILD_SA_REPLY, ikev2_initiate_del_child_sa_reply) \
5692 _(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \
5693 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5694 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
5695 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
5696 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
5697 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
5698 _(WANT_STATS_REPLY, want_stats_reply) \
5699 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5700 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5701 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5702 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5703 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5704 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5705 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
5706 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5707 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5708 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5709 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5710 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5711 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5712 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5713 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5714 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5715 one_map_register_enable_disable_reply) \
5716 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
5717 _(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5718 _(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
5719 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5720 one_map_register_fallback_threshold_reply) \
5721 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5722 one_rloc_probe_enable_disable_reply) \
5723 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
5724 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
5725 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5726 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5727 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5728 _(ONE_LOCATOR_DETAILS, one_locator_details) \
5729 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5730 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5731 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5732 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5733 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5734 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
5735 _(ONE_STATS_DETAILS, one_stats_details) \
5736 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
5737 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5738 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5739 show_one_stats_enable_disable_reply) \
5740 _(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5741 _(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5742 _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
5743 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5744 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5745 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
5746 _(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5747 _(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5748 one_enable_disable_pitr_mode_reply) \
5749 _(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5750 one_enable_disable_petr_mode_reply) \
5751 _(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5752 _(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5753 _(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
5754 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5755 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
5756 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
5757 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5758 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
5759 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
5760 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
5761 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5762 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5763 gpe_add_del_native_fwd_rpath_reply) \
5764 _(GPE_FWD_ENTRY_PATH_DETAILS, \
5765 gpe_fwd_entry_path_details) \
5766 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5767 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5768 one_add_del_map_request_itr_rlocs_reply) \
5769 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5770 one_get_map_request_itr_rlocs_reply) \
5771 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
5772 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
5773 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
5774 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5775 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5776 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5777 show_one_map_register_state_reply) \
5778 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
5779 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5780 show_one_map_register_fallback_threshold_reply) \
5781 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5782 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
5783 _(AF_PACKET_DETAILS, af_packet_details) \
5784 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5785 _(POLICER_DETAILS, policer_details) \
5786 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5787 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5788 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
5789 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5790 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5791 _(MPLS_FIB_DETAILS, mpls_fib_details) \
5792 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5793 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5794 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5795 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5796 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5797 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5798 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5799 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5800 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5801 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5802 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5803 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5804 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5805 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5806 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5807 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5808 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5809 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5810 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5811 ip_source_and_port_range_check_add_del_reply) \
5812 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5813 ip_source_and_port_range_check_interface_add_del_reply) \
5814 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
5815 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5816 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5817 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5818 _(PUNT_REPLY, punt_reply) \
5819 _(IP_FIB_DETAILS, ip_fib_details) \
5820 _(IP6_FIB_DETAILS, ip6_fib_details) \
5821 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5822 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5823 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5824 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
5825 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5826 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5827 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5828 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5829 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5830 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
5831 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
5832 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5833 _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5834 _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
5835 _(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
5836 _(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
5837 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
5838 _(SESSION_RULES_DETAILS, session_rules_details) \
5839 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
5840 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
5841 _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
5843 #define foreach_standalone_reply_msg \
5844 _(SW_INTERFACE_EVENT, sw_interface_event) \
5845 _(VNET_INTERFACE_SIMPLE_COUNTERS, vnet_interface_simple_counters) \
5846 _(VNET_INTERFACE_COMBINED_COUNTERS, vnet_interface_combined_counters) \
5847 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
5848 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
5849 _(VNET_IP4_NBR_COUNTERS, vnet_ip4_nbr_counters) \
5850 _(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters)
5858 #define STR_VTR_OP_CASE(op) \
5859 case L2_VTR_ ## op: \
5863 str_vtr_op (u32 vtr_op)
5867 STR_VTR_OP_CASE (DISABLED);
5868 STR_VTR_OP_CASE (PUSH_1);
5869 STR_VTR_OP_CASE (PUSH_2);
5870 STR_VTR_OP_CASE (POP_1);
5871 STR_VTR_OP_CASE (POP_2);
5872 STR_VTR_OP_CASE (TRANSLATE_1_1);
5873 STR_VTR_OP_CASE (TRANSLATE_1_2);
5874 STR_VTR_OP_CASE (TRANSLATE_2_1);
5875 STR_VTR_OP_CASE (TRANSLATE_2_2);
5882 dump_sub_interface_table (vat_main_t * vam)
5884 const sw_interface_subif_t *sub = NULL;
5886 if (vam->json_output)
5889 ("JSON output supported only for VPE API calls and dump_stats_table");
5894 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5895 "Interface", "sw_if_index",
5896 "sub id", "dot1ad", "tags", "outer id",
5897 "inner id", "exact", "default", "outer any", "inner any");
5899 vec_foreach (sub, vam->sw_if_subif_table)
5902 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5903 sub->interface_name,
5905 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5906 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5907 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5908 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5909 if (sub->vtr_op != L2_VTR_DISABLED)
5912 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5913 "tag1: %d tag2: %d ]",
5914 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5915 sub->vtr_tag1, sub->vtr_tag2);
5923 name_sort_cmp (void *a1, void *a2)
5925 name_sort_t *n1 = a1;
5926 name_sort_t *n2 = a2;
5928 return strcmp ((char *) n1->name, (char *) n2->name);
5932 dump_interface_table (vat_main_t * vam)
5935 name_sort_t *nses = 0, *ns;
5937 if (vam->json_output)
5940 ("JSON output supported only for VPE API calls and dump_stats_table");
5945 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5947 vec_add2 (nses, ns, 1);
5948 ns->name = (u8 *)(p->key);
5949 ns->value = (u32) p->value[0];
5953 vec_sort_with_function (nses, name_sort_cmp);
5955 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5956 vec_foreach (ns, nses)
5958 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5965 dump_ip_table (vat_main_t * vam, int is_ipv6)
5967 const ip_details_t *det = NULL;
5968 const ip_address_details_t *address = NULL;
5971 print (vam->ofp, "%-12s", "sw_if_index");
5973 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5980 print (vam->ofp, "%-12d", i);
5981 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5986 vec_foreach (address, det->addr)
5990 is_ipv6 ? format_ip6_address : format_ip4_address,
5991 address->ip, address->prefix_length);
5999 dump_ipv4_table (vat_main_t * vam)
6001 if (vam->json_output)
6004 ("JSON output supported only for VPE API calls and dump_stats_table");
6008 return dump_ip_table (vam, 0);
6012 dump_ipv6_table (vat_main_t * vam)
6014 if (vam->json_output)
6017 ("JSON output supported only for VPE API calls and dump_stats_table");
6021 return dump_ip_table (vam, 1);
6025 counter_type_to_str (u8 counter_type, u8 is_combined)
6029 switch (counter_type)
6031 case VNET_INTERFACE_COUNTER_DROP:
6033 case VNET_INTERFACE_COUNTER_PUNT:
6035 case VNET_INTERFACE_COUNTER_IP4:
6037 case VNET_INTERFACE_COUNTER_IP6:
6039 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
6041 case VNET_INTERFACE_COUNTER_RX_MISS:
6043 case VNET_INTERFACE_COUNTER_RX_ERROR:
6045 case VNET_INTERFACE_COUNTER_TX_ERROR:
6048 return "INVALID-COUNTER-TYPE";
6053 switch (counter_type)
6055 case VNET_INTERFACE_COUNTER_RX:
6057 case VNET_INTERFACE_COUNTER_TX:
6060 return "INVALID-COUNTER-TYPE";
6066 dump_stats_table (vat_main_t * vam)
6068 vat_json_node_t node;
6069 vat_json_node_t *msg_array;
6070 vat_json_node_t *msg;
6071 vat_json_node_t *counter_array;
6072 vat_json_node_t *counter;
6073 interface_counter_t c;
6075 ip4_fib_counter_t *c4;
6076 ip6_fib_counter_t *c6;
6077 ip4_nbr_counter_t *n4;
6078 ip6_nbr_counter_t *n6;
6081 if (!vam->json_output)
6083 clib_warning ("dump_stats_table supported only in JSON format");
6087 vat_json_init_object (&node);
6089 /* interface counters */
6090 msg_array = vat_json_object_add (&node, "interface_counters");
6091 vat_json_init_array (msg_array);
6092 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
6094 msg = vat_json_array_add (msg_array);
6095 vat_json_init_object (msg);
6096 vat_json_object_add_string_copy (msg, "vnet_counter_type",
6097 (u8 *) counter_type_to_str (i, 0));
6098 vat_json_object_add_int (msg, "is_combined", 0);
6099 counter_array = vat_json_object_add (msg, "data");
6100 vat_json_init_array (counter_array);
6101 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
6103 packets = vam->simple_interface_counters[i][j];
6104 vat_json_array_add_uint (counter_array, packets);
6107 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
6109 msg = vat_json_array_add (msg_array);
6110 vat_json_init_object (msg);
6111 vat_json_object_add_string_copy (msg, "vnet_counter_type",
6112 (u8 *) counter_type_to_str (i, 1));
6113 vat_json_object_add_int (msg, "is_combined", 1);
6114 counter_array = vat_json_object_add (msg, "data");
6115 vat_json_init_array (counter_array);
6116 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
6118 c = vam->combined_interface_counters[i][j];
6119 counter = vat_json_array_add (counter_array);
6120 vat_json_init_object (counter);
6121 vat_json_object_add_uint (counter, "packets", c.packets);
6122 vat_json_object_add_uint (counter, "bytes", c.bytes);
6126 /* ip4 fib counters */
6127 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
6128 vat_json_init_array (msg_array);
6129 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
6131 msg = vat_json_array_add (msg_array);
6132 vat_json_init_object (msg);
6133 vat_json_object_add_uint (msg, "vrf_id",
6134 vam->ip4_fib_counters_vrf_id_by_index[i]);
6135 counter_array = vat_json_object_add (msg, "c");
6136 vat_json_init_array (counter_array);
6137 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
6139 counter = vat_json_array_add (counter_array);
6140 vat_json_init_object (counter);
6141 c4 = &vam->ip4_fib_counters[i][j];
6142 vat_json_object_add_ip4 (counter, "address", c4->address);
6143 vat_json_object_add_uint (counter, "address_length",
6144 c4->address_length);
6145 vat_json_object_add_uint (counter, "packets", c4->packets);
6146 vat_json_object_add_uint (counter, "bytes", c4->bytes);
6150 /* ip6 fib counters */
6151 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
6152 vat_json_init_array (msg_array);
6153 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
6155 msg = vat_json_array_add (msg_array);
6156 vat_json_init_object (msg);
6157 vat_json_object_add_uint (msg, "vrf_id",
6158 vam->ip6_fib_counters_vrf_id_by_index[i]);
6159 counter_array = vat_json_object_add (msg, "c");
6160 vat_json_init_array (counter_array);
6161 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
6163 counter = vat_json_array_add (counter_array);
6164 vat_json_init_object (counter);
6165 c6 = &vam->ip6_fib_counters[i][j];
6166 vat_json_object_add_ip6 (counter, "address", c6->address);
6167 vat_json_object_add_uint (counter, "address_length",
6168 c6->address_length);
6169 vat_json_object_add_uint (counter, "packets", c6->packets);
6170 vat_json_object_add_uint (counter, "bytes", c6->bytes);
6174 /* ip4 nbr counters */
6175 msg_array = vat_json_object_add (&node, "ip4_nbr_counters");
6176 vat_json_init_array (msg_array);
6177 for (i = 0; i < vec_len (vam->ip4_nbr_counters); i++)
6179 msg = vat_json_array_add (msg_array);
6180 vat_json_init_object (msg);
6181 vat_json_object_add_uint (msg, "sw_if_index", i);
6182 counter_array = vat_json_object_add (msg, "c");
6183 vat_json_init_array (counter_array);
6184 for (j = 0; j < vec_len (vam->ip4_nbr_counters[i]); j++)
6186 counter = vat_json_array_add (counter_array);
6187 vat_json_init_object (counter);
6188 n4 = &vam->ip4_nbr_counters[i][j];
6189 vat_json_object_add_ip4 (counter, "address", n4->address);
6190 vat_json_object_add_uint (counter, "link-type", n4->linkt);
6191 vat_json_object_add_uint (counter, "packets", n4->packets);
6192 vat_json_object_add_uint (counter, "bytes", n4->bytes);
6196 /* ip6 nbr counters */
6197 msg_array = vat_json_object_add (&node, "ip6_nbr_counters");
6198 vat_json_init_array (msg_array);
6199 for (i = 0; i < vec_len (vam->ip6_nbr_counters); i++)
6201 msg = vat_json_array_add (msg_array);
6202 vat_json_init_object (msg);
6203 vat_json_object_add_uint (msg, "sw_if_index", i);
6204 counter_array = vat_json_object_add (msg, "c");
6205 vat_json_init_array (counter_array);
6206 for (j = 0; j < vec_len (vam->ip6_nbr_counters[i]); j++)
6208 counter = vat_json_array_add (counter_array);
6209 vat_json_init_object (counter);
6210 n6 = &vam->ip6_nbr_counters[i][j];
6211 vat_json_object_add_ip6 (counter, "address", n6->address);
6212 vat_json_object_add_uint (counter, "packets", n6->packets);
6213 vat_json_object_add_uint (counter, "bytes", n6->bytes);
6217 vat_json_print (vam->ofp, &node);
6218 vat_json_free (&node);
6224 * Pass CLI buffers directly in the CLI_INBAND API message,
6225 * instead of an additional shared memory area.
6228 exec_inband (vat_main_t * vam)
6230 vl_api_cli_inband_t *mp;
6231 unformat_input_t *i = vam->input;
6234 if (vec_len (i->buffer) == 0)
6237 if (vam->exec_mode == 0 && unformat (i, "mode"))
6242 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
6249 * In order for the CLI command to work, it
6250 * must be a vector ending in \n, not a C-string ending
6253 u32 len = vec_len (vam->input->buffer);
6254 M2 (CLI_INBAND, mp, len);
6255 clib_memcpy (mp->cmd, vam->input->buffer, len);
6256 mp->length = htonl (len);
6260 /* json responses may or may not include a useful reply... */
6261 if (vec_len (vam->cmd_reply))
6262 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
6267 exec (vat_main_t * vam)
6269 return exec_inband (vam);
6273 api_create_loopback (vat_main_t * vam)
6275 unformat_input_t *i = vam->input;
6276 vl_api_create_loopback_t *mp;
6277 vl_api_create_loopback_instance_t *mp_lbi;
6280 u8 is_specified = 0;
6281 u32 user_instance = 0;
6284 memset (mac_address, 0, sizeof (mac_address));
6286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6288 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6290 if (unformat (i, "instance %d", &user_instance))
6298 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
6299 mp_lbi->is_specified = is_specified;
6301 mp_lbi->user_instance = htonl (user_instance);
6303 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
6308 /* Construct the API message */
6309 M (CREATE_LOOPBACK, mp);
6311 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
6320 api_delete_loopback (vat_main_t * vam)
6322 unformat_input_t *i = vam->input;
6323 vl_api_delete_loopback_t *mp;
6324 u32 sw_if_index = ~0;
6327 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6329 if (unformat (i, "sw_if_index %d", &sw_if_index))
6335 if (sw_if_index == ~0)
6337 errmsg ("missing sw_if_index");
6341 /* Construct the API message */
6342 M (DELETE_LOOPBACK, mp);
6343 mp->sw_if_index = ntohl (sw_if_index);
6351 api_want_stats (vat_main_t * vam)
6353 unformat_input_t *i = vam->input;
6354 vl_api_want_stats_t *mp;
6358 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6360 if (unformat (i, "enable"))
6362 else if (unformat (i, "disable"))
6370 errmsg ("missing enable|disable");
6375 mp->enable_disable = enable;
6383 api_want_interface_events (vat_main_t * vam)
6385 unformat_input_t *i = vam->input;
6386 vl_api_want_interface_events_t *mp;
6390 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6392 if (unformat (i, "enable"))
6394 else if (unformat (i, "disable"))
6402 errmsg ("missing enable|disable");
6406 M (WANT_INTERFACE_EVENTS, mp);
6407 mp->enable_disable = enable;
6409 vam->interface_event_display = enable;
6417 /* Note: non-static, called once to set up the initial intfc table */
6419 api_sw_interface_dump (vat_main_t * vam)
6421 vl_api_sw_interface_dump_t *mp;
6422 vl_api_control_ping_t *mp_ping;
6424 name_sort_t *nses = 0, *ns;
6425 sw_interface_subif_t *sub = NULL;
6428 /* Toss the old name table */
6430 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
6432 vec_add2 (nses, ns, 1);
6433 ns->name = (u8 *)(p->key);
6434 ns->value = (u32) p->value[0];
6438 hash_free (vam->sw_if_index_by_interface_name);
6440 vec_foreach (ns, nses) vec_free (ns->name);
6444 vec_foreach (sub, vam->sw_if_subif_table)
6446 vec_free (sub->interface_name);
6448 vec_free (vam->sw_if_subif_table);
6450 /* recreate the interface name hash table */
6451 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
6454 * Ask for all interface names. Otherwise, the epic catalog of
6455 * name filters becomes ridiculously long, and vat ends up needing
6456 * to be taught about new interface types.
6458 M (SW_INTERFACE_DUMP, mp);
6461 /* Use a control ping for synchronization */
6462 MPING (CONTROL_PING, mp_ping);
6470 api_sw_interface_set_flags (vat_main_t * vam)
6472 unformat_input_t *i = vam->input;
6473 vl_api_sw_interface_set_flags_t *mp;
6475 u8 sw_if_index_set = 0;
6479 /* Parse args required to build the message */
6480 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6482 if (unformat (i, "admin-up"))
6484 else if (unformat (i, "admin-down"))
6487 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6488 sw_if_index_set = 1;
6489 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6490 sw_if_index_set = 1;
6495 if (sw_if_index_set == 0)
6497 errmsg ("missing interface name or sw_if_index");
6501 /* Construct the API message */
6502 M (SW_INTERFACE_SET_FLAGS, mp);
6503 mp->sw_if_index = ntohl (sw_if_index);
6504 mp->admin_up_down = admin_up;
6509 /* Wait for a reply, return the good/bad news... */
6515 api_sw_interface_set_rx_mode (vat_main_t * vam)
6517 unformat_input_t *i = vam->input;
6518 vl_api_sw_interface_set_rx_mode_t *mp;
6520 u8 sw_if_index_set = 0;
6522 u8 queue_id_valid = 0;
6524 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6526 /* Parse args required to build the message */
6527 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6529 if (unformat (i, "queue %d", &queue_id))
6531 else if (unformat (i, "polling"))
6532 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6533 else if (unformat (i, "interrupt"))
6534 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6535 else if (unformat (i, "adaptive"))
6536 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6538 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6539 sw_if_index_set = 1;
6540 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6541 sw_if_index_set = 1;
6546 if (sw_if_index_set == 0)
6548 errmsg ("missing interface name or sw_if_index");
6551 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6553 errmsg ("missing rx-mode");
6557 /* Construct the API message */
6558 M (SW_INTERFACE_SET_RX_MODE, mp);
6559 mp->sw_if_index = ntohl (sw_if_index);
6561 mp->queue_id_valid = queue_id_valid;
6562 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6567 /* Wait for a reply, return the good/bad news... */
6573 api_sw_interface_set_rx_placement (vat_main_t * vam)
6575 unformat_input_t *i = vam->input;
6576 vl_api_sw_interface_set_rx_placement_t *mp;
6578 u8 sw_if_index_set = 0;
6581 u32 queue_id, thread_index;
6583 /* Parse args required to build the message */
6584 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6586 if (unformat (i, "queue %d", &queue_id))
6588 else if (unformat (i, "main"))
6590 else if (unformat (i, "worker %d", &thread_index))
6593 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6594 sw_if_index_set = 1;
6595 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6596 sw_if_index_set = 1;
6601 if (sw_if_index_set == 0)
6603 errmsg ("missing interface name or sw_if_index");
6609 /* Construct the API message */
6610 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6611 mp->sw_if_index = ntohl (sw_if_index);
6612 mp->worker_id = ntohl (thread_index);
6613 mp->queue_id = ntohl (queue_id);
6614 mp->is_main = is_main;
6618 /* Wait for a reply, return the good/bad news... */
6624 api_sw_interface_clear_stats (vat_main_t * vam)
6626 unformat_input_t *i = vam->input;
6627 vl_api_sw_interface_clear_stats_t *mp;
6629 u8 sw_if_index_set = 0;
6632 /* Parse args required to build the message */
6633 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6635 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6636 sw_if_index_set = 1;
6637 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6638 sw_if_index_set = 1;
6643 /* Construct the API message */
6644 M (SW_INTERFACE_CLEAR_STATS, mp);
6646 if (sw_if_index_set == 1)
6647 mp->sw_if_index = ntohl (sw_if_index);
6649 mp->sw_if_index = ~0;
6654 /* Wait for a reply, return the good/bad news... */
6660 api_sw_interface_add_del_address (vat_main_t * vam)
6662 unformat_input_t *i = vam->input;
6663 vl_api_sw_interface_add_del_address_t *mp;
6665 u8 sw_if_index_set = 0;
6666 u8 is_add = 1, del_all = 0;
6667 u32 address_length = 0;
6668 u8 v4_address_set = 0;
6669 u8 v6_address_set = 0;
6670 ip4_address_t v4address;
6671 ip6_address_t v6address;
6674 /* Parse args required to build the message */
6675 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6677 if (unformat (i, "del-all"))
6679 else if (unformat (i, "del"))
6682 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6683 sw_if_index_set = 1;
6684 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6685 sw_if_index_set = 1;
6686 else if (unformat (i, "%U/%d",
6687 unformat_ip4_address, &v4address, &address_length))
6689 else if (unformat (i, "%U/%d",
6690 unformat_ip6_address, &v6address, &address_length))
6696 if (sw_if_index_set == 0)
6698 errmsg ("missing interface name or sw_if_index");
6701 if (v4_address_set && v6_address_set)
6703 errmsg ("both v4 and v6 addresses set");
6706 if (!v4_address_set && !v6_address_set && !del_all)
6708 errmsg ("no addresses set");
6712 /* Construct the API message */
6713 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
6715 mp->sw_if_index = ntohl (sw_if_index);
6716 mp->is_add = is_add;
6717 mp->del_all = del_all;
6721 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6725 clib_memcpy (mp->address, &v4address, sizeof (v4address));
6727 mp->address_length = address_length;
6732 /* Wait for a reply, return good/bad news */
6738 api_sw_interface_set_mpls_enable (vat_main_t * vam)
6740 unformat_input_t *i = vam->input;
6741 vl_api_sw_interface_set_mpls_enable_t *mp;
6743 u8 sw_if_index_set = 0;
6747 /* Parse args required to build the message */
6748 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6750 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6751 sw_if_index_set = 1;
6752 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6753 sw_if_index_set = 1;
6754 else if (unformat (i, "disable"))
6756 else if (unformat (i, "dis"))
6762 if (sw_if_index_set == 0)
6764 errmsg ("missing interface name or sw_if_index");
6768 /* Construct the API message */
6769 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
6771 mp->sw_if_index = ntohl (sw_if_index);
6772 mp->enable = enable;
6777 /* Wait for a reply... */
6783 api_sw_interface_set_table (vat_main_t * vam)
6785 unformat_input_t *i = vam->input;
6786 vl_api_sw_interface_set_table_t *mp;
6787 u32 sw_if_index, vrf_id = 0;
6788 u8 sw_if_index_set = 0;
6792 /* Parse args required to build the message */
6793 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6795 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6796 sw_if_index_set = 1;
6797 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6798 sw_if_index_set = 1;
6799 else if (unformat (i, "vrf %d", &vrf_id))
6801 else if (unformat (i, "ipv6"))
6807 if (sw_if_index_set == 0)
6809 errmsg ("missing interface name or sw_if_index");
6813 /* Construct the API message */
6814 M (SW_INTERFACE_SET_TABLE, mp);
6816 mp->sw_if_index = ntohl (sw_if_index);
6817 mp->is_ipv6 = is_ipv6;
6818 mp->vrf_id = ntohl (vrf_id);
6823 /* Wait for a reply... */
6828 static void vl_api_sw_interface_get_table_reply_t_handler
6829 (vl_api_sw_interface_get_table_reply_t * mp)
6831 vat_main_t *vam = &vat_main;
6833 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6835 vam->retval = ntohl (mp->retval);
6836 vam->result_ready = 1;
6840 static void vl_api_sw_interface_get_table_reply_t_handler_json
6841 (vl_api_sw_interface_get_table_reply_t * mp)
6843 vat_main_t *vam = &vat_main;
6844 vat_json_node_t node;
6846 vat_json_init_object (&node);
6847 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6848 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6850 vat_json_print (vam->ofp, &node);
6851 vat_json_free (&node);
6853 vam->retval = ntohl (mp->retval);
6854 vam->result_ready = 1;
6858 api_sw_interface_get_table (vat_main_t * vam)
6860 unformat_input_t *i = vam->input;
6861 vl_api_sw_interface_get_table_t *mp;
6863 u8 sw_if_index_set = 0;
6867 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6869 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6870 sw_if_index_set = 1;
6871 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6872 sw_if_index_set = 1;
6873 else if (unformat (i, "ipv6"))
6879 if (sw_if_index_set == 0)
6881 errmsg ("missing interface name or sw_if_index");
6885 M (SW_INTERFACE_GET_TABLE, mp);
6886 mp->sw_if_index = htonl (sw_if_index);
6887 mp->is_ipv6 = is_ipv6;
6895 api_sw_interface_set_vpath (vat_main_t * vam)
6897 unformat_input_t *i = vam->input;
6898 vl_api_sw_interface_set_vpath_t *mp;
6899 u32 sw_if_index = 0;
6900 u8 sw_if_index_set = 0;
6904 /* Parse args required to build the message */
6905 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6907 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6908 sw_if_index_set = 1;
6909 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6910 sw_if_index_set = 1;
6911 else if (unformat (i, "enable"))
6913 else if (unformat (i, "disable"))
6919 if (sw_if_index_set == 0)
6921 errmsg ("missing interface name or sw_if_index");
6925 /* Construct the API message */
6926 M (SW_INTERFACE_SET_VPATH, mp);
6928 mp->sw_if_index = ntohl (sw_if_index);
6929 mp->enable = is_enable;
6934 /* Wait for a reply... */
6940 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6942 unformat_input_t *i = vam->input;
6943 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6944 u32 sw_if_index = 0;
6945 u8 sw_if_index_set = 0;
6950 /* Parse args required to build the message */
6951 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6953 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6954 sw_if_index_set = 1;
6955 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6956 sw_if_index_set = 1;
6957 else if (unformat (i, "enable"))
6959 else if (unformat (i, "disable"))
6961 else if (unformat (i, "ip4"))
6963 else if (unformat (i, "ip6"))
6969 if (sw_if_index_set == 0)
6971 errmsg ("missing interface name or sw_if_index");
6975 /* Construct the API message */
6976 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6978 mp->sw_if_index = ntohl (sw_if_index);
6979 mp->enable = is_enable;
6980 mp->is_ipv6 = is_ipv6;
6985 /* Wait for a reply... */
6991 api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6993 unformat_input_t *i = vam->input;
6994 vl_api_sw_interface_set_geneve_bypass_t *mp;
6995 u32 sw_if_index = 0;
6996 u8 sw_if_index_set = 0;
7001 /* Parse args required to build the message */
7002 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7004 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7005 sw_if_index_set = 1;
7006 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7007 sw_if_index_set = 1;
7008 else if (unformat (i, "enable"))
7010 else if (unformat (i, "disable"))
7012 else if (unformat (i, "ip4"))
7014 else if (unformat (i, "ip6"))
7020 if (sw_if_index_set == 0)
7022 errmsg ("missing interface name or sw_if_index");
7026 /* Construct the API message */
7027 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
7029 mp->sw_if_index = ntohl (sw_if_index);
7030 mp->enable = is_enable;
7031 mp->is_ipv6 = is_ipv6;
7036 /* Wait for a reply... */
7042 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
7044 unformat_input_t *i = vam->input;
7045 vl_api_sw_interface_set_l2_xconnect_t *mp;
7047 u8 rx_sw_if_index_set = 0;
7049 u8 tx_sw_if_index_set = 0;
7053 /* Parse args required to build the message */
7054 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7056 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7057 rx_sw_if_index_set = 1;
7058 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7059 tx_sw_if_index_set = 1;
7060 else if (unformat (i, "rx"))
7062 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7064 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
7066 rx_sw_if_index_set = 1;
7071 else if (unformat (i, "tx"))
7073 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7075 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
7077 tx_sw_if_index_set = 1;
7082 else if (unformat (i, "enable"))
7084 else if (unformat (i, "disable"))
7090 if (rx_sw_if_index_set == 0)
7092 errmsg ("missing rx interface name or rx_sw_if_index");
7096 if (enable && (tx_sw_if_index_set == 0))
7098 errmsg ("missing tx interface name or tx_sw_if_index");
7102 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
7104 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7105 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7106 mp->enable = enable;
7114 api_sw_interface_set_l2_bridge (vat_main_t * vam)
7116 unformat_input_t *i = vam->input;
7117 vl_api_sw_interface_set_l2_bridge_t *mp;
7118 vl_api_l2_port_type_t port_type;
7120 u8 rx_sw_if_index_set = 0;
7127 port_type = L2_API_PORT_TYPE_NORMAL;
7129 /* Parse args required to build the message */
7130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7132 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
7133 rx_sw_if_index_set = 1;
7134 else if (unformat (i, "bd_id %d", &bd_id))
7138 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
7139 rx_sw_if_index_set = 1;
7140 else if (unformat (i, "shg %d", &shg))
7142 else if (unformat (i, "bvi"))
7143 port_type = L2_API_PORT_TYPE_BVI;
7144 else if (unformat (i, "uu-fwd"))
7145 port_type = L2_API_PORT_TYPE_UU_FWD;
7146 else if (unformat (i, "enable"))
7148 else if (unformat (i, "disable"))
7154 if (rx_sw_if_index_set == 0)
7156 errmsg ("missing rx interface name or sw_if_index");
7160 if (enable && (bd_id_set == 0))
7162 errmsg ("missing bridge domain");
7166 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
7168 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7169 mp->bd_id = ntohl (bd_id);
7171 mp->port_type = ntohl (port_type);
7172 mp->enable = enable;
7180 api_bridge_domain_dump (vat_main_t * vam)
7182 unformat_input_t *i = vam->input;
7183 vl_api_bridge_domain_dump_t *mp;
7184 vl_api_control_ping_t *mp_ping;
7188 /* Parse args required to build the message */
7189 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7191 if (unformat (i, "bd_id %d", &bd_id))
7197 M (BRIDGE_DOMAIN_DUMP, mp);
7198 mp->bd_id = ntohl (bd_id);
7201 /* Use a control ping for synchronization */
7202 MPING (CONTROL_PING, mp_ping);
7210 api_bridge_domain_add_del (vat_main_t * vam)
7212 unformat_input_t *i = vam->input;
7213 vl_api_bridge_domain_add_del_t *mp;
7216 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
7221 /* Parse args required to build the message */
7222 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7224 if (unformat (i, "bd_id %d", &bd_id))
7226 else if (unformat (i, "flood %d", &flood))
7228 else if (unformat (i, "uu-flood %d", &uu_flood))
7230 else if (unformat (i, "forward %d", &forward))
7232 else if (unformat (i, "learn %d", &learn))
7234 else if (unformat (i, "arp-term %d", &arp_term))
7236 else if (unformat (i, "mac-age %d", &mac_age))
7238 else if (unformat (i, "bd-tag %s", &bd_tag))
7240 else if (unformat (i, "del"))
7243 flood = uu_flood = forward = learn = 0;
7251 errmsg ("missing bridge domain");
7258 errmsg ("mac age must be less than 256 ");
7263 if ((bd_tag) && (vec_len (bd_tag) > 63))
7265 errmsg ("bd-tag cannot be longer than 63");
7270 M (BRIDGE_DOMAIN_ADD_DEL, mp);
7272 mp->bd_id = ntohl (bd_id);
7274 mp->uu_flood = uu_flood;
7275 mp->forward = forward;
7277 mp->arp_term = arp_term;
7278 mp->is_add = is_add;
7279 mp->mac_age = (u8) mac_age;
7282 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
7283 mp->bd_tag[vec_len (bd_tag)] = 0;
7294 api_l2fib_flush_bd (vat_main_t * vam)
7296 unformat_input_t *i = vam->input;
7297 vl_api_l2fib_flush_bd_t *mp;
7301 /* Parse args required to build the message */
7302 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7304 if (unformat (i, "bd_id %d", &bd_id));
7311 errmsg ("missing bridge domain");
7315 M (L2FIB_FLUSH_BD, mp);
7317 mp->bd_id = htonl (bd_id);
7325 api_l2fib_flush_int (vat_main_t * vam)
7327 unformat_input_t *i = vam->input;
7328 vl_api_l2fib_flush_int_t *mp;
7329 u32 sw_if_index = ~0;
7332 /* Parse args required to build the message */
7333 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7335 if (unformat (i, "sw_if_index %d", &sw_if_index));
7337 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
7342 if (sw_if_index == ~0)
7344 errmsg ("missing interface name or sw_if_index");
7348 M (L2FIB_FLUSH_INT, mp);
7350 mp->sw_if_index = ntohl (sw_if_index);
7358 api_l2fib_add_del (vat_main_t * vam)
7360 unformat_input_t *i = vam->input;
7361 vl_api_l2fib_add_del_t *mp;
7367 u32 sw_if_index = 0;
7368 u8 sw_if_index_set = 0;
7377 /* Parse args required to build the message */
7378 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7380 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
7382 else if (unformat (i, "bd_id %d", &bd_id))
7384 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7385 sw_if_index_set = 1;
7386 else if (unformat (i, "sw_if"))
7388 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7391 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7392 sw_if_index_set = 1;
7397 else if (unformat (i, "static"))
7399 else if (unformat (i, "filter"))
7404 else if (unformat (i, "bvi"))
7409 else if (unformat (i, "del"))
7411 else if (unformat (i, "count %d", &count))
7419 errmsg ("missing mac address");
7425 errmsg ("missing bridge domain");
7429 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7431 errmsg ("missing interface name or sw_if_index");
7437 /* Turn on async mode */
7438 vam->async_mode = 1;
7439 vam->async_errors = 0;
7440 before = vat_time_now (vam);
7443 for (j = 0; j < count; j++)
7445 M (L2FIB_ADD_DEL, mp);
7447 clib_memcpy (mp->mac, mac, 6);
7448 mp->bd_id = ntohl (bd_id);
7449 mp->is_add = is_add;
7450 mp->sw_if_index = ntohl (sw_if_index);
7454 mp->static_mac = static_mac;
7455 mp->filter_mac = filter_mac;
7456 mp->bvi_mac = bvi_mac;
7458 increment_mac_address (mac);
7465 vl_api_control_ping_t *mp_ping;
7468 /* Shut off async mode */
7469 vam->async_mode = 0;
7471 MPING (CONTROL_PING, mp_ping);
7474 timeout = vat_time_now (vam) + 1.0;
7475 while (vat_time_now (vam) < timeout)
7476 if (vam->result_ready == 1)
7481 if (vam->retval == -99)
7484 if (vam->async_errors > 0)
7486 errmsg ("%d asynchronous errors", vam->async_errors);
7489 vam->async_errors = 0;
7490 after = vat_time_now (vam);
7492 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7493 count, after - before, count / (after - before));
7499 /* Wait for a reply... */
7503 /* Return the good/bad news */
7504 return (vam->retval);
7508 api_bridge_domain_set_mac_age (vat_main_t * vam)
7510 unformat_input_t *i = vam->input;
7511 vl_api_bridge_domain_set_mac_age_t *mp;
7516 /* Parse args required to build the message */
7517 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7519 if (unformat (i, "bd_id %d", &bd_id));
7520 else if (unformat (i, "mac-age %d", &mac_age));
7527 errmsg ("missing bridge domain");
7533 errmsg ("mac age must be less than 256 ");
7537 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7539 mp->bd_id = htonl (bd_id);
7540 mp->mac_age = (u8) mac_age;
7548 api_l2_flags (vat_main_t * vam)
7550 unformat_input_t *i = vam->input;
7551 vl_api_l2_flags_t *mp;
7554 u8 sw_if_index_set = 0;
7558 /* Parse args required to build the message */
7559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7561 if (unformat (i, "sw_if_index %d", &sw_if_index))
7562 sw_if_index_set = 1;
7563 else if (unformat (i, "sw_if"))
7565 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7568 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7569 sw_if_index_set = 1;
7574 else if (unformat (i, "learn"))
7576 else if (unformat (i, "forward"))
7578 else if (unformat (i, "flood"))
7580 else if (unformat (i, "uu-flood"))
7581 flags |= L2_UU_FLOOD;
7582 else if (unformat (i, "arp-term"))
7583 flags |= L2_ARP_TERM;
7584 else if (unformat (i, "off"))
7586 else if (unformat (i, "disable"))
7592 if (sw_if_index_set == 0)
7594 errmsg ("missing interface name or sw_if_index");
7600 mp->sw_if_index = ntohl (sw_if_index);
7601 mp->feature_bitmap = ntohl (flags);
7602 mp->is_set = is_set;
7610 api_bridge_flags (vat_main_t * vam)
7612 unformat_input_t *i = vam->input;
7613 vl_api_bridge_flags_t *mp;
7617 bd_flags_t flags = 0;
7620 /* Parse args required to build the message */
7621 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7623 if (unformat (i, "bd_id %d", &bd_id))
7625 else if (unformat (i, "learn"))
7626 flags |= BRIDGE_API_FLAG_LEARN;
7627 else if (unformat (i, "forward"))
7628 flags |= BRIDGE_API_FLAG_FWD;
7629 else if (unformat (i, "flood"))
7630 flags |= BRIDGE_API_FLAG_FLOOD;
7631 else if (unformat (i, "uu-flood"))
7632 flags |= BRIDGE_API_FLAG_UU_FLOOD;
7633 else if (unformat (i, "arp-term"))
7634 flags |= BRIDGE_API_FLAG_ARP_TERM;
7635 else if (unformat (i, "off"))
7637 else if (unformat (i, "disable"))
7645 errmsg ("missing bridge domain");
7649 M (BRIDGE_FLAGS, mp);
7651 mp->bd_id = ntohl (bd_id);
7652 mp->flags = ntohl (flags);
7653 mp->is_set = is_set;
7661 api_bd_ip_mac_add_del (vat_main_t * vam)
7663 unformat_input_t *i = vam->input;
7664 vl_api_bd_ip_mac_add_del_t *mp;
7671 ip4_address_t v4addr;
7672 ip6_address_t v6addr;
7677 /* Parse args required to build the message */
7678 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7680 if (unformat (i, "bd_id %d", &bd_id))
7684 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
7688 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
7693 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
7697 else if (unformat (i, "del"))
7705 errmsg ("missing bridge domain");
7708 else if (ip_set == 0)
7710 errmsg ("missing IP address");
7713 else if (mac_set == 0)
7715 errmsg ("missing MAC address");
7719 M (BD_IP_MAC_ADD_DEL, mp);
7721 mp->bd_id = ntohl (bd_id);
7722 mp->is_ipv6 = is_ipv6;
7723 mp->is_add = is_add;
7725 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
7727 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
7728 clib_memcpy (mp->mac_address, macaddr, 6);
7734 static void vl_api_bd_ip_mac_details_t_handler
7735 (vl_api_bd_ip_mac_details_t * mp)
7737 vat_main_t *vam = &vat_main;
7742 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7745 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7748 "\n%-5d %-7s %-20U %-30s",
7749 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7750 format_ethernet_address, mp->mac_address, ip);
7755 static void vl_api_bd_ip_mac_details_t_handler_json
7756 (vl_api_bd_ip_mac_details_t * mp)
7758 vat_main_t *vam = &vat_main;
7759 vat_json_node_t *node = NULL;
7761 if (VAT_JSON_ARRAY != vam->json_tree.type)
7763 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7764 vat_json_init_array (&vam->json_tree);
7766 node = vat_json_array_add (&vam->json_tree);
7768 vat_json_init_object (node);
7769 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7770 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
7771 vat_json_object_add_string_copy (node, "mac_address",
7772 format (0, "%U", format_ethernet_address,
7778 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7781 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7782 vat_json_object_add_string_copy (node, "ip_address", ip);
7787 api_bd_ip_mac_dump (vat_main_t * vam)
7789 unformat_input_t *i = vam->input;
7790 vl_api_bd_ip_mac_dump_t *mp;
7791 vl_api_control_ping_t *mp_ping;
7796 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7798 if (unformat (i, "bd_id %d", &bd_id))
7807 "\n%-5s %-7s %-20s %-30s",
7808 "bd_id", "is_ipv6", "mac_address", "ip_address");
7810 /* Dump Bridge Domain Ip to Mac entries */
7811 M (BD_IP_MAC_DUMP, mp);
7814 mp->bd_id = htonl (bd_id);
7820 /* Use a control ping for synchronization */
7821 MPING (CONTROL_PING, mp_ping);
7829 api_tap_connect (vat_main_t * vam)
7831 unformat_input_t *i = vam->input;
7832 vl_api_tap_connect_t *mp;
7838 ip4_address_t ip4_address;
7840 int ip4_address_set = 0;
7841 ip6_address_t ip6_address;
7843 int ip6_address_set = 0;
7846 memset (mac_address, 0, sizeof (mac_address));
7848 /* Parse args required to build the message */
7849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7851 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7855 else if (unformat (i, "random-mac"))
7857 else if (unformat (i, "tapname %s", &tap_name))
7859 else if (unformat (i, "tag %s", &tag))
7861 else if (unformat (i, "address %U/%d",
7862 unformat_ip4_address, &ip4_address, &ip4_mask_width))
7863 ip4_address_set = 1;
7864 else if (unformat (i, "address %U/%d",
7865 unformat_ip6_address, &ip6_address, &ip6_mask_width))
7866 ip6_address_set = 1;
7873 errmsg ("missing tap name");
7876 if (vec_len (tap_name) > 63)
7878 errmsg ("tap name too long");
7881 vec_add1 (tap_name, 0);
7883 if (vec_len (tag) > 63)
7885 errmsg ("tag too long");
7889 /* Construct the API message */
7890 M (TAP_CONNECT, mp);
7892 mp->use_random_mac = random_mac;
7893 clib_memcpy (mp->mac_address, mac_address, 6);
7894 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7896 clib_memcpy (mp->tag, tag, vec_len (tag));
7898 if (ip4_address_set)
7900 mp->ip4_address_set = 1;
7901 clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address));
7902 mp->ip4_mask_width = ip4_mask_width;
7904 if (ip6_address_set)
7906 mp->ip6_address_set = 1;
7907 clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address));
7908 mp->ip6_mask_width = ip6_mask_width;
7911 vec_free (tap_name);
7917 /* Wait for a reply... */
7923 api_tap_modify (vat_main_t * vam)
7925 unformat_input_t *i = vam->input;
7926 vl_api_tap_modify_t *mp;
7931 u32 sw_if_index = ~0;
7932 u8 sw_if_index_set = 0;
7935 memset (mac_address, 0, sizeof (mac_address));
7937 /* Parse args required to build the message */
7938 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7940 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7941 sw_if_index_set = 1;
7942 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7943 sw_if_index_set = 1;
7944 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7948 else if (unformat (i, "random-mac"))
7950 else if (unformat (i, "tapname %s", &tap_name))
7956 if (sw_if_index_set == 0)
7958 errmsg ("missing vpp interface name");
7963 errmsg ("missing tap name");
7966 if (vec_len (tap_name) > 63)
7968 errmsg ("tap name too long");
7970 vec_add1 (tap_name, 0);
7972 /* Construct the API message */
7975 mp->use_random_mac = random_mac;
7976 mp->sw_if_index = ntohl (sw_if_index);
7977 clib_memcpy (mp->mac_address, mac_address, 6);
7978 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7979 vec_free (tap_name);
7984 /* Wait for a reply... */
7990 api_tap_delete (vat_main_t * vam)
7992 unformat_input_t *i = vam->input;
7993 vl_api_tap_delete_t *mp;
7994 u32 sw_if_index = ~0;
7995 u8 sw_if_index_set = 0;
7998 /* Parse args required to build the message */
7999 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8001 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8002 sw_if_index_set = 1;
8003 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8004 sw_if_index_set = 1;
8009 if (sw_if_index_set == 0)
8011 errmsg ("missing vpp interface name");
8015 /* Construct the API message */
8018 mp->sw_if_index = ntohl (sw_if_index);
8023 /* Wait for a reply... */
8029 api_tap_create_v2 (vat_main_t * vam)
8031 unformat_input_t *i = vam->input;
8032 vl_api_tap_create_v2_t *mp;
8036 u8 *host_if_name = 0;
8038 u8 host_mac_addr[6];
8039 u8 host_mac_addr_set = 0;
8040 u8 *host_bridge = 0;
8041 ip4_address_t host_ip4_addr;
8042 ip4_address_t host_ip4_gw;
8043 u8 host_ip4_gw_set = 0;
8044 u32 host_ip4_prefix_len = 0;
8045 ip6_address_t host_ip6_addr;
8046 ip6_address_t host_ip6_gw;
8047 u8 host_ip6_gw_set = 0;
8048 u32 host_ip6_prefix_len = 0;
8050 u32 rx_ring_sz = 0, tx_ring_sz = 0;
8052 memset (mac_address, 0, sizeof (mac_address));
8054 /* Parse args required to build the message */
8055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8057 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
8061 else if (unformat (i, "id %u", &id))
8063 else if (unformat (i, "host-if-name %s", &host_if_name))
8065 else if (unformat (i, "host-ns %s", &host_ns))
8067 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
8069 host_mac_addr_set = 1;
8070 else if (unformat (i, "host-bridge %s", &host_bridge))
8072 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
8073 &host_ip4_addr, &host_ip4_prefix_len))
8075 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
8076 &host_ip6_addr, &host_ip6_prefix_len))
8078 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
8080 host_ip4_gw_set = 1;
8081 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
8083 host_ip6_gw_set = 1;
8084 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
8086 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
8092 if (vec_len (host_if_name) > 63)
8094 errmsg ("tap name too long. ");
8097 if (vec_len (host_ns) > 63)
8099 errmsg ("host name space too long. ");
8102 if (vec_len (host_bridge) > 63)
8104 errmsg ("host bridge name too long. ");
8107 if (host_ip4_prefix_len > 32)
8109 errmsg ("host ip4 prefix length not valid. ");
8112 if (host_ip6_prefix_len > 128)
8114 errmsg ("host ip6 prefix length not valid. ");
8117 if (!is_pow2 (rx_ring_sz))
8119 errmsg ("rx ring size must be power of 2. ");
8122 if (rx_ring_sz > 32768)
8124 errmsg ("rx ring size must be 32768 or lower. ");
8127 if (!is_pow2 (tx_ring_sz))
8129 errmsg ("tx ring size must be power of 2. ");
8132 if (tx_ring_sz > 32768)
8134 errmsg ("tx ring size must be 32768 or lower. ");
8138 /* Construct the API message */
8139 M (TAP_CREATE_V2, mp);
8141 mp->use_random_mac = random_mac;
8143 mp->id = ntohl (id);
8144 mp->host_namespace_set = host_ns != 0;
8145 mp->host_bridge_set = host_bridge != 0;
8146 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
8147 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
8148 mp->rx_ring_sz = ntohs (rx_ring_sz);
8149 mp->tx_ring_sz = ntohs (tx_ring_sz);
8151 if (random_mac == 0)
8152 clib_memcpy (mp->mac_address, mac_address, 6);
8153 if (host_mac_addr_set)
8154 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
8156 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
8158 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
8160 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
8161 if (host_ip4_prefix_len)
8162 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
8163 if (host_ip4_prefix_len)
8164 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
8165 if (host_ip4_gw_set)
8166 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
8167 if (host_ip6_gw_set)
8168 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
8171 vec_free (host_if_name);
8172 vec_free (host_bridge);
8177 /* Wait for a reply... */
8183 api_tap_delete_v2 (vat_main_t * vam)
8185 unformat_input_t *i = vam->input;
8186 vl_api_tap_delete_v2_t *mp;
8187 u32 sw_if_index = ~0;
8188 u8 sw_if_index_set = 0;
8191 /* Parse args required to build the message */
8192 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8194 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8195 sw_if_index_set = 1;
8196 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8197 sw_if_index_set = 1;
8202 if (sw_if_index_set == 0)
8204 errmsg ("missing vpp interface name. ");
8208 /* Construct the API message */
8209 M (TAP_DELETE_V2, mp);
8211 mp->sw_if_index = ntohl (sw_if_index);
8216 /* Wait for a reply... */
8222 api_bond_create (vat_main_t * vam)
8224 unformat_input_t *i = vam->input;
8225 vl_api_bond_create_t *mp;
8233 memset (mac_address, 0, sizeof (mac_address));
8236 /* Parse args required to build the message */
8237 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8239 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
8241 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
8242 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
8244 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
8251 if (mode_is_set == 0)
8253 errmsg ("Missing bond mode. ");
8257 /* Construct the API message */
8258 M (BOND_CREATE, mp);
8260 mp->use_custom_mac = custom_mac;
8266 clib_memcpy (mp->mac_address, mac_address, 6);
8271 /* Wait for a reply... */
8277 api_bond_delete (vat_main_t * vam)
8279 unformat_input_t *i = vam->input;
8280 vl_api_bond_delete_t *mp;
8281 u32 sw_if_index = ~0;
8282 u8 sw_if_index_set = 0;
8285 /* Parse args required to build the message */
8286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8288 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8289 sw_if_index_set = 1;
8290 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8291 sw_if_index_set = 1;
8296 if (sw_if_index_set == 0)
8298 errmsg ("missing vpp interface name. ");
8302 /* Construct the API message */
8303 M (BOND_DELETE, mp);
8305 mp->sw_if_index = ntohl (sw_if_index);
8310 /* Wait for a reply... */
8316 api_bond_enslave (vat_main_t * vam)
8318 unformat_input_t *i = vam->input;
8319 vl_api_bond_enslave_t *mp;
8320 u32 bond_sw_if_index;
8324 u32 bond_sw_if_index_is_set = 0;
8326 u8 sw_if_index_is_set = 0;
8328 /* Parse args required to build the message */
8329 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8331 if (unformat (i, "sw_if_index %d", &sw_if_index))
8332 sw_if_index_is_set = 1;
8333 else if (unformat (i, "bond %u", &bond_sw_if_index))
8334 bond_sw_if_index_is_set = 1;
8335 else if (unformat (i, "passive %d", &is_passive))
8337 else if (unformat (i, "long-timeout %d", &is_long_timeout))
8343 if (bond_sw_if_index_is_set == 0)
8345 errmsg ("Missing bond sw_if_index. ");
8348 if (sw_if_index_is_set == 0)
8350 errmsg ("Missing slave sw_if_index. ");
8354 /* Construct the API message */
8355 M (BOND_ENSLAVE, mp);
8357 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
8358 mp->sw_if_index = ntohl (sw_if_index);
8359 mp->is_long_timeout = is_long_timeout;
8360 mp->is_passive = is_passive;
8365 /* Wait for a reply... */
8371 api_bond_detach_slave (vat_main_t * vam)
8373 unformat_input_t *i = vam->input;
8374 vl_api_bond_detach_slave_t *mp;
8375 u32 sw_if_index = ~0;
8376 u8 sw_if_index_set = 0;
8379 /* Parse args required to build the message */
8380 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8382 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8383 sw_if_index_set = 1;
8384 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8385 sw_if_index_set = 1;
8390 if (sw_if_index_set == 0)
8392 errmsg ("missing vpp interface name. ");
8396 /* Construct the API message */
8397 M (BOND_DETACH_SLAVE, mp);
8399 mp->sw_if_index = ntohl (sw_if_index);
8404 /* Wait for a reply... */
8410 api_ip_table_add_del (vat_main_t * vam)
8412 unformat_input_t *i = vam->input;
8413 vl_api_ip_table_add_del_t *mp;
8419 /* Parse args required to build the message */
8420 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8422 if (unformat (i, "ipv6"))
8424 else if (unformat (i, "del"))
8426 else if (unformat (i, "add"))
8428 else if (unformat (i, "table %d", &table_id))
8432 clib_warning ("parse error '%U'", format_unformat_error, i);
8439 errmsg ("missing table-ID");
8443 /* Construct the API message */
8444 M (IP_TABLE_ADD_DEL, mp);
8446 mp->table_id = ntohl (table_id);
8447 mp->is_ipv6 = is_ipv6;
8448 mp->is_add = is_add;
8453 /* Wait for a reply... */
8460 api_ip_add_del_route (vat_main_t * vam)
8462 unformat_input_t *i = vam->input;
8463 vl_api_ip_add_del_route_t *mp;
8464 u32 sw_if_index = ~0, vrf_id = 0;
8466 u8 is_local = 0, is_drop = 0;
8467 u8 is_unreach = 0, is_prohibit = 0;
8469 u32 next_hop_weight = 1;
8470 u8 is_multipath = 0;
8472 u8 address_length_set = 0;
8473 u32 next_hop_table_id = 0;
8474 u32 resolve_attempts = 0;
8475 u32 dst_address_length = 0;
8476 u8 next_hop_set = 0;
8477 ip4_address_t v4_dst_address, v4_next_hop_address;
8478 ip6_address_t v6_dst_address, v6_next_hop_address;
8482 u32 random_add_del = 0;
8483 u32 *random_vector = 0;
8485 u32 random_seed = 0xdeaddabe;
8486 u32 classify_table_index = ~0;
8488 u8 resolve_host = 0, resolve_attached = 0;
8489 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8490 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8491 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8493 memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8494 memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
8495 /* Parse args required to build the message */
8496 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8498 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8500 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8502 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8507 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8512 else if (unformat (i, "/%d", &dst_address_length))
8514 address_length_set = 1;
8517 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8518 &v4_next_hop_address))
8522 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8523 &v6_next_hop_address))
8529 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8533 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8537 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8539 else if (unformat (i, "weight %d", &next_hop_weight))
8541 else if (unformat (i, "drop"))
8545 else if (unformat (i, "null-send-unreach"))
8549 else if (unformat (i, "null-send-prohibit"))
8553 else if (unformat (i, "local"))
8557 else if (unformat (i, "classify %d", &classify_table_index))
8561 else if (unformat (i, "del"))
8563 else if (unformat (i, "add"))
8565 else if (unformat (i, "resolve-via-host"))
8567 else if (unformat (i, "resolve-via-attached"))
8568 resolve_attached = 1;
8569 else if (unformat (i, "multipath"))
8571 else if (unformat (i, "vrf %d", &vrf_id))
8573 else if (unformat (i, "count %d", &count))
8575 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8577 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8579 else if (unformat (i, "out-label %d", &next_hop_out_label))
8581 vl_api_fib_mpls_label_t fib_label = {
8582 .label = ntohl (next_hop_out_label),
8586 vec_add1 (next_hop_out_label_stack, fib_label);
8588 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8590 else if (unformat (i, "random"))
8592 else if (unformat (i, "seed %d", &random_seed))
8596 clib_warning ("parse error '%U'", format_unformat_error, i);
8601 if (!next_hop_set && !is_drop && !is_local &&
8602 !is_classify && !is_unreach && !is_prohibit &&
8603 MPLS_LABEL_INVALID == next_hop_via_label)
8606 ("next hop / local / drop / unreach / prohibit / classify not set");
8610 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8612 errmsg ("next hop and next-hop via label set");
8615 if (address_set == 0)
8617 errmsg ("missing addresses");
8621 if (address_length_set == 0)
8623 errmsg ("missing address length");
8627 /* Generate a pile of unique, random routes */
8630 u32 this_random_address;
8631 random_hash = hash_create (count, sizeof (uword));
8633 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8634 for (j = 0; j <= count; j++)
8638 this_random_address = random_u32 (&random_seed);
8639 this_random_address =
8640 clib_host_to_net_u32 (this_random_address);
8642 while (hash_get (random_hash, this_random_address));
8643 vec_add1 (random_vector, this_random_address);
8644 hash_set (random_hash, this_random_address, 1);
8646 hash_free (random_hash);
8647 v4_dst_address.as_u32 = random_vector[0];
8652 /* Turn on async mode */
8653 vam->async_mode = 1;
8654 vam->async_errors = 0;
8655 before = vat_time_now (vam);
8658 for (j = 0; j < count; j++)
8660 /* Construct the API message */
8661 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8662 vec_len (next_hop_out_label_stack));
8664 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8665 mp->table_id = ntohl (vrf_id);
8667 mp->is_add = is_add;
8668 mp->is_drop = is_drop;
8669 mp->is_unreach = is_unreach;
8670 mp->is_prohibit = is_prohibit;
8671 mp->is_ipv6 = is_ipv6;
8672 mp->is_local = is_local;
8673 mp->is_classify = is_classify;
8674 mp->is_multipath = is_multipath;
8675 mp->is_resolve_host = resolve_host;
8676 mp->is_resolve_attached = resolve_attached;
8677 mp->next_hop_weight = next_hop_weight;
8678 mp->dst_address_length = dst_address_length;
8679 mp->next_hop_table_id = ntohl (next_hop_table_id);
8680 mp->classify_table_index = ntohl (classify_table_index);
8681 mp->next_hop_via_label = ntohl (next_hop_via_label);
8682 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8683 if (0 != mp->next_hop_n_out_labels)
8685 memcpy (mp->next_hop_out_label_stack,
8686 next_hop_out_label_stack,
8687 (vec_len (next_hop_out_label_stack) *
8688 sizeof (vl_api_fib_mpls_label_t)));
8689 vec_free (next_hop_out_label_stack);
8694 clib_memcpy (mp->dst_address, &v6_dst_address,
8695 sizeof (v6_dst_address));
8697 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8698 sizeof (v6_next_hop_address));
8699 increment_v6_address (&v6_dst_address);
8703 clib_memcpy (mp->dst_address, &v4_dst_address,
8704 sizeof (v4_dst_address));
8706 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8707 sizeof (v4_next_hop_address));
8709 v4_dst_address.as_u32 = random_vector[j + 1];
8711 increment_v4_address (&v4_dst_address);
8715 /* If we receive SIGTERM, stop now... */
8720 /* When testing multiple add/del ops, use a control-ping to sync */
8723 vl_api_control_ping_t *mp_ping;
8727 /* Shut off async mode */
8728 vam->async_mode = 0;
8730 MPING (CONTROL_PING, mp_ping);
8733 timeout = vat_time_now (vam) + 1.0;
8734 while (vat_time_now (vam) < timeout)
8735 if (vam->result_ready == 1)
8740 if (vam->retval == -99)
8743 if (vam->async_errors > 0)
8745 errmsg ("%d asynchronous errors", vam->async_errors);
8748 vam->async_errors = 0;
8749 after = vat_time_now (vam);
8751 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8755 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8756 count, after - before, count / (after - before));
8762 /* Wait for a reply... */
8767 /* Return the good/bad news */
8768 return (vam->retval);
8772 api_ip_mroute_add_del (vat_main_t * vam)
8774 unformat_input_t *i = vam->input;
8775 vl_api_ip_mroute_add_del_t *mp;
8776 u32 sw_if_index = ~0, vrf_id = 0;
8781 u32 grp_address_length = 0;
8782 ip4_address_t v4_grp_address, v4_src_address;
8783 ip6_address_t v6_grp_address, v6_src_address;
8784 mfib_itf_flags_t iflags = 0;
8785 mfib_entry_flags_t eflags = 0;
8788 /* Parse args required to build the message */
8789 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8791 if (unformat (i, "sw_if_index %d", &sw_if_index))
8793 else if (unformat (i, "%U %U",
8794 unformat_ip4_address, &v4_src_address,
8795 unformat_ip4_address, &v4_grp_address))
8797 grp_address_length = 64;
8801 else if (unformat (i, "%U %U",
8802 unformat_ip6_address, &v6_src_address,
8803 unformat_ip6_address, &v6_grp_address))
8805 grp_address_length = 256;
8809 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8811 memset (&v4_src_address, 0, sizeof (v4_src_address));
8812 grp_address_length = 32;
8816 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8818 memset (&v6_src_address, 0, sizeof (v6_src_address));
8819 grp_address_length = 128;
8823 else if (unformat (i, "/%d", &grp_address_length))
8825 else if (unformat (i, "local"))
8829 else if (unformat (i, "del"))
8831 else if (unformat (i, "add"))
8833 else if (unformat (i, "vrf %d", &vrf_id))
8835 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8837 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8841 clib_warning ("parse error '%U'", format_unformat_error, i);
8846 if (address_set == 0)
8848 errmsg ("missing addresses\n");
8852 /* Construct the API message */
8853 M (IP_MROUTE_ADD_DEL, mp);
8855 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8856 mp->table_id = ntohl (vrf_id);
8858 mp->is_add = is_add;
8859 mp->is_ipv6 = is_ipv6;
8860 mp->is_local = is_local;
8861 mp->itf_flags = ntohl (iflags);
8862 mp->entry_flags = ntohl (eflags);
8863 mp->grp_address_length = grp_address_length;
8864 mp->grp_address_length = ntohs (mp->grp_address_length);
8868 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8869 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8873 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8874 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8880 /* Wait for a reply... */
8886 api_mpls_table_add_del (vat_main_t * vam)
8888 unformat_input_t *i = vam->input;
8889 vl_api_mpls_table_add_del_t *mp;
8894 /* Parse args required to build the message */
8895 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8897 if (unformat (i, "table %d", &table_id))
8899 else if (unformat (i, "del"))
8901 else if (unformat (i, "add"))
8905 clib_warning ("parse error '%U'", format_unformat_error, i);
8912 errmsg ("missing table-ID");
8916 /* Construct the API message */
8917 M (MPLS_TABLE_ADD_DEL, mp);
8919 mp->mt_table_id = ntohl (table_id);
8920 mp->mt_is_add = is_add;
8925 /* Wait for a reply... */
8932 api_mpls_route_add_del (vat_main_t * vam)
8934 unformat_input_t *i = vam->input;
8935 vl_api_mpls_route_add_del_t *mp;
8936 u32 sw_if_index = ~0, table_id = 0;
8938 u32 next_hop_weight = 1;
8939 u8 is_multipath = 0;
8940 u32 next_hop_table_id = 0;
8941 u8 next_hop_set = 0;
8942 ip4_address_t v4_next_hop_address = {
8945 ip6_address_t v6_next_hop_address = { {0} };
8949 u32 classify_table_index = ~0;
8951 u8 resolve_host = 0, resolve_attached = 0;
8952 u8 is_interface_rx = 0;
8953 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8954 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8955 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8956 mpls_label_t local_label = MPLS_LABEL_INVALID;
8958 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
8960 /* Parse args required to build the message */
8961 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8963 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8965 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8967 else if (unformat (i, "%d", &local_label))
8969 else if (unformat (i, "eos"))
8971 else if (unformat (i, "non-eos"))
8973 else if (unformat (i, "via %U", unformat_ip4_address,
8974 &v4_next_hop_address))
8977 next_hop_proto = DPO_PROTO_IP4;
8979 else if (unformat (i, "via %U", unformat_ip6_address,
8980 &v6_next_hop_address))
8983 next_hop_proto = DPO_PROTO_IP6;
8985 else if (unformat (i, "weight %d", &next_hop_weight))
8987 else if (unformat (i, "classify %d", &classify_table_index))
8991 else if (unformat (i, "del"))
8993 else if (unformat (i, "add"))
8995 else if (unformat (i, "resolve-via-host"))
8997 else if (unformat (i, "resolve-via-attached"))
8998 resolve_attached = 1;
8999 else if (unformat (i, "multipath"))
9001 else if (unformat (i, "count %d", &count))
9003 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
9006 next_hop_proto = DPO_PROTO_IP4;
9008 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
9011 next_hop_proto = DPO_PROTO_IP6;
9015 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
9019 next_hop_proto = DPO_PROTO_ETHERNET;
9020 is_interface_rx = 1;
9022 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
9025 next_hop_proto = DPO_PROTO_ETHERNET;
9026 is_interface_rx = 1;
9028 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
9030 else if (unformat (i, "via via-label %d", &next_hop_via_label))
9032 else if (unformat (i, "out-label %d", &next_hop_out_label))
9034 vl_api_fib_mpls_label_t fib_label = {
9035 .label = ntohl (next_hop_out_label),
9039 vec_add1 (next_hop_out_label_stack, fib_label);
9043 clib_warning ("parse error '%U'", format_unformat_error, i);
9048 if (!next_hop_set && !is_classify)
9050 errmsg ("next hop / classify not set");
9054 if (MPLS_LABEL_INVALID == local_label)
9056 errmsg ("missing label");
9062 /* Turn on async mode */
9063 vam->async_mode = 1;
9064 vam->async_errors = 0;
9065 before = vat_time_now (vam);
9068 for (j = 0; j < count; j++)
9070 /* Construct the API message */
9071 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9072 vec_len (next_hop_out_label_stack));
9074 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
9075 mp->mr_table_id = ntohl (table_id);
9077 mp->mr_is_add = is_add;
9078 mp->mr_next_hop_proto = next_hop_proto;
9079 mp->mr_is_classify = is_classify;
9080 mp->mr_is_multipath = is_multipath;
9081 mp->mr_is_resolve_host = resolve_host;
9082 mp->mr_is_resolve_attached = resolve_attached;
9083 mp->mr_is_interface_rx = is_interface_rx;
9084 mp->mr_next_hop_weight = next_hop_weight;
9085 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
9086 mp->mr_classify_table_index = ntohl (classify_table_index);
9087 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
9088 mp->mr_label = ntohl (local_label);
9089 mp->mr_eos = is_eos;
9091 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
9092 if (0 != mp->mr_next_hop_n_out_labels)
9094 memcpy (mp->mr_next_hop_out_label_stack,
9095 next_hop_out_label_stack,
9096 vec_len (next_hop_out_label_stack) *
9097 sizeof (vl_api_fib_mpls_label_t));
9098 vec_free (next_hop_out_label_stack);
9103 if (DPO_PROTO_IP4 == next_hop_proto)
9105 clib_memcpy (mp->mr_next_hop,
9106 &v4_next_hop_address,
9107 sizeof (v4_next_hop_address));
9109 else if (DPO_PROTO_IP6 == next_hop_proto)
9112 clib_memcpy (mp->mr_next_hop,
9113 &v6_next_hop_address,
9114 sizeof (v6_next_hop_address));
9121 /* If we receive SIGTERM, stop now... */
9126 /* When testing multiple add/del ops, use a control-ping to sync */
9129 vl_api_control_ping_t *mp_ping;
9133 /* Shut off async mode */
9134 vam->async_mode = 0;
9136 MPING (CONTROL_PING, mp_ping);
9139 timeout = vat_time_now (vam) + 1.0;
9140 while (vat_time_now (vam) < timeout)
9141 if (vam->result_ready == 1)
9146 if (vam->retval == -99)
9149 if (vam->async_errors > 0)
9151 errmsg ("%d asynchronous errors", vam->async_errors);
9154 vam->async_errors = 0;
9155 after = vat_time_now (vam);
9157 /* slim chance, but we might have eaten SIGTERM on the first iteration */
9161 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
9162 count, after - before, count / (after - before));
9168 /* Wait for a reply... */
9173 /* Return the good/bad news */
9174 return (vam->retval);
9178 api_mpls_ip_bind_unbind (vat_main_t * vam)
9180 unformat_input_t *i = vam->input;
9181 vl_api_mpls_ip_bind_unbind_t *mp;
9182 u32 ip_table_id = 0;
9185 ip4_address_t v4_address;
9186 ip6_address_t v6_address;
9189 mpls_label_t local_label = MPLS_LABEL_INVALID;
9192 /* Parse args required to build the message */
9193 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9195 if (unformat (i, "%U/%d", unformat_ip4_address,
9196 &v4_address, &address_length))
9201 else if (unformat (i, "%U/%d", unformat_ip6_address,
9202 &v6_address, &address_length))
9207 else if (unformat (i, "%d", &local_label))
9209 else if (unformat (i, "table-id %d", &ip_table_id))
9211 else if (unformat (i, "unbind"))
9213 else if (unformat (i, "bind"))
9217 clib_warning ("parse error '%U'", format_unformat_error, i);
9224 errmsg ("IP addres not set");
9228 if (MPLS_LABEL_INVALID == local_label)
9230 errmsg ("missing label");
9234 /* Construct the API message */
9235 M (MPLS_IP_BIND_UNBIND, mp);
9237 mp->mb_is_bind = is_bind;
9238 mp->mb_is_ip4 = is_ip4;
9239 mp->mb_ip_table_id = ntohl (ip_table_id);
9240 mp->mb_mpls_table_id = 0;
9241 mp->mb_label = ntohl (local_label);
9242 mp->mb_address_length = address_length;
9245 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
9247 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
9252 /* Wait for a reply... */
9258 api_sr_mpls_policy_add (vat_main_t * vam)
9260 unformat_input_t *i = vam->input;
9261 vl_api_sr_mpls_policy_add_t *mp;
9267 u32 *segments = NULL;
9270 /* Parse args required to build the message */
9271 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9273 if (unformat (i, "bsid %d", &bsid))
9275 else if (unformat (i, "weight %d", &weight))
9277 else if (unformat (i, "spray"))
9279 else if (unformat (i, "next %d", &sid))
9282 vec_add1 (segments, htonl (sid));
9286 clib_warning ("parse error '%U'", format_unformat_error, i);
9293 errmsg ("bsid not set");
9297 if (n_segments == 0)
9299 errmsg ("no sid in segment stack");
9303 /* Construct the API message */
9304 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
9306 mp->bsid = htonl (bsid);
9307 mp->weight = htonl (weight);
9309 mp->n_segments = n_segments;
9310 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
9311 vec_free (segments);
9316 /* Wait for a reply... */
9322 api_sr_mpls_policy_del (vat_main_t * vam)
9324 unformat_input_t *i = vam->input;
9325 vl_api_sr_mpls_policy_del_t *mp;
9329 /* Parse args required to build the message */
9330 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9332 if (unformat (i, "bsid %d", &bsid))
9336 clib_warning ("parse error '%U'", format_unformat_error, i);
9343 errmsg ("bsid not set");
9347 /* Construct the API message */
9348 M (SR_MPLS_POLICY_DEL, mp);
9350 mp->bsid = htonl (bsid);
9355 /* Wait for a reply... */
9361 api_bier_table_add_del (vat_main_t * vam)
9363 unformat_input_t *i = vam->input;
9364 vl_api_bier_table_add_del_t *mp;
9366 u32 set = 0, sub_domain = 0, hdr_len = 3;
9367 mpls_label_t local_label = MPLS_LABEL_INVALID;
9370 /* Parse args required to build the message */
9371 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9373 if (unformat (i, "sub-domain %d", &sub_domain))
9375 else if (unformat (i, "set %d", &set))
9377 else if (unformat (i, "label %d", &local_label))
9379 else if (unformat (i, "hdr-len %d", &hdr_len))
9381 else if (unformat (i, "add"))
9383 else if (unformat (i, "del"))
9387 clib_warning ("parse error '%U'", format_unformat_error, i);
9392 if (MPLS_LABEL_INVALID == local_label)
9394 errmsg ("missing label\n");
9398 /* Construct the API message */
9399 M (BIER_TABLE_ADD_DEL, mp);
9401 mp->bt_is_add = is_add;
9402 mp->bt_label = ntohl (local_label);
9403 mp->bt_tbl_id.bt_set = set;
9404 mp->bt_tbl_id.bt_sub_domain = sub_domain;
9405 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
9410 /* Wait for a reply... */
9417 api_bier_route_add_del (vat_main_t * vam)
9419 unformat_input_t *i = vam->input;
9420 vl_api_bier_route_add_del_t *mp;
9422 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
9423 ip4_address_t v4_next_hop_address;
9424 ip6_address_t v6_next_hop_address;
9425 u8 next_hop_set = 0;
9426 u8 next_hop_proto_is_ip4 = 1;
9427 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9430 /* Parse args required to build the message */
9431 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9433 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
9435 next_hop_proto_is_ip4 = 1;
9438 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
9440 next_hop_proto_is_ip4 = 0;
9443 if (unformat (i, "sub-domain %d", &sub_domain))
9445 else if (unformat (i, "set %d", &set))
9447 else if (unformat (i, "hdr-len %d", &hdr_len))
9449 else if (unformat (i, "bp %d", &bp))
9451 else if (unformat (i, "add"))
9453 else if (unformat (i, "del"))
9455 else if (unformat (i, "out-label %d", &next_hop_out_label))
9459 clib_warning ("parse error '%U'", format_unformat_error, i);
9464 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9466 errmsg ("next hop / label set\n");
9471 errmsg ("bit=position not set\n");
9475 /* Construct the API message */
9476 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
9478 mp->br_is_add = is_add;
9479 mp->br_tbl_id.bt_set = set;
9480 mp->br_tbl_id.bt_sub_domain = sub_domain;
9481 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9482 mp->br_bp = ntohs (bp);
9484 mp->br_paths[0].n_labels = 1;
9485 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
9486 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9488 if (next_hop_proto_is_ip4)
9490 clib_memcpy (mp->br_paths[0].next_hop,
9491 &v4_next_hop_address, sizeof (v4_next_hop_address));
9495 clib_memcpy (mp->br_paths[0].next_hop,
9496 &v6_next_hop_address, sizeof (v6_next_hop_address));
9502 /* Wait for a reply... */
9509 api_proxy_arp_add_del (vat_main_t * vam)
9511 unformat_input_t *i = vam->input;
9512 vl_api_proxy_arp_add_del_t *mp;
9515 ip4_address_t lo, hi;
9519 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9521 if (unformat (i, "vrf %d", &vrf_id))
9523 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
9524 unformat_ip4_address, &hi))
9526 else if (unformat (i, "del"))
9530 clib_warning ("parse error '%U'", format_unformat_error, i);
9537 errmsg ("address range not set");
9541 M (PROXY_ARP_ADD_DEL, mp);
9543 mp->proxy.vrf_id = ntohl (vrf_id);
9544 mp->is_add = is_add;
9545 clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address));
9546 clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address));
9554 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9556 unformat_input_t *i = vam->input;
9557 vl_api_proxy_arp_intfc_enable_disable_t *mp;
9560 u8 sw_if_index_set = 0;
9563 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9565 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9566 sw_if_index_set = 1;
9567 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9568 sw_if_index_set = 1;
9569 else if (unformat (i, "enable"))
9571 else if (unformat (i, "disable"))
9575 clib_warning ("parse error '%U'", format_unformat_error, i);
9580 if (sw_if_index_set == 0)
9582 errmsg ("missing interface name or sw_if_index");
9586 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
9588 mp->sw_if_index = ntohl (sw_if_index);
9589 mp->enable_disable = enable;
9597 api_mpls_tunnel_add_del (vat_main_t * vam)
9599 unformat_input_t *i = vam->input;
9600 vl_api_mpls_tunnel_add_del_t *mp;
9604 u32 sw_if_index = ~0;
9605 u32 next_hop_sw_if_index = ~0;
9606 u32 next_hop_proto_is_ip4 = 1;
9608 u32 next_hop_table_id = 0;
9609 ip4_address_t v4_next_hop_address = {
9612 ip6_address_t v6_next_hop_address = { {0} };
9613 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
9614 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID, *labels = NULL;
9617 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9619 if (unformat (i, "add"))
9621 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9623 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9625 else if (unformat (i, "via %U",
9626 unformat_ip4_address, &v4_next_hop_address))
9628 next_hop_proto_is_ip4 = 1;
9630 else if (unformat (i, "via %U",
9631 unformat_ip6_address, &v6_next_hop_address))
9633 next_hop_proto_is_ip4 = 0;
9635 else if (unformat (i, "via-label %d", &next_hop_via_label))
9637 else if (unformat (i, "l2-only"))
9639 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9641 else if (unformat (i, "out-label %d", &next_hop_out_label))
9642 vec_add1 (labels, ntohl (next_hop_out_label));
9645 clib_warning ("parse error '%U'", format_unformat_error, i);
9650 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (mpls_label_t) * vec_len (labels));
9652 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9653 mp->mt_sw_if_index = ntohl (sw_if_index);
9654 mp->mt_is_add = is_add;
9655 mp->mt_l2_only = l2_only;
9656 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9657 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
9658 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
9660 mp->mt_next_hop_n_out_labels = vec_len (labels);
9662 if (0 != mp->mt_next_hop_n_out_labels)
9664 clib_memcpy (mp->mt_next_hop_out_label_stack, labels,
9665 sizeof (mpls_label_t) * mp->mt_next_hop_n_out_labels);
9669 if (next_hop_proto_is_ip4)
9671 clib_memcpy (mp->mt_next_hop,
9672 &v4_next_hop_address, sizeof (v4_next_hop_address));
9676 clib_memcpy (mp->mt_next_hop,
9677 &v6_next_hop_address, sizeof (v6_next_hop_address));
9686 api_sw_interface_set_unnumbered (vat_main_t * vam)
9688 unformat_input_t *i = vam->input;
9689 vl_api_sw_interface_set_unnumbered_t *mp;
9691 u32 unnum_sw_index = ~0;
9693 u8 sw_if_index_set = 0;
9696 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9698 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9699 sw_if_index_set = 1;
9700 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9701 sw_if_index_set = 1;
9702 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9704 else if (unformat (i, "del"))
9708 clib_warning ("parse error '%U'", format_unformat_error, i);
9713 if (sw_if_index_set == 0)
9715 errmsg ("missing interface name or sw_if_index");
9719 M (SW_INTERFACE_SET_UNNUMBERED, mp);
9721 mp->sw_if_index = ntohl (sw_if_index);
9722 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9723 mp->is_add = is_add;
9731 api_ip_neighbor_add_del (vat_main_t * vam)
9733 unformat_input_t *i = vam->input;
9734 vl_api_ip_neighbor_add_del_t *mp;
9736 u8 sw_if_index_set = 0;
9739 u8 is_no_fib_entry = 0;
9742 u8 v4_address_set = 0;
9743 u8 v6_address_set = 0;
9744 ip4_address_t v4address;
9745 ip6_address_t v6address;
9748 memset (mac_address, 0, sizeof (mac_address));
9750 /* Parse args required to build the message */
9751 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9753 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
9757 else if (unformat (i, "del"))
9760 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9761 sw_if_index_set = 1;
9762 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9763 sw_if_index_set = 1;
9764 else if (unformat (i, "is_static"))
9766 else if (unformat (i, "no-fib-entry"))
9767 is_no_fib_entry = 1;
9768 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
9770 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
9774 clib_warning ("parse error '%U'", format_unformat_error, i);
9779 if (sw_if_index_set == 0)
9781 errmsg ("missing interface name or sw_if_index");
9784 if (v4_address_set && v6_address_set)
9786 errmsg ("both v4 and v6 addresses set");
9789 if (!v4_address_set && !v6_address_set)
9791 errmsg ("no address set");
9795 /* Construct the API message */
9796 M (IP_NEIGHBOR_ADD_DEL, mp);
9798 mp->sw_if_index = ntohl (sw_if_index);
9799 mp->is_add = is_add;
9800 mp->is_static = is_static;
9801 mp->is_no_adj_fib = is_no_fib_entry;
9803 clib_memcpy (mp->mac_address, mac_address, 6);
9807 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
9811 /* mp->is_ipv6 = 0; via memset in M macro above */
9812 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
9818 /* Wait for a reply, return good/bad news */
9824 api_create_vlan_subif (vat_main_t * vam)
9826 unformat_input_t *i = vam->input;
9827 vl_api_create_vlan_subif_t *mp;
9829 u8 sw_if_index_set = 0;
9834 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9836 if (unformat (i, "sw_if_index %d", &sw_if_index))
9837 sw_if_index_set = 1;
9839 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9840 sw_if_index_set = 1;
9841 else if (unformat (i, "vlan %d", &vlan_id))
9845 clib_warning ("parse error '%U'", format_unformat_error, i);
9850 if (sw_if_index_set == 0)
9852 errmsg ("missing interface name or sw_if_index");
9856 if (vlan_id_set == 0)
9858 errmsg ("missing vlan_id");
9861 M (CREATE_VLAN_SUBIF, mp);
9863 mp->sw_if_index = ntohl (sw_if_index);
9864 mp->vlan_id = ntohl (vlan_id);
9871 #define foreach_create_subif_bit \
9878 _(outer_vlan_id_any) \
9879 _(inner_vlan_id_any)
9882 api_create_subif (vat_main_t * vam)
9884 unformat_input_t *i = vam->input;
9885 vl_api_create_subif_t *mp;
9887 u8 sw_if_index_set = 0;
9894 u32 exact_match = 0;
9895 u32 default_sub = 0;
9896 u32 outer_vlan_id_any = 0;
9897 u32 inner_vlan_id_any = 0;
9899 u16 outer_vlan_id = 0;
9900 u16 inner_vlan_id = 0;
9903 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9905 if (unformat (i, "sw_if_index %d", &sw_if_index))
9906 sw_if_index_set = 1;
9908 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9909 sw_if_index_set = 1;
9910 else if (unformat (i, "sub_id %d", &sub_id))
9912 else if (unformat (i, "outer_vlan_id %d", &tmp))
9913 outer_vlan_id = tmp;
9914 else if (unformat (i, "inner_vlan_id %d", &tmp))
9915 inner_vlan_id = tmp;
9917 #define _(a) else if (unformat (i, #a)) a = 1 ;
9918 foreach_create_subif_bit
9922 clib_warning ("parse error '%U'", format_unformat_error, i);
9927 if (sw_if_index_set == 0)
9929 errmsg ("missing interface name or sw_if_index");
9933 if (sub_id_set == 0)
9935 errmsg ("missing sub_id");
9938 M (CREATE_SUBIF, mp);
9940 mp->sw_if_index = ntohl (sw_if_index);
9941 mp->sub_id = ntohl (sub_id);
9943 #define _(a) mp->a = a;
9944 foreach_create_subif_bit;
9947 mp->outer_vlan_id = ntohs (outer_vlan_id);
9948 mp->inner_vlan_id = ntohs (inner_vlan_id);
9956 api_oam_add_del (vat_main_t * vam)
9958 unformat_input_t *i = vam->input;
9959 vl_api_oam_add_del_t *mp;
9962 ip4_address_t src, dst;
9967 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9969 if (unformat (i, "vrf %d", &vrf_id))
9971 else if (unformat (i, "src %U", unformat_ip4_address, &src))
9973 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
9975 else if (unformat (i, "del"))
9979 clib_warning ("parse error '%U'", format_unformat_error, i);
9986 errmsg ("missing src addr");
9992 errmsg ("missing dst addr");
9996 M (OAM_ADD_DEL, mp);
9998 mp->vrf_id = ntohl (vrf_id);
9999 mp->is_add = is_add;
10000 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
10001 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
10009 api_reset_fib (vat_main_t * vam)
10011 unformat_input_t *i = vam->input;
10012 vl_api_reset_fib_t *mp;
10018 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10020 if (unformat (i, "vrf %d", &vrf_id))
10022 else if (unformat (i, "ipv6"))
10026 clib_warning ("parse error '%U'", format_unformat_error, i);
10031 if (vrf_id_set == 0)
10033 errmsg ("missing vrf id");
10039 mp->vrf_id = ntohl (vrf_id);
10040 mp->is_ipv6 = is_ipv6;
10048 api_dhcp_proxy_config (vat_main_t * vam)
10050 unformat_input_t *i = vam->input;
10051 vl_api_dhcp_proxy_config_t *mp;
10053 u32 server_vrf_id = 0;
10055 u8 v4_address_set = 0;
10056 u8 v6_address_set = 0;
10057 ip4_address_t v4address;
10058 ip6_address_t v6address;
10059 u8 v4_src_address_set = 0;
10060 u8 v6_src_address_set = 0;
10061 ip4_address_t v4srcaddress;
10062 ip6_address_t v6srcaddress;
10065 /* Parse args required to build the message */
10066 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10068 if (unformat (i, "del"))
10070 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
10072 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
10074 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
10075 v4_address_set = 1;
10076 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
10077 v6_address_set = 1;
10078 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
10079 v4_src_address_set = 1;
10080 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
10081 v6_src_address_set = 1;
10086 if (v4_address_set && v6_address_set)
10088 errmsg ("both v4 and v6 server addresses set");
10091 if (!v4_address_set && !v6_address_set)
10093 errmsg ("no server addresses set");
10097 if (v4_src_address_set && v6_src_address_set)
10099 errmsg ("both v4 and v6 src addresses set");
10102 if (!v4_src_address_set && !v6_src_address_set)
10104 errmsg ("no src addresses set");
10108 if (!(v4_src_address_set && v4_address_set) &&
10109 !(v6_src_address_set && v6_address_set))
10111 errmsg ("no matching server and src addresses set");
10115 /* Construct the API message */
10116 M (DHCP_PROXY_CONFIG, mp);
10118 mp->is_add = is_add;
10119 mp->rx_vrf_id = ntohl (rx_vrf_id);
10120 mp->server_vrf_id = ntohl (server_vrf_id);
10121 if (v6_address_set)
10124 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
10125 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
10129 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
10130 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
10136 /* Wait for a reply, return good/bad news */
10141 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
10142 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
10145 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
10147 vat_main_t *vam = &vat_main;
10148 u32 i, count = mp->count;
10149 vl_api_dhcp_server_t *s;
10153 "RX Table-ID %d, Source Address %U, VSS Type %d, "
10154 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
10155 ntohl (mp->rx_vrf_id),
10156 format_ip6_address, mp->dhcp_src_address,
10157 mp->vss_type, mp->vss_vpn_ascii_id,
10158 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
10161 "RX Table-ID %d, Source Address %U, VSS Type %d, "
10162 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
10163 ntohl (mp->rx_vrf_id),
10164 format_ip4_address, mp->dhcp_src_address,
10165 mp->vss_type, mp->vss_vpn_ascii_id,
10166 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
10168 for (i = 0; i < count; i++)
10170 s = &mp->servers[i];
10174 " Server Table-ID %d, Server Address %U",
10175 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
10178 " Server Table-ID %d, Server Address %U",
10179 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
10183 static void vl_api_dhcp_proxy_details_t_handler_json
10184 (vl_api_dhcp_proxy_details_t * mp)
10186 vat_main_t *vam = &vat_main;
10187 vat_json_node_t *node = NULL;
10188 u32 i, count = mp->count;
10189 struct in_addr ip4;
10190 struct in6_addr ip6;
10191 vl_api_dhcp_server_t *s;
10193 if (VAT_JSON_ARRAY != vam->json_tree.type)
10195 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10196 vat_json_init_array (&vam->json_tree);
10198 node = vat_json_array_add (&vam->json_tree);
10200 vat_json_init_object (node);
10201 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
10202 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
10203 sizeof (mp->vss_type));
10204 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
10205 mp->vss_vpn_ascii_id);
10206 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
10207 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
10211 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
10212 vat_json_object_add_ip6 (node, "src_address", ip6);
10216 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
10217 vat_json_object_add_ip4 (node, "src_address", ip4);
10220 for (i = 0; i < count; i++)
10222 s = &mp->servers[i];
10224 vat_json_object_add_uint (node, "server-table-id",
10225 ntohl (s->server_vrf_id));
10229 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
10230 vat_json_object_add_ip4 (node, "src_address", ip4);
10234 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
10235 vat_json_object_add_ip6 (node, "server_address", ip6);
10241 api_dhcp_proxy_dump (vat_main_t * vam)
10243 unformat_input_t *i = vam->input;
10244 vl_api_control_ping_t *mp_ping;
10245 vl_api_dhcp_proxy_dump_t *mp;
10249 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10251 if (unformat (i, "ipv6"))
10255 clib_warning ("parse error '%U'", format_unformat_error, i);
10260 M (DHCP_PROXY_DUMP, mp);
10262 mp->is_ip6 = is_ipv6;
10265 /* Use a control ping for synchronization */
10266 MPING (CONTROL_PING, mp_ping);
10274 api_dhcp_proxy_set_vss (vat_main_t * vam)
10276 unformat_input_t *i = vam->input;
10277 vl_api_dhcp_proxy_set_vss_t *mp;
10281 u8 vss_type = VSS_TYPE_DEFAULT;
10282 u8 *vpn_ascii_id = 0;
10287 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10289 if (unformat (i, "tbl_id %d", &tbl_id))
10291 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
10292 vss_type = VSS_TYPE_ASCII;
10293 else if (unformat (i, "fib_id %d", &fib_id))
10294 vss_type = VSS_TYPE_VPN_ID;
10295 else if (unformat (i, "oui %d", &oui))
10296 vss_type = VSS_TYPE_VPN_ID;
10297 else if (unformat (i, "ipv6"))
10299 else if (unformat (i, "del"))
10307 errmsg ("missing tbl_id ");
10308 vec_free (vpn_ascii_id);
10312 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
10314 errmsg ("vpn_ascii_id cannot be longer than 128 ");
10315 vec_free (vpn_ascii_id);
10319 M (DHCP_PROXY_SET_VSS, mp);
10320 mp->tbl_id = ntohl (tbl_id);
10321 mp->vss_type = vss_type;
10324 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
10325 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
10327 mp->vpn_index = ntohl (fib_id);
10328 mp->oui = ntohl (oui);
10329 mp->is_ipv6 = is_ipv6;
10330 mp->is_add = is_add;
10335 vec_free (vpn_ascii_id);
10340 api_dhcp_client_config (vat_main_t * vam)
10342 unformat_input_t *i = vam->input;
10343 vl_api_dhcp_client_config_t *mp;
10345 u8 sw_if_index_set = 0;
10348 u8 disable_event = 0;
10351 /* Parse args required to build the message */
10352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10354 if (unformat (i, "del"))
10357 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10358 sw_if_index_set = 1;
10359 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10360 sw_if_index_set = 1;
10361 else if (unformat (i, "hostname %s", &hostname))
10363 else if (unformat (i, "disable_event"))
10369 if (sw_if_index_set == 0)
10371 errmsg ("missing interface name or sw_if_index");
10375 if (vec_len (hostname) > 63)
10377 errmsg ("hostname too long");
10379 vec_add1 (hostname, 0);
10381 /* Construct the API message */
10382 M (DHCP_CLIENT_CONFIG, mp);
10384 mp->is_add = is_add;
10385 mp->client.sw_if_index = htonl (sw_if_index);
10386 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
10387 vec_free (hostname);
10388 mp->client.want_dhcp_event = disable_event ? 0 : 1;
10389 mp->client.pid = htonl (getpid ());
10394 /* Wait for a reply, return good/bad news */
10400 api_set_ip_flow_hash (vat_main_t * vam)
10402 unformat_input_t *i = vam->input;
10403 vl_api_set_ip_flow_hash_t *mp;
10415 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10417 if (unformat (i, "vrf %d", &vrf_id))
10419 else if (unformat (i, "ipv6"))
10421 else if (unformat (i, "src"))
10423 else if (unformat (i, "dst"))
10425 else if (unformat (i, "sport"))
10427 else if (unformat (i, "dport"))
10429 else if (unformat (i, "proto"))
10431 else if (unformat (i, "reverse"))
10436 clib_warning ("parse error '%U'", format_unformat_error, i);
10441 if (vrf_id_set == 0)
10443 errmsg ("missing vrf id");
10447 M (SET_IP_FLOW_HASH, mp);
10453 mp->reverse = reverse;
10454 mp->vrf_id = ntohl (vrf_id);
10455 mp->is_ipv6 = is_ipv6;
10463 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
10465 unformat_input_t *i = vam->input;
10466 vl_api_sw_interface_ip6_enable_disable_t *mp;
10468 u8 sw_if_index_set = 0;
10472 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10474 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10475 sw_if_index_set = 1;
10476 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10477 sw_if_index_set = 1;
10478 else if (unformat (i, "enable"))
10480 else if (unformat (i, "disable"))
10484 clib_warning ("parse error '%U'", format_unformat_error, i);
10489 if (sw_if_index_set == 0)
10491 errmsg ("missing interface name or sw_if_index");
10495 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
10497 mp->sw_if_index = ntohl (sw_if_index);
10498 mp->enable = enable;
10506 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
10508 unformat_input_t *i = vam->input;
10509 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
10511 u8 sw_if_index_set = 0;
10512 u8 v6_address_set = 0;
10513 ip6_address_t v6address;
10516 /* Parse args required to build the message */
10517 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10519 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10520 sw_if_index_set = 1;
10521 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10522 sw_if_index_set = 1;
10523 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
10524 v6_address_set = 1;
10529 if (sw_if_index_set == 0)
10531 errmsg ("missing interface name or sw_if_index");
10534 if (!v6_address_set)
10536 errmsg ("no address set");
10540 /* Construct the API message */
10541 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, mp);
10543 mp->sw_if_index = ntohl (sw_if_index);
10544 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10549 /* Wait for a reply, return good/bad news */
10555 api_ip6nd_proxy_add_del (vat_main_t * vam)
10557 unformat_input_t *i = vam->input;
10558 vl_api_ip6nd_proxy_add_del_t *mp;
10559 u32 sw_if_index = ~0;
10560 u8 v6_address_set = 0;
10561 ip6_address_t v6address;
10565 /* Parse args required to build the message */
10566 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10568 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10570 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10572 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
10573 v6_address_set = 1;
10574 if (unformat (i, "del"))
10578 clib_warning ("parse error '%U'", format_unformat_error, i);
10583 if (sw_if_index == ~0)
10585 errmsg ("missing interface name or sw_if_index");
10588 if (!v6_address_set)
10590 errmsg ("no address set");
10594 /* Construct the API message */
10595 M (IP6ND_PROXY_ADD_DEL, mp);
10597 mp->is_del = is_del;
10598 mp->sw_if_index = ntohl (sw_if_index);
10599 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10604 /* Wait for a reply, return good/bad news */
10610 api_ip6nd_proxy_dump (vat_main_t * vam)
10612 vl_api_ip6nd_proxy_dump_t *mp;
10613 vl_api_control_ping_t *mp_ping;
10616 M (IP6ND_PROXY_DUMP, mp);
10620 /* Use a control ping for synchronization */
10621 MPING (CONTROL_PING, mp_ping);
10628 static void vl_api_ip6nd_proxy_details_t_handler
10629 (vl_api_ip6nd_proxy_details_t * mp)
10631 vat_main_t *vam = &vat_main;
10633 print (vam->ofp, "host %U sw_if_index %d",
10634 format_ip6_address, mp->address, ntohl (mp->sw_if_index));
10637 static void vl_api_ip6nd_proxy_details_t_handler_json
10638 (vl_api_ip6nd_proxy_details_t * mp)
10640 vat_main_t *vam = &vat_main;
10641 struct in6_addr ip6;
10642 vat_json_node_t *node = NULL;
10644 if (VAT_JSON_ARRAY != vam->json_tree.type)
10646 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10647 vat_json_init_array (&vam->json_tree);
10649 node = vat_json_array_add (&vam->json_tree);
10651 vat_json_init_object (node);
10652 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10654 clib_memcpy (&ip6, mp->address, sizeof (ip6));
10655 vat_json_object_add_ip6 (node, "host", ip6);
10659 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10661 unformat_input_t *i = vam->input;
10662 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
10664 u8 sw_if_index_set = 0;
10665 u32 address_length = 0;
10666 u8 v6_address_set = 0;
10667 ip6_address_t v6address;
10668 u8 use_default = 0;
10669 u8 no_advertise = 0;
10671 u8 no_autoconfig = 0;
10674 u32 val_lifetime = 0;
10675 u32 pref_lifetime = 0;
10678 /* Parse args required to build the message */
10679 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10681 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10682 sw_if_index_set = 1;
10683 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10684 sw_if_index_set = 1;
10685 else if (unformat (i, "%U/%d",
10686 unformat_ip6_address, &v6address, &address_length))
10687 v6_address_set = 1;
10688 else if (unformat (i, "val_life %d", &val_lifetime))
10690 else if (unformat (i, "pref_life %d", &pref_lifetime))
10692 else if (unformat (i, "def"))
10694 else if (unformat (i, "noadv"))
10696 else if (unformat (i, "offl"))
10698 else if (unformat (i, "noauto"))
10700 else if (unformat (i, "nolink"))
10702 else if (unformat (i, "isno"))
10706 clib_warning ("parse error '%U'", format_unformat_error, i);
10711 if (sw_if_index_set == 0)
10713 errmsg ("missing interface name or sw_if_index");
10716 if (!v6_address_set)
10718 errmsg ("no address set");
10722 /* Construct the API message */
10723 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
10725 mp->sw_if_index = ntohl (sw_if_index);
10726 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10727 mp->address_length = address_length;
10728 mp->use_default = use_default;
10729 mp->no_advertise = no_advertise;
10730 mp->off_link = off_link;
10731 mp->no_autoconfig = no_autoconfig;
10732 mp->no_onlink = no_onlink;
10734 mp->val_lifetime = ntohl (val_lifetime);
10735 mp->pref_lifetime = ntohl (pref_lifetime);
10740 /* Wait for a reply, return good/bad news */
10746 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10748 unformat_input_t *i = vam->input;
10749 vl_api_sw_interface_ip6nd_ra_config_t *mp;
10751 u8 sw_if_index_set = 0;
10756 u8 send_unicast = 0;
10759 u8 default_router = 0;
10760 u32 max_interval = 0;
10761 u32 min_interval = 0;
10763 u32 initial_count = 0;
10764 u32 initial_interval = 0;
10768 /* Parse args required to build the message */
10769 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10771 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10772 sw_if_index_set = 1;
10773 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10774 sw_if_index_set = 1;
10775 else if (unformat (i, "maxint %d", &max_interval))
10777 else if (unformat (i, "minint %d", &min_interval))
10779 else if (unformat (i, "life %d", &lifetime))
10781 else if (unformat (i, "count %d", &initial_count))
10783 else if (unformat (i, "interval %d", &initial_interval))
10785 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10787 else if (unformat (i, "managed"))
10789 else if (unformat (i, "other"))
10791 else if (unformat (i, "ll"))
10793 else if (unformat (i, "send"))
10795 else if (unformat (i, "cease"))
10797 else if (unformat (i, "isno"))
10799 else if (unformat (i, "def"))
10800 default_router = 1;
10803 clib_warning ("parse error '%U'", format_unformat_error, i);
10808 if (sw_if_index_set == 0)
10810 errmsg ("missing interface name or sw_if_index");
10814 /* Construct the API message */
10815 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
10817 mp->sw_if_index = ntohl (sw_if_index);
10818 mp->max_interval = ntohl (max_interval);
10819 mp->min_interval = ntohl (min_interval);
10820 mp->lifetime = ntohl (lifetime);
10821 mp->initial_count = ntohl (initial_count);
10822 mp->initial_interval = ntohl (initial_interval);
10823 mp->suppress = suppress;
10824 mp->managed = managed;
10826 mp->ll_option = ll_option;
10827 mp->send_unicast = send_unicast;
10830 mp->default_router = default_router;
10835 /* Wait for a reply, return good/bad news */
10841 api_set_arp_neighbor_limit (vat_main_t * vam)
10843 unformat_input_t *i = vam->input;
10844 vl_api_set_arp_neighbor_limit_t *mp;
10850 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10852 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10854 else if (unformat (i, "ipv6"))
10858 clib_warning ("parse error '%U'", format_unformat_error, i);
10863 if (limit_set == 0)
10865 errmsg ("missing limit value");
10869 M (SET_ARP_NEIGHBOR_LIMIT, mp);
10871 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10872 mp->is_ipv6 = is_ipv6;
10880 api_l2_patch_add_del (vat_main_t * vam)
10882 unformat_input_t *i = vam->input;
10883 vl_api_l2_patch_add_del_t *mp;
10884 u32 rx_sw_if_index;
10885 u8 rx_sw_if_index_set = 0;
10886 u32 tx_sw_if_index;
10887 u8 tx_sw_if_index_set = 0;
10891 /* Parse args required to build the message */
10892 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10894 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10895 rx_sw_if_index_set = 1;
10896 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10897 tx_sw_if_index_set = 1;
10898 else if (unformat (i, "rx"))
10900 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10902 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10904 rx_sw_if_index_set = 1;
10909 else if (unformat (i, "tx"))
10911 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10913 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10915 tx_sw_if_index_set = 1;
10920 else if (unformat (i, "del"))
10926 if (rx_sw_if_index_set == 0)
10928 errmsg ("missing rx interface name or rx_sw_if_index");
10932 if (tx_sw_if_index_set == 0)
10934 errmsg ("missing tx interface name or tx_sw_if_index");
10938 M (L2_PATCH_ADD_DEL, mp);
10940 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10941 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10942 mp->is_add = is_add;
10950 u8 localsid_addr[16];
10959 api_sr_localsid_add_del (vat_main_t * vam)
10961 unformat_input_t *i = vam->input;
10962 vl_api_sr_localsid_add_del_t *mp;
10965 ip6_address_t localsid;
10969 u32 fib_table = ~(u32) 0;
10970 ip6_address_t nh_addr6;
10971 ip4_address_t nh_addr4;
10972 memset (&nh_addr6, 0, sizeof (ip6_address_t));
10973 memset (&nh_addr4, 0, sizeof (ip4_address_t));
10975 bool nexthop_set = 0;
10979 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10981 if (unformat (i, "del"))
10983 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
10984 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10986 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
10988 else if (unformat (i, "behavior %u", &behavior));
10989 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10990 else if (unformat (i, "fib-table %u", &fib_table));
10991 else if (unformat (i, "end.psp %u", &behavior));
10996 M (SR_LOCALSID_ADD_DEL, mp);
10998 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
11001 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
11002 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
11004 mp->behavior = behavior;
11005 mp->sw_if_index = ntohl (sw_if_index);
11006 mp->fib_table = ntohl (fib_table);
11007 mp->end_psp = end_psp;
11008 mp->is_del = is_del;
11016 api_ioam_enable (vat_main_t * vam)
11018 unformat_input_t *input = vam->input;
11019 vl_api_ioam_enable_t *mp;
11021 int has_trace_option = 0;
11022 int has_pot_option = 0;
11023 int has_seqno_option = 0;
11024 int has_analyse_option = 0;
11027 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11029 if (unformat (input, "trace"))
11030 has_trace_option = 1;
11031 else if (unformat (input, "pot"))
11032 has_pot_option = 1;
11033 else if (unformat (input, "seqno"))
11034 has_seqno_option = 1;
11035 else if (unformat (input, "analyse"))
11036 has_analyse_option = 1;
11040 M (IOAM_ENABLE, mp);
11041 mp->id = htons (id);
11042 mp->seqno = has_seqno_option;
11043 mp->analyse = has_analyse_option;
11044 mp->pot_enable = has_pot_option;
11045 mp->trace_enable = has_trace_option;
11054 api_ioam_disable (vat_main_t * vam)
11056 vl_api_ioam_disable_t *mp;
11059 M (IOAM_DISABLE, mp);
11065 #define foreach_tcp_proto_field \
11069 #define foreach_udp_proto_field \
11073 #define foreach_ip4_proto_field \
11085 u16 src_port, dst_port;
11088 #if VPP_API_TEST_BUILTIN == 0
11090 unformat_tcp_mask (unformat_input_t * input, va_list * args)
11092 u8 **maskp = va_arg (*args, u8 **);
11094 u8 found_something = 0;
11097 #define _(a) u8 a=0;
11098 foreach_tcp_proto_field;
11101 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11104 #define _(a) else if (unformat (input, #a)) a=1;
11105 foreach_tcp_proto_field
11111 #define _(a) found_something += a;
11112 foreach_tcp_proto_field;
11115 if (found_something == 0)
11118 vec_validate (mask, sizeof (*tcp) - 1);
11120 tcp = (tcp_header_t *) mask;
11122 #define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
11123 foreach_tcp_proto_field;
11131 unformat_udp_mask (unformat_input_t * input, va_list * args)
11133 u8 **maskp = va_arg (*args, u8 **);
11135 u8 found_something = 0;
11138 #define _(a) u8 a=0;
11139 foreach_udp_proto_field;
11142 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11145 #define _(a) else if (unformat (input, #a)) a=1;
11146 foreach_udp_proto_field
11152 #define _(a) found_something += a;
11153 foreach_udp_proto_field;
11156 if (found_something == 0)
11159 vec_validate (mask, sizeof (*udp) - 1);
11161 udp = (udp_header_t *) mask;
11163 #define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
11164 foreach_udp_proto_field;
11172 unformat_l4_mask (unformat_input_t * input, va_list * args)
11174 u8 **maskp = va_arg (*args, u8 **);
11175 u16 src_port = 0, dst_port = 0;
11176 tcpudp_header_t *tcpudp;
11178 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11180 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
11182 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
11184 else if (unformat (input, "src_port"))
11186 else if (unformat (input, "dst_port"))
11192 if (!src_port && !dst_port)
11196 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
11198 tcpudp = (tcpudp_header_t *) mask;
11199 tcpudp->src_port = src_port;
11200 tcpudp->dst_port = dst_port;
11208 unformat_ip4_mask (unformat_input_t * input, va_list * args)
11210 u8 **maskp = va_arg (*args, u8 **);
11212 u8 found_something = 0;
11215 #define _(a) u8 a=0;
11216 foreach_ip4_proto_field;
11222 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11224 if (unformat (input, "version"))
11226 else if (unformat (input, "hdr_length"))
11228 else if (unformat (input, "src"))
11230 else if (unformat (input, "dst"))
11232 else if (unformat (input, "proto"))
11235 #define _(a) else if (unformat (input, #a)) a=1;
11236 foreach_ip4_proto_field
11242 #define _(a) found_something += a;
11243 foreach_ip4_proto_field;
11246 if (found_something == 0)
11249 vec_validate (mask, sizeof (*ip) - 1);
11251 ip = (ip4_header_t *) mask;
11253 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
11254 foreach_ip4_proto_field;
11257 ip->ip_version_and_header_length = 0;
11260 ip->ip_version_and_header_length |= 0xF0;
11263 ip->ip_version_and_header_length |= 0x0F;
11269 #define foreach_ip6_proto_field \
11272 _(payload_length) \
11277 unformat_ip6_mask (unformat_input_t * input, va_list * args)
11279 u8 **maskp = va_arg (*args, u8 **);
11281 u8 found_something = 0;
11283 u32 ip_version_traffic_class_and_flow_label;
11285 #define _(a) u8 a=0;
11286 foreach_ip6_proto_field;
11289 u8 traffic_class = 0;
11292 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11294 if (unformat (input, "version"))
11296 else if (unformat (input, "traffic-class"))
11298 else if (unformat (input, "flow-label"))
11300 else if (unformat (input, "src"))
11302 else if (unformat (input, "dst"))
11304 else if (unformat (input, "proto"))
11307 #define _(a) else if (unformat (input, #a)) a=1;
11308 foreach_ip6_proto_field
11314 #define _(a) found_something += a;
11315 foreach_ip6_proto_field;
11318 if (found_something == 0)
11321 vec_validate (mask, sizeof (*ip) - 1);
11323 ip = (ip6_header_t *) mask;
11325 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
11326 foreach_ip6_proto_field;
11329 ip_version_traffic_class_and_flow_label = 0;
11332 ip_version_traffic_class_and_flow_label |= 0xF0000000;
11335 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
11338 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
11340 ip->ip_version_traffic_class_and_flow_label =
11341 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11348 unformat_l3_mask (unformat_input_t * input, va_list * args)
11350 u8 **maskp = va_arg (*args, u8 **);
11352 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11354 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
11356 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
11365 unformat_l2_mask (unformat_input_t * input, va_list * args)
11367 u8 **maskp = va_arg (*args, u8 **);
11374 u8 ignore_tag1 = 0;
11375 u8 ignore_tag2 = 0;
11382 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11384 if (unformat (input, "src"))
11386 else if (unformat (input, "dst"))
11388 else if (unformat (input, "proto"))
11390 else if (unformat (input, "tag1"))
11392 else if (unformat (input, "tag2"))
11394 else if (unformat (input, "ignore-tag1"))
11396 else if (unformat (input, "ignore-tag2"))
11398 else if (unformat (input, "cos1"))
11400 else if (unformat (input, "cos2"))
11402 else if (unformat (input, "dot1q"))
11404 else if (unformat (input, "dot1ad"))
11409 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
11410 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11413 if (tag1 || ignore_tag1 || cos1 || dot1q)
11415 if (tag2 || ignore_tag2 || cos2 || dot1ad)
11418 vec_validate (mask, len - 1);
11421 memset (mask, 0xff, 6);
11424 memset (mask + 6, 0xff, 6);
11426 if (tag2 || dot1ad)
11428 /* inner vlan tag */
11437 mask[21] = mask[20] = 0xff;
11458 mask[16] = mask[17] = 0xff;
11468 mask[12] = mask[13] = 0xff;
11475 unformat_classify_mask (unformat_input_t * input, va_list * args)
11477 u8 **maskp = va_arg (*args, u8 **);
11478 u32 *skipp = va_arg (*args, u32 *);
11479 u32 *matchp = va_arg (*args, u32 *);
11487 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11489 if (unformat (input, "hex %U", unformat_hex_string, &mask))
11491 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
11493 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
11495 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
11509 if (mask || l2 || l3 || l4)
11511 if (l2 || l3 || l4)
11513 /* "With a free Ethernet header in every package" */
11515 vec_validate (l2, 13);
11519 vec_append (mask, l3);
11524 vec_append (mask, l4);
11529 /* Scan forward looking for the first significant mask octet */
11530 for (i = 0; i < vec_len (mask); i++)
11534 /* compute (skip, match) params */
11535 *skipp = i / sizeof (u32x4);
11536 vec_delete (mask, *skipp * sizeof (u32x4), 0);
11538 /* Pad mask to an even multiple of the vector size */
11539 while (vec_len (mask) % sizeof (u32x4))
11540 vec_add1 (mask, 0);
11542 match = vec_len (mask) / sizeof (u32x4);
11544 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
11546 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11547 if (*tmp || *(tmp + 1))
11552 clib_warning ("BUG: match 0");
11554 _vec_len (mask) = match * sizeof (u32x4);
11564 #endif /* VPP_API_TEST_BUILTIN */
11566 #define foreach_l2_next \
11568 _(ethernet, ETHERNET_INPUT) \
11569 _(ip4, IP4_INPUT) \
11573 unformat_l2_next_index (unformat_input_t * input, va_list * args)
11575 u32 *miss_next_indexp = va_arg (*args, u32 *);
11576 u32 next_index = 0;
11580 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11584 if (unformat (input, "%d", &tmp))
11593 *miss_next_indexp = next_index;
11597 #define foreach_ip_next \
11600 _(rewrite, REWRITE)
11603 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
11605 u32 *miss_next_indexp = va_arg (*args, u32 *);
11606 u32 next_index = 0;
11610 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11614 if (unformat (input, "%d", &tmp))
11623 *miss_next_indexp = next_index;
11627 #define foreach_acl_next \
11631 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
11633 u32 *miss_next_indexp = va_arg (*args, u32 *);
11634 u32 next_index = 0;
11638 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11642 if (unformat (input, "permit"))
11647 else if (unformat (input, "%d", &tmp))
11656 *miss_next_indexp = next_index;
11661 unformat_policer_precolor (unformat_input_t * input, va_list * args)
11663 u32 *r = va_arg (*args, u32 *);
11665 if (unformat (input, "conform-color"))
11666 *r = POLICE_CONFORM;
11667 else if (unformat (input, "exceed-color"))
11668 *r = POLICE_EXCEED;
11676 api_classify_add_del_table (vat_main_t * vam)
11678 unformat_input_t *i = vam->input;
11679 vl_api_classify_add_del_table_t *mp;
11686 u32 table_index = ~0;
11687 u32 next_table_index = ~0;
11688 u32 miss_next_index = ~0;
11689 u32 memory_size = 32 << 20;
11691 u32 current_data_flag = 0;
11692 int current_data_offset = 0;
11695 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11697 if (unformat (i, "del"))
11699 else if (unformat (i, "del-chain"))
11704 else if (unformat (i, "buckets %d", &nbuckets))
11706 else if (unformat (i, "memory_size %d", &memory_size))
11708 else if (unformat (i, "skip %d", &skip))
11710 else if (unformat (i, "match %d", &match))
11712 else if (unformat (i, "table %d", &table_index))
11714 else if (unformat (i, "mask %U", unformat_classify_mask,
11715 &mask, &skip, &match))
11717 else if (unformat (i, "next-table %d", &next_table_index))
11719 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
11722 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11725 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
11728 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
11730 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
11736 if (is_add && mask == 0)
11738 errmsg ("Mask required");
11742 if (is_add && skip == ~0)
11744 errmsg ("skip count required");
11748 if (is_add && match == ~0)
11750 errmsg ("match count required");
11754 if (!is_add && table_index == ~0)
11756 errmsg ("table index required for delete");
11760 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
11762 mp->is_add = is_add;
11763 mp->del_chain = del_chain;
11764 mp->table_index = ntohl (table_index);
11765 mp->nbuckets = ntohl (nbuckets);
11766 mp->memory_size = ntohl (memory_size);
11767 mp->skip_n_vectors = ntohl (skip);
11768 mp->match_n_vectors = ntohl (match);
11769 mp->next_table_index = ntohl (next_table_index);
11770 mp->miss_next_index = ntohl (miss_next_index);
11771 mp->current_data_flag = ntohl (current_data_flag);
11772 mp->current_data_offset = ntohl (current_data_offset);
11773 mp->mask_len = ntohl (vec_len (mask));
11774 clib_memcpy (mp->mask, mask, vec_len (mask));
11783 #if VPP_API_TEST_BUILTIN == 0
11785 unformat_l4_match (unformat_input_t * input, va_list * args)
11787 u8 **matchp = va_arg (*args, u8 **);
11789 u8 *proto_header = 0;
11795 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11797 if (unformat (input, "src_port %d", &src_port))
11799 else if (unformat (input, "dst_port %d", &dst_port))
11805 h.src_port = clib_host_to_net_u16 (src_port);
11806 h.dst_port = clib_host_to_net_u16 (dst_port);
11807 vec_validate (proto_header, sizeof (h) - 1);
11808 memcpy (proto_header, &h, sizeof (h));
11810 *matchp = proto_header;
11816 unformat_ip4_match (unformat_input_t * input, va_list * args)
11818 u8 **matchp = va_arg (*args, u8 **);
11823 int hdr_length = 0;
11824 u32 hdr_length_val;
11825 int src = 0, dst = 0;
11826 ip4_address_t src_val, dst_val;
11833 int fragment_id = 0;
11834 u32 fragment_id_val;
11840 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11842 if (unformat (input, "version %d", &version_val))
11844 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11846 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11848 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11850 else if (unformat (input, "proto %d", &proto_val))
11852 else if (unformat (input, "tos %d", &tos_val))
11854 else if (unformat (input, "length %d", &length_val))
11856 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11858 else if (unformat (input, "ttl %d", &ttl_val))
11860 else if (unformat (input, "checksum %d", &checksum_val))
11866 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11867 + ttl + checksum == 0)
11871 * Aligned because we use the real comparison functions
11873 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11875 ip = (ip4_header_t *) match;
11877 /* These are realistically matched in practice */
11879 ip->src_address.as_u32 = src_val.as_u32;
11882 ip->dst_address.as_u32 = dst_val.as_u32;
11885 ip->protocol = proto_val;
11888 /* These are not, but they're included for completeness */
11890 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11893 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11899 ip->length = clib_host_to_net_u16 (length_val);
11905 ip->checksum = clib_host_to_net_u16 (checksum_val);
11912 unformat_ip6_match (unformat_input_t * input, va_list * args)
11914 u8 **matchp = va_arg (*args, u8 **);
11919 u8 traffic_class = 0;
11920 u32 traffic_class_val = 0;
11923 int src = 0, dst = 0;
11924 ip6_address_t src_val, dst_val;
11927 int payload_length = 0;
11928 u32 payload_length_val;
11931 u32 ip_version_traffic_class_and_flow_label;
11933 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11935 if (unformat (input, "version %d", &version_val))
11937 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11939 else if (unformat (input, "flow_label %d", &flow_label_val))
11941 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11943 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11945 else if (unformat (input, "proto %d", &proto_val))
11947 else if (unformat (input, "payload_length %d", &payload_length_val))
11948 payload_length = 1;
11949 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11955 if (version + traffic_class + flow_label + src + dst + proto +
11956 payload_length + hop_limit == 0)
11960 * Aligned because we use the real comparison functions
11962 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11964 ip = (ip6_header_t *) match;
11967 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11970 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11973 ip->protocol = proto_val;
11975 ip_version_traffic_class_and_flow_label = 0;
11978 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11981 ip_version_traffic_class_and_flow_label |=
11982 (traffic_class_val & 0xFF) << 20;
11985 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11987 ip->ip_version_traffic_class_and_flow_label =
11988 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11990 if (payload_length)
11991 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11994 ip->hop_limit = hop_limit_val;
12001 unformat_l3_match (unformat_input_t * input, va_list * args)
12003 u8 **matchp = va_arg (*args, u8 **);
12005 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12007 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
12009 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
12018 unformat_vlan_tag (unformat_input_t * input, va_list * args)
12020 u8 *tagp = va_arg (*args, u8 *);
12023 if (unformat (input, "%d", &tag))
12025 tagp[0] = (tag >> 8) & 0x0F;
12026 tagp[1] = tag & 0xFF;
12034 unformat_l2_match (unformat_input_t * input, va_list * args)
12036 u8 **matchp = va_arg (*args, u8 **);
12049 u8 ignore_tag1 = 0;
12050 u8 ignore_tag2 = 0;
12056 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12058 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
12061 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
12063 else if (unformat (input, "proto %U",
12064 unformat_ethernet_type_host_byte_order, &proto_val))
12066 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
12068 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
12070 else if (unformat (input, "ignore-tag1"))
12072 else if (unformat (input, "ignore-tag2"))
12074 else if (unformat (input, "cos1 %d", &cos1_val))
12076 else if (unformat (input, "cos2 %d", &cos2_val))
12081 if ((src + dst + proto + tag1 + tag2 +
12082 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
12085 if (tag1 || ignore_tag1 || cos1)
12087 if (tag2 || ignore_tag2 || cos2)
12090 vec_validate_aligned (match, len - 1, sizeof (u32x4));
12093 clib_memcpy (match, dst_val, 6);
12096 clib_memcpy (match + 6, src_val, 6);
12100 /* inner vlan tag */
12101 match[19] = tag2_val[1];
12102 match[18] = tag2_val[0];
12104 match[18] |= (cos2_val & 0x7) << 5;
12107 match[21] = proto_val & 0xff;
12108 match[20] = proto_val >> 8;
12112 match[15] = tag1_val[1];
12113 match[14] = tag1_val[0];
12116 match[14] |= (cos1_val & 0x7) << 5;
12122 match[15] = tag1_val[1];
12123 match[14] = tag1_val[0];
12126 match[17] = proto_val & 0xff;
12127 match[16] = proto_val >> 8;
12130 match[14] |= (cos1_val & 0x7) << 5;
12136 match[18] |= (cos2_val & 0x7) << 5;
12138 match[14] |= (cos1_val & 0x7) << 5;
12141 match[13] = proto_val & 0xff;
12142 match[12] = proto_val >> 8;
12150 unformat_qos_source (unformat_input_t * input, va_list * args)
12152 int *qs = va_arg (*args, int *);
12154 if (unformat (input, "ip"))
12155 *qs = QOS_SOURCE_IP;
12156 else if (unformat (input, "mpls"))
12157 *qs = QOS_SOURCE_MPLS;
12158 else if (unformat (input, "ext"))
12159 *qs = QOS_SOURCE_EXT;
12160 else if (unformat (input, "vlan"))
12161 *qs = QOS_SOURCE_VLAN;
12170 api_unformat_classify_match (unformat_input_t * input, va_list * args)
12172 u8 **matchp = va_arg (*args, u8 **);
12173 u32 skip_n_vectors = va_arg (*args, u32);
12174 u32 match_n_vectors = va_arg (*args, u32);
12181 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12183 if (unformat (input, "hex %U", unformat_hex_string, &match))
12185 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
12187 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
12189 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
12203 if (match || l2 || l3 || l4)
12205 if (l2 || l3 || l4)
12207 /* "Win a free Ethernet header in every packet" */
12209 vec_validate_aligned (l2, 13, sizeof (u32x4));
12213 vec_append_aligned (match, l3, sizeof (u32x4));
12218 vec_append_aligned (match, l4, sizeof (u32x4));
12223 /* Make sure the vector is big enough even if key is all 0's */
12224 vec_validate_aligned
12225 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
12228 /* Set size, include skipped vectors */
12229 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
12240 api_classify_add_del_session (vat_main_t * vam)
12242 unformat_input_t *i = vam->input;
12243 vl_api_classify_add_del_session_t *mp;
12245 u32 table_index = ~0;
12246 u32 hit_next_index = ~0;
12247 u32 opaque_index = ~0;
12250 u32 skip_n_vectors = 0;
12251 u32 match_n_vectors = 0;
12257 * Warning: you have to supply skip_n and match_n
12258 * because the API client cant simply look at the classify
12262 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12264 if (unformat (i, "del"))
12266 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
12269 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
12272 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
12275 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
12277 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
12279 else if (unformat (i, "opaque-index %d", &opaque_index))
12281 else if (unformat (i, "skip_n %d", &skip_n_vectors))
12283 else if (unformat (i, "match_n %d", &match_n_vectors))
12285 else if (unformat (i, "match %U", api_unformat_classify_match,
12286 &match, skip_n_vectors, match_n_vectors))
12288 else if (unformat (i, "advance %d", &advance))
12290 else if (unformat (i, "table-index %d", &table_index))
12292 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
12294 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
12296 else if (unformat (i, "action %d", &action))
12298 else if (unformat (i, "metadata %d", &metadata))
12304 if (table_index == ~0)
12306 errmsg ("Table index required");
12310 if (is_add && match == 0)
12312 errmsg ("Match value required");
12316 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
12318 mp->is_add = is_add;
12319 mp->table_index = ntohl (table_index);
12320 mp->hit_next_index = ntohl (hit_next_index);
12321 mp->opaque_index = ntohl (opaque_index);
12322 mp->advance = ntohl (advance);
12323 mp->action = action;
12324 mp->metadata = ntohl (metadata);
12325 mp->match_len = ntohl (vec_len (match));
12326 clib_memcpy (mp->match, match, vec_len (match));
12335 api_classify_set_interface_ip_table (vat_main_t * vam)
12337 unformat_input_t *i = vam->input;
12338 vl_api_classify_set_interface_ip_table_t *mp;
12340 int sw_if_index_set;
12341 u32 table_index = ~0;
12345 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12347 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12348 sw_if_index_set = 1;
12349 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12350 sw_if_index_set = 1;
12351 else if (unformat (i, "table %d", &table_index))
12355 clib_warning ("parse error '%U'", format_unformat_error, i);
12360 if (sw_if_index_set == 0)
12362 errmsg ("missing interface name or sw_if_index");
12367 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
12369 mp->sw_if_index = ntohl (sw_if_index);
12370 mp->table_index = ntohl (table_index);
12371 mp->is_ipv6 = is_ipv6;
12379 api_classify_set_interface_l2_tables (vat_main_t * vam)
12381 unformat_input_t *i = vam->input;
12382 vl_api_classify_set_interface_l2_tables_t *mp;
12384 int sw_if_index_set;
12385 u32 ip4_table_index = ~0;
12386 u32 ip6_table_index = ~0;
12387 u32 other_table_index = ~0;
12391 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12393 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12394 sw_if_index_set = 1;
12395 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12396 sw_if_index_set = 1;
12397 else if (unformat (i, "ip4-table %d", &ip4_table_index))
12399 else if (unformat (i, "ip6-table %d", &ip6_table_index))
12401 else if (unformat (i, "other-table %d", &other_table_index))
12403 else if (unformat (i, "is-input %d", &is_input))
12407 clib_warning ("parse error '%U'", format_unformat_error, i);
12412 if (sw_if_index_set == 0)
12414 errmsg ("missing interface name or sw_if_index");
12419 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
12421 mp->sw_if_index = ntohl (sw_if_index);
12422 mp->ip4_table_index = ntohl (ip4_table_index);
12423 mp->ip6_table_index = ntohl (ip6_table_index);
12424 mp->other_table_index = ntohl (other_table_index);
12425 mp->is_input = (u8) is_input;
12433 api_set_ipfix_exporter (vat_main_t * vam)
12435 unformat_input_t *i = vam->input;
12436 vl_api_set_ipfix_exporter_t *mp;
12437 ip4_address_t collector_address;
12438 u8 collector_address_set = 0;
12439 u32 collector_port = ~0;
12440 ip4_address_t src_address;
12441 u8 src_address_set = 0;
12444 u32 template_interval = ~0;
12445 u8 udp_checksum = 0;
12448 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12450 if (unformat (i, "collector_address %U", unformat_ip4_address,
12451 &collector_address))
12452 collector_address_set = 1;
12453 else if (unformat (i, "collector_port %d", &collector_port))
12455 else if (unformat (i, "src_address %U", unformat_ip4_address,
12457 src_address_set = 1;
12458 else if (unformat (i, "vrf_id %d", &vrf_id))
12460 else if (unformat (i, "path_mtu %d", &path_mtu))
12462 else if (unformat (i, "template_interval %d", &template_interval))
12464 else if (unformat (i, "udp_checksum"))
12470 if (collector_address_set == 0)
12472 errmsg ("collector_address required");
12476 if (src_address_set == 0)
12478 errmsg ("src_address required");
12482 M (SET_IPFIX_EXPORTER, mp);
12484 memcpy (mp->collector_address, collector_address.data,
12485 sizeof (collector_address.data));
12486 mp->collector_port = htons ((u16) collector_port);
12487 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
12488 mp->vrf_id = htonl (vrf_id);
12489 mp->path_mtu = htonl (path_mtu);
12490 mp->template_interval = htonl (template_interval);
12491 mp->udp_checksum = udp_checksum;
12499 api_set_ipfix_classify_stream (vat_main_t * vam)
12501 unformat_input_t *i = vam->input;
12502 vl_api_set_ipfix_classify_stream_t *mp;
12504 u32 src_port = UDP_DST_PORT_ipfix;
12507 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12509 if (unformat (i, "domain %d", &domain_id))
12511 else if (unformat (i, "src_port %d", &src_port))
12515 errmsg ("unknown input `%U'", format_unformat_error, i);
12520 M (SET_IPFIX_CLASSIFY_STREAM, mp);
12522 mp->domain_id = htonl (domain_id);
12523 mp->src_port = htons ((u16) src_port);
12531 api_ipfix_classify_table_add_del (vat_main_t * vam)
12533 unformat_input_t *i = vam->input;
12534 vl_api_ipfix_classify_table_add_del_t *mp;
12536 u32 classify_table_index = ~0;
12538 u8 transport_protocol = 255;
12541 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12543 if (unformat (i, "add"))
12545 else if (unformat (i, "del"))
12547 else if (unformat (i, "table %d", &classify_table_index))
12549 else if (unformat (i, "ip4"))
12551 else if (unformat (i, "ip6"))
12553 else if (unformat (i, "tcp"))
12554 transport_protocol = 6;
12555 else if (unformat (i, "udp"))
12556 transport_protocol = 17;
12559 errmsg ("unknown input `%U'", format_unformat_error, i);
12566 errmsg ("expecting: add|del");
12569 if (classify_table_index == ~0)
12571 errmsg ("classifier table not specified");
12574 if (ip_version == 0)
12576 errmsg ("IP version not specified");
12580 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
12582 mp->is_add = is_add;
12583 mp->table_id = htonl (classify_table_index);
12584 mp->ip_version = ip_version;
12585 mp->transport_protocol = transport_protocol;
12593 api_get_node_index (vat_main_t * vam)
12595 unformat_input_t *i = vam->input;
12596 vl_api_get_node_index_t *mp;
12600 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12602 if (unformat (i, "node %s", &name))
12609 errmsg ("node name required");
12612 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12614 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12618 M (GET_NODE_INDEX, mp);
12619 clib_memcpy (mp->node_name, name, vec_len (name));
12628 api_get_next_index (vat_main_t * vam)
12630 unformat_input_t *i = vam->input;
12631 vl_api_get_next_index_t *mp;
12632 u8 *node_name = 0, *next_node_name = 0;
12635 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12637 if (unformat (i, "node-name %s", &node_name))
12639 else if (unformat (i, "next-node-name %s", &next_node_name))
12643 if (node_name == 0)
12645 errmsg ("node name required");
12648 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12650 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12654 if (next_node_name == 0)
12656 errmsg ("next node name required");
12659 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12661 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12665 M (GET_NEXT_INDEX, mp);
12666 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12667 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12668 vec_free (node_name);
12669 vec_free (next_node_name);
12677 api_add_node_next (vat_main_t * vam)
12679 unformat_input_t *i = vam->input;
12680 vl_api_add_node_next_t *mp;
12685 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12687 if (unformat (i, "node %s", &name))
12689 else if (unformat (i, "next %s", &next))
12696 errmsg ("node name required");
12699 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12701 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12706 errmsg ("next node required");
12709 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12711 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12715 M (ADD_NODE_NEXT, mp);
12716 clib_memcpy (mp->node_name, name, vec_len (name));
12717 clib_memcpy (mp->next_name, next, vec_len (next));
12727 api_l2tpv3_create_tunnel (vat_main_t * vam)
12729 unformat_input_t *i = vam->input;
12730 ip6_address_t client_address, our_address;
12731 int client_address_set = 0;
12732 int our_address_set = 0;
12733 u32 local_session_id = 0;
12734 u32 remote_session_id = 0;
12735 u64 local_cookie = 0;
12736 u64 remote_cookie = 0;
12737 u8 l2_sublayer_present = 0;
12738 vl_api_l2tpv3_create_tunnel_t *mp;
12741 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12743 if (unformat (i, "client_address %U", unformat_ip6_address,
12745 client_address_set = 1;
12746 else if (unformat (i, "our_address %U", unformat_ip6_address,
12748 our_address_set = 1;
12749 else if (unformat (i, "local_session_id %d", &local_session_id))
12751 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12753 else if (unformat (i, "local_cookie %lld", &local_cookie))
12755 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12757 else if (unformat (i, "l2-sublayer-present"))
12758 l2_sublayer_present = 1;
12763 if (client_address_set == 0)
12765 errmsg ("client_address required");
12769 if (our_address_set == 0)
12771 errmsg ("our_address required");
12775 M (L2TPV3_CREATE_TUNNEL, mp);
12777 clib_memcpy (mp->client_address, client_address.as_u8,
12778 sizeof (mp->client_address));
12780 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12782 mp->local_session_id = ntohl (local_session_id);
12783 mp->remote_session_id = ntohl (remote_session_id);
12784 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12785 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12786 mp->l2_sublayer_present = l2_sublayer_present;
12795 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12797 unformat_input_t *i = vam->input;
12799 u8 sw_if_index_set = 0;
12800 u64 new_local_cookie = 0;
12801 u64 new_remote_cookie = 0;
12802 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
12805 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12807 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12808 sw_if_index_set = 1;
12809 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12810 sw_if_index_set = 1;
12811 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12813 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12819 if (sw_if_index_set == 0)
12821 errmsg ("missing interface name or sw_if_index");
12825 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
12827 mp->sw_if_index = ntohl (sw_if_index);
12828 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12829 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12837 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12839 unformat_input_t *i = vam->input;
12840 vl_api_l2tpv3_interface_enable_disable_t *mp;
12842 u8 sw_if_index_set = 0;
12843 u8 enable_disable = 1;
12846 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12848 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12849 sw_if_index_set = 1;
12850 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12851 sw_if_index_set = 1;
12852 else if (unformat (i, "enable"))
12853 enable_disable = 1;
12854 else if (unformat (i, "disable"))
12855 enable_disable = 0;
12860 if (sw_if_index_set == 0)
12862 errmsg ("missing interface name or sw_if_index");
12866 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
12868 mp->sw_if_index = ntohl (sw_if_index);
12869 mp->enable_disable = enable_disable;
12877 api_l2tpv3_set_lookup_key (vat_main_t * vam)
12879 unformat_input_t *i = vam->input;
12880 vl_api_l2tpv3_set_lookup_key_t *mp;
12884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12886 if (unformat (i, "lookup_v6_src"))
12887 key = L2T_LOOKUP_SRC_ADDRESS;
12888 else if (unformat (i, "lookup_v6_dst"))
12889 key = L2T_LOOKUP_DST_ADDRESS;
12890 else if (unformat (i, "lookup_session_id"))
12891 key = L2T_LOOKUP_SESSION_ID;
12896 if (key == (u8) ~ 0)
12898 errmsg ("l2tp session lookup key unset");
12902 M (L2TPV3_SET_LOOKUP_KEY, mp);
12911 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12912 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12914 vat_main_t *vam = &vat_main;
12916 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12917 format_ip6_address, mp->our_address,
12918 format_ip6_address, mp->client_address,
12919 clib_net_to_host_u32 (mp->sw_if_index));
12922 " local cookies %016llx %016llx remote cookie %016llx",
12923 clib_net_to_host_u64 (mp->local_cookie[0]),
12924 clib_net_to_host_u64 (mp->local_cookie[1]),
12925 clib_net_to_host_u64 (mp->remote_cookie));
12927 print (vam->ofp, " local session-id %d remote session-id %d",
12928 clib_net_to_host_u32 (mp->local_session_id),
12929 clib_net_to_host_u32 (mp->remote_session_id));
12931 print (vam->ofp, " l2 specific sublayer %s\n",
12932 mp->l2_sublayer_present ? "preset" : "absent");
12936 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12937 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12939 vat_main_t *vam = &vat_main;
12940 vat_json_node_t *node = NULL;
12941 struct in6_addr addr;
12943 if (VAT_JSON_ARRAY != vam->json_tree.type)
12945 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12946 vat_json_init_array (&vam->json_tree);
12948 node = vat_json_array_add (&vam->json_tree);
12950 vat_json_init_object (node);
12952 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12953 vat_json_object_add_ip6 (node, "our_address", addr);
12954 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12955 vat_json_object_add_ip6 (node, "client_address", addr);
12957 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12958 vat_json_init_array (lc);
12959 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12960 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12961 vat_json_object_add_uint (node, "remote_cookie",
12962 clib_net_to_host_u64 (mp->remote_cookie));
12964 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12965 vat_json_object_add_uint (node, "local_session_id",
12966 clib_net_to_host_u32 (mp->local_session_id));
12967 vat_json_object_add_uint (node, "remote_session_id",
12968 clib_net_to_host_u32 (mp->remote_session_id));
12969 vat_json_object_add_string_copy (node, "l2_sublayer",
12970 mp->l2_sublayer_present ? (u8 *) "present"
12971 : (u8 *) "absent");
12975 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12977 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
12978 vl_api_control_ping_t *mp_ping;
12981 /* Get list of l2tpv3-tunnel interfaces */
12982 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
12985 /* Use a control ping for synchronization */
12986 MPING (CONTROL_PING, mp_ping);
12994 static void vl_api_sw_interface_tap_details_t_handler
12995 (vl_api_sw_interface_tap_details_t * mp)
12997 vat_main_t *vam = &vat_main;
12999 print (vam->ofp, "%-16s %d",
13000 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
13003 static void vl_api_sw_interface_tap_details_t_handler_json
13004 (vl_api_sw_interface_tap_details_t * mp)
13006 vat_main_t *vam = &vat_main;
13007 vat_json_node_t *node = NULL;
13009 if (VAT_JSON_ARRAY != vam->json_tree.type)
13011 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13012 vat_json_init_array (&vam->json_tree);
13014 node = vat_json_array_add (&vam->json_tree);
13016 vat_json_init_object (node);
13017 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13018 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
13022 api_sw_interface_tap_dump (vat_main_t * vam)
13024 vl_api_sw_interface_tap_dump_t *mp;
13025 vl_api_control_ping_t *mp_ping;
13028 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
13029 /* Get list of tap interfaces */
13030 M (SW_INTERFACE_TAP_DUMP, mp);
13033 /* Use a control ping for synchronization */
13034 MPING (CONTROL_PING, mp_ping);
13041 static void vl_api_sw_interface_tap_v2_details_t_handler
13042 (vl_api_sw_interface_tap_v2_details_t * mp)
13044 vat_main_t *vam = &vat_main;
13046 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
13047 mp->host_ip4_prefix_len);
13048 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
13049 mp->host_ip6_prefix_len);
13052 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s",
13053 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
13054 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
13055 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
13056 mp->host_bridge, ip4, ip6);
13062 static void vl_api_sw_interface_tap_v2_details_t_handler_json
13063 (vl_api_sw_interface_tap_v2_details_t * mp)
13065 vat_main_t *vam = &vat_main;
13066 vat_json_node_t *node = NULL;
13068 if (VAT_JSON_ARRAY != vam->json_tree.type)
13070 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13071 vat_json_init_array (&vam->json_tree);
13073 node = vat_json_array_add (&vam->json_tree);
13075 vat_json_init_object (node);
13076 vat_json_object_add_uint (node, "id", ntohl (mp->id));
13077 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13078 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
13079 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
13080 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
13081 vat_json_object_add_string_copy (node, "host_mac_addr",
13082 format (0, "%U", format_ethernet_address,
13083 &mp->host_mac_addr));
13084 vat_json_object_add_string_copy (node, "host_namespace",
13085 mp->host_namespace);
13086 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
13087 vat_json_object_add_string_copy (node, "host_ip4_addr",
13088 format (0, "%U/%d", format_ip4_address,
13090 mp->host_ip4_prefix_len));
13091 vat_json_object_add_string_copy (node, "host_ip6_addr",
13092 format (0, "%U/%d", format_ip6_address,
13094 mp->host_ip6_prefix_len));
13099 api_sw_interface_tap_v2_dump (vat_main_t * vam)
13101 vl_api_sw_interface_tap_v2_dump_t *mp;
13102 vl_api_control_ping_t *mp_ping;
13106 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
13107 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
13108 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
13111 /* Get list of tap interfaces */
13112 M (SW_INTERFACE_TAP_V2_DUMP, mp);
13115 /* Use a control ping for synchronization */
13116 MPING (CONTROL_PING, mp_ping);
13124 api_vxlan_offload_rx (vat_main_t * vam)
13126 unformat_input_t *line_input = vam->input;
13127 vl_api_vxlan_offload_rx_t *mp;
13128 u32 hw_if_index = ~0, rx_if_index = ~0;
13132 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13134 if (unformat (line_input, "del"))
13136 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
13139 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
13141 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
13144 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
13148 errmsg ("parse error '%U'", format_unformat_error, line_input);
13153 if (hw_if_index == ~0)
13155 errmsg ("no hw interface");
13159 if (rx_if_index == ~0)
13161 errmsg ("no rx tunnel");
13165 M (VXLAN_OFFLOAD_RX, mp);
13167 mp->hw_if_index = ntohl (hw_if_index);
13168 mp->sw_if_index = ntohl (rx_if_index);
13169 mp->enable = is_add;
13176 static uword unformat_vxlan_decap_next
13177 (unformat_input_t * input, va_list * args)
13179 u32 *result = va_arg (*args, u32 *);
13182 if (unformat (input, "l2"))
13183 *result = VXLAN_INPUT_NEXT_L2_INPUT;
13184 else if (unformat (input, "%d", &tmp))
13192 api_vxlan_add_del_tunnel (vat_main_t * vam)
13194 unformat_input_t *line_input = vam->input;
13195 vl_api_vxlan_add_del_tunnel_t *mp;
13196 ip46_address_t src, dst;
13198 u8 ipv4_set = 0, ipv6_set = 0;
13203 u32 mcast_sw_if_index = ~0;
13204 u32 encap_vrf_id = 0;
13205 u32 decap_next_index = ~0;
13209 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13210 memset (&src, 0, sizeof src);
13211 memset (&dst, 0, sizeof dst);
13213 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13215 if (unformat (line_input, "del"))
13217 else if (unformat (line_input, "instance %d", &instance))
13220 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13226 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13232 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13238 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13243 else if (unformat (line_input, "group %U %U",
13244 unformat_ip4_address, &dst.ip4,
13245 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13247 grp_set = dst_set = 1;
13250 else if (unformat (line_input, "group %U",
13251 unformat_ip4_address, &dst.ip4))
13253 grp_set = dst_set = 1;
13256 else if (unformat (line_input, "group %U %U",
13257 unformat_ip6_address, &dst.ip6,
13258 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13260 grp_set = dst_set = 1;
13263 else if (unformat (line_input, "group %U",
13264 unformat_ip6_address, &dst.ip6))
13266 grp_set = dst_set = 1;
13270 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13272 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13274 else if (unformat (line_input, "decap-next %U",
13275 unformat_vxlan_decap_next, &decap_next_index))
13277 else if (unformat (line_input, "vni %d", &vni))
13281 errmsg ("parse error '%U'", format_unformat_error, line_input);
13288 errmsg ("tunnel src address not specified");
13293 errmsg ("tunnel dst address not specified");
13297 if (grp_set && !ip46_address_is_multicast (&dst))
13299 errmsg ("tunnel group address not multicast");
13302 if (grp_set && mcast_sw_if_index == ~0)
13304 errmsg ("tunnel nonexistent multicast device");
13307 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13309 errmsg ("tunnel dst address must be unicast");
13314 if (ipv4_set && ipv6_set)
13316 errmsg ("both IPv4 and IPv6 addresses specified");
13320 if ((vni == 0) || (vni >> 24))
13322 errmsg ("vni not specified or out of range");
13326 M (VXLAN_ADD_DEL_TUNNEL, mp);
13330 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
13331 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
13335 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
13336 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
13339 mp->instance = htonl (instance);
13340 mp->encap_vrf_id = ntohl (encap_vrf_id);
13341 mp->decap_next_index = ntohl (decap_next_index);
13342 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13343 mp->vni = ntohl (vni);
13344 mp->is_add = is_add;
13345 mp->is_ipv6 = ipv6_set;
13352 static void vl_api_vxlan_tunnel_details_t_handler
13353 (vl_api_vxlan_tunnel_details_t * mp)
13355 vat_main_t *vam = &vat_main;
13356 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13357 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13359 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
13360 ntohl (mp->sw_if_index),
13361 ntohl (mp->instance),
13362 format_ip46_address, &src, IP46_TYPE_ANY,
13363 format_ip46_address, &dst, IP46_TYPE_ANY,
13364 ntohl (mp->encap_vrf_id),
13365 ntohl (mp->decap_next_index), ntohl (mp->vni),
13366 ntohl (mp->mcast_sw_if_index));
13369 static void vl_api_vxlan_tunnel_details_t_handler_json
13370 (vl_api_vxlan_tunnel_details_t * mp)
13372 vat_main_t *vam = &vat_main;
13373 vat_json_node_t *node = NULL;
13375 if (VAT_JSON_ARRAY != vam->json_tree.type)
13377 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13378 vat_json_init_array (&vam->json_tree);
13380 node = vat_json_array_add (&vam->json_tree);
13382 vat_json_init_object (node);
13383 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13385 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13389 struct in6_addr ip6;
13391 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13392 vat_json_object_add_ip6 (node, "src_address", ip6);
13393 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13394 vat_json_object_add_ip6 (node, "dst_address", ip6);
13398 struct in_addr ip4;
13400 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13401 vat_json_object_add_ip4 (node, "src_address", ip4);
13402 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13403 vat_json_object_add_ip4 (node, "dst_address", ip4);
13405 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13406 vat_json_object_add_uint (node, "decap_next_index",
13407 ntohl (mp->decap_next_index));
13408 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13409 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13410 vat_json_object_add_uint (node, "mcast_sw_if_index",
13411 ntohl (mp->mcast_sw_if_index));
13415 api_vxlan_tunnel_dump (vat_main_t * vam)
13417 unformat_input_t *i = vam->input;
13418 vl_api_vxlan_tunnel_dump_t *mp;
13419 vl_api_control_ping_t *mp_ping;
13421 u8 sw_if_index_set = 0;
13424 /* Parse args required to build the message */
13425 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13427 if (unformat (i, "sw_if_index %d", &sw_if_index))
13428 sw_if_index_set = 1;
13433 if (sw_if_index_set == 0)
13438 if (!vam->json_output)
13440 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
13441 "sw_if_index", "instance", "src_address", "dst_address",
13442 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13445 /* Get list of vxlan-tunnel interfaces */
13446 M (VXLAN_TUNNEL_DUMP, mp);
13448 mp->sw_if_index = htonl (sw_if_index);
13452 /* Use a control ping for synchronization */
13453 MPING (CONTROL_PING, mp_ping);
13460 static uword unformat_geneve_decap_next
13461 (unformat_input_t * input, va_list * args)
13463 u32 *result = va_arg (*args, u32 *);
13466 if (unformat (input, "l2"))
13467 *result = GENEVE_INPUT_NEXT_L2_INPUT;
13468 else if (unformat (input, "%d", &tmp))
13476 api_geneve_add_del_tunnel (vat_main_t * vam)
13478 unformat_input_t *line_input = vam->input;
13479 vl_api_geneve_add_del_tunnel_t *mp;
13480 ip46_address_t src, dst;
13482 u8 ipv4_set = 0, ipv6_set = 0;
13486 u32 mcast_sw_if_index = ~0;
13487 u32 encap_vrf_id = 0;
13488 u32 decap_next_index = ~0;
13492 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13493 memset (&src, 0, sizeof src);
13494 memset (&dst, 0, sizeof dst);
13496 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13498 if (unformat (line_input, "del"))
13501 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13507 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13513 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13519 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13524 else if (unformat (line_input, "group %U %U",
13525 unformat_ip4_address, &dst.ip4,
13526 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13528 grp_set = dst_set = 1;
13531 else if (unformat (line_input, "group %U",
13532 unformat_ip4_address, &dst.ip4))
13534 grp_set = dst_set = 1;
13537 else if (unformat (line_input, "group %U %U",
13538 unformat_ip6_address, &dst.ip6,
13539 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13541 grp_set = dst_set = 1;
13544 else if (unformat (line_input, "group %U",
13545 unformat_ip6_address, &dst.ip6))
13547 grp_set = dst_set = 1;
13551 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13553 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13555 else if (unformat (line_input, "decap-next %U",
13556 unformat_geneve_decap_next, &decap_next_index))
13558 else if (unformat (line_input, "vni %d", &vni))
13562 errmsg ("parse error '%U'", format_unformat_error, line_input);
13569 errmsg ("tunnel src address not specified");
13574 errmsg ("tunnel dst address not specified");
13578 if (grp_set && !ip46_address_is_multicast (&dst))
13580 errmsg ("tunnel group address not multicast");
13583 if (grp_set && mcast_sw_if_index == ~0)
13585 errmsg ("tunnel nonexistent multicast device");
13588 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13590 errmsg ("tunnel dst address must be unicast");
13595 if (ipv4_set && ipv6_set)
13597 errmsg ("both IPv4 and IPv6 addresses specified");
13601 if ((vni == 0) || (vni >> 24))
13603 errmsg ("vni not specified or out of range");
13607 M (GENEVE_ADD_DEL_TUNNEL, mp);
13611 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13612 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13616 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13617 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13619 mp->encap_vrf_id = ntohl (encap_vrf_id);
13620 mp->decap_next_index = ntohl (decap_next_index);
13621 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13622 mp->vni = ntohl (vni);
13623 mp->is_add = is_add;
13624 mp->is_ipv6 = ipv6_set;
13631 static void vl_api_geneve_tunnel_details_t_handler
13632 (vl_api_geneve_tunnel_details_t * mp)
13634 vat_main_t *vam = &vat_main;
13635 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13636 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13638 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13639 ntohl (mp->sw_if_index),
13640 format_ip46_address, &src, IP46_TYPE_ANY,
13641 format_ip46_address, &dst, IP46_TYPE_ANY,
13642 ntohl (mp->encap_vrf_id),
13643 ntohl (mp->decap_next_index), ntohl (mp->vni),
13644 ntohl (mp->mcast_sw_if_index));
13647 static void vl_api_geneve_tunnel_details_t_handler_json
13648 (vl_api_geneve_tunnel_details_t * mp)
13650 vat_main_t *vam = &vat_main;
13651 vat_json_node_t *node = NULL;
13653 if (VAT_JSON_ARRAY != vam->json_tree.type)
13655 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13656 vat_json_init_array (&vam->json_tree);
13658 node = vat_json_array_add (&vam->json_tree);
13660 vat_json_init_object (node);
13661 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13664 struct in6_addr ip6;
13666 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13667 vat_json_object_add_ip6 (node, "src_address", ip6);
13668 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13669 vat_json_object_add_ip6 (node, "dst_address", ip6);
13673 struct in_addr ip4;
13675 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13676 vat_json_object_add_ip4 (node, "src_address", ip4);
13677 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13678 vat_json_object_add_ip4 (node, "dst_address", ip4);
13680 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13681 vat_json_object_add_uint (node, "decap_next_index",
13682 ntohl (mp->decap_next_index));
13683 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13684 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13685 vat_json_object_add_uint (node, "mcast_sw_if_index",
13686 ntohl (mp->mcast_sw_if_index));
13690 api_geneve_tunnel_dump (vat_main_t * vam)
13692 unformat_input_t *i = vam->input;
13693 vl_api_geneve_tunnel_dump_t *mp;
13694 vl_api_control_ping_t *mp_ping;
13696 u8 sw_if_index_set = 0;
13699 /* Parse args required to build the message */
13700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13702 if (unformat (i, "sw_if_index %d", &sw_if_index))
13703 sw_if_index_set = 1;
13708 if (sw_if_index_set == 0)
13713 if (!vam->json_output)
13715 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13716 "sw_if_index", "local_address", "remote_address",
13717 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13720 /* Get list of geneve-tunnel interfaces */
13721 M (GENEVE_TUNNEL_DUMP, mp);
13723 mp->sw_if_index = htonl (sw_if_index);
13727 /* Use a control ping for synchronization */
13728 M (CONTROL_PING, mp_ping);
13736 api_gre_add_del_tunnel (vat_main_t * vam)
13738 unformat_input_t *line_input = vam->input;
13739 vl_api_gre_add_del_tunnel_t *mp;
13740 ip4_address_t src4, dst4;
13741 ip6_address_t src6, dst6;
13745 u8 t_type = GRE_TUNNEL_TYPE_L3;
13748 u32 outer_fib_id = 0;
13749 u32 session_id = 0;
13753 memset (&src4, 0, sizeof src4);
13754 memset (&dst4, 0, sizeof dst4);
13755 memset (&src6, 0, sizeof src6);
13756 memset (&dst6, 0, sizeof dst6);
13758 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13760 if (unformat (line_input, "del"))
13762 else if (unformat (line_input, "instance %d", &instance))
13764 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
13769 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
13774 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
13779 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
13784 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13786 else if (unformat (line_input, "teb"))
13787 t_type = GRE_TUNNEL_TYPE_TEB;
13788 else if (unformat (line_input, "erspan %d", &session_id))
13789 t_type = GRE_TUNNEL_TYPE_ERSPAN;
13792 errmsg ("parse error '%U'", format_unformat_error, line_input);
13799 errmsg ("tunnel src address not specified");
13804 errmsg ("tunnel dst address not specified");
13807 if (ipv4_set && ipv6_set)
13809 errmsg ("both IPv4 and IPv6 addresses specified");
13814 M (GRE_ADD_DEL_TUNNEL, mp);
13818 clib_memcpy (&mp->src_address, &src4, 4);
13819 clib_memcpy (&mp->dst_address, &dst4, 4);
13823 clib_memcpy (&mp->src_address, &src6, 16);
13824 clib_memcpy (&mp->dst_address, &dst6, 16);
13826 mp->instance = htonl (instance);
13827 mp->outer_fib_id = htonl (outer_fib_id);
13828 mp->is_add = is_add;
13829 mp->session_id = htons ((u16) session_id);
13830 mp->tunnel_type = t_type;
13831 mp->is_ipv6 = ipv6_set;
13838 static void vl_api_gre_tunnel_details_t_handler
13839 (vl_api_gre_tunnel_details_t * mp)
13841 vat_main_t *vam = &vat_main;
13842 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
13843 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
13845 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
13846 ntohl (mp->sw_if_index),
13847 ntohl (mp->instance),
13848 format_ip46_address, &src, IP46_TYPE_ANY,
13849 format_ip46_address, &dst, IP46_TYPE_ANY,
13850 mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id));
13853 static void vl_api_gre_tunnel_details_t_handler_json
13854 (vl_api_gre_tunnel_details_t * mp)
13856 vat_main_t *vam = &vat_main;
13857 vat_json_node_t *node = NULL;
13858 struct in_addr ip4;
13859 struct in6_addr ip6;
13861 if (VAT_JSON_ARRAY != vam->json_tree.type)
13863 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13864 vat_json_init_array (&vam->json_tree);
13866 node = vat_json_array_add (&vam->json_tree);
13868 vat_json_init_object (node);
13869 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13870 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13873 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
13874 vat_json_object_add_ip4 (node, "src_address", ip4);
13875 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
13876 vat_json_object_add_ip4 (node, "dst_address", ip4);
13880 clib_memcpy (&ip6, &mp->src_address, sizeof (ip6));
13881 vat_json_object_add_ip6 (node, "src_address", ip6);
13882 clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
13883 vat_json_object_add_ip6 (node, "dst_address", ip6);
13885 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type);
13886 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
13887 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
13888 vat_json_object_add_uint (node, "session_id", mp->session_id);
13892 api_gre_tunnel_dump (vat_main_t * vam)
13894 unformat_input_t *i = vam->input;
13895 vl_api_gre_tunnel_dump_t *mp;
13896 vl_api_control_ping_t *mp_ping;
13898 u8 sw_if_index_set = 0;
13901 /* Parse args required to build the message */
13902 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13904 if (unformat (i, "sw_if_index %d", &sw_if_index))
13905 sw_if_index_set = 1;
13910 if (sw_if_index_set == 0)
13915 if (!vam->json_output)
13917 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13918 "sw_if_index", "instance", "src_address", "dst_address",
13919 "tunnel_type", "outer_fib_id", "session_id");
13922 /* Get list of gre-tunnel interfaces */
13923 M (GRE_TUNNEL_DUMP, mp);
13925 mp->sw_if_index = htonl (sw_if_index);
13929 /* Use a control ping for synchronization */
13930 MPING (CONTROL_PING, mp_ping);
13938 api_l2_fib_clear_table (vat_main_t * vam)
13940 // unformat_input_t * i = vam->input;
13941 vl_api_l2_fib_clear_table_t *mp;
13944 M (L2_FIB_CLEAR_TABLE, mp);
13952 api_l2_interface_efp_filter (vat_main_t * vam)
13954 unformat_input_t *i = vam->input;
13955 vl_api_l2_interface_efp_filter_t *mp;
13958 u8 sw_if_index_set = 0;
13961 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13963 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13964 sw_if_index_set = 1;
13965 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13966 sw_if_index_set = 1;
13967 else if (unformat (i, "enable"))
13969 else if (unformat (i, "disable"))
13973 clib_warning ("parse error '%U'", format_unformat_error, i);
13978 if (sw_if_index_set == 0)
13980 errmsg ("missing sw_if_index");
13984 M (L2_INTERFACE_EFP_FILTER, mp);
13986 mp->sw_if_index = ntohl (sw_if_index);
13987 mp->enable_disable = enable;
13994 #define foreach_vtr_op \
13995 _("disable", L2_VTR_DISABLED) \
13996 _("push-1", L2_VTR_PUSH_1) \
13997 _("push-2", L2_VTR_PUSH_2) \
13998 _("pop-1", L2_VTR_POP_1) \
13999 _("pop-2", L2_VTR_POP_2) \
14000 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
14001 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
14002 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
14003 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
14006 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
14008 unformat_input_t *i = vam->input;
14009 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
14011 u8 sw_if_index_set = 0;
14014 u32 push_dot1q = 1;
14019 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14021 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14022 sw_if_index_set = 1;
14023 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14024 sw_if_index_set = 1;
14025 else if (unformat (i, "vtr_op %d", &vtr_op))
14027 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
14030 else if (unformat (i, "push_dot1q %d", &push_dot1q))
14032 else if (unformat (i, "tag1 %d", &tag1))
14034 else if (unformat (i, "tag2 %d", &tag2))
14038 clib_warning ("parse error '%U'", format_unformat_error, i);
14043 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
14045 errmsg ("missing vtr operation or sw_if_index");
14049 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
14050 mp->sw_if_index = ntohl (sw_if_index);
14051 mp->vtr_op = ntohl (vtr_op);
14052 mp->push_dot1q = ntohl (push_dot1q);
14053 mp->tag1 = ntohl (tag1);
14054 mp->tag2 = ntohl (tag2);
14062 api_create_vhost_user_if (vat_main_t * vam)
14064 unformat_input_t *i = vam->input;
14065 vl_api_create_vhost_user_if_t *mp;
14068 u8 file_name_set = 0;
14069 u32 custom_dev_instance = ~0;
14071 u8 use_custom_mac = 0;
14072 u8 disable_mrg_rxbuf = 0;
14073 u8 disable_indirect_desc = 0;
14077 /* Shut up coverity */
14078 memset (hwaddr, 0, sizeof (hwaddr));
14080 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14082 if (unformat (i, "socket %s", &file_name))
14086 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
14088 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
14089 use_custom_mac = 1;
14090 else if (unformat (i, "server"))
14092 else if (unformat (i, "disable_mrg_rxbuf"))
14093 disable_mrg_rxbuf = 1;
14094 else if (unformat (i, "disable_indirect_desc"))
14095 disable_indirect_desc = 1;
14096 else if (unformat (i, "tag %s", &tag))
14102 if (file_name_set == 0)
14104 errmsg ("missing socket file name");
14108 if (vec_len (file_name) > 255)
14110 errmsg ("socket file name too long");
14113 vec_add1 (file_name, 0);
14115 M (CREATE_VHOST_USER_IF, mp);
14117 mp->is_server = is_server;
14118 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
14119 mp->disable_indirect_desc = disable_indirect_desc;
14120 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
14121 vec_free (file_name);
14122 if (custom_dev_instance != ~0)
14125 mp->custom_dev_instance = ntohl (custom_dev_instance);
14128 mp->use_custom_mac = use_custom_mac;
14129 clib_memcpy (mp->mac_address, hwaddr, 6);
14131 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
14140 api_modify_vhost_user_if (vat_main_t * vam)
14142 unformat_input_t *i = vam->input;
14143 vl_api_modify_vhost_user_if_t *mp;
14146 u8 file_name_set = 0;
14147 u32 custom_dev_instance = ~0;
14148 u8 sw_if_index_set = 0;
14149 u32 sw_if_index = (u32) ~ 0;
14152 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14154 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14155 sw_if_index_set = 1;
14156 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14157 sw_if_index_set = 1;
14158 else if (unformat (i, "socket %s", &file_name))
14162 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
14164 else if (unformat (i, "server"))
14170 if (sw_if_index_set == 0)
14172 errmsg ("missing sw_if_index or interface name");
14176 if (file_name_set == 0)
14178 errmsg ("missing socket file name");
14182 if (vec_len (file_name) > 255)
14184 errmsg ("socket file name too long");
14187 vec_add1 (file_name, 0);
14189 M (MODIFY_VHOST_USER_IF, mp);
14191 mp->sw_if_index = ntohl (sw_if_index);
14192 mp->is_server = is_server;
14193 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
14194 vec_free (file_name);
14195 if (custom_dev_instance != ~0)
14198 mp->custom_dev_instance = ntohl (custom_dev_instance);
14207 api_delete_vhost_user_if (vat_main_t * vam)
14209 unformat_input_t *i = vam->input;
14210 vl_api_delete_vhost_user_if_t *mp;
14211 u32 sw_if_index = ~0;
14212 u8 sw_if_index_set = 0;
14215 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14217 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14218 sw_if_index_set = 1;
14219 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14220 sw_if_index_set = 1;
14225 if (sw_if_index_set == 0)
14227 errmsg ("missing sw_if_index or interface name");
14232 M (DELETE_VHOST_USER_IF, mp);
14234 mp->sw_if_index = ntohl (sw_if_index);
14241 static void vl_api_sw_interface_vhost_user_details_t_handler
14242 (vl_api_sw_interface_vhost_user_details_t * mp)
14244 vat_main_t *vam = &vat_main;
14246 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
14247 (char *) mp->interface_name,
14248 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
14249 clib_net_to_host_u64 (mp->features), mp->is_server,
14250 ntohl (mp->num_regions), (char *) mp->sock_filename);
14251 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
14254 static void vl_api_sw_interface_vhost_user_details_t_handler_json
14255 (vl_api_sw_interface_vhost_user_details_t * mp)
14257 vat_main_t *vam = &vat_main;
14258 vat_json_node_t *node = NULL;
14260 if (VAT_JSON_ARRAY != vam->json_tree.type)
14262 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14263 vat_json_init_array (&vam->json_tree);
14265 node = vat_json_array_add (&vam->json_tree);
14267 vat_json_init_object (node);
14268 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14269 vat_json_object_add_string_copy (node, "interface_name",
14270 mp->interface_name);
14271 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
14272 ntohl (mp->virtio_net_hdr_sz));
14273 vat_json_object_add_uint (node, "features",
14274 clib_net_to_host_u64 (mp->features));
14275 vat_json_object_add_uint (node, "is_server", mp->is_server);
14276 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
14277 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
14278 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
14282 api_sw_interface_vhost_user_dump (vat_main_t * vam)
14284 vl_api_sw_interface_vhost_user_dump_t *mp;
14285 vl_api_control_ping_t *mp_ping;
14288 "Interface name idx hdr_sz features server regions filename");
14290 /* Get list of vhost-user interfaces */
14291 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
14294 /* Use a control ping for synchronization */
14295 MPING (CONTROL_PING, mp_ping);
14303 api_show_version (vat_main_t * vam)
14305 vl_api_show_version_t *mp;
14308 M (SHOW_VERSION, mp);
14317 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
14319 unformat_input_t *line_input = vam->input;
14320 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
14321 ip4_address_t local4, remote4;
14322 ip6_address_t local6, remote6;
14324 u8 ipv4_set = 0, ipv6_set = 0;
14328 u32 mcast_sw_if_index = ~0;
14329 u32 encap_vrf_id = 0;
14330 u32 decap_vrf_id = 0;
14336 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
14337 memset (&local4, 0, sizeof local4);
14338 memset (&remote4, 0, sizeof remote4);
14339 memset (&local6, 0, sizeof local6);
14340 memset (&remote6, 0, sizeof remote6);
14342 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14344 if (unformat (line_input, "del"))
14346 else if (unformat (line_input, "local %U",
14347 unformat_ip4_address, &local4))
14352 else if (unformat (line_input, "remote %U",
14353 unformat_ip4_address, &remote4))
14358 else if (unformat (line_input, "local %U",
14359 unformat_ip6_address, &local6))
14364 else if (unformat (line_input, "remote %U",
14365 unformat_ip6_address, &remote6))
14370 else if (unformat (line_input, "group %U %U",
14371 unformat_ip4_address, &remote4,
14372 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14374 grp_set = remote_set = 1;
14377 else if (unformat (line_input, "group %U",
14378 unformat_ip4_address, &remote4))
14380 grp_set = remote_set = 1;
14383 else if (unformat (line_input, "group %U %U",
14384 unformat_ip6_address, &remote6,
14385 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14387 grp_set = remote_set = 1;
14390 else if (unformat (line_input, "group %U",
14391 unformat_ip6_address, &remote6))
14393 grp_set = remote_set = 1;
14397 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
14399 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
14401 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
14403 else if (unformat (line_input, "vni %d", &vni))
14405 else if (unformat (line_input, "next-ip4"))
14407 else if (unformat (line_input, "next-ip6"))
14409 else if (unformat (line_input, "next-ethernet"))
14411 else if (unformat (line_input, "next-nsh"))
14415 errmsg ("parse error '%U'", format_unformat_error, line_input);
14420 if (local_set == 0)
14422 errmsg ("tunnel local address not specified");
14425 if (remote_set == 0)
14427 errmsg ("tunnel remote address not specified");
14430 if (grp_set && mcast_sw_if_index == ~0)
14432 errmsg ("tunnel nonexistent multicast device");
14435 if (ipv4_set && ipv6_set)
14437 errmsg ("both IPv4 and IPv6 addresses specified");
14443 errmsg ("vni not specified");
14447 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
14452 clib_memcpy (&mp->local, &local6, sizeof (local6));
14453 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
14457 clib_memcpy (&mp->local, &local4, sizeof (local4));
14458 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
14461 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
14462 mp->encap_vrf_id = ntohl (encap_vrf_id);
14463 mp->decap_vrf_id = ntohl (decap_vrf_id);
14464 mp->protocol = protocol;
14465 mp->vni = ntohl (vni);
14466 mp->is_add = is_add;
14467 mp->is_ipv6 = ipv6_set;
14474 static void vl_api_vxlan_gpe_tunnel_details_t_handler
14475 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14477 vat_main_t *vam = &vat_main;
14478 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
14479 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
14481 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
14482 ntohl (mp->sw_if_index),
14483 format_ip46_address, &local, IP46_TYPE_ANY,
14484 format_ip46_address, &remote, IP46_TYPE_ANY,
14485 ntohl (mp->vni), mp->protocol,
14486 ntohl (mp->mcast_sw_if_index),
14487 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
14491 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
14492 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14494 vat_main_t *vam = &vat_main;
14495 vat_json_node_t *node = NULL;
14496 struct in_addr ip4;
14497 struct in6_addr ip6;
14499 if (VAT_JSON_ARRAY != vam->json_tree.type)
14501 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14502 vat_json_init_array (&vam->json_tree);
14504 node = vat_json_array_add (&vam->json_tree);
14506 vat_json_init_object (node);
14507 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14510 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
14511 vat_json_object_add_ip6 (node, "local", ip6);
14512 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
14513 vat_json_object_add_ip6 (node, "remote", ip6);
14517 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
14518 vat_json_object_add_ip4 (node, "local", ip4);
14519 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
14520 vat_json_object_add_ip4 (node, "remote", ip4);
14522 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
14523 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
14524 vat_json_object_add_uint (node, "mcast_sw_if_index",
14525 ntohl (mp->mcast_sw_if_index));
14526 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
14527 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
14528 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
14532 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14534 unformat_input_t *i = vam->input;
14535 vl_api_vxlan_gpe_tunnel_dump_t *mp;
14536 vl_api_control_ping_t *mp_ping;
14538 u8 sw_if_index_set = 0;
14541 /* Parse args required to build the message */
14542 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14544 if (unformat (i, "sw_if_index %d", &sw_if_index))
14545 sw_if_index_set = 1;
14550 if (sw_if_index_set == 0)
14555 if (!vam->json_output)
14557 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
14558 "sw_if_index", "local", "remote", "vni",
14559 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
14562 /* Get list of vxlan-tunnel interfaces */
14563 M (VXLAN_GPE_TUNNEL_DUMP, mp);
14565 mp->sw_if_index = htonl (sw_if_index);
14569 /* Use a control ping for synchronization */
14570 MPING (CONTROL_PING, mp_ping);
14577 static void vl_api_l2_fib_table_details_t_handler
14578 (vl_api_l2_fib_table_details_t * mp)
14580 vat_main_t *vam = &vat_main;
14582 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14584 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
14585 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14589 static void vl_api_l2_fib_table_details_t_handler_json
14590 (vl_api_l2_fib_table_details_t * mp)
14592 vat_main_t *vam = &vat_main;
14593 vat_json_node_t *node = NULL;
14595 if (VAT_JSON_ARRAY != vam->json_tree.type)
14597 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14598 vat_json_init_array (&vam->json_tree);
14600 node = vat_json_array_add (&vam->json_tree);
14602 vat_json_init_object (node);
14603 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
14604 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
14605 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14606 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14607 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14608 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14612 api_l2_fib_table_dump (vat_main_t * vam)
14614 unformat_input_t *i = vam->input;
14615 vl_api_l2_fib_table_dump_t *mp;
14616 vl_api_control_ping_t *mp_ping;
14621 /* Parse args required to build the message */
14622 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14624 if (unformat (i, "bd_id %d", &bd_id))
14630 if (bd_id_set == 0)
14632 errmsg ("missing bridge domain");
14636 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14638 /* Get list of l2 fib entries */
14639 M (L2_FIB_TABLE_DUMP, mp);
14641 mp->bd_id = ntohl (bd_id);
14644 /* Use a control ping for synchronization */
14645 MPING (CONTROL_PING, mp_ping);
14654 api_interface_name_renumber (vat_main_t * vam)
14656 unformat_input_t *line_input = vam->input;
14657 vl_api_interface_name_renumber_t *mp;
14658 u32 sw_if_index = ~0;
14659 u32 new_show_dev_instance = ~0;
14662 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14664 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14667 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14669 else if (unformat (line_input, "new_show_dev_instance %d",
14670 &new_show_dev_instance))
14676 if (sw_if_index == ~0)
14678 errmsg ("missing interface name or sw_if_index");
14682 if (new_show_dev_instance == ~0)
14684 errmsg ("missing new_show_dev_instance");
14688 M (INTERFACE_NAME_RENUMBER, mp);
14690 mp->sw_if_index = ntohl (sw_if_index);
14691 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14699 api_ip_probe_neighbor (vat_main_t * vam)
14701 unformat_input_t *i = vam->input;
14702 vl_api_ip_probe_neighbor_t *mp;
14710 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14712 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14714 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14716 else if (unformat (i, "address %U", unformat_ip4_address, dst_adr))
14718 else if (unformat (i, "address %U", unformat_ip6_address, dst_adr))
14729 errmsg ("missing interface");
14735 errmsg ("missing addresses");
14739 M (IP_PROBE_NEIGHBOR, mp);
14741 mp->sw_if_index = ntohl (sw_if_index);
14742 mp->is_ipv6 = is_ipv6;
14743 clib_memcpy (mp->dst_address, dst_adr, sizeof (dst_adr));
14751 api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14753 unformat_input_t *i = vam->input;
14754 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14755 u8 mode = IP_SCAN_V46_NEIGHBORS;
14756 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14759 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14761 if (unformat (i, "ip4"))
14762 mode = IP_SCAN_V4_NEIGHBORS;
14763 else if (unformat (i, "ip6"))
14764 mode = IP_SCAN_V6_NEIGHBORS;
14765 if (unformat (i, "both"))
14766 mode = IP_SCAN_V46_NEIGHBORS;
14767 else if (unformat (i, "disable"))
14768 mode = IP_SCAN_DISABLED;
14769 else if (unformat (i, "interval %d", &interval))
14771 else if (unformat (i, "max-time %d", &time))
14773 else if (unformat (i, "max-update %d", &update))
14775 else if (unformat (i, "delay %d", &delay))
14777 else if (unformat (i, "stale %d", &stale))
14783 if (interval > 255)
14785 errmsg ("interval cannot exceed 255 minutes.");
14790 errmsg ("max-time cannot exceed 255 usec.");
14795 errmsg ("max-update cannot exceed 255.");
14800 errmsg ("delay cannot exceed 255 msec.");
14805 errmsg ("stale cannot exceed 255 minutes.");
14809 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14811 mp->scan_interval = interval;
14812 mp->max_proc_time = time;
14813 mp->max_update = update;
14814 mp->scan_int_delay = delay;
14815 mp->stale_threshold = stale;
14823 api_want_ip4_arp_events (vat_main_t * vam)
14825 unformat_input_t *line_input = vam->input;
14826 vl_api_want_ip4_arp_events_t *mp;
14827 ip4_address_t address;
14828 int address_set = 0;
14829 u32 enable_disable = 1;
14832 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14834 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14836 else if (unformat (line_input, "del"))
14837 enable_disable = 0;
14842 if (address_set == 0)
14844 errmsg ("missing addresses");
14848 M (WANT_IP4_ARP_EVENTS, mp);
14849 mp->enable_disable = enable_disable;
14850 mp->pid = htonl (getpid ());
14851 mp->address = address.as_u32;
14859 api_want_ip6_nd_events (vat_main_t * vam)
14861 unformat_input_t *line_input = vam->input;
14862 vl_api_want_ip6_nd_events_t *mp;
14863 ip6_address_t address;
14864 int address_set = 0;
14865 u32 enable_disable = 1;
14868 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14870 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
14872 else if (unformat (line_input, "del"))
14873 enable_disable = 0;
14878 if (address_set == 0)
14880 errmsg ("missing addresses");
14884 M (WANT_IP6_ND_EVENTS, mp);
14885 mp->enable_disable = enable_disable;
14886 mp->pid = htonl (getpid ());
14887 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
14895 api_want_l2_macs_events (vat_main_t * vam)
14897 unformat_input_t *line_input = vam->input;
14898 vl_api_want_l2_macs_events_t *mp;
14899 u8 enable_disable = 1;
14900 u32 scan_delay = 0;
14901 u32 max_macs_in_event = 0;
14902 u32 learn_limit = 0;
14905 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14907 if (unformat (line_input, "learn-limit %d", &learn_limit))
14909 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14911 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14913 else if (unformat (line_input, "disable"))
14914 enable_disable = 0;
14919 M (WANT_L2_MACS_EVENTS, mp);
14920 mp->enable_disable = enable_disable;
14921 mp->pid = htonl (getpid ());
14922 mp->learn_limit = htonl (learn_limit);
14923 mp->scan_delay = (u8) scan_delay;
14924 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14931 api_input_acl_set_interface (vat_main_t * vam)
14933 unformat_input_t *i = vam->input;
14934 vl_api_input_acl_set_interface_t *mp;
14936 int sw_if_index_set;
14937 u32 ip4_table_index = ~0;
14938 u32 ip6_table_index = ~0;
14939 u32 l2_table_index = ~0;
14943 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14945 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14946 sw_if_index_set = 1;
14947 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14948 sw_if_index_set = 1;
14949 else if (unformat (i, "del"))
14951 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14953 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14955 else if (unformat (i, "l2-table %d", &l2_table_index))
14959 clib_warning ("parse error '%U'", format_unformat_error, i);
14964 if (sw_if_index_set == 0)
14966 errmsg ("missing interface name or sw_if_index");
14970 M (INPUT_ACL_SET_INTERFACE, mp);
14972 mp->sw_if_index = ntohl (sw_if_index);
14973 mp->ip4_table_index = ntohl (ip4_table_index);
14974 mp->ip6_table_index = ntohl (ip6_table_index);
14975 mp->l2_table_index = ntohl (l2_table_index);
14976 mp->is_add = is_add;
14984 api_output_acl_set_interface (vat_main_t * vam)
14986 unformat_input_t *i = vam->input;
14987 vl_api_output_acl_set_interface_t *mp;
14989 int sw_if_index_set;
14990 u32 ip4_table_index = ~0;
14991 u32 ip6_table_index = ~0;
14992 u32 l2_table_index = ~0;
14996 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14998 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14999 sw_if_index_set = 1;
15000 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15001 sw_if_index_set = 1;
15002 else if (unformat (i, "del"))
15004 else if (unformat (i, "ip4-table %d", &ip4_table_index))
15006 else if (unformat (i, "ip6-table %d", &ip6_table_index))
15008 else if (unformat (i, "l2-table %d", &l2_table_index))
15012 clib_warning ("parse error '%U'", format_unformat_error, i);
15017 if (sw_if_index_set == 0)
15019 errmsg ("missing interface name or sw_if_index");
15023 M (OUTPUT_ACL_SET_INTERFACE, mp);
15025 mp->sw_if_index = ntohl (sw_if_index);
15026 mp->ip4_table_index = ntohl (ip4_table_index);
15027 mp->ip6_table_index = ntohl (ip6_table_index);
15028 mp->l2_table_index = ntohl (l2_table_index);
15029 mp->is_add = is_add;
15037 api_ip_address_dump (vat_main_t * vam)
15039 unformat_input_t *i = vam->input;
15040 vl_api_ip_address_dump_t *mp;
15041 vl_api_control_ping_t *mp_ping;
15042 u32 sw_if_index = ~0;
15043 u8 sw_if_index_set = 0;
15048 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15050 if (unformat (i, "sw_if_index %d", &sw_if_index))
15051 sw_if_index_set = 1;
15053 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15054 sw_if_index_set = 1;
15055 else if (unformat (i, "ipv4"))
15057 else if (unformat (i, "ipv6"))
15063 if (ipv4_set && ipv6_set)
15065 errmsg ("ipv4 and ipv6 flags cannot be both set");
15069 if ((!ipv4_set) && (!ipv6_set))
15071 errmsg ("no ipv4 nor ipv6 flag set");
15075 if (sw_if_index_set == 0)
15077 errmsg ("missing interface name or sw_if_index");
15081 vam->current_sw_if_index = sw_if_index;
15082 vam->is_ipv6 = ipv6_set;
15084 M (IP_ADDRESS_DUMP, mp);
15085 mp->sw_if_index = ntohl (sw_if_index);
15086 mp->is_ipv6 = ipv6_set;
15089 /* Use a control ping for synchronization */
15090 MPING (CONTROL_PING, mp_ping);
15098 api_ip_dump (vat_main_t * vam)
15100 vl_api_ip_dump_t *mp;
15101 vl_api_control_ping_t *mp_ping;
15102 unformat_input_t *in = vam->input;
15109 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
15111 if (unformat (in, "ipv4"))
15113 else if (unformat (in, "ipv6"))
15119 if (ipv4_set && ipv6_set)
15121 errmsg ("ipv4 and ipv6 flags cannot be both set");
15125 if ((!ipv4_set) && (!ipv6_set))
15127 errmsg ("no ipv4 nor ipv6 flag set");
15131 is_ipv6 = ipv6_set;
15132 vam->is_ipv6 = is_ipv6;
15134 /* free old data */
15135 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
15137 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
15139 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
15142 mp->is_ipv6 = ipv6_set;
15145 /* Use a control ping for synchronization */
15146 MPING (CONTROL_PING, mp_ping);
15154 api_ipsec_spd_add_del (vat_main_t * vam)
15156 unformat_input_t *i = vam->input;
15157 vl_api_ipsec_spd_add_del_t *mp;
15162 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15164 if (unformat (i, "spd_id %d", &spd_id))
15166 else if (unformat (i, "del"))
15170 clib_warning ("parse error '%U'", format_unformat_error, i);
15176 errmsg ("spd_id must be set");
15180 M (IPSEC_SPD_ADD_DEL, mp);
15182 mp->spd_id = ntohl (spd_id);
15183 mp->is_add = is_add;
15191 api_ipsec_interface_add_del_spd (vat_main_t * vam)
15193 unformat_input_t *i = vam->input;
15194 vl_api_ipsec_interface_add_del_spd_t *mp;
15196 u8 sw_if_index_set = 0;
15197 u32 spd_id = (u32) ~ 0;
15201 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15203 if (unformat (i, "del"))
15205 else if (unformat (i, "spd_id %d", &spd_id))
15208 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15209 sw_if_index_set = 1;
15210 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15211 sw_if_index_set = 1;
15214 clib_warning ("parse error '%U'", format_unformat_error, i);
15220 if (spd_id == (u32) ~ 0)
15222 errmsg ("spd_id must be set");
15226 if (sw_if_index_set == 0)
15228 errmsg ("missing interface name or sw_if_index");
15232 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
15234 mp->spd_id = ntohl (spd_id);
15235 mp->sw_if_index = ntohl (sw_if_index);
15236 mp->is_add = is_add;
15244 api_ipsec_spd_add_del_entry (vat_main_t * vam)
15246 unformat_input_t *i = vam->input;
15247 vl_api_ipsec_spd_add_del_entry_t *mp;
15248 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
15249 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
15251 u32 rport_start = 0, rport_stop = (u32) ~ 0;
15252 u32 lport_start = 0, lport_stop = (u32) ~ 0;
15253 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
15254 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
15257 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
15258 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
15259 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
15260 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
15261 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
15262 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
15264 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15266 if (unformat (i, "del"))
15268 if (unformat (i, "outbound"))
15270 if (unformat (i, "inbound"))
15272 else if (unformat (i, "spd_id %d", &spd_id))
15274 else if (unformat (i, "sa_id %d", &sa_id))
15276 else if (unformat (i, "priority %d", &priority))
15278 else if (unformat (i, "protocol %d", &protocol))
15280 else if (unformat (i, "lport_start %d", &lport_start))
15282 else if (unformat (i, "lport_stop %d", &lport_stop))
15284 else if (unformat (i, "rport_start %d", &rport_start))
15286 else if (unformat (i, "rport_stop %d", &rport_stop))
15290 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
15296 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
15303 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
15309 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
15316 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
15322 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
15329 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
15335 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
15341 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
15343 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
15345 clib_warning ("unsupported action: 'resolve'");
15351 clib_warning ("parse error '%U'", format_unformat_error, i);
15357 M (IPSEC_SPD_ADD_DEL_ENTRY, mp);
15359 mp->spd_id = ntohl (spd_id);
15360 mp->priority = ntohl (priority);
15361 mp->is_outbound = is_outbound;
15363 mp->is_ipv6 = is_ipv6;
15364 if (is_ipv6 || is_ip_any)
15366 clib_memcpy (mp->remote_address_start, &raddr6_start,
15367 sizeof (ip6_address_t));
15368 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
15369 sizeof (ip6_address_t));
15370 clib_memcpy (mp->local_address_start, &laddr6_start,
15371 sizeof (ip6_address_t));
15372 clib_memcpy (mp->local_address_stop, &laddr6_stop,
15373 sizeof (ip6_address_t));
15377 clib_memcpy (mp->remote_address_start, &raddr4_start,
15378 sizeof (ip4_address_t));
15379 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
15380 sizeof (ip4_address_t));
15381 clib_memcpy (mp->local_address_start, &laddr4_start,
15382 sizeof (ip4_address_t));
15383 clib_memcpy (mp->local_address_stop, &laddr4_stop,
15384 sizeof (ip4_address_t));
15386 mp->protocol = (u8) protocol;
15387 mp->local_port_start = ntohs ((u16) lport_start);
15388 mp->local_port_stop = ntohs ((u16) lport_stop);
15389 mp->remote_port_start = ntohs ((u16) rport_start);
15390 mp->remote_port_stop = ntohs ((u16) rport_stop);
15391 mp->policy = (u8) policy;
15392 mp->sa_id = ntohl (sa_id);
15393 mp->is_add = is_add;
15394 mp->is_ip_any = is_ip_any;
15401 api_ipsec_sad_add_del_entry (vat_main_t * vam)
15403 unformat_input_t *i = vam->input;
15404 vl_api_ipsec_sad_add_del_entry_t *mp;
15405 u32 sad_id = 0, spi = 0;
15406 u8 *ck = 0, *ik = 0;
15409 u8 protocol = IPSEC_PROTOCOL_AH;
15410 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
15411 u32 crypto_alg = 0, integ_alg = 0;
15412 ip4_address_t tun_src4;
15413 ip4_address_t tun_dst4;
15414 ip6_address_t tun_src6;
15415 ip6_address_t tun_dst6;
15418 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15420 if (unformat (i, "del"))
15422 else if (unformat (i, "sad_id %d", &sad_id))
15424 else if (unformat (i, "spi %d", &spi))
15426 else if (unformat (i, "esp"))
15427 protocol = IPSEC_PROTOCOL_ESP;
15428 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
15431 is_tunnel_ipv6 = 0;
15433 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
15436 is_tunnel_ipv6 = 0;
15438 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
15441 is_tunnel_ipv6 = 1;
15443 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
15446 is_tunnel_ipv6 = 1;
15450 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15452 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15454 clib_warning ("unsupported crypto-alg: '%U'",
15455 format_ipsec_crypto_alg, crypto_alg);
15459 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15463 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15465 if (integ_alg >= IPSEC_INTEG_N_ALG)
15467 clib_warning ("unsupported integ-alg: '%U'",
15468 format_ipsec_integ_alg, integ_alg);
15472 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15476 clib_warning ("parse error '%U'", format_unformat_error, i);
15482 M (IPSEC_SAD_ADD_DEL_ENTRY, mp);
15484 mp->sad_id = ntohl (sad_id);
15485 mp->is_add = is_add;
15486 mp->protocol = protocol;
15487 mp->spi = ntohl (spi);
15488 mp->is_tunnel = is_tunnel;
15489 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
15490 mp->crypto_algorithm = crypto_alg;
15491 mp->integrity_algorithm = integ_alg;
15492 mp->crypto_key_length = vec_len (ck);
15493 mp->integrity_key_length = vec_len (ik);
15495 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15496 mp->crypto_key_length = sizeof (mp->crypto_key);
15498 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15499 mp->integrity_key_length = sizeof (mp->integrity_key);
15502 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15504 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15508 if (is_tunnel_ipv6)
15510 clib_memcpy (mp->tunnel_src_address, &tun_src6,
15511 sizeof (ip6_address_t));
15512 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
15513 sizeof (ip6_address_t));
15517 clib_memcpy (mp->tunnel_src_address, &tun_src4,
15518 sizeof (ip4_address_t));
15519 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
15520 sizeof (ip4_address_t));
15530 api_ipsec_sa_set_key (vat_main_t * vam)
15532 unformat_input_t *i = vam->input;
15533 vl_api_ipsec_sa_set_key_t *mp;
15535 u8 *ck = 0, *ik = 0;
15538 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15540 if (unformat (i, "sa_id %d", &sa_id))
15542 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15544 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15548 clib_warning ("parse error '%U'", format_unformat_error, i);
15553 M (IPSEC_SA_SET_KEY, mp);
15555 mp->sa_id = ntohl (sa_id);
15556 mp->crypto_key_length = vec_len (ck);
15557 mp->integrity_key_length = vec_len (ik);
15559 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15560 mp->crypto_key_length = sizeof (mp->crypto_key);
15562 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15563 mp->integrity_key_length = sizeof (mp->integrity_key);
15566 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15568 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15576 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
15578 unformat_input_t *i = vam->input;
15579 vl_api_ipsec_tunnel_if_add_del_t *mp;
15580 u32 local_spi = 0, remote_spi = 0;
15581 u32 crypto_alg = 0, integ_alg = 0;
15582 u8 *lck = NULL, *rck = NULL;
15583 u8 *lik = NULL, *rik = NULL;
15584 ip4_address_t local_ip = { {0} };
15585 ip4_address_t remote_ip = { {0} };
15588 u8 anti_replay = 0;
15593 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15595 if (unformat (i, "del"))
15597 else if (unformat (i, "esn"))
15599 else if (unformat (i, "anti_replay"))
15601 else if (unformat (i, "local_spi %d", &local_spi))
15603 else if (unformat (i, "remote_spi %d", &remote_spi))
15605 else if (unformat (i, "local_ip %U", unformat_ip4_address, &local_ip))
15607 else if (unformat (i, "remote_ip %U", unformat_ip4_address, &remote_ip))
15609 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
15612 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
15614 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
15616 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
15620 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15622 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15624 errmsg ("unsupported crypto-alg: '%U'\n",
15625 format_ipsec_crypto_alg, crypto_alg);
15631 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15633 if (integ_alg >= IPSEC_INTEG_N_ALG)
15635 errmsg ("unsupported integ-alg: '%U'\n",
15636 format_ipsec_integ_alg, integ_alg);
15640 else if (unformat (i, "instance %u", &instance))
15644 errmsg ("parse error '%U'\n", format_unformat_error, i);
15649 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
15651 mp->is_add = is_add;
15653 mp->anti_replay = anti_replay;
15655 clib_memcpy (mp->local_ip, &local_ip, sizeof (ip4_address_t));
15656 clib_memcpy (mp->remote_ip, &remote_ip, sizeof (ip4_address_t));
15658 mp->local_spi = htonl (local_spi);
15659 mp->remote_spi = htonl (remote_spi);
15660 mp->crypto_alg = (u8) crypto_alg;
15662 mp->local_crypto_key_len = 0;
15665 mp->local_crypto_key_len = vec_len (lck);
15666 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15667 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15668 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15671 mp->remote_crypto_key_len = 0;
15674 mp->remote_crypto_key_len = vec_len (rck);
15675 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15676 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15677 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15680 mp->integ_alg = (u8) integ_alg;
15682 mp->local_integ_key_len = 0;
15685 mp->local_integ_key_len = vec_len (lik);
15686 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15687 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15688 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15691 mp->remote_integ_key_len = 0;
15694 mp->remote_integ_key_len = vec_len (rik);
15695 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15696 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15697 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15702 mp->renumber = renumber;
15703 mp->show_instance = ntohl (instance);
15712 vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15714 vat_main_t *vam = &vat_main;
15716 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
15717 "crypto_key %U integ_alg %u integ_key %U use_esn %u "
15718 "use_anti_replay %u is_tunnel %u is_tunnel_ip6 %u "
15719 "tunnel_src_addr %U tunnel_dst_addr %U "
15720 "salt %u seq_outbound %lu last_seq_inbound %lu "
15721 "replay_window %lu total_data_size %lu\n",
15722 ntohl (mp->sa_id), ntohl (mp->sw_if_index), ntohl (mp->spi),
15724 mp->crypto_alg, format_hex_bytes, mp->crypto_key, mp->crypto_key_len,
15725 mp->integ_alg, format_hex_bytes, mp->integ_key, mp->integ_key_len,
15726 mp->use_esn, mp->use_anti_replay, mp->is_tunnel, mp->is_tunnel_ip6,
15727 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15728 mp->tunnel_src_addr,
15729 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15730 mp->tunnel_dst_addr,
15732 clib_net_to_host_u64 (mp->seq_outbound),
15733 clib_net_to_host_u64 (mp->last_seq_inbound),
15734 clib_net_to_host_u64 (mp->replay_window),
15735 clib_net_to_host_u64 (mp->total_data_size));
15738 #define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15739 #define vl_api_ipsec_sa_details_t_print vl_noop_handler
15741 static void vl_api_ipsec_sa_details_t_handler_json
15742 (vl_api_ipsec_sa_details_t * mp)
15744 vat_main_t *vam = &vat_main;
15745 vat_json_node_t *node = NULL;
15746 struct in_addr src_ip4, dst_ip4;
15747 struct in6_addr src_ip6, dst_ip6;
15749 if (VAT_JSON_ARRAY != vam->json_tree.type)
15751 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15752 vat_json_init_array (&vam->json_tree);
15754 node = vat_json_array_add (&vam->json_tree);
15756 vat_json_init_object (node);
15757 vat_json_object_add_uint (node, "sa_id", ntohl (mp->sa_id));
15758 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15759 vat_json_object_add_uint (node, "spi", ntohl (mp->spi));
15760 vat_json_object_add_uint (node, "proto", mp->protocol);
15761 vat_json_object_add_uint (node, "crypto_alg", mp->crypto_alg);
15762 vat_json_object_add_uint (node, "integ_alg", mp->integ_alg);
15763 vat_json_object_add_uint (node, "use_esn", mp->use_esn);
15764 vat_json_object_add_uint (node, "use_anti_replay", mp->use_anti_replay);
15765 vat_json_object_add_uint (node, "is_tunnel", mp->is_tunnel);
15766 vat_json_object_add_uint (node, "is_tunnel_ip6", mp->is_tunnel_ip6);
15767 vat_json_object_add_bytes (node, "crypto_key", mp->crypto_key,
15768 mp->crypto_key_len);
15769 vat_json_object_add_bytes (node, "integ_key", mp->integ_key,
15770 mp->integ_key_len);
15771 if (mp->is_tunnel_ip6)
15773 clib_memcpy (&src_ip6, mp->tunnel_src_addr, sizeof (src_ip6));
15774 vat_json_object_add_ip6 (node, "tunnel_src_addr", src_ip6);
15775 clib_memcpy (&dst_ip6, mp->tunnel_dst_addr, sizeof (dst_ip6));
15776 vat_json_object_add_ip6 (node, "tunnel_dst_addr", dst_ip6);
15780 clib_memcpy (&src_ip4, mp->tunnel_src_addr, sizeof (src_ip4));
15781 vat_json_object_add_ip4 (node, "tunnel_src_addr", src_ip4);
15782 clib_memcpy (&dst_ip4, mp->tunnel_dst_addr, sizeof (dst_ip4));
15783 vat_json_object_add_ip4 (node, "tunnel_dst_addr", dst_ip4);
15785 vat_json_object_add_uint (node, "replay_window",
15786 clib_net_to_host_u64 (mp->replay_window));
15787 vat_json_object_add_uint (node, "total_data_size",
15788 clib_net_to_host_u64 (mp->total_data_size));
15793 api_ipsec_sa_dump (vat_main_t * vam)
15795 unformat_input_t *i = vam->input;
15796 vl_api_ipsec_sa_dump_t *mp;
15797 vl_api_control_ping_t *mp_ping;
15801 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15803 if (unformat (i, "sa_id %d", &sa_id))
15807 clib_warning ("parse error '%U'", format_unformat_error, i);
15812 M (IPSEC_SA_DUMP, mp);
15814 mp->sa_id = ntohl (sa_id);
15818 /* Use a control ping for synchronization */
15819 M (CONTROL_PING, mp_ping);
15827 api_ipsec_tunnel_if_set_key (vat_main_t * vam)
15829 unformat_input_t *i = vam->input;
15830 vl_api_ipsec_tunnel_if_set_key_t *mp;
15831 u32 sw_if_index = ~0;
15832 u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE;
15837 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15839 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15842 if (unformat (i, "local crypto %U", unformat_ipsec_crypto_alg, &alg))
15843 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO;
15845 if (unformat (i, "remote crypto %U", unformat_ipsec_crypto_alg, &alg))
15846 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO;
15847 else if (unformat (i, "local integ %U", unformat_ipsec_integ_alg, &alg))
15848 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG;
15850 if (unformat (i, "remote integ %U", unformat_ipsec_integ_alg, &alg))
15851 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG;
15852 else if (unformat (i, "%U", unformat_hex_string, &key))
15856 clib_warning ("parse error '%U'", format_unformat_error, i);
15861 if (sw_if_index == ~0)
15863 errmsg ("interface must be specified");
15867 if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE)
15869 errmsg ("key type must be specified");
15875 errmsg ("algorithm must be specified");
15879 if (vec_len (key) == 0)
15881 errmsg ("key must be specified");
15885 M (IPSEC_TUNNEL_IF_SET_KEY, mp);
15887 mp->sw_if_index = htonl (sw_if_index);
15889 mp->key_type = key_type;
15890 mp->key_len = vec_len (key);
15891 clib_memcpy (mp->key, key, vec_len (key));
15900 api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15902 unformat_input_t *i = vam->input;
15903 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15904 u32 sw_if_index = ~0;
15906 u8 is_outbound = (u8) ~ 0;
15909 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15911 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15913 else if (unformat (i, "sa_id %d", &sa_id))
15915 else if (unformat (i, "outbound"))
15917 else if (unformat (i, "inbound"))
15921 clib_warning ("parse error '%U'", format_unformat_error, i);
15926 if (sw_if_index == ~0)
15928 errmsg ("interface must be specified");
15934 errmsg ("SA ID must be specified");
15938 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15940 mp->sw_if_index = htonl (sw_if_index);
15941 mp->sa_id = htonl (sa_id);
15942 mp->is_outbound = is_outbound;
15951 api_ikev2_profile_add_del (vat_main_t * vam)
15953 unformat_input_t *i = vam->input;
15954 vl_api_ikev2_profile_add_del_t *mp;
15959 const char *valid_chars = "a-zA-Z0-9_";
15961 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15963 if (unformat (i, "del"))
15965 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15966 vec_add1 (name, 0);
15969 errmsg ("parse error '%U'", format_unformat_error, i);
15974 if (!vec_len (name))
15976 errmsg ("profile name must be specified");
15980 if (vec_len (name) > 64)
15982 errmsg ("profile name too long");
15986 M (IKEV2_PROFILE_ADD_DEL, mp);
15988 clib_memcpy (mp->name, name, vec_len (name));
15989 mp->is_add = is_add;
15998 api_ikev2_profile_set_auth (vat_main_t * vam)
16000 unformat_input_t *i = vam->input;
16001 vl_api_ikev2_profile_set_auth_t *mp;
16004 u32 auth_method = 0;
16008 const char *valid_chars = "a-zA-Z0-9_";
16010 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16012 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
16013 vec_add1 (name, 0);
16014 else if (unformat (i, "auth_method %U",
16015 unformat_ikev2_auth_method, &auth_method))
16017 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
16019 else if (unformat (i, "auth_data %v", &data))
16023 errmsg ("parse error '%U'", format_unformat_error, i);
16028 if (!vec_len (name))
16030 errmsg ("profile name must be specified");
16034 if (vec_len (name) > 64)
16036 errmsg ("profile name too long");
16040 if (!vec_len (data))
16042 errmsg ("auth_data must be specified");
16048 errmsg ("auth_method must be specified");
16052 M (IKEV2_PROFILE_SET_AUTH, mp);
16054 mp->is_hex = is_hex;
16055 mp->auth_method = (u8) auth_method;
16056 mp->data_len = vec_len (data);
16057 clib_memcpy (mp->name, name, vec_len (name));
16058 clib_memcpy (mp->data, data, vec_len (data));
16068 api_ikev2_profile_set_id (vat_main_t * vam)
16070 unformat_input_t *i = vam->input;
16071 vl_api_ikev2_profile_set_id_t *mp;
16079 const char *valid_chars = "a-zA-Z0-9_";
16081 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16083 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
16084 vec_add1 (name, 0);
16085 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
16087 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
16089 data = vec_new (u8, 4);
16090 clib_memcpy (data, ip4.as_u8, 4);
16092 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
16094 else if (unformat (i, "id_data %v", &data))
16096 else if (unformat (i, "local"))
16098 else if (unformat (i, "remote"))
16102 errmsg ("parse error '%U'", format_unformat_error, i);
16107 if (!vec_len (name))
16109 errmsg ("profile name must be specified");
16113 if (vec_len (name) > 64)
16115 errmsg ("profile name too long");
16119 if (!vec_len (data))
16121 errmsg ("id_data must be specified");
16127 errmsg ("id_type must be specified");
16131 M (IKEV2_PROFILE_SET_ID, mp);
16133 mp->is_local = is_local;
16134 mp->id_type = (u8) id_type;
16135 mp->data_len = vec_len (data);
16136 clib_memcpy (mp->name, name, vec_len (name));
16137 clib_memcpy (mp->data, data, vec_len (data));
16147 api_ikev2_profile_set_ts (vat_main_t * vam)
16149 unformat_input_t *i = vam->input;
16150 vl_api_ikev2_profile_set_ts_t *mp;
16153 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
16154 ip4_address_t start_addr, end_addr;
16156 const char *valid_chars = "a-zA-Z0-9_";
16159 start_addr.as_u32 = 0;
16160 end_addr.as_u32 = (u32) ~ 0;
16162 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16164 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
16165 vec_add1 (name, 0);
16166 else if (unformat (i, "protocol %d", &proto))
16168 else if (unformat (i, "start_port %d", &start_port))
16170 else if (unformat (i, "end_port %d", &end_port))
16173 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
16175 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
16177 else if (unformat (i, "local"))
16179 else if (unformat (i, "remote"))
16183 errmsg ("parse error '%U'", format_unformat_error, i);
16188 if (!vec_len (name))
16190 errmsg ("profile name must be specified");
16194 if (vec_len (name) > 64)
16196 errmsg ("profile name too long");
16200 M (IKEV2_PROFILE_SET_TS, mp);
16202 mp->is_local = is_local;
16203 mp->proto = (u8) proto;
16204 mp->start_port = (u16) start_port;
16205 mp->end_port = (u16) end_port;
16206 mp->start_addr = start_addr.as_u32;
16207 mp->end_addr = end_addr.as_u32;
16208 clib_memcpy (mp->name, name, vec_len (name));
16217 api_ikev2_set_local_key (vat_main_t * vam)
16219 unformat_input_t *i = vam->input;
16220 vl_api_ikev2_set_local_key_t *mp;
16224 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16226 if (unformat (i, "file %v", &file))
16227 vec_add1 (file, 0);
16230 errmsg ("parse error '%U'", format_unformat_error, i);
16235 if (!vec_len (file))
16237 errmsg ("RSA key file must be specified");
16241 if (vec_len (file) > 256)
16243 errmsg ("file name too long");
16247 M (IKEV2_SET_LOCAL_KEY, mp);
16249 clib_memcpy (mp->key_file, file, vec_len (file));
16258 api_ikev2_set_responder (vat_main_t * vam)
16260 unformat_input_t *i = vam->input;
16261 vl_api_ikev2_set_responder_t *mp;
16264 u32 sw_if_index = ~0;
16265 ip4_address_t address;
16267 const char *valid_chars = "a-zA-Z0-9_";
16269 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16272 (i, "%U interface %d address %U", unformat_token, valid_chars,
16273 &name, &sw_if_index, unformat_ip4_address, &address))
16274 vec_add1 (name, 0);
16277 errmsg ("parse error '%U'", format_unformat_error, i);
16282 if (!vec_len (name))
16284 errmsg ("profile name must be specified");
16288 if (vec_len (name) > 64)
16290 errmsg ("profile name too long");
16294 M (IKEV2_SET_RESPONDER, mp);
16296 clib_memcpy (mp->name, name, vec_len (name));
16299 mp->sw_if_index = sw_if_index;
16300 clib_memcpy (mp->address, &address, sizeof (address));
16308 api_ikev2_set_ike_transforms (vat_main_t * vam)
16310 unformat_input_t *i = vam->input;
16311 vl_api_ikev2_set_ike_transforms_t *mp;
16314 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
16316 const char *valid_chars = "a-zA-Z0-9_";
16318 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16320 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
16321 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
16322 vec_add1 (name, 0);
16325 errmsg ("parse error '%U'", format_unformat_error, i);
16330 if (!vec_len (name))
16332 errmsg ("profile name must be specified");
16336 if (vec_len (name) > 64)
16338 errmsg ("profile name too long");
16342 M (IKEV2_SET_IKE_TRANSFORMS, mp);
16344 clib_memcpy (mp->name, name, vec_len (name));
16346 mp->crypto_alg = crypto_alg;
16347 mp->crypto_key_size = crypto_key_size;
16348 mp->integ_alg = integ_alg;
16349 mp->dh_group = dh_group;
16358 api_ikev2_set_esp_transforms (vat_main_t * vam)
16360 unformat_input_t *i = vam->input;
16361 vl_api_ikev2_set_esp_transforms_t *mp;
16364 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
16366 const char *valid_chars = "a-zA-Z0-9_";
16368 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16370 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
16371 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
16372 vec_add1 (name, 0);
16375 errmsg ("parse error '%U'", format_unformat_error, i);
16380 if (!vec_len (name))
16382 errmsg ("profile name must be specified");
16386 if (vec_len (name) > 64)
16388 errmsg ("profile name too long");
16392 M (IKEV2_SET_ESP_TRANSFORMS, mp);
16394 clib_memcpy (mp->name, name, vec_len (name));
16396 mp->crypto_alg = crypto_alg;
16397 mp->crypto_key_size = crypto_key_size;
16398 mp->integ_alg = integ_alg;
16399 mp->dh_group = dh_group;
16407 api_ikev2_set_sa_lifetime (vat_main_t * vam)
16409 unformat_input_t *i = vam->input;
16410 vl_api_ikev2_set_sa_lifetime_t *mp;
16413 u64 lifetime, lifetime_maxdata;
16414 u32 lifetime_jitter, handover;
16416 const char *valid_chars = "a-zA-Z0-9_";
16418 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16420 if (unformat (i, "%U %lu %u %u %lu", unformat_token, valid_chars, &name,
16421 &lifetime, &lifetime_jitter, &handover,
16422 &lifetime_maxdata))
16423 vec_add1 (name, 0);
16426 errmsg ("parse error '%U'", format_unformat_error, i);
16431 if (!vec_len (name))
16433 errmsg ("profile name must be specified");
16437 if (vec_len (name) > 64)
16439 errmsg ("profile name too long");
16443 M (IKEV2_SET_SA_LIFETIME, mp);
16445 clib_memcpy (mp->name, name, vec_len (name));
16447 mp->lifetime = lifetime;
16448 mp->lifetime_jitter = lifetime_jitter;
16449 mp->handover = handover;
16450 mp->lifetime_maxdata = lifetime_maxdata;
16458 api_ikev2_initiate_sa_init (vat_main_t * vam)
16460 unformat_input_t *i = vam->input;
16461 vl_api_ikev2_initiate_sa_init_t *mp;
16465 const char *valid_chars = "a-zA-Z0-9_";
16467 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16469 if (unformat (i, "%U", unformat_token, valid_chars, &name))
16470 vec_add1 (name, 0);
16473 errmsg ("parse error '%U'", format_unformat_error, i);
16478 if (!vec_len (name))
16480 errmsg ("profile name must be specified");
16484 if (vec_len (name) > 64)
16486 errmsg ("profile name too long");
16490 M (IKEV2_INITIATE_SA_INIT, mp);
16492 clib_memcpy (mp->name, name, vec_len (name));
16501 api_ikev2_initiate_del_ike_sa (vat_main_t * vam)
16503 unformat_input_t *i = vam->input;
16504 vl_api_ikev2_initiate_del_ike_sa_t *mp;
16509 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16511 if (unformat (i, "%lx", &ispi))
16515 errmsg ("parse error '%U'", format_unformat_error, i);
16520 M (IKEV2_INITIATE_DEL_IKE_SA, mp);
16530 api_ikev2_initiate_del_child_sa (vat_main_t * vam)
16532 unformat_input_t *i = vam->input;
16533 vl_api_ikev2_initiate_del_child_sa_t *mp;
16538 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16540 if (unformat (i, "%x", &ispi))
16544 errmsg ("parse error '%U'", format_unformat_error, i);
16549 M (IKEV2_INITIATE_DEL_CHILD_SA, mp);
16559 api_ikev2_initiate_rekey_child_sa (vat_main_t * vam)
16561 unformat_input_t *i = vam->input;
16562 vl_api_ikev2_initiate_rekey_child_sa_t *mp;
16567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16569 if (unformat (i, "%x", &ispi))
16573 errmsg ("parse error '%U'", format_unformat_error, i);
16578 M (IKEV2_INITIATE_REKEY_CHILD_SA, mp);
16588 api_get_first_msg_id (vat_main_t * vam)
16590 vl_api_get_first_msg_id_t *mp;
16591 unformat_input_t *i = vam->input;
16596 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16598 if (unformat (i, "client %s", &name))
16606 errmsg ("missing client name");
16609 vec_add1 (name, 0);
16611 if (vec_len (name) > 63)
16613 errmsg ("client name too long");
16617 M (GET_FIRST_MSG_ID, mp);
16618 clib_memcpy (mp->name, name, vec_len (name));
16625 api_cop_interface_enable_disable (vat_main_t * vam)
16627 unformat_input_t *line_input = vam->input;
16628 vl_api_cop_interface_enable_disable_t *mp;
16629 u32 sw_if_index = ~0;
16630 u8 enable_disable = 1;
16633 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16635 if (unformat (line_input, "disable"))
16636 enable_disable = 0;
16637 if (unformat (line_input, "enable"))
16638 enable_disable = 1;
16639 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16640 vam, &sw_if_index))
16642 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16648 if (sw_if_index == ~0)
16650 errmsg ("missing interface name or sw_if_index");
16654 /* Construct the API message */
16655 M (COP_INTERFACE_ENABLE_DISABLE, mp);
16656 mp->sw_if_index = ntohl (sw_if_index);
16657 mp->enable_disable = enable_disable;
16661 /* Wait for the reply */
16667 api_cop_whitelist_enable_disable (vat_main_t * vam)
16669 unformat_input_t *line_input = vam->input;
16670 vl_api_cop_whitelist_enable_disable_t *mp;
16671 u32 sw_if_index = ~0;
16672 u8 ip4 = 0, ip6 = 0, default_cop = 0;
16676 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16678 if (unformat (line_input, "ip4"))
16680 else if (unformat (line_input, "ip6"))
16682 else if (unformat (line_input, "default"))
16684 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16685 vam, &sw_if_index))
16687 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16689 else if (unformat (line_input, "fib-id %d", &fib_id))
16695 if (sw_if_index == ~0)
16697 errmsg ("missing interface name or sw_if_index");
16701 /* Construct the API message */
16702 M (COP_WHITELIST_ENABLE_DISABLE, mp);
16703 mp->sw_if_index = ntohl (sw_if_index);
16704 mp->fib_id = ntohl (fib_id);
16707 mp->default_cop = default_cop;
16711 /* Wait for the reply */
16717 api_get_node_graph (vat_main_t * vam)
16719 vl_api_get_node_graph_t *mp;
16722 M (GET_NODE_GRAPH, mp);
16726 /* Wait for the reply */
16732 /** Used for parsing LISP eids */
16733 typedef CLIB_PACKED(struct{
16734 u8 addr[16]; /**< eid address */
16735 u32 len; /**< prefix length if IP */
16736 u8 type; /**< type of eid */
16741 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
16743 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
16745 memset (a, 0, sizeof (a[0]));
16747 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
16749 a->type = 0; /* ipv4 type */
16751 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
16753 a->type = 1; /* ipv6 type */
16755 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
16757 a->type = 2; /* mac type */
16759 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
16761 a->type = 3; /* NSH type */
16762 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
16763 nsh->spi = clib_host_to_net_u32 (nsh->spi);
16770 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
16779 lisp_eid_size_vat (u8 type)
16796 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
16798 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
16802 api_one_add_del_locator_set (vat_main_t * vam)
16804 unformat_input_t *input = vam->input;
16805 vl_api_one_add_del_locator_set_t *mp;
16807 u8 *locator_set_name = NULL;
16808 u8 locator_set_name_set = 0;
16809 vl_api_local_locator_t locator, *locators = 0;
16810 u32 sw_if_index, priority, weight;
16814 /* Parse args required to build the message */
16815 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16817 if (unformat (input, "del"))
16821 else if (unformat (input, "locator-set %s", &locator_set_name))
16823 locator_set_name_set = 1;
16825 else if (unformat (input, "sw_if_index %u p %u w %u",
16826 &sw_if_index, &priority, &weight))
16828 locator.sw_if_index = htonl (sw_if_index);
16829 locator.priority = priority;
16830 locator.weight = weight;
16831 vec_add1 (locators, locator);
16835 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
16836 &sw_if_index, &priority, &weight))
16838 locator.sw_if_index = htonl (sw_if_index);
16839 locator.priority = priority;
16840 locator.weight = weight;
16841 vec_add1 (locators, locator);
16847 if (locator_set_name_set == 0)
16849 errmsg ("missing locator-set name");
16850 vec_free (locators);
16854 if (vec_len (locator_set_name) > 64)
16856 errmsg ("locator-set name too long");
16857 vec_free (locator_set_name);
16858 vec_free (locators);
16861 vec_add1 (locator_set_name, 0);
16863 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
16865 /* Construct the API message */
16866 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
16868 mp->is_add = is_add;
16869 clib_memcpy (mp->locator_set_name, locator_set_name,
16870 vec_len (locator_set_name));
16871 vec_free (locator_set_name);
16873 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
16875 clib_memcpy (mp->locators, locators, data_len);
16876 vec_free (locators);
16881 /* Wait for a reply... */
16886 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
16889 api_one_add_del_locator (vat_main_t * vam)
16891 unformat_input_t *input = vam->input;
16892 vl_api_one_add_del_locator_t *mp;
16893 u32 tmp_if_index = ~0;
16894 u32 sw_if_index = ~0;
16895 u8 sw_if_index_set = 0;
16896 u8 sw_if_index_if_name_set = 0;
16898 u8 priority_set = 0;
16902 u8 *locator_set_name = NULL;
16903 u8 locator_set_name_set = 0;
16906 /* Parse args required to build the message */
16907 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16909 if (unformat (input, "del"))
16913 else if (unformat (input, "locator-set %s", &locator_set_name))
16915 locator_set_name_set = 1;
16917 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
16920 sw_if_index_if_name_set = 1;
16921 sw_if_index = tmp_if_index;
16923 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
16925 sw_if_index_set = 1;
16926 sw_if_index = tmp_if_index;
16928 else if (unformat (input, "p %d", &priority))
16932 else if (unformat (input, "w %d", &weight))
16940 if (locator_set_name_set == 0)
16942 errmsg ("missing locator-set name");
16946 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
16948 errmsg ("missing sw_if_index");
16949 vec_free (locator_set_name);
16953 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
16955 errmsg ("cannot use both params interface name and sw_if_index");
16956 vec_free (locator_set_name);
16960 if (priority_set == 0)
16962 errmsg ("missing locator-set priority");
16963 vec_free (locator_set_name);
16967 if (weight_set == 0)
16969 errmsg ("missing locator-set weight");
16970 vec_free (locator_set_name);
16974 if (vec_len (locator_set_name) > 64)
16976 errmsg ("locator-set name too long");
16977 vec_free (locator_set_name);
16980 vec_add1 (locator_set_name, 0);
16982 /* Construct the API message */
16983 M (ONE_ADD_DEL_LOCATOR, mp);
16985 mp->is_add = is_add;
16986 mp->sw_if_index = ntohl (sw_if_index);
16987 mp->priority = priority;
16988 mp->weight = weight;
16989 clib_memcpy (mp->locator_set_name, locator_set_name,
16990 vec_len (locator_set_name));
16991 vec_free (locator_set_name);
16996 /* Wait for a reply... */
17001 #define api_lisp_add_del_locator api_one_add_del_locator
17004 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
17006 u32 *key_id = va_arg (*args, u32 *);
17009 if (unformat (input, "%s", &s))
17011 if (!strcmp ((char *) s, "sha1"))
17012 key_id[0] = HMAC_SHA_1_96;
17013 else if (!strcmp ((char *) s, "sha256"))
17014 key_id[0] = HMAC_SHA_256_128;
17017 clib_warning ("invalid key_id: '%s'", s);
17018 key_id[0] = HMAC_NO_KEY;
17029 api_one_add_del_local_eid (vat_main_t * vam)
17031 unformat_input_t *input = vam->input;
17032 vl_api_one_add_del_local_eid_t *mp;
17035 lisp_eid_vat_t _eid, *eid = &_eid;
17036 u8 *locator_set_name = 0;
17037 u8 locator_set_name_set = 0;
17043 /* Parse args required to build the message */
17044 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17046 if (unformat (input, "del"))
17050 else if (unformat (input, "vni %d", &vni))
17054 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
17058 else if (unformat (input, "locator-set %s", &locator_set_name))
17060 locator_set_name_set = 1;
17062 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
17064 else if (unformat (input, "secret-key %_%v%_", &key))
17070 if (locator_set_name_set == 0)
17072 errmsg ("missing locator-set name");
17078 errmsg ("EID address not set!");
17079 vec_free (locator_set_name);
17083 if (key && (0 == key_id))
17085 errmsg ("invalid key_id!");
17089 if (vec_len (key) > 64)
17091 errmsg ("key too long");
17096 if (vec_len (locator_set_name) > 64)
17098 errmsg ("locator-set name too long");
17099 vec_free (locator_set_name);
17102 vec_add1 (locator_set_name, 0);
17104 /* Construct the API message */
17105 M (ONE_ADD_DEL_LOCAL_EID, mp);
17107 mp->is_add = is_add;
17108 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
17109 mp->eid_type = eid->type;
17110 mp->prefix_len = eid->len;
17111 mp->vni = clib_host_to_net_u32 (vni);
17112 mp->key_id = clib_host_to_net_u16 (key_id);
17113 clib_memcpy (mp->locator_set_name, locator_set_name,
17114 vec_len (locator_set_name));
17115 clib_memcpy (mp->key, key, vec_len (key));
17117 vec_free (locator_set_name);
17123 /* Wait for a reply... */
17128 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
17131 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
17133 u32 dp_table = 0, vni = 0;;
17134 unformat_input_t *input = vam->input;
17135 vl_api_gpe_add_del_fwd_entry_t *mp;
17137 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
17138 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
17139 u8 rmt_eid_set = 0, lcl_eid_set = 0;
17140 u32 action = ~0, w;
17141 ip4_address_t rmt_rloc4, lcl_rloc4;
17142 ip6_address_t rmt_rloc6, lcl_rloc6;
17143 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
17146 memset (&rloc, 0, sizeof (rloc));
17148 /* Parse args required to build the message */
17149 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17151 if (unformat (input, "del"))
17153 else if (unformat (input, "add"))
17155 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
17159 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
17163 else if (unformat (input, "vrf %d", &dp_table))
17165 else if (unformat (input, "bd %d", &dp_table))
17167 else if (unformat (input, "vni %d", &vni))
17169 else if (unformat (input, "w %d", &w))
17173 errmsg ("No RLOC configured for setting priority/weight!");
17176 curr_rloc->weight = w;
17178 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
17179 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
17183 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
17185 vec_add1 (lcl_locs, rloc);
17187 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
17188 vec_add1 (rmt_locs, rloc);
17189 /* weight saved in rmt loc */
17190 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
17192 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
17193 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
17196 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
17198 vec_add1 (lcl_locs, rloc);
17200 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
17201 vec_add1 (rmt_locs, rloc);
17202 /* weight saved in rmt loc */
17203 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
17205 else if (unformat (input, "action %d", &action))
17211 clib_warning ("parse error '%U'", format_unformat_error, input);
17218 errmsg ("remote eid addresses not set");
17222 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
17224 errmsg ("eid types don't match");
17228 if (0 == rmt_locs && (u32) ~ 0 == action)
17230 errmsg ("action not set for negative mapping");
17234 /* Construct the API message */
17235 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
17236 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
17238 mp->is_add = is_add;
17239 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
17240 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
17241 mp->eid_type = rmt_eid->type;
17242 mp->dp_table = clib_host_to_net_u32 (dp_table);
17243 mp->vni = clib_host_to_net_u32 (vni);
17244 mp->rmt_len = rmt_eid->len;
17245 mp->lcl_len = lcl_eid->len;
17246 mp->action = action;
17248 if (0 != rmt_locs && 0 != lcl_locs)
17250 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
17251 clib_memcpy (mp->locs, lcl_locs,
17252 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
17254 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
17255 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
17256 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
17258 vec_free (lcl_locs);
17259 vec_free (rmt_locs);
17264 /* Wait for a reply... */
17270 api_one_add_del_map_server (vat_main_t * vam)
17272 unformat_input_t *input = vam->input;
17273 vl_api_one_add_del_map_server_t *mp;
17277 ip4_address_t ipv4;
17278 ip6_address_t ipv6;
17281 /* Parse args required to build the message */
17282 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17284 if (unformat (input, "del"))
17288 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
17292 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
17300 if (ipv4_set && ipv6_set)
17302 errmsg ("both eid v4 and v6 addresses set");
17306 if (!ipv4_set && !ipv6_set)
17308 errmsg ("eid addresses not set");
17312 /* Construct the API message */
17313 M (ONE_ADD_DEL_MAP_SERVER, mp);
17315 mp->is_add = is_add;
17319 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
17324 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
17330 /* Wait for a reply... */
17335 #define api_lisp_add_del_map_server api_one_add_del_map_server
17338 api_one_add_del_map_resolver (vat_main_t * vam)
17340 unformat_input_t *input = vam->input;
17341 vl_api_one_add_del_map_resolver_t *mp;
17345 ip4_address_t ipv4;
17346 ip6_address_t ipv6;
17349 /* Parse args required to build the message */
17350 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17352 if (unformat (input, "del"))
17356 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
17360 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
17368 if (ipv4_set && ipv6_set)
17370 errmsg ("both eid v4 and v6 addresses set");
17374 if (!ipv4_set && !ipv6_set)
17376 errmsg ("eid addresses not set");
17380 /* Construct the API message */
17381 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
17383 mp->is_add = is_add;
17387 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
17392 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
17398 /* Wait for a reply... */
17403 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
17406 api_lisp_gpe_enable_disable (vat_main_t * vam)
17408 unformat_input_t *input = vam->input;
17409 vl_api_gpe_enable_disable_t *mp;
17414 /* Parse args required to build the message */
17415 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17417 if (unformat (input, "enable"))
17422 else if (unformat (input, "disable"))
17433 errmsg ("Value not set");
17437 /* Construct the API message */
17438 M (GPE_ENABLE_DISABLE, mp);
17445 /* Wait for a reply... */
17451 api_one_rloc_probe_enable_disable (vat_main_t * vam)
17453 unformat_input_t *input = vam->input;
17454 vl_api_one_rloc_probe_enable_disable_t *mp;
17459 /* Parse args required to build the message */
17460 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17462 if (unformat (input, "enable"))
17467 else if (unformat (input, "disable"))
17475 errmsg ("Value not set");
17479 /* Construct the API message */
17480 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
17482 mp->is_enabled = is_en;
17487 /* Wait for a reply... */
17492 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
17495 api_one_map_register_enable_disable (vat_main_t * vam)
17497 unformat_input_t *input = vam->input;
17498 vl_api_one_map_register_enable_disable_t *mp;
17503 /* Parse args required to build the message */
17504 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17506 if (unformat (input, "enable"))
17511 else if (unformat (input, "disable"))
17519 errmsg ("Value not set");
17523 /* Construct the API message */
17524 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
17526 mp->is_enabled = is_en;
17531 /* Wait for a reply... */
17536 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
17539 api_one_enable_disable (vat_main_t * vam)
17541 unformat_input_t *input = vam->input;
17542 vl_api_one_enable_disable_t *mp;
17547 /* Parse args required to build the message */
17548 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17550 if (unformat (input, "enable"))
17555 else if (unformat (input, "disable"))
17565 errmsg ("Value not set");
17569 /* Construct the API message */
17570 M (ONE_ENABLE_DISABLE, mp);
17577 /* Wait for a reply... */
17582 #define api_lisp_enable_disable api_one_enable_disable
17585 api_one_enable_disable_xtr_mode (vat_main_t * vam)
17587 unformat_input_t *input = vam->input;
17588 vl_api_one_enable_disable_xtr_mode_t *mp;
17593 /* Parse args required to build the message */
17594 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17596 if (unformat (input, "enable"))
17601 else if (unformat (input, "disable"))
17611 errmsg ("Value not set");
17615 /* Construct the API message */
17616 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
17623 /* Wait for a reply... */
17629 api_one_show_xtr_mode (vat_main_t * vam)
17631 vl_api_one_show_xtr_mode_t *mp;
17634 /* Construct the API message */
17635 M (ONE_SHOW_XTR_MODE, mp);
17640 /* Wait for a reply... */
17646 api_one_enable_disable_pitr_mode (vat_main_t * vam)
17648 unformat_input_t *input = vam->input;
17649 vl_api_one_enable_disable_pitr_mode_t *mp;
17654 /* Parse args required to build the message */
17655 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17657 if (unformat (input, "enable"))
17662 else if (unformat (input, "disable"))
17672 errmsg ("Value not set");
17676 /* Construct the API message */
17677 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
17684 /* Wait for a reply... */
17690 api_one_show_pitr_mode (vat_main_t * vam)
17692 vl_api_one_show_pitr_mode_t *mp;
17695 /* Construct the API message */
17696 M (ONE_SHOW_PITR_MODE, mp);
17701 /* Wait for a reply... */
17707 api_one_enable_disable_petr_mode (vat_main_t * vam)
17709 unformat_input_t *input = vam->input;
17710 vl_api_one_enable_disable_petr_mode_t *mp;
17715 /* Parse args required to build the message */
17716 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17718 if (unformat (input, "enable"))
17723 else if (unformat (input, "disable"))
17733 errmsg ("Value not set");
17737 /* Construct the API message */
17738 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
17745 /* Wait for a reply... */
17751 api_one_show_petr_mode (vat_main_t * vam)
17753 vl_api_one_show_petr_mode_t *mp;
17756 /* Construct the API message */
17757 M (ONE_SHOW_PETR_MODE, mp);
17762 /* Wait for a reply... */
17768 api_show_one_map_register_state (vat_main_t * vam)
17770 vl_api_show_one_map_register_state_t *mp;
17773 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
17778 /* wait for reply */
17783 #define api_show_lisp_map_register_state api_show_one_map_register_state
17786 api_show_one_rloc_probe_state (vat_main_t * vam)
17788 vl_api_show_one_rloc_probe_state_t *mp;
17791 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
17796 /* wait for reply */
17801 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
17804 api_one_add_del_ndp_entry (vat_main_t * vam)
17806 vl_api_one_add_del_ndp_entry_t *mp;
17807 unformat_input_t *input = vam->input;
17812 u8 mac[6] = { 0, };
17813 u8 ip6[16] = { 0, };
17817 /* Parse args required to build the message */
17818 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17820 if (unformat (input, "del"))
17822 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17824 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
17826 else if (unformat (input, "bd %d", &bd))
17830 errmsg ("parse error '%U'", format_unformat_error, input);
17835 if (!bd_set || !ip_set || (!mac_set && is_add))
17837 errmsg ("Missing BD, IP or MAC!");
17841 M (ONE_ADD_DEL_NDP_ENTRY, mp);
17842 mp->is_add = is_add;
17843 clib_memcpy (mp->mac, mac, 6);
17844 mp->bd = clib_host_to_net_u32 (bd);
17845 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
17850 /* wait for reply */
17856 api_one_add_del_l2_arp_entry (vat_main_t * vam)
17858 vl_api_one_add_del_l2_arp_entry_t *mp;
17859 unformat_input_t *input = vam->input;
17864 u8 mac[6] = { 0, };
17865 u32 ip4 = 0, bd = ~0;
17868 /* Parse args required to build the message */
17869 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17871 if (unformat (input, "del"))
17873 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17875 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
17877 else if (unformat (input, "bd %d", &bd))
17881 errmsg ("parse error '%U'", format_unformat_error, input);
17886 if (!bd_set || !ip_set || (!mac_set && is_add))
17888 errmsg ("Missing BD, IP or MAC!");
17892 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
17893 mp->is_add = is_add;
17894 clib_memcpy (mp->mac, mac, 6);
17895 mp->bd = clib_host_to_net_u32 (bd);
17901 /* wait for reply */
17907 api_one_ndp_bd_get (vat_main_t * vam)
17909 vl_api_one_ndp_bd_get_t *mp;
17912 M (ONE_NDP_BD_GET, mp);
17917 /* wait for reply */
17923 api_one_ndp_entries_get (vat_main_t * vam)
17925 vl_api_one_ndp_entries_get_t *mp;
17926 unformat_input_t *input = vam->input;
17931 /* Parse args required to build the message */
17932 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17934 if (unformat (input, "bd %d", &bd))
17938 errmsg ("parse error '%U'", format_unformat_error, input);
17945 errmsg ("Expected bridge domain!");
17949 M (ONE_NDP_ENTRIES_GET, mp);
17950 mp->bd = clib_host_to_net_u32 (bd);
17955 /* wait for reply */
17961 api_one_l2_arp_bd_get (vat_main_t * vam)
17963 vl_api_one_l2_arp_bd_get_t *mp;
17966 M (ONE_L2_ARP_BD_GET, mp);
17971 /* wait for reply */
17977 api_one_l2_arp_entries_get (vat_main_t * vam)
17979 vl_api_one_l2_arp_entries_get_t *mp;
17980 unformat_input_t *input = vam->input;
17985 /* Parse args required to build the message */
17986 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17988 if (unformat (input, "bd %d", &bd))
17992 errmsg ("parse error '%U'", format_unformat_error, input);
17999 errmsg ("Expected bridge domain!");
18003 M (ONE_L2_ARP_ENTRIES_GET, mp);
18004 mp->bd = clib_host_to_net_u32 (bd);
18009 /* wait for reply */
18015 api_one_stats_enable_disable (vat_main_t * vam)
18017 vl_api_one_stats_enable_disable_t *mp;
18018 unformat_input_t *input = vam->input;
18023 /* Parse args required to build the message */
18024 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18026 if (unformat (input, "enable"))
18031 else if (unformat (input, "disable"))
18041 errmsg ("Value not set");
18045 M (ONE_STATS_ENABLE_DISABLE, mp);
18051 /* wait for reply */
18057 api_show_one_stats_enable_disable (vat_main_t * vam)
18059 vl_api_show_one_stats_enable_disable_t *mp;
18062 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
18067 /* wait for reply */
18073 api_show_one_map_request_mode (vat_main_t * vam)
18075 vl_api_show_one_map_request_mode_t *mp;
18078 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
18083 /* wait for reply */
18088 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
18091 api_one_map_request_mode (vat_main_t * vam)
18093 unformat_input_t *input = vam->input;
18094 vl_api_one_map_request_mode_t *mp;
18098 /* Parse args required to build the message */
18099 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18101 if (unformat (input, "dst-only"))
18103 else if (unformat (input, "src-dst"))
18107 errmsg ("parse error '%U'", format_unformat_error, input);
18112 M (ONE_MAP_REQUEST_MODE, mp);
18119 /* wait for reply */
18124 #define api_lisp_map_request_mode api_one_map_request_mode
18127 * Enable/disable ONE proxy ITR.
18129 * @param vam vpp API test context
18130 * @return return code
18133 api_one_pitr_set_locator_set (vat_main_t * vam)
18135 u8 ls_name_set = 0;
18136 unformat_input_t *input = vam->input;
18137 vl_api_one_pitr_set_locator_set_t *mp;
18142 /* Parse args required to build the message */
18143 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18145 if (unformat (input, "del"))
18147 else if (unformat (input, "locator-set %s", &ls_name))
18151 errmsg ("parse error '%U'", format_unformat_error, input);
18158 errmsg ("locator-set name not set!");
18162 M (ONE_PITR_SET_LOCATOR_SET, mp);
18164 mp->is_add = is_add;
18165 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
18166 vec_free (ls_name);
18171 /* wait for reply */
18176 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
18179 api_one_nsh_set_locator_set (vat_main_t * vam)
18181 u8 ls_name_set = 0;
18182 unformat_input_t *input = vam->input;
18183 vl_api_one_nsh_set_locator_set_t *mp;
18188 /* Parse args required to build the message */
18189 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18191 if (unformat (input, "del"))
18193 else if (unformat (input, "ls %s", &ls_name))
18197 errmsg ("parse error '%U'", format_unformat_error, input);
18202 if (!ls_name_set && is_add)
18204 errmsg ("locator-set name not set!");
18208 M (ONE_NSH_SET_LOCATOR_SET, mp);
18210 mp->is_add = is_add;
18211 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
18212 vec_free (ls_name);
18217 /* wait for reply */
18223 api_show_one_pitr (vat_main_t * vam)
18225 vl_api_show_one_pitr_t *mp;
18228 if (!vam->json_output)
18230 print (vam->ofp, "%=20s", "lisp status:");
18233 M (SHOW_ONE_PITR, mp);
18237 /* Wait for a reply... */
18242 #define api_show_lisp_pitr api_show_one_pitr
18245 api_one_use_petr (vat_main_t * vam)
18247 unformat_input_t *input = vam->input;
18248 vl_api_one_use_petr_t *mp;
18253 memset (&ip, 0, sizeof (ip));
18255 /* Parse args required to build the message */
18256 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18258 if (unformat (input, "disable"))
18261 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
18264 ip_addr_version (&ip) = IP4;
18267 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
18270 ip_addr_version (&ip) = IP6;
18274 errmsg ("parse error '%U'", format_unformat_error, input);
18279 M (ONE_USE_PETR, mp);
18281 mp->is_add = is_add;
18284 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
18286 clib_memcpy (mp->address, &ip, 4);
18288 clib_memcpy (mp->address, &ip, 16);
18294 /* wait for reply */
18299 #define api_lisp_use_petr api_one_use_petr
18302 api_show_one_nsh_mapping (vat_main_t * vam)
18304 vl_api_show_one_use_petr_t *mp;
18307 if (!vam->json_output)
18309 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
18312 M (SHOW_ONE_NSH_MAPPING, mp);
18316 /* Wait for a reply... */
18322 api_show_one_use_petr (vat_main_t * vam)
18324 vl_api_show_one_use_petr_t *mp;
18327 if (!vam->json_output)
18329 print (vam->ofp, "%=20s", "Proxy-ETR status:");
18332 M (SHOW_ONE_USE_PETR, mp);
18336 /* Wait for a reply... */
18341 #define api_show_lisp_use_petr api_show_one_use_petr
18344 * Add/delete mapping between vni and vrf
18347 api_one_eid_table_add_del_map (vat_main_t * vam)
18349 unformat_input_t *input = vam->input;
18350 vl_api_one_eid_table_add_del_map_t *mp;
18351 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
18352 u32 vni, vrf, bd_index;
18355 /* Parse args required to build the message */
18356 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18358 if (unformat (input, "del"))
18360 else if (unformat (input, "vrf %d", &vrf))
18362 else if (unformat (input, "bd_index %d", &bd_index))
18364 else if (unformat (input, "vni %d", &vni))
18370 if (!vni_set || (!vrf_set && !bd_index_set))
18372 errmsg ("missing arguments!");
18376 if (vrf_set && bd_index_set)
18378 errmsg ("error: both vrf and bd entered!");
18382 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
18384 mp->is_add = is_add;
18385 mp->vni = htonl (vni);
18386 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
18387 mp->is_l2 = bd_index_set;
18392 /* wait for reply */
18397 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
18400 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
18402 u32 *action = va_arg (*args, u32 *);
18405 if (unformat (input, "%s", &s))
18407 if (!strcmp ((char *) s, "no-action"))
18409 else if (!strcmp ((char *) s, "natively-forward"))
18411 else if (!strcmp ((char *) s, "send-map-request"))
18413 else if (!strcmp ((char *) s, "drop"))
18417 clib_warning ("invalid action: '%s'", s);
18429 * Add/del remote mapping to/from ONE control plane
18431 * @param vam vpp API test context
18432 * @return return code
18435 api_one_add_del_remote_mapping (vat_main_t * vam)
18437 unformat_input_t *input = vam->input;
18438 vl_api_one_add_del_remote_mapping_t *mp;
18440 lisp_eid_vat_t _eid, *eid = &_eid;
18441 lisp_eid_vat_t _seid, *seid = &_seid;
18442 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
18443 u32 action = ~0, p, w, data_len;
18444 ip4_address_t rloc4;
18445 ip6_address_t rloc6;
18446 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
18449 memset (&rloc, 0, sizeof (rloc));
18451 /* Parse args required to build the message */
18452 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18454 if (unformat (input, "del-all"))
18458 else if (unformat (input, "del"))
18462 else if (unformat (input, "add"))
18466 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
18470 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
18474 else if (unformat (input, "vni %d", &vni))
18478 else if (unformat (input, "p %d w %d", &p, &w))
18482 errmsg ("No RLOC configured for setting priority/weight!");
18485 curr_rloc->priority = p;
18486 curr_rloc->weight = w;
18488 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
18491 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
18492 vec_add1 (rlocs, rloc);
18493 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18495 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
18498 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
18499 vec_add1 (rlocs, rloc);
18500 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18502 else if (unformat (input, "action %U",
18503 unformat_negative_mapping_action, &action))
18509 clib_warning ("parse error '%U'", format_unformat_error, input);
18516 errmsg ("missing params!");
18520 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
18522 errmsg ("no action set for negative map-reply!");
18526 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
18528 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
18529 mp->is_add = is_add;
18530 mp->vni = htonl (vni);
18531 mp->action = (u8) action;
18532 mp->is_src_dst = seid_set;
18533 mp->eid_len = eid->len;
18534 mp->seid_len = seid->len;
18535 mp->del_all = del_all;
18536 mp->eid_type = eid->type;
18537 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
18538 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
18540 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
18541 clib_memcpy (mp->rlocs, rlocs, data_len);
18547 /* Wait for a reply... */
18552 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
18555 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
18556 * forwarding entries in data-plane accordingly.
18558 * @param vam vpp API test context
18559 * @return return code
18562 api_one_add_del_adjacency (vat_main_t * vam)
18564 unformat_input_t *input = vam->input;
18565 vl_api_one_add_del_adjacency_t *mp;
18567 ip4_address_t leid4, reid4;
18568 ip6_address_t leid6, reid6;
18569 u8 reid_mac[6] = { 0 };
18570 u8 leid_mac[6] = { 0 };
18571 u8 reid_type, leid_type;
18572 u32 leid_len = 0, reid_len = 0, len;
18576 leid_type = reid_type = (u8) ~ 0;
18578 /* Parse args required to build the message */
18579 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18581 if (unformat (input, "del"))
18585 else if (unformat (input, "add"))
18589 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
18592 reid_type = 0; /* ipv4 */
18595 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
18598 reid_type = 1; /* ipv6 */
18601 else if (unformat (input, "reid %U", unformat_ethernet_address,
18604 reid_type = 2; /* mac */
18606 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
18609 leid_type = 0; /* ipv4 */
18612 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
18615 leid_type = 1; /* ipv6 */
18618 else if (unformat (input, "leid %U", unformat_ethernet_address,
18621 leid_type = 2; /* mac */
18623 else if (unformat (input, "vni %d", &vni))
18629 errmsg ("parse error '%U'", format_unformat_error, input);
18634 if ((u8) ~ 0 == reid_type)
18636 errmsg ("missing params!");
18640 if (leid_type != reid_type)
18642 errmsg ("remote and local EIDs are of different types!");
18646 M (ONE_ADD_DEL_ADJACENCY, mp);
18647 mp->is_add = is_add;
18648 mp->vni = htonl (vni);
18649 mp->leid_len = leid_len;
18650 mp->reid_len = reid_len;
18651 mp->eid_type = reid_type;
18653 switch (mp->eid_type)
18656 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
18657 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
18660 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
18661 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
18664 clib_memcpy (mp->leid, leid_mac, 6);
18665 clib_memcpy (mp->reid, reid_mac, 6);
18668 errmsg ("unknown EID type %d!", mp->eid_type);
18675 /* Wait for a reply... */
18680 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
18683 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
18685 u32 *mode = va_arg (*args, u32 *);
18687 if (unformat (input, "lisp"))
18689 else if (unformat (input, "vxlan"))
18698 api_gpe_get_encap_mode (vat_main_t * vam)
18700 vl_api_gpe_get_encap_mode_t *mp;
18703 /* Construct the API message */
18704 M (GPE_GET_ENCAP_MODE, mp);
18709 /* Wait for a reply... */
18715 api_gpe_set_encap_mode (vat_main_t * vam)
18717 unformat_input_t *input = vam->input;
18718 vl_api_gpe_set_encap_mode_t *mp;
18722 /* Parse args required to build the message */
18723 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18725 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
18731 /* Construct the API message */
18732 M (GPE_SET_ENCAP_MODE, mp);
18739 /* Wait for a reply... */
18745 api_lisp_gpe_add_del_iface (vat_main_t * vam)
18747 unformat_input_t *input = vam->input;
18748 vl_api_gpe_add_del_iface_t *mp;
18749 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
18750 u32 dp_table = 0, vni = 0;
18753 /* Parse args required to build the message */
18754 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18756 if (unformat (input, "up"))
18761 else if (unformat (input, "down"))
18766 else if (unformat (input, "table_id %d", &dp_table))
18770 else if (unformat (input, "bd_id %d", &dp_table))
18775 else if (unformat (input, "vni %d", &vni))
18783 if (action_set == 0)
18785 errmsg ("Action not set");
18788 if (dp_table_set == 0 || vni_set == 0)
18790 errmsg ("vni and dp_table must be set");
18794 /* Construct the API message */
18795 M (GPE_ADD_DEL_IFACE, mp);
18797 mp->is_add = is_add;
18798 mp->dp_table = clib_host_to_net_u32 (dp_table);
18800 mp->vni = clib_host_to_net_u32 (vni);
18805 /* Wait for a reply... */
18811 api_one_map_register_fallback_threshold (vat_main_t * vam)
18813 unformat_input_t *input = vam->input;
18814 vl_api_one_map_register_fallback_threshold_t *mp;
18819 /* Parse args required to build the message */
18820 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18822 if (unformat (input, "%u", &value))
18826 clib_warning ("parse error '%U'", format_unformat_error, input);
18833 errmsg ("fallback threshold value is missing!");
18837 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18838 mp->value = clib_host_to_net_u32 (value);
18843 /* Wait for a reply... */
18849 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
18851 vl_api_show_one_map_register_fallback_threshold_t *mp;
18854 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18859 /* Wait for a reply... */
18865 unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
18867 u32 *proto = va_arg (*args, u32 *);
18869 if (unformat (input, "udp"))
18871 else if (unformat (input, "api"))
18880 api_one_set_transport_protocol (vat_main_t * vam)
18882 unformat_input_t *input = vam->input;
18883 vl_api_one_set_transport_protocol_t *mp;
18888 /* Parse args required to build the message */
18889 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18891 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
18895 clib_warning ("parse error '%U'", format_unformat_error, input);
18902 errmsg ("Transport protocol missing!");
18906 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
18907 mp->protocol = (u8) protocol;
18912 /* Wait for a reply... */
18918 api_one_get_transport_protocol (vat_main_t * vam)
18920 vl_api_one_get_transport_protocol_t *mp;
18923 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
18928 /* Wait for a reply... */
18934 api_one_map_register_set_ttl (vat_main_t * vam)
18936 unformat_input_t *input = vam->input;
18937 vl_api_one_map_register_set_ttl_t *mp;
18942 /* Parse args required to build the message */
18943 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18945 if (unformat (input, "%u", &ttl))
18949 clib_warning ("parse error '%U'", format_unformat_error, input);
18956 errmsg ("TTL value missing!");
18960 M (ONE_MAP_REGISTER_SET_TTL, mp);
18961 mp->ttl = clib_host_to_net_u32 (ttl);
18966 /* Wait for a reply... */
18972 api_show_one_map_register_ttl (vat_main_t * vam)
18974 vl_api_show_one_map_register_ttl_t *mp;
18977 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
18982 /* Wait for a reply... */
18988 * Add/del map request itr rlocs from ONE control plane and updates
18990 * @param vam vpp API test context
18991 * @return return code
18994 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
18996 unformat_input_t *input = vam->input;
18997 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
18998 u8 *locator_set_name = 0;
18999 u8 locator_set_name_set = 0;
19003 /* Parse args required to build the message */
19004 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19006 if (unformat (input, "del"))
19010 else if (unformat (input, "%_%v%_", &locator_set_name))
19012 locator_set_name_set = 1;
19016 clib_warning ("parse error '%U'", format_unformat_error, input);
19021 if (is_add && !locator_set_name_set)
19023 errmsg ("itr-rloc is not set!");
19027 if (is_add && vec_len (locator_set_name) > 64)
19029 errmsg ("itr-rloc locator-set name too long");
19030 vec_free (locator_set_name);
19034 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
19035 mp->is_add = is_add;
19038 clib_memcpy (mp->locator_set_name, locator_set_name,
19039 vec_len (locator_set_name));
19043 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
19045 vec_free (locator_set_name);
19050 /* Wait for a reply... */
19055 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
19058 api_one_locator_dump (vat_main_t * vam)
19060 unformat_input_t *input = vam->input;
19061 vl_api_one_locator_dump_t *mp;
19062 vl_api_control_ping_t *mp_ping;
19063 u8 is_index_set = 0, is_name_set = 0;
19068 /* Parse args required to build the message */
19069 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19071 if (unformat (input, "ls_name %_%v%_", &ls_name))
19075 else if (unformat (input, "ls_index %d", &ls_index))
19081 errmsg ("parse error '%U'", format_unformat_error, input);
19086 if (!is_index_set && !is_name_set)
19088 errmsg ("error: expected one of index or name!");
19092 if (is_index_set && is_name_set)
19094 errmsg ("error: only one param expected!");
19098 if (vec_len (ls_name) > 62)
19100 errmsg ("error: locator set name too long!");
19104 if (!vam->json_output)
19106 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
19109 M (ONE_LOCATOR_DUMP, mp);
19110 mp->is_index_set = is_index_set;
19113 mp->ls_index = clib_host_to_net_u32 (ls_index);
19116 vec_add1 (ls_name, 0);
19117 strncpy ((char *) mp->ls_name, (char *) ls_name,
19118 sizeof (mp->ls_name) - 1);
19124 /* Use a control ping for synchronization */
19125 MPING (CONTROL_PING, mp_ping);
19128 /* Wait for a reply... */
19133 #define api_lisp_locator_dump api_one_locator_dump
19136 api_one_locator_set_dump (vat_main_t * vam)
19138 vl_api_one_locator_set_dump_t *mp;
19139 vl_api_control_ping_t *mp_ping;
19140 unformat_input_t *input = vam->input;
19144 /* Parse args required to build the message */
19145 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19147 if (unformat (input, "local"))
19151 else if (unformat (input, "remote"))
19157 errmsg ("parse error '%U'", format_unformat_error, input);
19162 if (!vam->json_output)
19164 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
19167 M (ONE_LOCATOR_SET_DUMP, mp);
19169 mp->filter = filter;
19174 /* Use a control ping for synchronization */
19175 MPING (CONTROL_PING, mp_ping);
19178 /* Wait for a reply... */
19183 #define api_lisp_locator_set_dump api_one_locator_set_dump
19186 api_one_eid_table_map_dump (vat_main_t * vam)
19190 unformat_input_t *input = vam->input;
19191 vl_api_one_eid_table_map_dump_t *mp;
19192 vl_api_control_ping_t *mp_ping;
19195 /* Parse args required to build the message */
19196 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19198 if (unformat (input, "l2"))
19203 else if (unformat (input, "l3"))
19210 errmsg ("parse error '%U'", format_unformat_error, input);
19217 errmsg ("expected one of 'l2' or 'l3' parameter!");
19221 if (!vam->json_output)
19223 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
19226 M (ONE_EID_TABLE_MAP_DUMP, mp);
19232 /* Use a control ping for synchronization */
19233 MPING (CONTROL_PING, mp_ping);
19236 /* Wait for a reply... */
19241 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
19244 api_one_eid_table_vni_dump (vat_main_t * vam)
19246 vl_api_one_eid_table_vni_dump_t *mp;
19247 vl_api_control_ping_t *mp_ping;
19250 if (!vam->json_output)
19252 print (vam->ofp, "VNI");
19255 M (ONE_EID_TABLE_VNI_DUMP, mp);
19260 /* Use a control ping for synchronization */
19261 MPING (CONTROL_PING, mp_ping);
19264 /* Wait for a reply... */
19269 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
19272 api_one_eid_table_dump (vat_main_t * vam)
19274 unformat_input_t *i = vam->input;
19275 vl_api_one_eid_table_dump_t *mp;
19276 vl_api_control_ping_t *mp_ping;
19277 struct in_addr ip4;
19278 struct in6_addr ip6;
19280 u8 eid_type = ~0, eid_set = 0;
19281 u32 prefix_length = ~0, t, vni = 0;
19284 lisp_nsh_api_t nsh;
19286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19288 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
19294 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
19300 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
19305 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
19310 else if (unformat (i, "vni %d", &t))
19314 else if (unformat (i, "local"))
19318 else if (unformat (i, "remote"))
19324 errmsg ("parse error '%U'", format_unformat_error, i);
19329 if (!vam->json_output)
19331 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
19332 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
19335 M (ONE_EID_TABLE_DUMP, mp);
19337 mp->filter = filter;
19341 mp->vni = htonl (vni);
19342 mp->eid_type = eid_type;
19346 mp->prefix_length = prefix_length;
19347 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
19350 mp->prefix_length = prefix_length;
19351 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
19354 clib_memcpy (mp->eid, mac, sizeof (mac));
19357 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
19360 errmsg ("unknown EID type %d!", eid_type);
19368 /* Use a control ping for synchronization */
19369 MPING (CONTROL_PING, mp_ping);
19372 /* Wait for a reply... */
19377 #define api_lisp_eid_table_dump api_one_eid_table_dump
19380 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
19382 unformat_input_t *i = vam->input;
19383 vl_api_gpe_fwd_entries_get_t *mp;
19388 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19390 if (unformat (i, "vni %d", &vni))
19396 errmsg ("parse error '%U'", format_unformat_error, i);
19403 errmsg ("vni not set!");
19407 if (!vam->json_output)
19409 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
19413 M (GPE_FWD_ENTRIES_GET, mp);
19414 mp->vni = clib_host_to_net_u32 (vni);
19419 /* Wait for a reply... */
19424 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
19425 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
19426 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
19427 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
19428 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
19429 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
19430 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
19431 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
19434 api_one_adjacencies_get (vat_main_t * vam)
19436 unformat_input_t *i = vam->input;
19437 vl_api_one_adjacencies_get_t *mp;
19442 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19444 if (unformat (i, "vni %d", &vni))
19450 errmsg ("parse error '%U'", format_unformat_error, i);
19457 errmsg ("vni not set!");
19461 if (!vam->json_output)
19463 print (vam->ofp, "%s %40s", "leid", "reid");
19466 M (ONE_ADJACENCIES_GET, mp);
19467 mp->vni = clib_host_to_net_u32 (vni);
19472 /* Wait for a reply... */
19477 #define api_lisp_adjacencies_get api_one_adjacencies_get
19480 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
19482 unformat_input_t *i = vam->input;
19483 vl_api_gpe_native_fwd_rpaths_get_t *mp;
19485 u8 ip_family_set = 0, is_ip4 = 1;
19487 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19489 if (unformat (i, "ip4"))
19494 else if (unformat (i, "ip6"))
19501 errmsg ("parse error '%U'", format_unformat_error, i);
19506 if (!ip_family_set)
19508 errmsg ("ip family not set!");
19512 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
19513 mp->is_ip4 = is_ip4;
19518 /* Wait for a reply... */
19524 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
19526 vl_api_gpe_fwd_entry_vnis_get_t *mp;
19529 if (!vam->json_output)
19531 print (vam->ofp, "VNIs");
19534 M (GPE_FWD_ENTRY_VNIS_GET, mp);
19539 /* Wait for a reply... */
19545 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
19547 unformat_input_t *i = vam->input;
19548 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
19550 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
19551 struct in_addr ip4;
19552 struct in6_addr ip6;
19553 u32 table_id = 0, nh_sw_if_index = ~0;
19555 memset (&ip4, 0, sizeof (ip4));
19556 memset (&ip6, 0, sizeof (ip6));
19558 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19560 if (unformat (i, "del"))
19562 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
19563 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19568 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
19569 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19574 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
19578 nh_sw_if_index = ~0;
19580 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
19584 nh_sw_if_index = ~0;
19586 else if (unformat (i, "table %d", &table_id))
19590 errmsg ("parse error '%U'", format_unformat_error, i);
19597 errmsg ("nh addr not set!");
19601 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
19602 mp->is_add = is_add;
19603 mp->table_id = clib_host_to_net_u32 (table_id);
19604 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
19605 mp->is_ip4 = is_ip4;
19607 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
19609 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
19614 /* Wait for a reply... */
19620 api_one_map_server_dump (vat_main_t * vam)
19622 vl_api_one_map_server_dump_t *mp;
19623 vl_api_control_ping_t *mp_ping;
19626 if (!vam->json_output)
19628 print (vam->ofp, "%=20s", "Map server");
19631 M (ONE_MAP_SERVER_DUMP, mp);
19635 /* Use a control ping for synchronization */
19636 MPING (CONTROL_PING, mp_ping);
19639 /* Wait for a reply... */
19644 #define api_lisp_map_server_dump api_one_map_server_dump
19647 api_one_map_resolver_dump (vat_main_t * vam)
19649 vl_api_one_map_resolver_dump_t *mp;
19650 vl_api_control_ping_t *mp_ping;
19653 if (!vam->json_output)
19655 print (vam->ofp, "%=20s", "Map resolver");
19658 M (ONE_MAP_RESOLVER_DUMP, mp);
19662 /* Use a control ping for synchronization */
19663 MPING (CONTROL_PING, mp_ping);
19666 /* Wait for a reply... */
19671 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
19674 api_one_stats_flush (vat_main_t * vam)
19676 vl_api_one_stats_flush_t *mp;
19679 M (ONE_STATS_FLUSH, mp);
19686 api_one_stats_dump (vat_main_t * vam)
19688 vl_api_one_stats_dump_t *mp;
19689 vl_api_control_ping_t *mp_ping;
19692 M (ONE_STATS_DUMP, mp);
19696 /* Use a control ping for synchronization */
19697 MPING (CONTROL_PING, mp_ping);
19700 /* Wait for a reply... */
19706 api_show_one_status (vat_main_t * vam)
19708 vl_api_show_one_status_t *mp;
19711 if (!vam->json_output)
19713 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
19716 M (SHOW_ONE_STATUS, mp);
19719 /* Wait for a reply... */
19724 #define api_show_lisp_status api_show_one_status
19727 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
19729 vl_api_gpe_fwd_entry_path_dump_t *mp;
19730 vl_api_control_ping_t *mp_ping;
19731 unformat_input_t *i = vam->input;
19732 u32 fwd_entry_index = ~0;
19735 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19737 if (unformat (i, "index %d", &fwd_entry_index))
19743 if (~0 == fwd_entry_index)
19745 errmsg ("no index specified!");
19749 if (!vam->json_output)
19751 print (vam->ofp, "first line");
19754 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
19758 /* Use a control ping for synchronization */
19759 MPING (CONTROL_PING, mp_ping);
19762 /* Wait for a reply... */
19768 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
19770 vl_api_one_get_map_request_itr_rlocs_t *mp;
19773 if (!vam->json_output)
19775 print (vam->ofp, "%=20s", "itr-rlocs:");
19778 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
19781 /* Wait for a reply... */
19786 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
19789 api_af_packet_create (vat_main_t * vam)
19791 unformat_input_t *i = vam->input;
19792 vl_api_af_packet_create_t *mp;
19793 u8 *host_if_name = 0;
19795 u8 random_hw_addr = 1;
19798 memset (hw_addr, 0, sizeof (hw_addr));
19800 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19802 if (unformat (i, "name %s", &host_if_name))
19803 vec_add1 (host_if_name, 0);
19804 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19805 random_hw_addr = 0;
19810 if (!vec_len (host_if_name))
19812 errmsg ("host-interface name must be specified");
19816 if (vec_len (host_if_name) > 64)
19818 errmsg ("host-interface name too long");
19822 M (AF_PACKET_CREATE, mp);
19824 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19825 clib_memcpy (mp->hw_addr, hw_addr, 6);
19826 mp->use_random_hw_addr = random_hw_addr;
19827 vec_free (host_if_name);
19835 fprintf (vam->ofp ? vam->ofp : stderr,
19836 " new sw_if_index = %d\n", vam->sw_if_index);
19843 api_af_packet_delete (vat_main_t * vam)
19845 unformat_input_t *i = vam->input;
19846 vl_api_af_packet_delete_t *mp;
19847 u8 *host_if_name = 0;
19850 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19852 if (unformat (i, "name %s", &host_if_name))
19853 vec_add1 (host_if_name, 0);
19858 if (!vec_len (host_if_name))
19860 errmsg ("host-interface name must be specified");
19864 if (vec_len (host_if_name) > 64)
19866 errmsg ("host-interface name too long");
19870 M (AF_PACKET_DELETE, mp);
19872 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19873 vec_free (host_if_name);
19880 static void vl_api_af_packet_details_t_handler
19881 (vl_api_af_packet_details_t * mp)
19883 vat_main_t *vam = &vat_main;
19885 print (vam->ofp, "%-16s %d",
19886 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
19889 static void vl_api_af_packet_details_t_handler_json
19890 (vl_api_af_packet_details_t * mp)
19892 vat_main_t *vam = &vat_main;
19893 vat_json_node_t *node = NULL;
19895 if (VAT_JSON_ARRAY != vam->json_tree.type)
19897 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19898 vat_json_init_array (&vam->json_tree);
19900 node = vat_json_array_add (&vam->json_tree);
19902 vat_json_init_object (node);
19903 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
19904 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
19908 api_af_packet_dump (vat_main_t * vam)
19910 vl_api_af_packet_dump_t *mp;
19911 vl_api_control_ping_t *mp_ping;
19914 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
19915 /* Get list of tap interfaces */
19916 M (AF_PACKET_DUMP, mp);
19919 /* Use a control ping for synchronization */
19920 MPING (CONTROL_PING, mp_ping);
19928 api_policer_add_del (vat_main_t * vam)
19930 unformat_input_t *i = vam->input;
19931 vl_api_policer_add_del_t *mp;
19941 u8 color_aware = 0;
19942 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
19945 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
19946 conform_action.dscp = 0;
19947 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
19948 exceed_action.dscp = 0;
19949 violate_action.action_type = SSE2_QOS_ACTION_DROP;
19950 violate_action.dscp = 0;
19952 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19954 if (unformat (i, "del"))
19956 else if (unformat (i, "name %s", &name))
19957 vec_add1 (name, 0);
19958 else if (unformat (i, "cir %u", &cir))
19960 else if (unformat (i, "eir %u", &eir))
19962 else if (unformat (i, "cb %u", &cb))
19964 else if (unformat (i, "eb %u", &eb))
19966 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
19969 else if (unformat (i, "round_type %U", unformat_policer_round_type,
19972 else if (unformat (i, "type %U", unformat_policer_type, &type))
19974 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
19977 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
19980 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
19983 else if (unformat (i, "color-aware"))
19989 if (!vec_len (name))
19991 errmsg ("policer name must be specified");
19995 if (vec_len (name) > 64)
19997 errmsg ("policer name too long");
20001 M (POLICER_ADD_DEL, mp);
20003 clib_memcpy (mp->name, name, vec_len (name));
20005 mp->is_add = is_add;
20006 mp->cir = ntohl (cir);
20007 mp->eir = ntohl (eir);
20008 mp->cb = clib_net_to_host_u64 (cb);
20009 mp->eb = clib_net_to_host_u64 (eb);
20010 mp->rate_type = rate_type;
20011 mp->round_type = round_type;
20013 mp->conform_action_type = conform_action.action_type;
20014 mp->conform_dscp = conform_action.dscp;
20015 mp->exceed_action_type = exceed_action.action_type;
20016 mp->exceed_dscp = exceed_action.dscp;
20017 mp->violate_action_type = violate_action.action_type;
20018 mp->violate_dscp = violate_action.dscp;
20019 mp->color_aware = color_aware;
20027 api_policer_dump (vat_main_t * vam)
20029 unformat_input_t *i = vam->input;
20030 vl_api_policer_dump_t *mp;
20031 vl_api_control_ping_t *mp_ping;
20032 u8 *match_name = 0;
20033 u8 match_name_valid = 0;
20036 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20038 if (unformat (i, "name %s", &match_name))
20040 vec_add1 (match_name, 0);
20041 match_name_valid = 1;
20047 M (POLICER_DUMP, mp);
20048 mp->match_name_valid = match_name_valid;
20049 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
20050 vec_free (match_name);
20054 /* Use a control ping for synchronization */
20055 MPING (CONTROL_PING, mp_ping);
20058 /* Wait for a reply... */
20064 api_policer_classify_set_interface (vat_main_t * vam)
20066 unformat_input_t *i = vam->input;
20067 vl_api_policer_classify_set_interface_t *mp;
20069 int sw_if_index_set;
20070 u32 ip4_table_index = ~0;
20071 u32 ip6_table_index = ~0;
20072 u32 l2_table_index = ~0;
20076 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20078 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20079 sw_if_index_set = 1;
20080 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20081 sw_if_index_set = 1;
20082 else if (unformat (i, "del"))
20084 else if (unformat (i, "ip4-table %d", &ip4_table_index))
20086 else if (unformat (i, "ip6-table %d", &ip6_table_index))
20088 else if (unformat (i, "l2-table %d", &l2_table_index))
20092 clib_warning ("parse error '%U'", format_unformat_error, i);
20097 if (sw_if_index_set == 0)
20099 errmsg ("missing interface name or sw_if_index");
20103 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
20105 mp->sw_if_index = ntohl (sw_if_index);
20106 mp->ip4_table_index = ntohl (ip4_table_index);
20107 mp->ip6_table_index = ntohl (ip6_table_index);
20108 mp->l2_table_index = ntohl (l2_table_index);
20109 mp->is_add = is_add;
20117 api_policer_classify_dump (vat_main_t * vam)
20119 unformat_input_t *i = vam->input;
20120 vl_api_policer_classify_dump_t *mp;
20121 vl_api_control_ping_t *mp_ping;
20122 u8 type = POLICER_CLASSIFY_N_TABLES;
20125 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
20129 errmsg ("classify table type must be specified");
20133 if (!vam->json_output)
20135 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
20138 M (POLICER_CLASSIFY_DUMP, mp);
20143 /* Use a control ping for synchronization */
20144 MPING (CONTROL_PING, mp_ping);
20147 /* Wait for a reply... */
20153 api_netmap_create (vat_main_t * vam)
20155 unformat_input_t *i = vam->input;
20156 vl_api_netmap_create_t *mp;
20159 u8 random_hw_addr = 1;
20164 memset (hw_addr, 0, sizeof (hw_addr));
20166 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20168 if (unformat (i, "name %s", &if_name))
20169 vec_add1 (if_name, 0);
20170 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
20171 random_hw_addr = 0;
20172 else if (unformat (i, "pipe"))
20174 else if (unformat (i, "master"))
20176 else if (unformat (i, "slave"))
20182 if (!vec_len (if_name))
20184 errmsg ("interface name must be specified");
20188 if (vec_len (if_name) > 64)
20190 errmsg ("interface name too long");
20194 M (NETMAP_CREATE, mp);
20196 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
20197 clib_memcpy (mp->hw_addr, hw_addr, 6);
20198 mp->use_random_hw_addr = random_hw_addr;
20199 mp->is_pipe = is_pipe;
20200 mp->is_master = is_master;
20201 vec_free (if_name);
20209 api_netmap_delete (vat_main_t * vam)
20211 unformat_input_t *i = vam->input;
20212 vl_api_netmap_delete_t *mp;
20216 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20218 if (unformat (i, "name %s", &if_name))
20219 vec_add1 (if_name, 0);
20224 if (!vec_len (if_name))
20226 errmsg ("interface name must be specified");
20230 if (vec_len (if_name) > 64)
20232 errmsg ("interface name too long");
20236 M (NETMAP_DELETE, mp);
20238 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
20239 vec_free (if_name);
20247 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
20249 if (fp->afi == IP46_TYPE_IP6)
20251 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20252 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20253 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20254 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20255 format_ip6_address, fp->next_hop);
20256 else if (fp->afi == IP46_TYPE_IP4)
20258 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20259 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20260 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20261 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20262 format_ip4_address, fp->next_hop);
20266 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
20267 vl_api_fib_path_t * fp)
20269 struct in_addr ip4;
20270 struct in6_addr ip6;
20272 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20273 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20274 vat_json_object_add_uint (node, "is_local", fp->is_local);
20275 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20276 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20277 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20278 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20279 if (fp->afi == IP46_TYPE_IP4)
20281 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20282 vat_json_object_add_ip4 (node, "next_hop", ip4);
20284 else if (fp->afi == IP46_TYPE_IP6)
20286 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20287 vat_json_object_add_ip6 (node, "next_hop", ip6);
20292 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
20294 vat_main_t *vam = &vat_main;
20295 int count = ntohl (mp->mt_count);
20296 vl_api_fib_path_t *fp;
20299 print (vam->ofp, "[%d]: sw_if_index %d via:",
20300 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
20302 for (i = 0; i < count; i++)
20304 vl_api_mpls_fib_path_print (vam, fp);
20308 print (vam->ofp, "");
20311 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
20312 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
20315 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
20317 vat_main_t *vam = &vat_main;
20318 vat_json_node_t *node = NULL;
20319 int count = ntohl (mp->mt_count);
20320 vl_api_fib_path_t *fp;
20323 if (VAT_JSON_ARRAY != vam->json_tree.type)
20325 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20326 vat_json_init_array (&vam->json_tree);
20328 node = vat_json_array_add (&vam->json_tree);
20330 vat_json_init_object (node);
20331 vat_json_object_add_uint (node, "tunnel_index",
20332 ntohl (mp->mt_tunnel_index));
20333 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
20335 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
20338 for (i = 0; i < count; i++)
20340 vl_api_mpls_fib_path_json_print (node, fp);
20346 api_mpls_tunnel_dump (vat_main_t * vam)
20348 vl_api_mpls_tunnel_dump_t *mp;
20349 vl_api_control_ping_t *mp_ping;
20353 /* Parse args required to build the message */
20354 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
20356 if (!unformat (vam->input, "tunnel_index %d", &index))
20363 print (vam->ofp, " tunnel_index %d", index);
20365 M (MPLS_TUNNEL_DUMP, mp);
20366 mp->tunnel_index = htonl (index);
20369 /* Use a control ping for synchronization */
20370 MPING (CONTROL_PING, mp_ping);
20377 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
20378 #define vl_api_mpls_fib_details_t_print vl_noop_handler
20382 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
20384 vat_main_t *vam = &vat_main;
20385 int count = ntohl (mp->count);
20386 vl_api_fib_path_t *fp;
20390 "table-id %d, label %u, ess_bit %u",
20391 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
20393 for (i = 0; i < count; i++)
20395 vl_api_mpls_fib_path_print (vam, fp);
20400 static void vl_api_mpls_fib_details_t_handler_json
20401 (vl_api_mpls_fib_details_t * mp)
20403 vat_main_t *vam = &vat_main;
20404 int count = ntohl (mp->count);
20405 vat_json_node_t *node = NULL;
20406 vl_api_fib_path_t *fp;
20409 if (VAT_JSON_ARRAY != vam->json_tree.type)
20411 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20412 vat_json_init_array (&vam->json_tree);
20414 node = vat_json_array_add (&vam->json_tree);
20416 vat_json_init_object (node);
20417 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20418 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
20419 vat_json_object_add_uint (node, "label", ntohl (mp->label));
20420 vat_json_object_add_uint (node, "path_count", count);
20422 for (i = 0; i < count; i++)
20424 vl_api_mpls_fib_path_json_print (node, fp);
20430 api_mpls_fib_dump (vat_main_t * vam)
20432 vl_api_mpls_fib_dump_t *mp;
20433 vl_api_control_ping_t *mp_ping;
20436 M (MPLS_FIB_DUMP, mp);
20439 /* Use a control ping for synchronization */
20440 MPING (CONTROL_PING, mp_ping);
20447 #define vl_api_ip_fib_details_t_endian vl_noop_handler
20448 #define vl_api_ip_fib_details_t_print vl_noop_handler
20451 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
20453 vat_main_t *vam = &vat_main;
20454 int count = ntohl (mp->count);
20455 vl_api_fib_path_t *fp;
20459 "table-id %d, prefix %U/%d stats-index %d",
20460 ntohl (mp->table_id), format_ip4_address, mp->address,
20461 mp->address_length, ntohl (mp->stats_index));
20463 for (i = 0; i < count; i++)
20465 if (fp->afi == IP46_TYPE_IP6)
20467 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20468 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20469 "next_hop_table %d",
20470 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20471 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20472 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
20473 else if (fp->afi == IP46_TYPE_IP4)
20475 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20476 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20477 "next_hop_table %d",
20478 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20479 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20480 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
20485 static void vl_api_ip_fib_details_t_handler_json
20486 (vl_api_ip_fib_details_t * mp)
20488 vat_main_t *vam = &vat_main;
20489 int count = ntohl (mp->count);
20490 vat_json_node_t *node = NULL;
20491 struct in_addr ip4;
20492 struct in6_addr ip6;
20493 vl_api_fib_path_t *fp;
20496 if (VAT_JSON_ARRAY != vam->json_tree.type)
20498 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20499 vat_json_init_array (&vam->json_tree);
20501 node = vat_json_array_add (&vam->json_tree);
20503 vat_json_init_object (node);
20504 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20505 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
20506 vat_json_object_add_ip4 (node, "prefix", ip4);
20507 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20508 vat_json_object_add_uint (node, "path_count", count);
20510 for (i = 0; i < count; i++)
20512 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20513 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20514 vat_json_object_add_uint (node, "is_local", fp->is_local);
20515 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20516 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20517 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20518 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20519 if (fp->afi == IP46_TYPE_IP4)
20521 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20522 vat_json_object_add_ip4 (node, "next_hop", ip4);
20524 else if (fp->afi == IP46_TYPE_IP6)
20526 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20527 vat_json_object_add_ip6 (node, "next_hop", ip6);
20533 api_ip_fib_dump (vat_main_t * vam)
20535 vl_api_ip_fib_dump_t *mp;
20536 vl_api_control_ping_t *mp_ping;
20539 M (IP_FIB_DUMP, mp);
20542 /* Use a control ping for synchronization */
20543 MPING (CONTROL_PING, mp_ping);
20551 api_ip_mfib_dump (vat_main_t * vam)
20553 vl_api_ip_mfib_dump_t *mp;
20554 vl_api_control_ping_t *mp_ping;
20557 M (IP_MFIB_DUMP, mp);
20560 /* Use a control ping for synchronization */
20561 MPING (CONTROL_PING, mp_ping);
20568 static void vl_api_ip_neighbor_details_t_handler
20569 (vl_api_ip_neighbor_details_t * mp)
20571 vat_main_t *vam = &vat_main;
20573 print (vam->ofp, "%c %U %U",
20574 (mp->is_static) ? 'S' : 'D',
20575 format_ethernet_address, &mp->mac_address,
20576 (mp->is_ipv6) ? format_ip6_address : format_ip4_address,
20580 static void vl_api_ip_neighbor_details_t_handler_json
20581 (vl_api_ip_neighbor_details_t * mp)
20584 vat_main_t *vam = &vat_main;
20585 vat_json_node_t *node;
20586 struct in_addr ip4;
20587 struct in6_addr ip6;
20589 if (VAT_JSON_ARRAY != vam->json_tree.type)
20591 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20592 vat_json_init_array (&vam->json_tree);
20594 node = vat_json_array_add (&vam->json_tree);
20596 vat_json_init_object (node);
20597 vat_json_object_add_string_copy (node, "flag",
20598 (mp->is_static) ? (u8 *) "static" : (u8 *)
20601 vat_json_object_add_string_copy (node, "link_layer",
20602 format (0, "%U", format_ethernet_address,
20603 &mp->mac_address));
20607 clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6));
20608 vat_json_object_add_ip6 (node, "ip_address", ip6);
20612 clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4));
20613 vat_json_object_add_ip4 (node, "ip_address", ip4);
20618 api_ip_neighbor_dump (vat_main_t * vam)
20620 unformat_input_t *i = vam->input;
20621 vl_api_ip_neighbor_dump_t *mp;
20622 vl_api_control_ping_t *mp_ping;
20624 u32 sw_if_index = ~0;
20627 /* Parse args required to build the message */
20628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20630 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20632 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20634 else if (unformat (i, "ip6"))
20640 if (sw_if_index == ~0)
20642 errmsg ("missing interface name or sw_if_index");
20646 M (IP_NEIGHBOR_DUMP, mp);
20647 mp->is_ipv6 = (u8) is_ipv6;
20648 mp->sw_if_index = ntohl (sw_if_index);
20651 /* Use a control ping for synchronization */
20652 MPING (CONTROL_PING, mp_ping);
20659 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
20660 #define vl_api_ip6_fib_details_t_print vl_noop_handler
20663 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
20665 vat_main_t *vam = &vat_main;
20666 int count = ntohl (mp->count);
20667 vl_api_fib_path_t *fp;
20671 "table-id %d, prefix %U/%d stats-index %d",
20672 ntohl (mp->table_id), format_ip6_address, mp->address,
20673 mp->address_length, ntohl (mp->stats_index));
20675 for (i = 0; i < count; i++)
20677 if (fp->afi == IP46_TYPE_IP6)
20679 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20680 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20681 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20682 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20683 format_ip6_address, fp->next_hop);
20684 else if (fp->afi == IP46_TYPE_IP4)
20686 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20687 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20688 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20689 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20690 format_ip4_address, fp->next_hop);
20695 static void vl_api_ip6_fib_details_t_handler_json
20696 (vl_api_ip6_fib_details_t * mp)
20698 vat_main_t *vam = &vat_main;
20699 int count = ntohl (mp->count);
20700 vat_json_node_t *node = NULL;
20701 struct in_addr ip4;
20702 struct in6_addr ip6;
20703 vl_api_fib_path_t *fp;
20706 if (VAT_JSON_ARRAY != vam->json_tree.type)
20708 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20709 vat_json_init_array (&vam->json_tree);
20711 node = vat_json_array_add (&vam->json_tree);
20713 vat_json_init_object (node);
20714 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20715 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
20716 vat_json_object_add_ip6 (node, "prefix", ip6);
20717 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20718 vat_json_object_add_uint (node, "path_count", count);
20720 for (i = 0; i < count; i++)
20722 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20723 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20724 vat_json_object_add_uint (node, "is_local", fp->is_local);
20725 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20726 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20727 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20728 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20729 if (fp->afi == IP46_TYPE_IP4)
20731 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20732 vat_json_object_add_ip4 (node, "next_hop", ip4);
20734 else if (fp->afi == IP46_TYPE_IP6)
20736 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20737 vat_json_object_add_ip6 (node, "next_hop", ip6);
20743 api_ip6_fib_dump (vat_main_t * vam)
20745 vl_api_ip6_fib_dump_t *mp;
20746 vl_api_control_ping_t *mp_ping;
20749 M (IP6_FIB_DUMP, mp);
20752 /* Use a control ping for synchronization */
20753 MPING (CONTROL_PING, mp_ping);
20761 api_ip6_mfib_dump (vat_main_t * vam)
20763 vl_api_ip6_mfib_dump_t *mp;
20764 vl_api_control_ping_t *mp_ping;
20767 M (IP6_MFIB_DUMP, mp);
20770 /* Use a control ping for synchronization */
20771 MPING (CONTROL_PING, mp_ping);
20779 api_classify_table_ids (vat_main_t * vam)
20781 vl_api_classify_table_ids_t *mp;
20784 /* Construct the API message */
20785 M (CLASSIFY_TABLE_IDS, mp);
20794 api_classify_table_by_interface (vat_main_t * vam)
20796 unformat_input_t *input = vam->input;
20797 vl_api_classify_table_by_interface_t *mp;
20799 u32 sw_if_index = ~0;
20801 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20803 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20805 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20810 if (sw_if_index == ~0)
20812 errmsg ("missing interface name or sw_if_index");
20816 /* Construct the API message */
20817 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
20819 mp->sw_if_index = ntohl (sw_if_index);
20827 api_classify_table_info (vat_main_t * vam)
20829 unformat_input_t *input = vam->input;
20830 vl_api_classify_table_info_t *mp;
20834 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20836 if (unformat (input, "table_id %d", &table_id))
20841 if (table_id == ~0)
20843 errmsg ("missing table id");
20847 /* Construct the API message */
20848 M (CLASSIFY_TABLE_INFO, mp);
20850 mp->table_id = ntohl (table_id);
20858 api_classify_session_dump (vat_main_t * vam)
20860 unformat_input_t *input = vam->input;
20861 vl_api_classify_session_dump_t *mp;
20862 vl_api_control_ping_t *mp_ping;
20866 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20868 if (unformat (input, "table_id %d", &table_id))
20873 if (table_id == ~0)
20875 errmsg ("missing table id");
20879 /* Construct the API message */
20880 M (CLASSIFY_SESSION_DUMP, mp);
20882 mp->table_id = ntohl (table_id);
20885 /* Use a control ping for synchronization */
20886 MPING (CONTROL_PING, mp_ping);
20894 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
20896 vat_main_t *vam = &vat_main;
20898 print (vam->ofp, "collector_address %U, collector_port %d, "
20899 "src_address %U, vrf_id %d, path_mtu %u, "
20900 "template_interval %u, udp_checksum %d",
20901 format_ip4_address, mp->collector_address,
20902 ntohs (mp->collector_port),
20903 format_ip4_address, mp->src_address,
20904 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
20905 ntohl (mp->template_interval), mp->udp_checksum);
20908 vam->result_ready = 1;
20912 vl_api_ipfix_exporter_details_t_handler_json
20913 (vl_api_ipfix_exporter_details_t * mp)
20915 vat_main_t *vam = &vat_main;
20916 vat_json_node_t node;
20917 struct in_addr collector_address;
20918 struct in_addr src_address;
20920 vat_json_init_object (&node);
20921 clib_memcpy (&collector_address, &mp->collector_address,
20922 sizeof (collector_address));
20923 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
20924 vat_json_object_add_uint (&node, "collector_port",
20925 ntohs (mp->collector_port));
20926 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
20927 vat_json_object_add_ip4 (&node, "src_address", src_address);
20928 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
20929 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
20930 vat_json_object_add_uint (&node, "template_interval",
20931 ntohl (mp->template_interval));
20932 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
20934 vat_json_print (vam->ofp, &node);
20935 vat_json_free (&node);
20937 vam->result_ready = 1;
20941 api_ipfix_exporter_dump (vat_main_t * vam)
20943 vl_api_ipfix_exporter_dump_t *mp;
20946 /* Construct the API message */
20947 M (IPFIX_EXPORTER_DUMP, mp);
20956 api_ipfix_classify_stream_dump (vat_main_t * vam)
20958 vl_api_ipfix_classify_stream_dump_t *mp;
20961 /* Construct the API message */
20962 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
20973 vl_api_ipfix_classify_stream_details_t_handler
20974 (vl_api_ipfix_classify_stream_details_t * mp)
20976 vat_main_t *vam = &vat_main;
20977 print (vam->ofp, "domain_id %d, src_port %d",
20978 ntohl (mp->domain_id), ntohs (mp->src_port));
20980 vam->result_ready = 1;
20984 vl_api_ipfix_classify_stream_details_t_handler_json
20985 (vl_api_ipfix_classify_stream_details_t * mp)
20987 vat_main_t *vam = &vat_main;
20988 vat_json_node_t node;
20990 vat_json_init_object (&node);
20991 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
20992 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
20994 vat_json_print (vam->ofp, &node);
20995 vat_json_free (&node);
20997 vam->result_ready = 1;
21001 api_ipfix_classify_table_dump (vat_main_t * vam)
21003 vl_api_ipfix_classify_table_dump_t *mp;
21004 vl_api_control_ping_t *mp_ping;
21007 if (!vam->json_output)
21009 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
21010 "transport_protocol");
21013 /* Construct the API message */
21014 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
21019 /* Use a control ping for synchronization */
21020 MPING (CONTROL_PING, mp_ping);
21028 vl_api_ipfix_classify_table_details_t_handler
21029 (vl_api_ipfix_classify_table_details_t * mp)
21031 vat_main_t *vam = &vat_main;
21032 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
21033 mp->transport_protocol);
21037 vl_api_ipfix_classify_table_details_t_handler_json
21038 (vl_api_ipfix_classify_table_details_t * mp)
21040 vat_json_node_t *node = NULL;
21041 vat_main_t *vam = &vat_main;
21043 if (VAT_JSON_ARRAY != vam->json_tree.type)
21045 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21046 vat_json_init_array (&vam->json_tree);
21049 node = vat_json_array_add (&vam->json_tree);
21050 vat_json_init_object (node);
21052 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
21053 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
21054 vat_json_object_add_uint (node, "transport_protocol",
21055 mp->transport_protocol);
21059 api_sw_interface_span_enable_disable (vat_main_t * vam)
21061 unformat_input_t *i = vam->input;
21062 vl_api_sw_interface_span_enable_disable_t *mp;
21063 u32 src_sw_if_index = ~0;
21064 u32 dst_sw_if_index = ~0;
21069 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21072 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
21074 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
21078 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
21080 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
21082 else if (unformat (i, "disable"))
21084 else if (unformat (i, "rx"))
21086 else if (unformat (i, "tx"))
21088 else if (unformat (i, "both"))
21090 else if (unformat (i, "l2"))
21096 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
21098 mp->sw_if_index_from = htonl (src_sw_if_index);
21099 mp->sw_if_index_to = htonl (dst_sw_if_index);
21109 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
21112 vat_main_t *vam = &vat_main;
21113 u8 *sw_if_from_name = 0;
21114 u8 *sw_if_to_name = 0;
21115 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
21116 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
21117 char *states[] = { "none", "rx", "tx", "both" };
21121 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
21123 if ((u32) p->value[0] == sw_if_index_from)
21125 sw_if_from_name = (u8 *)(p->key);
21129 if ((u32) p->value[0] == sw_if_index_to)
21131 sw_if_to_name = (u8 *)(p->key);
21132 if (sw_if_from_name)
21137 print (vam->ofp, "%20s => %20s (%s) %s",
21138 sw_if_from_name, sw_if_to_name, states[mp->state],
21139 mp->is_l2 ? "l2" : "device");
21143 vl_api_sw_interface_span_details_t_handler_json
21144 (vl_api_sw_interface_span_details_t * mp)
21146 vat_main_t *vam = &vat_main;
21147 vat_json_node_t *node = NULL;
21148 u8 *sw_if_from_name = 0;
21149 u8 *sw_if_to_name = 0;
21150 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
21151 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
21155 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
21157 if ((u32) p->value[0] == sw_if_index_from)
21159 sw_if_from_name = (u8 *)(p->key);
21163 if ((u32) p->value[0] == sw_if_index_to)
21165 sw_if_to_name = (u8 *)(p->key);
21166 if (sw_if_from_name)
21172 if (VAT_JSON_ARRAY != vam->json_tree.type)
21174 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21175 vat_json_init_array (&vam->json_tree);
21177 node = vat_json_array_add (&vam->json_tree);
21179 vat_json_init_object (node);
21180 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
21181 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
21182 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
21183 if (0 != sw_if_to_name)
21185 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
21187 vat_json_object_add_uint (node, "state", mp->state);
21188 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
21192 api_sw_interface_span_dump (vat_main_t * vam)
21194 unformat_input_t *input = vam->input;
21195 vl_api_sw_interface_span_dump_t *mp;
21196 vl_api_control_ping_t *mp_ping;
21200 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21202 if (unformat (input, "l2"))
21208 M (SW_INTERFACE_SPAN_DUMP, mp);
21212 /* Use a control ping for synchronization */
21213 MPING (CONTROL_PING, mp_ping);
21221 api_pg_create_interface (vat_main_t * vam)
21223 unformat_input_t *input = vam->input;
21224 vl_api_pg_create_interface_t *mp;
21228 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21230 if (unformat (input, "if_id %d", &if_id))
21237 errmsg ("missing pg interface index");
21241 /* Construct the API message */
21242 M (PG_CREATE_INTERFACE, mp);
21244 mp->interface_id = ntohl (if_id);
21252 api_pg_capture (vat_main_t * vam)
21254 unformat_input_t *input = vam->input;
21255 vl_api_pg_capture_t *mp;
21260 u8 pcap_file_set = 0;
21263 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21265 if (unformat (input, "if_id %d", &if_id))
21267 else if (unformat (input, "pcap %s", &pcap_file))
21269 else if (unformat (input, "count %d", &count))
21271 else if (unformat (input, "disable"))
21278 errmsg ("missing pg interface index");
21281 if (pcap_file_set > 0)
21283 if (vec_len (pcap_file) > 255)
21285 errmsg ("pcap file name is too long");
21290 u32 name_len = vec_len (pcap_file);
21291 /* Construct the API message */
21292 M (PG_CAPTURE, mp);
21294 mp->interface_id = ntohl (if_id);
21295 mp->is_enabled = enable;
21296 mp->count = ntohl (count);
21297 mp->pcap_name_length = ntohl (name_len);
21298 if (pcap_file_set != 0)
21300 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
21302 vec_free (pcap_file);
21310 api_pg_enable_disable (vat_main_t * vam)
21312 unformat_input_t *input = vam->input;
21313 vl_api_pg_enable_disable_t *mp;
21316 u8 stream_name_set = 0;
21317 u8 *stream_name = 0;
21319 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21321 if (unformat (input, "stream %s", &stream_name))
21322 stream_name_set = 1;
21323 else if (unformat (input, "disable"))
21329 if (stream_name_set > 0)
21331 if (vec_len (stream_name) > 255)
21333 errmsg ("stream name too long");
21338 u32 name_len = vec_len (stream_name);
21339 /* Construct the API message */
21340 M (PG_ENABLE_DISABLE, mp);
21342 mp->is_enabled = enable;
21343 if (stream_name_set != 0)
21345 mp->stream_name_length = ntohl (name_len);
21346 clib_memcpy (mp->stream_name, stream_name, name_len);
21348 vec_free (stream_name);
21356 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
21358 unformat_input_t *input = vam->input;
21359 vl_api_ip_source_and_port_range_check_add_del_t *mp;
21361 u16 *low_ports = 0;
21362 u16 *high_ports = 0;
21365 ip4_address_t ip4_addr;
21366 ip6_address_t ip6_addr;
21375 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21377 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
21383 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
21388 else if (unformat (input, "vrf %d", &vrf_id))
21390 else if (unformat (input, "del"))
21392 else if (unformat (input, "port %d", &tmp))
21394 if (tmp == 0 || tmp > 65535)
21396 errmsg ("port %d out of range", tmp);
21400 this_hi = this_low + 1;
21401 vec_add1 (low_ports, this_low);
21402 vec_add1 (high_ports, this_hi);
21404 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
21406 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
21408 errmsg ("incorrect range parameters");
21412 /* Note: in debug CLI +1 is added to high before
21413 passing to real fn that does "the work"
21414 (ip_source_and_port_range_check_add_del).
21415 This fn is a wrapper around the binary API fn a
21416 control plane will call, which expects this increment
21417 to have occurred. Hence letting the binary API control
21418 plane fn do the increment for consistency between VAT
21419 and other control planes.
21422 vec_add1 (low_ports, this_low);
21423 vec_add1 (high_ports, this_hi);
21429 if (prefix_set == 0)
21431 errmsg ("<address>/<mask> not specified");
21437 errmsg ("VRF ID required, not specified");
21444 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21448 if (vec_len (low_ports) == 0)
21450 errmsg ("At least one port or port range required");
21454 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
21456 mp->is_add = is_add;
21461 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
21466 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
21469 mp->mask_length = length;
21470 mp->number_of_ranges = vec_len (low_ports);
21472 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
21473 vec_free (low_ports);
21475 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
21476 vec_free (high_ports);
21478 mp->vrf_id = ntohl (vrf_id);
21486 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
21488 unformat_input_t *input = vam->input;
21489 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
21490 u32 sw_if_index = ~0;
21492 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
21493 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
21497 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21499 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21501 else if (unformat (input, "sw_if_index %d", &sw_if_index))
21503 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
21505 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
21507 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
21509 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
21511 else if (unformat (input, "del"))
21517 if (sw_if_index == ~0)
21519 errmsg ("Interface required but not specified");
21525 errmsg ("VRF ID required but not specified");
21529 if (tcp_out_vrf_id == 0
21530 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
21533 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21537 /* Construct the API message */
21538 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
21540 mp->sw_if_index = ntohl (sw_if_index);
21541 mp->is_add = is_add;
21542 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
21543 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
21544 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
21545 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
21550 /* Wait for a reply... */
21556 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
21558 unformat_input_t *i = vam->input;
21559 vl_api_ipsec_gre_add_del_tunnel_t *mp;
21560 u32 local_sa_id = 0;
21561 u32 remote_sa_id = 0;
21562 ip4_address_t src_address;
21563 ip4_address_t dst_address;
21567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21569 if (unformat (i, "local_sa %d", &local_sa_id))
21571 else if (unformat (i, "remote_sa %d", &remote_sa_id))
21573 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
21575 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
21577 else if (unformat (i, "del"))
21581 clib_warning ("parse error '%U'", format_unformat_error, i);
21586 M (IPSEC_GRE_ADD_DEL_TUNNEL, mp);
21588 mp->local_sa_id = ntohl (local_sa_id);
21589 mp->remote_sa_id = ntohl (remote_sa_id);
21590 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
21591 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
21592 mp->is_add = is_add;
21600 api_punt (vat_main_t * vam)
21602 unformat_input_t *i = vam->input;
21610 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21612 if (unformat (i, "ip %d", &ipv))
21614 else if (unformat (i, "protocol %d", &protocol))
21616 else if (unformat (i, "port %d", &port))
21618 else if (unformat (i, "del"))
21622 clib_warning ("parse error '%U'", format_unformat_error, i);
21629 mp->is_add = (u8) is_add;
21630 mp->ipv = (u8) ipv;
21631 mp->l4_protocol = (u8) protocol;
21632 mp->l4_port = htons ((u16) port);
21639 static void vl_api_ipsec_gre_tunnel_details_t_handler
21640 (vl_api_ipsec_gre_tunnel_details_t * mp)
21642 vat_main_t *vam = &vat_main;
21644 print (vam->ofp, "%11d%15U%15U%14d%14d",
21645 ntohl (mp->sw_if_index),
21646 format_ip4_address, &mp->src_address,
21647 format_ip4_address, &mp->dst_address,
21648 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
21651 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
21652 (vl_api_ipsec_gre_tunnel_details_t * mp)
21654 vat_main_t *vam = &vat_main;
21655 vat_json_node_t *node = NULL;
21656 struct in_addr ip4;
21658 if (VAT_JSON_ARRAY != vam->json_tree.type)
21660 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21661 vat_json_init_array (&vam->json_tree);
21663 node = vat_json_array_add (&vam->json_tree);
21665 vat_json_init_object (node);
21666 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
21667 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
21668 vat_json_object_add_ip4 (node, "src_address", ip4);
21669 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
21670 vat_json_object_add_ip4 (node, "dst_address", ip4);
21671 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
21672 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
21676 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
21678 unformat_input_t *i = vam->input;
21679 vl_api_ipsec_gre_tunnel_dump_t *mp;
21680 vl_api_control_ping_t *mp_ping;
21682 u8 sw_if_index_set = 0;
21685 /* Parse args required to build the message */
21686 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21688 if (unformat (i, "sw_if_index %d", &sw_if_index))
21689 sw_if_index_set = 1;
21694 if (sw_if_index_set == 0)
21699 if (!vam->json_output)
21701 print (vam->ofp, "%11s%15s%15s%14s%14s",
21702 "sw_if_index", "src_address", "dst_address",
21703 "local_sa_id", "remote_sa_id");
21706 /* Get list of gre-tunnel interfaces */
21707 M (IPSEC_GRE_TUNNEL_DUMP, mp);
21709 mp->sw_if_index = htonl (sw_if_index);
21713 /* Use a control ping for synchronization */
21714 MPING (CONTROL_PING, mp_ping);
21722 api_delete_subif (vat_main_t * vam)
21724 unformat_input_t *i = vam->input;
21725 vl_api_delete_subif_t *mp;
21726 u32 sw_if_index = ~0;
21729 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21731 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21733 if (unformat (i, "sw_if_index %d", &sw_if_index))
21739 if (sw_if_index == ~0)
21741 errmsg ("missing sw_if_index");
21745 /* Construct the API message */
21746 M (DELETE_SUBIF, mp);
21747 mp->sw_if_index = ntohl (sw_if_index);
21754 #define foreach_pbb_vtr_op \
21755 _("disable", L2_VTR_DISABLED) \
21756 _("pop", L2_VTR_POP_2) \
21757 _("push", L2_VTR_PUSH_2)
21760 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
21762 unformat_input_t *i = vam->input;
21763 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
21764 u32 sw_if_index = ~0, vtr_op = ~0;
21765 u16 outer_tag = ~0;
21766 u8 dmac[6], smac[6];
21767 u8 dmac_set = 0, smac_set = 0;
21773 /* Shut up coverity */
21774 memset (dmac, 0, sizeof (dmac));
21775 memset (smac, 0, sizeof (smac));
21777 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21779 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21781 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21783 else if (unformat (i, "vtr_op %d", &vtr_op))
21785 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
21788 else if (unformat (i, "translate_pbb_stag"))
21790 if (unformat (i, "%d", &tmp))
21792 vtr_op = L2_VTR_TRANSLATE_2_1;
21798 ("translate_pbb_stag operation requires outer tag definition");
21802 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
21804 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
21806 else if (unformat (i, "sid %d", &sid))
21808 else if (unformat (i, "vlanid %d", &tmp))
21812 clib_warning ("parse error '%U'", format_unformat_error, i);
21817 if ((sw_if_index == ~0) || (vtr_op == ~0))
21819 errmsg ("missing sw_if_index or vtr operation");
21822 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
21823 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
21826 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
21830 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
21831 mp->sw_if_index = ntohl (sw_if_index);
21832 mp->vtr_op = ntohl (vtr_op);
21833 mp->outer_tag = ntohs (outer_tag);
21834 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
21835 clib_memcpy (mp->b_smac, smac, sizeof (smac));
21836 mp->b_vlanid = ntohs (vlanid);
21837 mp->i_sid = ntohl (sid);
21845 api_flow_classify_set_interface (vat_main_t * vam)
21847 unformat_input_t *i = vam->input;
21848 vl_api_flow_classify_set_interface_t *mp;
21850 int sw_if_index_set;
21851 u32 ip4_table_index = ~0;
21852 u32 ip6_table_index = ~0;
21856 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21858 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21859 sw_if_index_set = 1;
21860 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21861 sw_if_index_set = 1;
21862 else if (unformat (i, "del"))
21864 else if (unformat (i, "ip4-table %d", &ip4_table_index))
21866 else if (unformat (i, "ip6-table %d", &ip6_table_index))
21870 clib_warning ("parse error '%U'", format_unformat_error, i);
21875 if (sw_if_index_set == 0)
21877 errmsg ("missing interface name or sw_if_index");
21881 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
21883 mp->sw_if_index = ntohl (sw_if_index);
21884 mp->ip4_table_index = ntohl (ip4_table_index);
21885 mp->ip6_table_index = ntohl (ip6_table_index);
21886 mp->is_add = is_add;
21894 api_flow_classify_dump (vat_main_t * vam)
21896 unformat_input_t *i = vam->input;
21897 vl_api_flow_classify_dump_t *mp;
21898 vl_api_control_ping_t *mp_ping;
21899 u8 type = FLOW_CLASSIFY_N_TABLES;
21902 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
21906 errmsg ("classify table type must be specified");
21910 if (!vam->json_output)
21912 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
21915 M (FLOW_CLASSIFY_DUMP, mp);
21920 /* Use a control ping for synchronization */
21921 MPING (CONTROL_PING, mp_ping);
21924 /* Wait for a reply... */
21930 api_feature_enable_disable (vat_main_t * vam)
21932 unformat_input_t *i = vam->input;
21933 vl_api_feature_enable_disable_t *mp;
21935 u8 *feature_name = 0;
21936 u32 sw_if_index = ~0;
21940 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21942 if (unformat (i, "arc_name %s", &arc_name))
21944 else if (unformat (i, "feature_name %s", &feature_name))
21947 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21949 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21951 else if (unformat (i, "disable"))
21959 errmsg ("missing arc name");
21962 if (vec_len (arc_name) > 63)
21964 errmsg ("arc name too long");
21967 if (feature_name == 0)
21969 errmsg ("missing feature name");
21972 if (vec_len (feature_name) > 63)
21974 errmsg ("feature name too long");
21977 if (sw_if_index == ~0)
21979 errmsg ("missing interface name or sw_if_index");
21983 /* Construct the API message */
21984 M (FEATURE_ENABLE_DISABLE, mp);
21985 mp->sw_if_index = ntohl (sw_if_index);
21986 mp->enable = enable;
21987 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
21988 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
21989 vec_free (arc_name);
21990 vec_free (feature_name);
21998 api_sw_interface_tag_add_del (vat_main_t * vam)
22000 unformat_input_t *i = vam->input;
22001 vl_api_sw_interface_tag_add_del_t *mp;
22002 u32 sw_if_index = ~0;
22007 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22009 if (unformat (i, "tag %s", &tag))
22011 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22015 else if (unformat (i, "del"))
22021 if (sw_if_index == ~0)
22023 errmsg ("missing interface name or sw_if_index");
22027 if (enable && (tag == 0))
22029 errmsg ("no tag specified");
22033 /* Construct the API message */
22034 M (SW_INTERFACE_TAG_ADD_DEL, mp);
22035 mp->sw_if_index = ntohl (sw_if_index);
22036 mp->is_add = enable;
22038 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
22046 static void vl_api_l2_xconnect_details_t_handler
22047 (vl_api_l2_xconnect_details_t * mp)
22049 vat_main_t *vam = &vat_main;
22051 print (vam->ofp, "%15d%15d",
22052 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
22055 static void vl_api_l2_xconnect_details_t_handler_json
22056 (vl_api_l2_xconnect_details_t * mp)
22058 vat_main_t *vam = &vat_main;
22059 vat_json_node_t *node = NULL;
22061 if (VAT_JSON_ARRAY != vam->json_tree.type)
22063 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
22064 vat_json_init_array (&vam->json_tree);
22066 node = vat_json_array_add (&vam->json_tree);
22068 vat_json_init_object (node);
22069 vat_json_object_add_uint (node, "rx_sw_if_index",
22070 ntohl (mp->rx_sw_if_index));
22071 vat_json_object_add_uint (node, "tx_sw_if_index",
22072 ntohl (mp->tx_sw_if_index));
22076 api_l2_xconnect_dump (vat_main_t * vam)
22078 vl_api_l2_xconnect_dump_t *mp;
22079 vl_api_control_ping_t *mp_ping;
22082 if (!vam->json_output)
22084 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
22087 M (L2_XCONNECT_DUMP, mp);
22091 /* Use a control ping for synchronization */
22092 MPING (CONTROL_PING, mp_ping);
22100 api_hw_interface_set_mtu (vat_main_t * vam)
22102 unformat_input_t *i = vam->input;
22103 vl_api_hw_interface_set_mtu_t *mp;
22104 u32 sw_if_index = ~0;
22108 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22110 if (unformat (i, "mtu %d", &mtu))
22112 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22114 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22120 if (sw_if_index == ~0)
22122 errmsg ("missing interface name or sw_if_index");
22128 errmsg ("no mtu specified");
22132 /* Construct the API message */
22133 M (HW_INTERFACE_SET_MTU, mp);
22134 mp->sw_if_index = ntohl (sw_if_index);
22135 mp->mtu = ntohs ((u16) mtu);
22143 api_p2p_ethernet_add (vat_main_t * vam)
22145 unformat_input_t *i = vam->input;
22146 vl_api_p2p_ethernet_add_t *mp;
22147 u32 parent_if_index = ~0;
22153 memset (remote_mac, 0, sizeof (remote_mac));
22154 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22156 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
22158 else if (unformat (i, "sw_if_index %d", &parent_if_index))
22162 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
22164 else if (unformat (i, "sub_id %d", &sub_id))
22168 clib_warning ("parse error '%U'", format_unformat_error, i);
22173 if (parent_if_index == ~0)
22175 errmsg ("missing interface name or sw_if_index");
22180 errmsg ("missing remote mac address");
22185 errmsg ("missing sub-interface id");
22189 M (P2P_ETHERNET_ADD, mp);
22190 mp->parent_if_index = ntohl (parent_if_index);
22191 mp->subif_id = ntohl (sub_id);
22192 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
22200 api_p2p_ethernet_del (vat_main_t * vam)
22202 unformat_input_t *i = vam->input;
22203 vl_api_p2p_ethernet_del_t *mp;
22204 u32 parent_if_index = ~0;
22209 memset (remote_mac, 0, sizeof (remote_mac));
22210 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22212 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
22214 else if (unformat (i, "sw_if_index %d", &parent_if_index))
22218 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
22222 clib_warning ("parse error '%U'", format_unformat_error, i);
22227 if (parent_if_index == ~0)
22229 errmsg ("missing interface name or sw_if_index");
22234 errmsg ("missing remote mac address");
22238 M (P2P_ETHERNET_DEL, mp);
22239 mp->parent_if_index = ntohl (parent_if_index);
22240 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
22248 api_lldp_config (vat_main_t * vam)
22250 unformat_input_t *i = vam->input;
22251 vl_api_lldp_config_t *mp;
22253 int tx_interval = 0;
22254 u8 *sys_name = NULL;
22257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22259 if (unformat (i, "system-name %s", &sys_name))
22261 else if (unformat (i, "tx-hold %d", &tx_hold))
22263 else if (unformat (i, "tx-interval %d", &tx_interval))
22267 clib_warning ("parse error '%U'", format_unformat_error, i);
22272 vec_add1 (sys_name, 0);
22274 M (LLDP_CONFIG, mp);
22275 mp->tx_hold = htonl (tx_hold);
22276 mp->tx_interval = htonl (tx_interval);
22277 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
22278 vec_free (sys_name);
22286 api_sw_interface_set_lldp (vat_main_t * vam)
22288 unformat_input_t *i = vam->input;
22289 vl_api_sw_interface_set_lldp_t *mp;
22290 u32 sw_if_index = ~0;
22292 u8 *port_desc = NULL, *mgmt_oid = NULL;
22293 ip4_address_t ip4_addr;
22294 ip6_address_t ip6_addr;
22297 memset (&ip4_addr, 0, sizeof (ip4_addr));
22298 memset (&ip6_addr, 0, sizeof (ip6_addr));
22300 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22302 if (unformat (i, "disable"))
22305 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22307 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22309 else if (unformat (i, "port-desc %s", &port_desc))
22311 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
22313 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
22315 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
22321 if (sw_if_index == ~0)
22323 errmsg ("missing interface name or sw_if_index");
22327 /* Construct the API message */
22328 vec_add1 (port_desc, 0);
22329 vec_add1 (mgmt_oid, 0);
22330 M (SW_INTERFACE_SET_LLDP, mp);
22331 mp->sw_if_index = ntohl (sw_if_index);
22332 mp->enable = enable;
22333 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
22334 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
22335 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
22336 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
22337 vec_free (port_desc);
22338 vec_free (mgmt_oid);
22346 api_tcp_configure_src_addresses (vat_main_t * vam)
22348 vl_api_tcp_configure_src_addresses_t *mp;
22349 unformat_input_t *i = vam->input;
22350 ip4_address_t v4first, v4last;
22351 ip6_address_t v6first, v6last;
22356 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22358 if (unformat (i, "%U - %U",
22359 unformat_ip4_address, &v4first,
22360 unformat_ip4_address, &v4last))
22364 errmsg ("one range per message (range already set)");
22369 else if (unformat (i, "%U - %U",
22370 unformat_ip6_address, &v6first,
22371 unformat_ip6_address, &v6last))
22375 errmsg ("one range per message (range already set)");
22380 else if (unformat (i, "vrf %d", &vrf_id))
22386 if (range_set == 0)
22388 errmsg ("address range not set");
22392 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
22393 mp->vrf_id = ntohl (vrf_id);
22395 if (range_set == 2)
22398 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
22399 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
22404 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
22405 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
22412 static void vl_api_app_namespace_add_del_reply_t_handler
22413 (vl_api_app_namespace_add_del_reply_t * mp)
22415 vat_main_t *vam = &vat_main;
22416 i32 retval = ntohl (mp->retval);
22417 if (vam->async_mode)
22419 vam->async_errors += (retval < 0);
22423 vam->retval = retval;
22425 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
22426 vam->result_ready = 1;
22430 static void vl_api_app_namespace_add_del_reply_t_handler_json
22431 (vl_api_app_namespace_add_del_reply_t * mp)
22433 vat_main_t *vam = &vat_main;
22434 vat_json_node_t node;
22436 vat_json_init_object (&node);
22437 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
22438 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
22440 vat_json_print (vam->ofp, &node);
22441 vat_json_free (&node);
22443 vam->retval = ntohl (mp->retval);
22444 vam->result_ready = 1;
22448 api_app_namespace_add_del (vat_main_t * vam)
22450 vl_api_app_namespace_add_del_t *mp;
22451 unformat_input_t *i = vam->input;
22452 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
22453 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
22457 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22459 if (unformat (i, "id %_%v%_", &ns_id))
22461 else if (unformat (i, "secret %lu", &secret))
22463 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22464 sw_if_index_set = 1;
22465 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
22467 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
22472 if (!ns_id || !secret_set || !sw_if_index_set)
22474 errmsg ("namespace id, secret and sw_if_index must be set");
22477 if (vec_len (ns_id) > 64)
22479 errmsg ("namespace id too long");
22482 M (APP_NAMESPACE_ADD_DEL, mp);
22484 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
22485 mp->namespace_id_len = vec_len (ns_id);
22486 mp->secret = clib_host_to_net_u64 (secret);
22487 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22488 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
22489 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
22497 api_sock_init_shm (vat_main_t * vam)
22499 #if VPP_API_TEST_BUILTIN == 0
22500 unformat_input_t *i = vam->input;
22501 vl_api_shm_elem_config_t *config = 0;
22502 u64 size = 64 << 20;
22505 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22507 if (unformat (i, "size %U", unformat_memory_size, &size))
22514 * Canned custom ring allocator config.
22515 * Should probably parse all of this
22517 vec_validate (config, 6);
22518 config[0].type = VL_API_VLIB_RING;
22519 config[0].size = 256;
22520 config[0].count = 32;
22522 config[1].type = VL_API_VLIB_RING;
22523 config[1].size = 1024;
22524 config[1].count = 16;
22526 config[2].type = VL_API_VLIB_RING;
22527 config[2].size = 4096;
22528 config[2].count = 2;
22530 config[3].type = VL_API_CLIENT_RING;
22531 config[3].size = 256;
22532 config[3].count = 32;
22534 config[4].type = VL_API_CLIENT_RING;
22535 config[4].size = 1024;
22536 config[4].count = 16;
22538 config[5].type = VL_API_CLIENT_RING;
22539 config[5].size = 4096;
22540 config[5].count = 2;
22542 config[6].type = VL_API_QUEUE;
22543 config[6].count = 128;
22544 config[6].size = sizeof (uword);
22546 rv = vl_socket_client_init_shm (config);
22548 vam->client_index_invalid = 1;
22556 api_dns_enable_disable (vat_main_t * vam)
22558 unformat_input_t *line_input = vam->input;
22559 vl_api_dns_enable_disable_t *mp;
22560 u8 enable_disable = 1;
22563 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22565 if (unformat (line_input, "disable"))
22566 enable_disable = 0;
22567 if (unformat (line_input, "enable"))
22568 enable_disable = 1;
22573 /* Construct the API message */
22574 M (DNS_ENABLE_DISABLE, mp);
22575 mp->enable = enable_disable;
22579 /* Wait for the reply */
22585 api_dns_resolve_name (vat_main_t * vam)
22587 unformat_input_t *line_input = vam->input;
22588 vl_api_dns_resolve_name_t *mp;
22592 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22594 if (unformat (line_input, "%s", &name))
22600 if (vec_len (name) > 127)
22602 errmsg ("name too long");
22606 /* Construct the API message */
22607 M (DNS_RESOLVE_NAME, mp);
22608 memcpy (mp->name, name, vec_len (name));
22613 /* Wait for the reply */
22619 api_dns_resolve_ip (vat_main_t * vam)
22621 unformat_input_t *line_input = vam->input;
22622 vl_api_dns_resolve_ip_t *mp;
22624 ip4_address_t addr4;
22625 ip6_address_t addr6;
22628 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22630 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
22632 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
22640 errmsg ("missing address");
22644 /* Construct the API message */
22645 M (DNS_RESOLVE_IP, mp);
22646 mp->is_ip6 = is_ip6;
22648 memcpy (mp->address, &addr6, sizeof (addr6));
22650 memcpy (mp->address, &addr4, sizeof (addr4));
22654 /* Wait for the reply */
22660 api_dns_name_server_add_del (vat_main_t * vam)
22662 unformat_input_t *i = vam->input;
22663 vl_api_dns_name_server_add_del_t *mp;
22665 ip6_address_t ip6_server;
22666 ip4_address_t ip4_server;
22671 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22673 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
22675 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
22677 else if (unformat (i, "del"))
22681 clib_warning ("parse error '%U'", format_unformat_error, i);
22686 if (ip4_set && ip6_set)
22688 errmsg ("Only one server address allowed per message");
22691 if ((ip4_set + ip6_set) == 0)
22693 errmsg ("Server address required");
22697 /* Construct the API message */
22698 M (DNS_NAME_SERVER_ADD_DEL, mp);
22702 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
22707 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
22711 mp->is_add = is_add;
22716 /* Wait for a reply, return good/bad news */
22722 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
22724 vat_main_t *vam = &vat_main;
22729 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22730 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22731 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
22732 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
22733 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22734 clib_net_to_host_u32 (mp->action_index), mp->tag);
22739 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22740 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22741 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
22742 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
22743 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22744 clib_net_to_host_u32 (mp->action_index), mp->tag);
22749 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
22752 vat_main_t *vam = &vat_main;
22753 vat_json_node_t *node = NULL;
22754 struct in6_addr ip6;
22755 struct in_addr ip4;
22757 if (VAT_JSON_ARRAY != vam->json_tree.type)
22759 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
22760 vat_json_init_array (&vam->json_tree);
22762 node = vat_json_array_add (&vam->json_tree);
22763 vat_json_init_object (node);
22765 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
22766 vat_json_object_add_uint (node, "appns_index",
22767 clib_net_to_host_u32 (mp->appns_index));
22768 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
22769 vat_json_object_add_uint (node, "scope", mp->scope);
22770 vat_json_object_add_uint (node, "action_index",
22771 clib_net_to_host_u32 (mp->action_index));
22772 vat_json_object_add_uint (node, "lcl_port",
22773 clib_net_to_host_u16 (mp->lcl_port));
22774 vat_json_object_add_uint (node, "rmt_port",
22775 clib_net_to_host_u16 (mp->rmt_port));
22776 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
22777 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
22778 vat_json_object_add_string_copy (node, "tag", mp->tag);
22781 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
22782 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
22783 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
22784 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
22788 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
22789 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
22790 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
22791 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
22796 api_session_rule_add_del (vat_main_t * vam)
22798 vl_api_session_rule_add_del_t *mp;
22799 unformat_input_t *i = vam->input;
22800 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
22801 u32 appns_index = 0, scope = 0;
22802 ip4_address_t lcl_ip4, rmt_ip4;
22803 ip6_address_t lcl_ip6, rmt_ip6;
22804 u8 is_ip4 = 1, conn_set = 0;
22805 u8 is_add = 1, *tag = 0;
22808 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22810 if (unformat (i, "del"))
22812 else if (unformat (i, "add"))
22814 else if (unformat (i, "proto tcp"))
22816 else if (unformat (i, "proto udp"))
22818 else if (unformat (i, "appns %d", &appns_index))
22820 else if (unformat (i, "scope %d", &scope))
22822 else if (unformat (i, "tag %_%v%_", &tag))
22826 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
22827 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
22835 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
22836 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
22842 else if (unformat (i, "action %d", &action))
22847 if (proto == ~0 || !conn_set || action == ~0)
22849 errmsg ("transport proto, connection and action must be set");
22855 errmsg ("scope should be 0-3");
22859 M (SESSION_RULE_ADD_DEL, mp);
22861 mp->is_ip4 = is_ip4;
22862 mp->transport_proto = proto;
22863 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
22864 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
22865 mp->lcl_plen = lcl_plen;
22866 mp->rmt_plen = rmt_plen;
22867 mp->action_index = clib_host_to_net_u32 (action);
22868 mp->appns_index = clib_host_to_net_u32 (appns_index);
22870 mp->is_add = is_add;
22873 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
22874 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
22878 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
22879 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
22883 clib_memcpy (mp->tag, tag, vec_len (tag));
22893 api_session_rules_dump (vat_main_t * vam)
22895 vl_api_session_rules_dump_t *mp;
22896 vl_api_control_ping_t *mp_ping;
22899 if (!vam->json_output)
22901 print (vam->ofp, "%=20s", "Session Rules");
22904 M (SESSION_RULES_DUMP, mp);
22908 /* Use a control ping for synchronization */
22909 MPING (CONTROL_PING, mp_ping);
22912 /* Wait for a reply... */
22918 api_ip_container_proxy_add_del (vat_main_t * vam)
22920 vl_api_ip_container_proxy_add_del_t *mp;
22921 unformat_input_t *i = vam->input;
22922 u32 plen = ~0, sw_if_index = ~0;
22929 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22931 if (unformat (i, "del"))
22933 else if (unformat (i, "add"))
22935 if (unformat (i, "%U", unformat_ip4_address, &ip4))
22940 else if (unformat (i, "%U", unformat_ip6_address, &ip6))
22945 else if (unformat (i, "sw_if_index %u", &sw_if_index))
22950 if (sw_if_index == ~0 || plen == ~0)
22952 errmsg ("address and sw_if_index must be set");
22956 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
22958 mp->is_ip4 = is_ip4;
22959 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22961 mp->is_add = is_add;
22963 clib_memcpy (mp->ip, &ip4, sizeof (ip4));
22965 clib_memcpy (mp->ip, &ip6, sizeof (ip6));
22973 api_qos_record_enable_disable (vat_main_t * vam)
22975 unformat_input_t *i = vam->input;
22976 vl_api_qos_record_enable_disable_t *mp;
22977 u32 sw_if_index, qs = 0xff;
22978 u8 sw_if_index_set = 0;
22982 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22984 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22985 sw_if_index_set = 1;
22986 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22987 sw_if_index_set = 1;
22988 else if (unformat (i, "%U", unformat_qos_source, &qs))
22990 else if (unformat (i, "disable"))
22994 clib_warning ("parse error '%U'", format_unformat_error, i);
22999 if (sw_if_index_set == 0)
23001 errmsg ("missing interface name or sw_if_index");
23006 errmsg ("input location must be specified");
23010 M (QOS_RECORD_ENABLE_DISABLE, mp);
23012 mp->sw_if_index = ntohl (sw_if_index);
23013 mp->input_source = qs;
23014 mp->enable = enable;
23023 q_or_quit (vat_main_t * vam)
23025 #if VPP_API_TEST_BUILTIN == 0
23026 longjmp (vam->jump_buf, 1);
23028 return 0; /* not so much */
23032 q (vat_main_t * vam)
23034 return q_or_quit (vam);
23038 quit (vat_main_t * vam)
23040 return q_or_quit (vam);
23044 comment (vat_main_t * vam)
23050 statseg (vat_main_t * vam)
23052 ssvm_private_t *ssvmp = &vam->stat_segment;
23053 ssvm_shared_header_t *shared_header = ssvmp->sh;
23054 vlib_counter_t **counters;
23055 u64 thread0_index1_packets;
23056 u64 thread0_index1_bytes;
23057 f64 vector_rate, input_rate;
23060 uword *counter_vector_by_name;
23061 if (vam->stat_segment_lockp == 0)
23063 errmsg ("Stat segment not mapped...");
23067 /* look up "/if/rx for sw_if_index 1 as a test */
23069 clib_spinlock_lock (vam->stat_segment_lockp);
23071 counter_vector_by_name = (uword *) shared_header->opaque[1];
23073 p = hash_get_mem (counter_vector_by_name, "/if/rx");
23076 clib_spinlock_unlock (vam->stat_segment_lockp);
23077 errmsg ("/if/tx not found?");
23081 /* Fish per-thread vector of combined counters from shared memory */
23082 counters = (vlib_counter_t **) p[0];
23084 if (vec_len (counters[0]) < 2)
23086 clib_spinlock_unlock (vam->stat_segment_lockp);
23087 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
23091 /* Read thread 0 sw_if_index 1 counter */
23092 thread0_index1_packets = counters[0][1].packets;
23093 thread0_index1_bytes = counters[0][1].bytes;
23095 p = hash_get_mem (counter_vector_by_name, "vector_rate");
23098 clib_spinlock_unlock (vam->stat_segment_lockp);
23099 errmsg ("vector_rate not found?");
23103 vector_rate = *(f64 *) (p[0]);
23104 p = hash_get_mem (counter_vector_by_name, "input_rate");
23107 clib_spinlock_unlock (vam->stat_segment_lockp);
23108 errmsg ("input_rate not found?");
23111 input_rate = *(f64 *) (p[0]);
23113 clib_spinlock_unlock (vam->stat_segment_lockp);
23115 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
23116 vector_rate, input_rate);
23117 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
23118 thread0_index1_packets, thread0_index1_bytes);
23124 cmd_cmp (void *a1, void *a2)
23129 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
23133 help (vat_main_t * vam)
23138 unformat_input_t *i = vam->input;
23141 if (unformat (i, "%s", &name))
23145 vec_add1 (name, 0);
23147 hs = hash_get_mem (vam->help_by_name, name);
23149 print (vam->ofp, "usage: %s %s", name, hs[0]);
23151 print (vam->ofp, "No such msg / command '%s'", name);
23156 print (vam->ofp, "Help is available for the following:");
23159 hash_foreach_pair (p, vam->function_by_name,
23161 vec_add1 (cmds, (u8 *)(p->key));
23165 vec_sort_with_function (cmds, cmd_cmp);
23167 for (j = 0; j < vec_len (cmds); j++)
23168 print (vam->ofp, "%s", cmds[j]);
23175 set (vat_main_t * vam)
23177 u8 *name = 0, *value = 0;
23178 unformat_input_t *i = vam->input;
23180 if (unformat (i, "%s", &name))
23182 /* The input buffer is a vector, not a string. */
23183 value = vec_dup (i->buffer);
23184 vec_delete (value, i->index, 0);
23185 /* Almost certainly has a trailing newline */
23186 if (value[vec_len (value) - 1] == '\n')
23187 value[vec_len (value) - 1] = 0;
23188 /* Make sure it's a proper string, one way or the other */
23189 vec_add1 (value, 0);
23190 (void) clib_macro_set_value (&vam->macro_main,
23191 (char *) name, (char *) value);
23194 errmsg ("usage: set <name> <value>");
23202 unset (vat_main_t * vam)
23206 if (unformat (vam->input, "%s", &name))
23207 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
23208 errmsg ("unset: %s wasn't set", name);
23221 macro_sort_cmp (void *a1, void *a2)
23223 macro_sort_t *s1 = a1;
23224 macro_sort_t *s2 = a2;
23226 return strcmp ((char *) (s1->name), (char *) (s2->name));
23230 dump_macro_table (vat_main_t * vam)
23232 macro_sort_t *sort_me = 0, *sm;
23237 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
23239 vec_add2 (sort_me, sm, 1);
23240 sm->name = (u8 *)(p->key);
23241 sm->value = (u8 *) (p->value[0]);
23245 vec_sort_with_function (sort_me, macro_sort_cmp);
23247 if (vec_len (sort_me))
23248 print (vam->ofp, "%-15s%s", "Name", "Value");
23250 print (vam->ofp, "The macro table is empty...");
23252 for (i = 0; i < vec_len (sort_me); i++)
23253 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
23258 dump_node_table (vat_main_t * vam)
23261 vlib_node_t *node, *next_node;
23263 if (vec_len (vam->graph_nodes) == 0)
23265 print (vam->ofp, "Node table empty, issue get_node_graph...");
23269 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
23271 node = vam->graph_nodes[0][i];
23272 print (vam->ofp, "[%d] %s", i, node->name);
23273 for (j = 0; j < vec_len (node->next_nodes); j++)
23275 if (node->next_nodes[j] != ~0)
23277 next_node = vam->graph_nodes[0][node->next_nodes[j]];
23278 print (vam->ofp, " [%d] %s", j, next_node->name);
23286 value_sort_cmp (void *a1, void *a2)
23288 name_sort_t *n1 = a1;
23289 name_sort_t *n2 = a2;
23291 if (n1->value < n2->value)
23293 if (n1->value > n2->value)
23300 dump_msg_api_table (vat_main_t * vam)
23302 api_main_t *am = &api_main;
23303 name_sort_t *nses = 0, *ns;
23308 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
23310 vec_add2 (nses, ns, 1);
23311 ns->name = (u8 *)(hp->key);
23312 ns->value = (u32) hp->value[0];
23316 vec_sort_with_function (nses, value_sort_cmp);
23318 for (i = 0; i < vec_len (nses); i++)
23319 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
23325 get_msg_id (vat_main_t * vam)
23330 if (unformat (vam->input, "%s", &name_and_crc))
23332 message_index = vl_msg_api_get_msg_index (name_and_crc);
23333 if (message_index == ~0)
23335 print (vam->ofp, " '%s' not found", name_and_crc);
23338 print (vam->ofp, " '%s' has message index %d",
23339 name_and_crc, message_index);
23342 errmsg ("name_and_crc required...");
23347 search_node_table (vat_main_t * vam)
23349 unformat_input_t *line_input = vam->input;
23352 vlib_node_t *node, *next_node;
23355 if (vam->graph_node_index_by_name == 0)
23357 print (vam->ofp, "Node table empty, issue get_node_graph...");
23361 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
23363 if (unformat (line_input, "%s", &node_to_find))
23365 vec_add1 (node_to_find, 0);
23366 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
23369 print (vam->ofp, "%s not found...", node_to_find);
23372 node = vam->graph_nodes[0][p[0]];
23373 print (vam->ofp, "[%d] %s", p[0], node->name);
23374 for (j = 0; j < vec_len (node->next_nodes); j++)
23376 if (node->next_nodes[j] != ~0)
23378 next_node = vam->graph_nodes[0][node->next_nodes[j]];
23379 print (vam->ofp, " [%d] %s", j, next_node->name);
23386 clib_warning ("parse error '%U'", format_unformat_error,
23392 vec_free (node_to_find);
23401 script (vat_main_t * vam)
23403 #if (VPP_API_TEST_BUILTIN==0)
23405 char *save_current_file;
23406 unformat_input_t save_input;
23407 jmp_buf save_jump_buf;
23408 u32 save_line_number;
23410 FILE *new_fp, *save_ifp;
23412 if (unformat (vam->input, "%s", &s))
23414 new_fp = fopen ((char *) s, "r");
23417 errmsg ("Couldn't open script file %s", s);
23424 errmsg ("Missing script name");
23428 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
23429 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
23430 save_ifp = vam->ifp;
23431 save_line_number = vam->input_line_number;
23432 save_current_file = (char *) vam->current_file;
23434 vam->input_line_number = 0;
23436 vam->current_file = s;
23439 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
23440 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
23441 vam->ifp = save_ifp;
23442 vam->input_line_number = save_line_number;
23443 vam->current_file = (u8 *) save_current_file;
23448 clib_warning ("use the exec command...");
23454 echo (vat_main_t * vam)
23456 print (vam->ofp, "%v", vam->input->buffer);
23460 /* List of API message constructors, CLI names map to api_xxx */
23461 #define foreach_vpe_api_msg \
23462 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
23463 _(sw_interface_dump,"") \
23464 _(sw_interface_set_flags, \
23465 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
23466 _(sw_interface_add_del_address, \
23467 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
23468 _(sw_interface_set_rx_mode, \
23469 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
23470 _(sw_interface_set_rx_placement, \
23471 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
23472 _(sw_interface_set_table, \
23473 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
23474 _(sw_interface_set_mpls_enable, \
23475 "<intfc> | sw_if_index [disable | dis]") \
23476 _(sw_interface_set_vpath, \
23477 "<intfc> | sw_if_index <id> enable | disable") \
23478 _(sw_interface_set_vxlan_bypass, \
23479 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23480 _(sw_interface_set_geneve_bypass, \
23481 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23482 _(sw_interface_set_l2_xconnect, \
23483 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23484 "enable | disable") \
23485 _(sw_interface_set_l2_bridge, \
23486 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
23487 "[shg <split-horizon-group>] [bvi]\n" \
23488 "enable | disable") \
23489 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
23490 _(bridge_domain_add_del, \
23491 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag <text>] [del]\n") \
23492 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
23494 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
23495 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
23496 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
23498 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23500 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23502 "tapname <name> mac <mac-addr> | random-mac [tag <string>]") \
23504 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
23506 "<vpp-if-name> | sw_if_index <id>") \
23507 _(sw_interface_tap_dump, "") \
23509 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
23511 "<vpp-if-name> | sw_if_index <id>") \
23512 _(sw_interface_tap_v2_dump, "") \
23514 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
23515 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]}") \
23517 "<vpp-if-name> | sw_if_index <id>") \
23519 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
23520 _(bond_detach_slave, \
23521 "sw_if_index <n>") \
23522 _(sw_interface_bond_dump, "") \
23523 _(sw_interface_slave_dump, \
23524 "<vpp-if-name> | sw_if_index <id>") \
23525 _(ip_table_add_del, \
23526 "table <n> [ipv6] [add | del]\n") \
23527 _(ip_add_del_route, \
23528 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
23529 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
23530 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
23531 "[multipath] [count <n>]") \
23532 _(ip_mroute_add_del, \
23533 "<src> <grp>/<mask> [table-id <n>]\n" \
23534 "[<intfc> | sw_if_index <id>] [local] [del]") \
23535 _(mpls_table_add_del, \
23536 "table <n> [add | del]\n") \
23537 _(mpls_route_add_del, \
23538 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
23539 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
23540 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
23541 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
23542 "[drop] [local] [classify <n>] [multipath] [count <n>] [del]") \
23543 _(mpls_ip_bind_unbind, \
23544 "<label> <addr/len>") \
23545 _(mpls_tunnel_add_del, \
23546 " via <addr> [table-id <n>]\n" \
23547 "sw_if_index <id>] [l2] [del]") \
23548 _(sr_mpls_policy_add, \
23549 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
23550 _(sr_mpls_policy_del, \
23552 _(bier_table_add_del, \
23553 "<label> <sub-domain> <set> <bsl> [del]") \
23554 _(bier_route_add_del, \
23555 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
23556 "[<intfc> | sw_if_index <id>]" \
23557 "[weight <n>] [del] [multipath]") \
23558 _(proxy_arp_add_del, \
23559 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
23560 _(proxy_arp_intfc_enable_disable, \
23561 "<intfc> | sw_if_index <id> enable | disable") \
23562 _(sw_interface_set_unnumbered, \
23563 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
23564 _(ip_neighbor_add_del, \
23565 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
23566 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
23567 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
23568 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
23569 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
23570 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
23571 "[outer_vlan_id_any][inner_vlan_id_any]") \
23572 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
23573 _(reset_fib, "vrf <n> [ipv6]") \
23574 _(dhcp_proxy_config, \
23575 "svr <v46-address> src <v46-address>\n" \
23576 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
23577 _(dhcp_proxy_set_vss, \
23578 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
23579 _(dhcp_proxy_dump, "ip6") \
23580 _(dhcp_client_config, \
23581 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
23582 _(set_ip_flow_hash, \
23583 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
23584 _(sw_interface_ip6_enable_disable, \
23585 "<intfc> | sw_if_index <id> enable | disable") \
23586 _(sw_interface_ip6_set_link_local_address, \
23587 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
23588 _(ip6nd_proxy_add_del, \
23589 "<intfc> | sw_if_index <id> <ip6-address>") \
23590 _(ip6nd_proxy_dump, "") \
23591 _(sw_interface_ip6nd_ra_prefix, \
23592 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
23593 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
23594 "[nolink] [isno]") \
23595 _(sw_interface_ip6nd_ra_config, \
23596 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
23597 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
23598 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
23599 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
23600 _(l2_patch_add_del, \
23601 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23602 "enable | disable") \
23603 _(sr_localsid_add_del, \
23604 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
23605 "fib-table <num> (end.psp) sw_if_index <num>") \
23606 _(classify_add_del_table, \
23607 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
23608 " [del] [del-chain] mask <mask-value>\n" \
23609 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
23610 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
23611 _(classify_add_del_session, \
23612 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
23613 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
23614 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
23615 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
23616 _(classify_set_interface_ip_table, \
23617 "<intfc> | sw_if_index <nn> table <nn>") \
23618 _(classify_set_interface_l2_tables, \
23619 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23620 " [other-table <nn>]") \
23621 _(get_node_index, "node <node-name") \
23622 _(add_node_next, "node <node-name> next <next-node-name>") \
23623 _(l2tpv3_create_tunnel, \
23624 "client_address <ip6-addr> our_address <ip6-addr>\n" \
23625 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
23626 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
23627 _(l2tpv3_set_tunnel_cookies, \
23628 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
23629 "[new_remote_cookie <nn>]\n") \
23630 _(l2tpv3_interface_enable_disable, \
23631 "<intfc> | sw_if_index <nn> enable | disable") \
23632 _(l2tpv3_set_lookup_key, \
23633 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
23634 _(sw_if_l2tpv3_tunnel_dump, "") \
23635 _(vxlan_offload_rx, \
23636 "hw { <interface name> | hw_if_index <nn>} " \
23637 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
23638 _(vxlan_add_del_tunnel, \
23639 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23640 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
23641 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23642 _(geneve_add_del_tunnel, \
23643 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23644 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23645 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23646 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23647 _(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23648 _(gre_add_del_tunnel, \
23649 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
23650 "[teb | erspan <session-id>] [del]") \
23651 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23652 _(l2_fib_clear_table, "") \
23653 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
23654 _(l2_interface_vlan_tag_rewrite, \
23655 "<intfc> | sw_if_index <nn> \n" \
23656 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
23657 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
23658 _(create_vhost_user_if, \
23659 "socket <filename> [server] [renumber <dev_instance>] " \
23660 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
23661 "[mac <mac_address>]") \
23662 _(modify_vhost_user_if, \
23663 "<intfc> | sw_if_index <nn> socket <filename>\n" \
23664 "[server] [renumber <dev_instance>]") \
23665 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
23666 _(sw_interface_vhost_user_dump, "") \
23667 _(show_version, "") \
23668 _(vxlan_gpe_add_del_tunnel, \
23669 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
23670 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23671 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
23672 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
23673 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23674 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
23675 _(interface_name_renumber, \
23676 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
23677 _(input_acl_set_interface, \
23678 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23679 " [l2-table <nn>] [del]") \
23680 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
23681 _(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
23682 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
23683 _(want_ip4_arp_events, "address <ip4-address> [del]") \
23684 _(want_ip6_nd_events, "address <ip6-address> [del]") \
23685 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
23686 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
23687 _(ip_dump, "ipv4 | ipv6") \
23688 _(ipsec_spd_add_del, "spd_id <n> [del]") \
23689 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
23691 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
23692 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
23693 " integ_alg <alg> integ_key <hex>") \
23694 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
23695 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
23696 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
23697 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
23698 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
23699 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
23700 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
23701 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
23702 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
23703 " [instance <n>]") \
23704 _(ipsec_sa_dump, "[sa_id <n>]") \
23705 _(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
23706 " <alg> <hex>\n") \
23707 _(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
23708 _(ikev2_profile_add_del, "name <profile_name> [del]") \
23709 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
23710 "(auth_data 0x<data> | auth_data <data>)") \
23711 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
23712 "(id_data 0x<data> | id_data <data>) (local|remote)") \
23713 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
23714 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
23715 "(local|remote)") \
23716 _(ikev2_set_local_key, "file <absolute_file_path>") \
23717 _(ikev2_set_responder, "<profile_name> interface <interface> address <addr>") \
23718 _(ikev2_set_ike_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23719 _(ikev2_set_esp_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23720 _(ikev2_set_sa_lifetime, "<profile_name> <seconds> <jitter> <handover> <max bytes>") \
23721 _(ikev2_initiate_sa_init, "<profile_name>") \
23722 _(ikev2_initiate_del_ike_sa, "<ispi>") \
23723 _(ikev2_initiate_del_child_sa, "<ispi>") \
23724 _(ikev2_initiate_rekey_child_sa, "<ispi>") \
23725 _(delete_loopback,"sw_if_index <nn>") \
23726 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
23727 _(bd_ip_mac_dump, "[bd_id] <id>") \
23728 _(want_interface_events, "enable|disable") \
23729 _(want_stats,"enable|disable") \
23730 _(get_first_msg_id, "client <name>") \
23731 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
23732 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
23733 "fib-id <nn> [ip4][ip6][default]") \
23734 _(get_node_graph, " ") \
23735 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
23736 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
23737 _(ioam_disable, "") \
23738 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
23739 " sw_if_index <sw_if_index> p <priority> " \
23740 "w <weight>] [del]") \
23741 _(one_add_del_locator, "locator-set <locator_name> " \
23742 "iface <intf> | sw_if_index <sw_if_index> " \
23743 "p <priority> w <weight> [del]") \
23744 _(one_add_del_local_eid,"vni <vni> eid " \
23745 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23746 "locator-set <locator_name> [del]" \
23747 "[key-id sha1|sha256 secret-key <secret-key>]")\
23748 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
23749 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
23750 _(one_enable_disable, "enable|disable") \
23751 _(one_map_register_enable_disable, "enable|disable") \
23752 _(one_map_register_fallback_threshold, "<value>") \
23753 _(one_rloc_probe_enable_disable, "enable|disable") \
23754 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23756 "rloc <locator> p <prio> " \
23757 "w <weight> [rloc <loc> ... ] " \
23758 "action <action> [del-all]") \
23759 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23761 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23762 _(one_use_petr, "ip-address> | disable") \
23763 _(one_map_request_mode, "src-dst|dst-only") \
23764 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23765 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23766 _(one_locator_set_dump, "[local | remote]") \
23767 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
23768 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23769 "[local] | [remote]") \
23770 _(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
23771 _(one_ndp_bd_get, "") \
23772 _(one_ndp_entries_get, "bd <bridge-domain>") \
23773 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
23774 _(one_l2_arp_bd_get, "") \
23775 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
23776 _(one_stats_enable_disable, "enable|disalbe") \
23777 _(show_one_stats_enable_disable, "") \
23778 _(one_eid_table_vni_dump, "") \
23779 _(one_eid_table_map_dump, "l2|l3") \
23780 _(one_map_resolver_dump, "") \
23781 _(one_map_server_dump, "") \
23782 _(one_adjacencies_get, "vni <vni>") \
23783 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
23784 _(show_one_rloc_probe_state, "") \
23785 _(show_one_map_register_state, "") \
23786 _(show_one_status, "") \
23787 _(one_stats_dump, "") \
23788 _(one_stats_flush, "") \
23789 _(one_get_map_request_itr_rlocs, "") \
23790 _(one_map_register_set_ttl, "<ttl>") \
23791 _(one_set_transport_protocol, "udp|api") \
23792 _(one_get_transport_protocol, "") \
23793 _(one_enable_disable_xtr_mode, "enable|disable") \
23794 _(one_show_xtr_mode, "") \
23795 _(one_enable_disable_pitr_mode, "enable|disable") \
23796 _(one_show_pitr_mode, "") \
23797 _(one_enable_disable_petr_mode, "enable|disable") \
23798 _(one_show_petr_mode, "") \
23799 _(show_one_nsh_mapping, "") \
23800 _(show_one_pitr, "") \
23801 _(show_one_use_petr, "") \
23802 _(show_one_map_request_mode, "") \
23803 _(show_one_map_register_ttl, "") \
23804 _(show_one_map_register_fallback_threshold, "") \
23805 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
23806 " sw_if_index <sw_if_index> p <priority> " \
23807 "w <weight>] [del]") \
23808 _(lisp_add_del_locator, "locator-set <locator_name> " \
23809 "iface <intf> | sw_if_index <sw_if_index> " \
23810 "p <priority> w <weight> [del]") \
23811 _(lisp_add_del_local_eid,"vni <vni> eid " \
23812 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23813 "locator-set <locator_name> [del]" \
23814 "[key-id sha1|sha256 secret-key <secret-key>]") \
23815 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
23816 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
23817 _(lisp_enable_disable, "enable|disable") \
23818 _(lisp_map_register_enable_disable, "enable|disable") \
23819 _(lisp_rloc_probe_enable_disable, "enable|disable") \
23820 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23822 "rloc <locator> p <prio> " \
23823 "w <weight> [rloc <loc> ... ] " \
23824 "action <action> [del-all]") \
23825 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23827 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23828 _(lisp_use_petr, "<ip-address> | disable") \
23829 _(lisp_map_request_mode, "src-dst|dst-only") \
23830 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23831 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23832 _(lisp_locator_set_dump, "[local | remote]") \
23833 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
23834 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23835 "[local] | [remote]") \
23836 _(lisp_eid_table_vni_dump, "") \
23837 _(lisp_eid_table_map_dump, "l2|l3") \
23838 _(lisp_map_resolver_dump, "") \
23839 _(lisp_map_server_dump, "") \
23840 _(lisp_adjacencies_get, "vni <vni>") \
23841 _(gpe_fwd_entry_vnis_get, "") \
23842 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
23843 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
23844 "[table <table-id>]") \
23845 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
23846 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
23847 _(gpe_set_encap_mode, "lisp|vxlan") \
23848 _(gpe_get_encap_mode, "") \
23849 _(lisp_gpe_add_del_iface, "up|down") \
23850 _(lisp_gpe_enable_disable, "enable|disable") \
23851 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
23852 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
23853 _(show_lisp_rloc_probe_state, "") \
23854 _(show_lisp_map_register_state, "") \
23855 _(show_lisp_status, "") \
23856 _(lisp_get_map_request_itr_rlocs, "") \
23857 _(show_lisp_pitr, "") \
23858 _(show_lisp_use_petr, "") \
23859 _(show_lisp_map_request_mode, "") \
23860 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
23861 _(af_packet_delete, "name <host interface name>") \
23862 _(af_packet_dump, "") \
23863 _(policer_add_del, "name <policer name> <params> [del]") \
23864 _(policer_dump, "[name <policer name>]") \
23865 _(policer_classify_set_interface, \
23866 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23867 " [l2-table <nn>] [del]") \
23868 _(policer_classify_dump, "type [ip4|ip6|l2]") \
23869 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
23870 "[master|slave]") \
23871 _(netmap_delete, "name <interface name>") \
23872 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
23873 _(mpls_fib_dump, "") \
23874 _(classify_table_ids, "") \
23875 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
23876 _(classify_table_info, "table_id <nn>") \
23877 _(classify_session_dump, "table_id <nn>") \
23878 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
23879 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
23880 "[template_interval <nn>] [udp_checksum]") \
23881 _(ipfix_exporter_dump, "") \
23882 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
23883 _(ipfix_classify_stream_dump, "") \
23884 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
23885 _(ipfix_classify_table_dump, "") \
23886 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
23887 _(sw_interface_span_dump, "[l2]") \
23888 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
23889 _(pg_create_interface, "if_id <nn>") \
23890 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
23891 _(pg_enable_disable, "[stream <id>] disable") \
23892 _(ip_source_and_port_range_check_add_del, \
23893 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
23894 _(ip_source_and_port_range_check_interface_add_del, \
23895 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
23896 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
23897 _(ipsec_gre_add_del_tunnel, \
23898 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
23899 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
23900 _(delete_subif,"<intfc> | sw_if_index <nn>") \
23901 _(l2_interface_pbb_tag_rewrite, \
23902 "<intfc> | sw_if_index <nn> \n" \
23903 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
23904 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
23905 _(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
23906 _(flow_classify_set_interface, \
23907 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
23908 _(flow_classify_dump, "type [ip4|ip6]") \
23909 _(ip_fib_dump, "") \
23910 _(ip_mfib_dump, "") \
23911 _(ip6_fib_dump, "") \
23912 _(ip6_mfib_dump, "") \
23913 _(feature_enable_disable, "arc_name <arc_name> " \
23914 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
23915 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
23917 _(l2_xconnect_dump, "") \
23918 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
23919 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
23920 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
23921 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
23922 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
23923 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
23924 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
23925 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
23926 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
23927 _(sock_init_shm, "size <nnn>") \
23928 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
23929 _(dns_enable_disable, "[enable][disable]") \
23930 _(dns_name_server_add_del, "<ip-address> [del]") \
23931 _(dns_resolve_name, "<hostname>") \
23932 _(dns_resolve_ip, "<ip4|ip6>") \
23933 _(dns_name_server_add_del, "<ip-address> [del]") \
23934 _(dns_resolve_name, "<hostname>") \
23935 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
23936 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
23937 _(session_rules_dump, "") \
23938 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
23939 _(output_acl_set_interface, \
23940 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23941 " [l2-table <nn>] [del]") \
23942 _(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
23944 /* List of command functions, CLI names map directly to functions */
23945 #define foreach_cli_function \
23946 _(comment, "usage: comment <ignore-rest-of-line>") \
23947 _(dump_interface_table, "usage: dump_interface_table") \
23948 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
23949 _(dump_ipv4_table, "usage: dump_ipv4_table") \
23950 _(dump_ipv6_table, "usage: dump_ipv6_table") \
23951 _(dump_stats_table, "usage: dump_stats_table") \
23952 _(dump_macro_table, "usage: dump_macro_table ") \
23953 _(dump_node_table, "usage: dump_node_table") \
23954 _(dump_msg_api_table, "usage: dump_msg_api_table") \
23955 _(get_msg_id, "usage: get_msg_id name_and_crc") \
23956 _(echo, "usage: echo <message>") \
23957 _(exec, "usage: exec <vpe-debug-CLI-command>") \
23958 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
23959 _(help, "usage: help") \
23960 _(q, "usage: quit") \
23961 _(quit, "usage: quit") \
23962 _(search_node_table, "usage: search_node_table <name>...") \
23963 _(set, "usage: set <variable-name> <value>") \
23964 _(script, "usage: script <file-name>") \
23965 _(statseg, "usage: statseg"); \
23966 _(unset, "usage: unset <variable-name>")
23969 static void vl_api_##n##_t_handler_uni \
23970 (vl_api_##n##_t * mp) \
23972 vat_main_t * vam = &vat_main; \
23973 if (vam->json_output) { \
23974 vl_api_##n##_t_handler_json(mp); \
23976 vl_api_##n##_t_handler(mp); \
23979 foreach_vpe_api_reply_msg;
23980 #if VPP_API_TEST_BUILTIN == 0
23981 foreach_standalone_reply_msg;
23986 vat_api_hookup (vat_main_t * vam)
23989 vl_msg_api_set_handlers(VL_API_##N, #n, \
23990 vl_api_##n##_t_handler_uni, \
23992 vl_api_##n##_t_endian, \
23993 vl_api_##n##_t_print, \
23994 sizeof(vl_api_##n##_t), 1);
23995 foreach_vpe_api_reply_msg;
23996 #if VPP_API_TEST_BUILTIN == 0
23997 foreach_standalone_reply_msg;
24001 #if (VPP_API_TEST_BUILTIN==0)
24002 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
24004 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
24006 vam->function_by_name = hash_create_string (0, sizeof (uword));
24008 vam->help_by_name = hash_create_string (0, sizeof (uword));
24011 /* API messages we can send */
24012 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
24013 foreach_vpe_api_msg;
24017 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
24018 foreach_vpe_api_msg;
24021 /* CLI functions */
24022 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
24023 foreach_cli_function;
24027 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
24028 foreach_cli_function;
24032 #if VPP_API_TEST_BUILTIN
24033 static clib_error_t *
24034 vat_api_hookup_shim (vlib_main_t * vm)
24036 vat_api_hookup (&vat_main);
24040 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
24044 * fd.io coding-style-patch-verification: ON
24047 * eval: (c-set-style "gnu")