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 <vpp/api/types.h>
22 #include <vppinfra/socket.h>
23 #include <vlibapi/api.h>
24 #include <vlibmemory/api.h>
25 #include <vnet/ip/ip.h>
26 #include <vnet/ip/ip_neighbor.h>
27 #include <vnet/l2/l2_input.h>
28 #include <vnet/l2tp/l2tp.h>
29 #include <vnet/vxlan/vxlan.h>
30 #include <vnet/geneve/geneve.h>
31 #include <vnet/gre/gre.h>
32 #include <vnet/vxlan-gpe/vxlan_gpe.h>
33 #include <vnet/lisp-gpe/lisp_gpe.h>
35 #include <vpp/api/vpe_msg_enum.h>
36 #include <vnet/l2/l2_classify.h>
37 #include <vnet/l2/l2_vtr.h>
38 #include <vnet/classify/in_out_acl.h>
39 #include <vnet/classify/policer_classify.h>
40 #include <vnet/classify/flow_classify.h>
41 #include <vnet/mpls/mpls.h>
42 #include <vnet/ipsec/ipsec.h>
43 #include <vnet/ipsec/ikev2.h>
45 #include <vnet/cop/cop.h>
46 #include <vnet/ip/ip6_hop_by_hop.h>
47 #include <vnet/ip/ip_source_and_port_range_check.h>
48 #include <vnet/policer/xlate.h>
49 #include <vnet/span/span.h>
50 #include <vnet/policer/policer.h>
51 #include <vnet/policer/police.h>
52 #include <vnet/mfib/mfib_types.h>
53 #include <vnet/dhcp/dhcp_proxy.h>
54 #include <vnet/bonding/node.h>
55 #include <vnet/qos/qos_types.h>
56 #include "vat/json_format.h"
57 #include <vnet/ip/ip_types_api.h>
58 #include <vnet/ethernet/ethernet_types_api.h>
63 #define vl_typedefs /* define message structures */
64 #include <vpp/api/vpe_all_api_h.h>
67 /* declare message handlers for each api */
69 #define vl_endianfun /* define message structures */
70 #include <vpp/api/vpe_all_api_h.h>
73 /* instantiate all the print functions we know about */
74 #define vl_print(handle, ...)
76 #include <vpp/api/vpe_all_api_h.h>
79 #define __plugin_msg_base 0
80 #include <vlibapi/vat_helper_macros.h>
82 #if VPP_API_TEST_BUILTIN == 0
92 vat_socket_connect (vat_main_t * vam)
95 vam->socket_client_main = &socket_client_main;
96 if ((rv = vl_socket_client_connect ((char *) vam->socket_name,
98 0 /* default socket rx, tx buffer */ )))
100 /* vpp expects the client index in network order */
101 vam->my_client_index = htonl (socket_client_main.client_index);
104 #else /* vpp built-in case, we don't do sockets... */
106 vat_socket_connect (vat_main_t * vam)
112 vl_socket_client_read (int wait)
118 vl_socket_client_write ()
124 vl_socket_client_msg_alloc (int nbytes)
132 vat_time_now (vat_main_t * vam)
134 #if VPP_API_TEST_BUILTIN
135 return vlib_time_now (vam->vlib_main);
137 return clib_time_now (&vam->clib_time);
142 errmsg (char *fmt, ...)
144 vat_main_t *vam = &vat_main;
149 s = va_format (0, fmt, &va);
154 #if VPP_API_TEST_BUILTIN
155 vlib_cli_output (vam->vlib_main, (char *) s);
158 if (vam->ifp != stdin)
159 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
160 vam->input_line_number);
161 fformat (vam->ofp, (char *) s);
169 #if VPP_API_TEST_BUILTIN == 0
171 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
173 vat_main_t *vam = va_arg (*args, vat_main_t *);
174 u32 *result = va_arg (*args, u32 *);
178 if (!unformat (input, "%s", &if_name))
181 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
189 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
194 /* Parse an IP4 address %d.%d.%d.%d. */
196 unformat_ip4_address (unformat_input_t * input, va_list * args)
198 u8 *result = va_arg (*args, u8 *);
201 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
204 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
216 unformat_ethernet_address (unformat_input_t * input, va_list * args)
218 u8 *result = va_arg (*args, u8 *);
221 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
222 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
226 for (i = 0; i < 6; i++)
227 if (a[i] >= (1 << 8))
230 for (i = 0; i < 6; i++)
236 /* Returns ethernet type as an int in host byte order. */
238 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
241 u16 *result = va_arg (*args, u16 *);
245 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
247 if (type >= (1 << 16))
255 /* Parse an IP6 address. */
257 unformat_ip6_address (unformat_input_t * input, va_list * args)
259 ip6_address_t *result = va_arg (*args, ip6_address_t *);
261 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
262 uword c, n_colon, double_colon_index;
264 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
265 double_colon_index = ARRAY_LEN (hex_quads);
266 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
269 if (c >= '0' && c <= '9')
271 else if (c >= 'a' && c <= 'f')
272 hex_digit = c + 10 - 'a';
273 else if (c >= 'A' && c <= 'F')
274 hex_digit = c + 10 - 'A';
275 else if (c == ':' && n_colon < 2)
279 unformat_put_input (input);
283 /* Too many hex quads. */
284 if (n_hex_quads >= ARRAY_LEN (hex_quads))
289 hex_quad = (hex_quad << 4) | hex_digit;
291 /* Hex quad must fit in 16 bits. */
292 if (n_hex_digits >= 4)
299 /* Save position of :: */
302 /* More than one :: ? */
303 if (double_colon_index < ARRAY_LEN (hex_quads))
305 double_colon_index = n_hex_quads;
308 if (n_colon > 0 && n_hex_digits > 0)
310 hex_quads[n_hex_quads++] = hex_quad;
316 if (n_hex_digits > 0)
317 hex_quads[n_hex_quads++] = hex_quad;
322 /* Expand :: to appropriate number of zero hex quads. */
323 if (double_colon_index < ARRAY_LEN (hex_quads))
325 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
327 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
328 hex_quads[n_zero + i] = hex_quads[i];
330 for (i = 0; i < n_zero; i++)
331 hex_quads[double_colon_index + i] = 0;
333 n_hex_quads = ARRAY_LEN (hex_quads);
336 /* Too few hex quads given. */
337 if (n_hex_quads < ARRAY_LEN (hex_quads))
340 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
341 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
348 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
350 u32 *r = va_arg (*args, u32 *);
353 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
354 foreach_ipsec_policy_action
362 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
364 u32 *r = va_arg (*args, u32 *);
367 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
368 foreach_ipsec_crypto_alg
376 format_ipsec_crypto_alg (u8 * s, va_list * args)
378 u32 i = va_arg (*args, u32);
383 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
384 foreach_ipsec_crypto_alg
387 return format (s, "unknown");
389 return format (s, "%s", t);
393 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
395 u32 *r = va_arg (*args, u32 *);
398 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
399 foreach_ipsec_integ_alg
407 format_ipsec_integ_alg (u8 * s, va_list * args)
409 u32 i = va_arg (*args, u32);
414 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
415 foreach_ipsec_integ_alg
418 return format (s, "unknown");
420 return format (s, "%s", t);
424 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
426 u32 *r = va_arg (*args, u32 *);
429 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
430 foreach_ikev2_auth_method
438 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
440 u32 *r = va_arg (*args, u32 *);
443 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
444 foreach_ikev2_id_type
450 #else /* VPP_API_TEST_BUILTIN == 1 */
452 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
454 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
455 vnet_main_t *vnm = vnet_get_main ();
456 u32 *result = va_arg (*args, u32 *);
458 return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result);
462 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
464 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
465 vnet_main_t *vnm = vnet_get_main ();
466 u32 *result = va_arg (*args, u32 *);
468 return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result);
471 #endif /* VPP_API_TEST_BUILTIN */
474 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
476 u8 *r = va_arg (*args, u8 *);
478 if (unformat (input, "kbps"))
479 *r = SSE2_QOS_RATE_KBPS;
480 else if (unformat (input, "pps"))
481 *r = SSE2_QOS_RATE_PPS;
488 unformat_policer_round_type (unformat_input_t * input, va_list * args)
490 u8 *r = va_arg (*args, u8 *);
492 if (unformat (input, "closest"))
493 *r = SSE2_QOS_ROUND_TO_CLOSEST;
494 else if (unformat (input, "up"))
495 *r = SSE2_QOS_ROUND_TO_UP;
496 else if (unformat (input, "down"))
497 *r = SSE2_QOS_ROUND_TO_DOWN;
504 unformat_policer_type (unformat_input_t * input, va_list * args)
506 u8 *r = va_arg (*args, u8 *);
508 if (unformat (input, "1r2c"))
509 *r = SSE2_QOS_POLICER_TYPE_1R2C;
510 else if (unformat (input, "1r3c"))
511 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
512 else if (unformat (input, "2r3c-2698"))
513 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
514 else if (unformat (input, "2r3c-4115"))
515 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
516 else if (unformat (input, "2r3c-mef5cf1"))
517 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
524 unformat_dscp (unformat_input_t * input, va_list * va)
526 u8 *r = va_arg (*va, u8 *);
529 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
538 unformat_policer_action_type (unformat_input_t * input, va_list * va)
540 sse2_qos_pol_action_params_st *a
541 = va_arg (*va, sse2_qos_pol_action_params_st *);
543 if (unformat (input, "drop"))
544 a->action_type = SSE2_QOS_ACTION_DROP;
545 else if (unformat (input, "transmit"))
546 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
547 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
548 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
555 unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
557 u32 *r = va_arg (*va, u32 *);
560 if (unformat (input, "ip4"))
561 tid = POLICER_CLASSIFY_TABLE_IP4;
562 else if (unformat (input, "ip6"))
563 tid = POLICER_CLASSIFY_TABLE_IP6;
564 else if (unformat (input, "l2"))
565 tid = POLICER_CLASSIFY_TABLE_L2;
574 unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
576 u32 *r = va_arg (*va, u32 *);
579 if (unformat (input, "ip4"))
580 tid = FLOW_CLASSIFY_TABLE_IP4;
581 else if (unformat (input, "ip6"))
582 tid = FLOW_CLASSIFY_TABLE_IP6;
590 static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
591 static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
592 static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
593 static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
595 #if (VPP_API_TEST_BUILTIN==0)
597 unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
599 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
600 mfib_itf_attribute_t attr;
603 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
605 if (unformat (input, mfib_itf_flag_long_names[attr]))
606 *iflags |= (1 << attr);
608 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
610 if (unformat (input, mfib_itf_flag_names[attr]))
611 *iflags |= (1 << attr);
614 return (old == *iflags ? 0 : 1);
618 unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
620 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
621 mfib_entry_attribute_t attr;
624 FOR_EACH_MFIB_ATTRIBUTE (attr)
626 if (unformat (input, mfib_flag_long_names[attr]))
627 *eflags |= (1 << attr);
629 FOR_EACH_MFIB_ATTRIBUTE (attr)
631 if (unformat (input, mfib_flag_names[attr]))
632 *eflags |= (1 << attr);
635 return (old == *eflags ? 0 : 1);
639 format_ip4_address (u8 * s, va_list * args)
641 u8 *a = va_arg (*args, u8 *);
642 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
646 format_ip6_address (u8 * s, va_list * args)
648 ip6_address_t *a = va_arg (*args, ip6_address_t *);
649 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
651 i_max_n_zero = ARRAY_LEN (a->as_u16);
653 i_first_zero = i_max_n_zero;
655 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
657 u32 is_zero = a->as_u16[i] == 0;
658 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
664 if ((!is_zero && n_zeros > max_n_zeros)
665 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
667 i_max_n_zero = i_first_zero;
668 max_n_zeros = n_zeros;
669 i_first_zero = ARRAY_LEN (a->as_u16);
674 last_double_colon = 0;
675 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
677 if (i == i_max_n_zero && max_n_zeros > 1)
679 s = format (s, "::");
680 i += max_n_zeros - 1;
681 last_double_colon = 1;
685 s = format (s, "%s%x",
686 (last_double_colon || i == 0) ? "" : ":",
687 clib_net_to_host_u16 (a->as_u16[i]));
688 last_double_colon = 0;
695 /* Format an IP46 address. */
697 format_ip46_address (u8 * s, va_list * args)
699 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
700 ip46_type_t type = va_arg (*args, ip46_type_t);
706 is_ip4 = ip46_address_is_ip4 (ip46);
717 format (s, "%U", format_ip4_address, &ip46->ip4) :
718 format (s, "%U", format_ip6_address, &ip46->ip6);
722 format_ethernet_address (u8 * s, va_list * args)
724 u8 *a = va_arg (*args, u8 *);
726 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
727 a[0], a[1], a[2], a[3], a[4], a[5]);
732 increment_v4_address (ip4_address_t * a)
736 v = ntohl (a->as_u32) + 1;
737 a->as_u32 = ntohl (v);
741 increment_v6_address (ip6_address_t * a)
745 v0 = clib_net_to_host_u64 (a->as_u64[0]);
746 v1 = clib_net_to_host_u64 (a->as_u64[1]);
751 a->as_u64[0] = clib_net_to_host_u64 (v0);
752 a->as_u64[1] = clib_net_to_host_u64 (v1);
756 increment_mac_address (u8 * mac)
758 u64 tmp = *((u64 *) mac);
759 tmp = clib_net_to_host_u64 (tmp);
760 tmp += 1 << 16; /* skip unused (least significant) octets */
761 tmp = clib_host_to_net_u64 (tmp);
763 clib_memcpy (mac, &tmp, 6);
766 static void vl_api_create_loopback_reply_t_handler
767 (vl_api_create_loopback_reply_t * mp)
769 vat_main_t *vam = &vat_main;
770 i32 retval = ntohl (mp->retval);
772 vam->retval = retval;
773 vam->regenerate_interface_table = 1;
774 vam->sw_if_index = ntohl (mp->sw_if_index);
775 vam->result_ready = 1;
778 static void vl_api_create_loopback_reply_t_handler_json
779 (vl_api_create_loopback_reply_t * mp)
781 vat_main_t *vam = &vat_main;
782 vat_json_node_t node;
784 vat_json_init_object (&node);
785 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
786 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
788 vat_json_print (vam->ofp, &node);
789 vat_json_free (&node);
790 vam->retval = ntohl (mp->retval);
791 vam->result_ready = 1;
794 static void vl_api_create_loopback_instance_reply_t_handler
795 (vl_api_create_loopback_instance_reply_t * mp)
797 vat_main_t *vam = &vat_main;
798 i32 retval = ntohl (mp->retval);
800 vam->retval = retval;
801 vam->regenerate_interface_table = 1;
802 vam->sw_if_index = ntohl (mp->sw_if_index);
803 vam->result_ready = 1;
806 static void vl_api_create_loopback_instance_reply_t_handler_json
807 (vl_api_create_loopback_instance_reply_t * mp)
809 vat_main_t *vam = &vat_main;
810 vat_json_node_t node;
812 vat_json_init_object (&node);
813 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
814 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
816 vat_json_print (vam->ofp, &node);
817 vat_json_free (&node);
818 vam->retval = ntohl (mp->retval);
819 vam->result_ready = 1;
822 static void vl_api_af_packet_create_reply_t_handler
823 (vl_api_af_packet_create_reply_t * mp)
825 vat_main_t *vam = &vat_main;
826 i32 retval = ntohl (mp->retval);
828 vam->retval = retval;
829 vam->regenerate_interface_table = 1;
830 vam->sw_if_index = ntohl (mp->sw_if_index);
831 vam->result_ready = 1;
834 static void vl_api_af_packet_create_reply_t_handler_json
835 (vl_api_af_packet_create_reply_t * mp)
837 vat_main_t *vam = &vat_main;
838 vat_json_node_t node;
840 vat_json_init_object (&node);
841 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
842 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
844 vat_json_print (vam->ofp, &node);
845 vat_json_free (&node);
847 vam->retval = ntohl (mp->retval);
848 vam->result_ready = 1;
851 static void vl_api_create_vlan_subif_reply_t_handler
852 (vl_api_create_vlan_subif_reply_t * mp)
854 vat_main_t *vam = &vat_main;
855 i32 retval = ntohl (mp->retval);
857 vam->retval = retval;
858 vam->regenerate_interface_table = 1;
859 vam->sw_if_index = ntohl (mp->sw_if_index);
860 vam->result_ready = 1;
863 static void vl_api_create_vlan_subif_reply_t_handler_json
864 (vl_api_create_vlan_subif_reply_t * mp)
866 vat_main_t *vam = &vat_main;
867 vat_json_node_t node;
869 vat_json_init_object (&node);
870 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
871 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
873 vat_json_print (vam->ofp, &node);
874 vat_json_free (&node);
876 vam->retval = ntohl (mp->retval);
877 vam->result_ready = 1;
880 static void vl_api_create_subif_reply_t_handler
881 (vl_api_create_subif_reply_t * mp)
883 vat_main_t *vam = &vat_main;
884 i32 retval = ntohl (mp->retval);
886 vam->retval = retval;
887 vam->regenerate_interface_table = 1;
888 vam->sw_if_index = ntohl (mp->sw_if_index);
889 vam->result_ready = 1;
892 static void vl_api_create_subif_reply_t_handler_json
893 (vl_api_create_subif_reply_t * mp)
895 vat_main_t *vam = &vat_main;
896 vat_json_node_t node;
898 vat_json_init_object (&node);
899 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
900 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
902 vat_json_print (vam->ofp, &node);
903 vat_json_free (&node);
905 vam->retval = ntohl (mp->retval);
906 vam->result_ready = 1;
909 static void vl_api_interface_name_renumber_reply_t_handler
910 (vl_api_interface_name_renumber_reply_t * mp)
912 vat_main_t *vam = &vat_main;
913 i32 retval = ntohl (mp->retval);
915 vam->retval = retval;
916 vam->regenerate_interface_table = 1;
917 vam->result_ready = 1;
920 static void vl_api_interface_name_renumber_reply_t_handler_json
921 (vl_api_interface_name_renumber_reply_t * mp)
923 vat_main_t *vam = &vat_main;
924 vat_json_node_t node;
926 vat_json_init_object (&node);
927 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
929 vat_json_print (vam->ofp, &node);
930 vat_json_free (&node);
932 vam->retval = ntohl (mp->retval);
933 vam->result_ready = 1;
937 * Special-case: build the interface table, maintain
938 * the next loopback sw_if_index vbl.
940 static void vl_api_sw_interface_details_t_handler
941 (vl_api_sw_interface_details_t * mp)
943 vat_main_t *vam = &vat_main;
944 u8 *s = format (0, "%s%c", mp->interface_name, 0);
946 hash_set_mem (vam->sw_if_index_by_interface_name, s,
947 ntohl (mp->sw_if_index));
949 /* In sub interface case, fill the sub interface table entry */
950 if (mp->sw_if_index != mp->sup_sw_if_index)
952 sw_interface_subif_t *sub = NULL;
954 vec_add2 (vam->sw_if_subif_table, sub, 1);
956 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
957 strncpy ((char *) sub->interface_name, (char *) s,
958 vec_len (sub->interface_name));
959 sub->sw_if_index = ntohl (mp->sw_if_index);
960 sub->sub_id = ntohl (mp->sub_id);
962 sub->sub_dot1ad = mp->sub_dot1ad;
963 sub->sub_number_of_tags = mp->sub_number_of_tags;
964 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
965 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
966 sub->sub_exact_match = mp->sub_exact_match;
967 sub->sub_default = mp->sub_default;
968 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
969 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
971 /* vlan tag rewrite */
972 sub->vtr_op = ntohl (mp->vtr_op);
973 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
974 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
975 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
979 static void vl_api_sw_interface_details_t_handler_json
980 (vl_api_sw_interface_details_t * mp)
982 vat_main_t *vam = &vat_main;
983 vat_json_node_t *node = NULL;
985 if (VAT_JSON_ARRAY != vam->json_tree.type)
987 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
988 vat_json_init_array (&vam->json_tree);
990 node = vat_json_array_add (&vam->json_tree);
992 vat_json_init_object (node);
993 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
994 vat_json_object_add_uint (node, "sup_sw_if_index",
995 ntohl (mp->sup_sw_if_index));
996 vat_json_object_add_uint (node, "l2_address_length",
997 ntohl (mp->l2_address_length));
998 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
999 sizeof (mp->l2_address));
1000 vat_json_object_add_string_copy (node, "interface_name",
1001 mp->interface_name);
1002 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
1003 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
1004 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
1005 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
1006 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
1007 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
1008 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
1009 vat_json_object_add_uint (node, "sub_number_of_tags",
1010 mp->sub_number_of_tags);
1011 vat_json_object_add_uint (node, "sub_outer_vlan_id",
1012 ntohs (mp->sub_outer_vlan_id));
1013 vat_json_object_add_uint (node, "sub_inner_vlan_id",
1014 ntohs (mp->sub_inner_vlan_id));
1015 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
1016 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
1017 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
1018 mp->sub_outer_vlan_id_any);
1019 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
1020 mp->sub_inner_vlan_id_any);
1021 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
1022 vat_json_object_add_uint (node, "vtr_push_dot1q",
1023 ntohl (mp->vtr_push_dot1q));
1024 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
1025 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
1028 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
1030 format_ethernet_address,
1032 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
1034 format_ethernet_address,
1036 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
1037 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
1041 #if VPP_API_TEST_BUILTIN == 0
1042 static void vl_api_sw_interface_event_t_handler
1043 (vl_api_sw_interface_event_t * mp)
1045 vat_main_t *vam = &vat_main;
1046 if (vam->interface_event_display)
1047 errmsg ("interface flags: sw_if_index %d %s %s",
1048 ntohl (mp->sw_if_index),
1049 mp->admin_up_down ? "admin-up" : "admin-down",
1050 mp->link_up_down ? "link-up" : "link-down");
1054 static void vl_api_sw_interface_event_t_handler_json
1055 (vl_api_sw_interface_event_t * mp)
1057 /* JSON output not supported */
1061 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
1063 vat_main_t *vam = &vat_main;
1064 i32 retval = ntohl (mp->retval);
1066 vam->retval = retval;
1067 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
1068 vam->result_ready = 1;
1072 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
1074 vat_main_t *vam = &vat_main;
1075 vat_json_node_t node;
1076 api_main_t *am = &api_main;
1080 vat_json_init_object (&node);
1081 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1082 vat_json_object_add_uint (&node, "reply_in_shmem",
1083 ntohl (mp->reply_in_shmem));
1084 /* Toss the shared-memory original... */
1085 pthread_mutex_lock (&am->vlib_rp->mutex);
1086 oldheap = svm_push_data_heap (am->vlib_rp);
1088 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1091 svm_pop_heap (oldheap);
1092 pthread_mutex_unlock (&am->vlib_rp->mutex);
1094 vat_json_print (vam->ofp, &node);
1095 vat_json_free (&node);
1097 vam->retval = ntohl (mp->retval);
1098 vam->result_ready = 1;
1102 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
1104 vat_main_t *vam = &vat_main;
1105 i32 retval = ntohl (mp->retval);
1106 u32 length = vl_api_string_len (&mp->reply);
1108 vec_reset_length (vam->cmd_reply);
1110 vam->retval = retval;
1113 vec_validate (vam->cmd_reply, length);
1114 clib_memcpy ((char *) (vam->cmd_reply),
1115 vl_api_from_api_string (&mp->reply), length);
1116 vam->cmd_reply[length] = 0;
1118 vam->result_ready = 1;
1122 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
1124 vat_main_t *vam = &vat_main;
1125 vat_json_node_t node;
1127 vec_reset_length (vam->cmd_reply);
1129 vat_json_init_object (&node);
1130 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1131 vat_json_object_add_string_copy (&node, "reply",
1132 vl_api_from_api_string (&mp->reply));
1134 vat_json_print (vam->ofp, &node);
1135 vat_json_free (&node);
1137 vam->retval = ntohl (mp->retval);
1138 vam->result_ready = 1;
1141 static void vl_api_classify_add_del_table_reply_t_handler
1142 (vl_api_classify_add_del_table_reply_t * mp)
1144 vat_main_t *vam = &vat_main;
1145 i32 retval = ntohl (mp->retval);
1146 if (vam->async_mode)
1148 vam->async_errors += (retval < 0);
1152 vam->retval = retval;
1154 ((mp->new_table_index != 0xFFFFFFFF) ||
1155 (mp->skip_n_vectors != 0xFFFFFFFF) ||
1156 (mp->match_n_vectors != 0xFFFFFFFF)))
1158 * Note: this is just barely thread-safe, depends on
1159 * the main thread spinning waiting for an answer...
1161 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d",
1162 ntohl (mp->new_table_index),
1163 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
1164 vam->result_ready = 1;
1168 static void vl_api_classify_add_del_table_reply_t_handler_json
1169 (vl_api_classify_add_del_table_reply_t * mp)
1171 vat_main_t *vam = &vat_main;
1172 vat_json_node_t node;
1174 vat_json_init_object (&node);
1175 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1176 vat_json_object_add_uint (&node, "new_table_index",
1177 ntohl (mp->new_table_index));
1178 vat_json_object_add_uint (&node, "skip_n_vectors",
1179 ntohl (mp->skip_n_vectors));
1180 vat_json_object_add_uint (&node, "match_n_vectors",
1181 ntohl (mp->match_n_vectors));
1183 vat_json_print (vam->ofp, &node);
1184 vat_json_free (&node);
1186 vam->retval = ntohl (mp->retval);
1187 vam->result_ready = 1;
1190 static void vl_api_get_node_index_reply_t_handler
1191 (vl_api_get_node_index_reply_t * mp)
1193 vat_main_t *vam = &vat_main;
1194 i32 retval = ntohl (mp->retval);
1195 if (vam->async_mode)
1197 vam->async_errors += (retval < 0);
1201 vam->retval = retval;
1203 errmsg ("node index %d", ntohl (mp->node_index));
1204 vam->result_ready = 1;
1208 static void vl_api_get_node_index_reply_t_handler_json
1209 (vl_api_get_node_index_reply_t * mp)
1211 vat_main_t *vam = &vat_main;
1212 vat_json_node_t node;
1214 vat_json_init_object (&node);
1215 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1216 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1218 vat_json_print (vam->ofp, &node);
1219 vat_json_free (&node);
1221 vam->retval = ntohl (mp->retval);
1222 vam->result_ready = 1;
1225 static void vl_api_get_next_index_reply_t_handler
1226 (vl_api_get_next_index_reply_t * mp)
1228 vat_main_t *vam = &vat_main;
1229 i32 retval = ntohl (mp->retval);
1230 if (vam->async_mode)
1232 vam->async_errors += (retval < 0);
1236 vam->retval = retval;
1238 errmsg ("next node index %d", ntohl (mp->next_index));
1239 vam->result_ready = 1;
1243 static void vl_api_get_next_index_reply_t_handler_json
1244 (vl_api_get_next_index_reply_t * mp)
1246 vat_main_t *vam = &vat_main;
1247 vat_json_node_t node;
1249 vat_json_init_object (&node);
1250 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1251 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1253 vat_json_print (vam->ofp, &node);
1254 vat_json_free (&node);
1256 vam->retval = ntohl (mp->retval);
1257 vam->result_ready = 1;
1260 static void vl_api_add_node_next_reply_t_handler
1261 (vl_api_add_node_next_reply_t * mp)
1263 vat_main_t *vam = &vat_main;
1264 i32 retval = ntohl (mp->retval);
1265 if (vam->async_mode)
1267 vam->async_errors += (retval < 0);
1271 vam->retval = retval;
1273 errmsg ("next index %d", ntohl (mp->next_index));
1274 vam->result_ready = 1;
1278 static void vl_api_add_node_next_reply_t_handler_json
1279 (vl_api_add_node_next_reply_t * mp)
1281 vat_main_t *vam = &vat_main;
1282 vat_json_node_t node;
1284 vat_json_init_object (&node);
1285 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1286 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1288 vat_json_print (vam->ofp, &node);
1289 vat_json_free (&node);
1291 vam->retval = ntohl (mp->retval);
1292 vam->result_ready = 1;
1295 static void vl_api_show_version_reply_t_handler
1296 (vl_api_show_version_reply_t * mp)
1298 vat_main_t *vam = &vat_main;
1299 i32 retval = ntohl (mp->retval);
1304 char *p = (char *) &mp->program;
1306 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1307 errmsg (" program: %s\n", s);
1311 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1312 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1313 errmsg (" version: %s\n", s);
1317 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1318 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1319 errmsg (" build date: %s\n", s);
1323 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1324 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1325 errmsg ("build directory: %s\n", s);
1328 vam->retval = retval;
1329 vam->result_ready = 1;
1332 static void vl_api_show_version_reply_t_handler_json
1333 (vl_api_show_version_reply_t * mp)
1335 vat_main_t *vam = &vat_main;
1336 vat_json_node_t node;
1338 vat_json_init_object (&node);
1339 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1340 char *p = (char *) &mp->program;
1341 vat_json_object_add_string_copy (&node, "program",
1342 vl_api_from_api_string ((vl_api_string_t *)
1344 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1345 vat_json_object_add_string_copy (&node, "version",
1346 vl_api_from_api_string ((vl_api_string_t *)
1348 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1349 vat_json_object_add_string_copy (&node, "build_date",
1350 vl_api_from_api_string ((vl_api_string_t *)
1352 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1353 vat_json_object_add_string_copy (&node, "build_directory",
1354 vl_api_from_api_string ((vl_api_string_t *)
1357 vat_json_print (vam->ofp, &node);
1358 vat_json_free (&node);
1360 vam->retval = ntohl (mp->retval);
1361 vam->result_ready = 1;
1364 static void vl_api_show_threads_reply_t_handler
1365 (vl_api_show_threads_reply_t * mp)
1367 vat_main_t *vam = &vat_main;
1368 i32 retval = ntohl (mp->retval);
1372 count = ntohl (mp->count);
1374 for (i = 0; i < count; i++)
1376 "\n%-2d %-11s %-11s %-5d %-6d %-4d %-6d",
1377 ntohl (mp->thread_data[i].id), mp->thread_data[i].name,
1378 mp->thread_data[i].type, ntohl (mp->thread_data[i].pid),
1379 ntohl (mp->thread_data[i].cpu_id), ntohl (mp->thread_data[i].core),
1380 ntohl (mp->thread_data[i].cpu_socket));
1382 vam->retval = retval;
1383 vam->result_ready = 1;
1386 static void vl_api_show_threads_reply_t_handler_json
1387 (vl_api_show_threads_reply_t * mp)
1389 vat_main_t *vam = &vat_main;
1390 vat_json_node_t node;
1391 vl_api_thread_data_t *td;
1392 i32 retval = ntohl (mp->retval);
1396 count = ntohl (mp->count);
1398 vat_json_init_object (&node);
1399 vat_json_object_add_int (&node, "retval", retval);
1400 vat_json_object_add_uint (&node, "count", count);
1402 for (i = 0; i < count; i++)
1404 td = &mp->thread_data[i];
1405 vat_json_object_add_uint (&node, "id", ntohl (td->id));
1406 vat_json_object_add_string_copy (&node, "name", td->name);
1407 vat_json_object_add_string_copy (&node, "type", td->type);
1408 vat_json_object_add_uint (&node, "pid", ntohl (td->pid));
1409 vat_json_object_add_int (&node, "cpu_id", ntohl (td->cpu_id));
1410 vat_json_object_add_int (&node, "core", ntohl (td->id));
1411 vat_json_object_add_int (&node, "cpu_socket", ntohl (td->cpu_socket));
1414 vat_json_print (vam->ofp, &node);
1415 vat_json_free (&node);
1417 vam->retval = retval;
1418 vam->result_ready = 1;
1422 api_show_threads (vat_main_t * vam)
1424 vl_api_show_threads_t *mp;
1428 "\n%-2s %-11s %-11s %-5s %-6s %-4s %-6s",
1429 "ID", "Name", "Type", "LWP", "cpu_id", "Core", "Socket");
1431 M (SHOW_THREADS, mp);
1439 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1441 u32 sw_if_index = ntohl (mp->sw_if_index);
1442 errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n",
1443 mp->mac_ip ? "mac/ip binding" : "address resolution",
1444 ntohl (mp->pid), format_ip4_address, &mp->address,
1445 format_ethernet_address, mp->new_mac, sw_if_index);
1449 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1451 /* JSON output not supported */
1455 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1457 u32 sw_if_index = ntohl (mp->sw_if_index);
1458 errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n",
1459 mp->mac_ip ? "mac/ip binding" : "address resolution",
1460 ntohl (mp->pid), format_ip6_address, mp->address,
1461 format_ethernet_address, mp->new_mac, sw_if_index);
1465 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1467 /* JSON output not supported */
1471 vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1473 u32 n_macs = ntohl (mp->n_macs);
1474 errmsg ("L2MAC event received with pid %d cl-idx %d for %d macs: \n",
1475 ntohl (mp->pid), mp->client_index, n_macs);
1477 for (i = 0; i < n_macs; i++)
1479 vl_api_mac_entry_t *mac = &mp->mac[i];
1480 errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
1481 i + 1, ntohl (mac->sw_if_index),
1482 format_ethernet_address, mac->mac_addr, mac->action);
1489 vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1491 /* JSON output not supported */
1494 #define vl_api_bridge_domain_details_t_endian vl_noop_handler
1495 #define vl_api_bridge_domain_details_t_print vl_noop_handler
1498 * Special-case: build the bridge domain table, maintain
1499 * the next bd id vbl.
1501 static void vl_api_bridge_domain_details_t_handler
1502 (vl_api_bridge_domain_details_t * mp)
1504 vat_main_t *vam = &vat_main;
1505 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1508 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-6s %-3s",
1509 " ID", "LRN", "FWD", "FLD", "BVI", "UU-FWD", "#IF");
1511 print (vam->ofp, "%3d %3d %3d %3d %3d %6d %3d",
1512 ntohl (mp->bd_id), mp->learn, mp->forward,
1513 mp->flood, ntohl (mp->bvi_sw_if_index),
1514 ntohl (mp->uu_fwd_sw_if_index), n_sw_ifs);
1518 vl_api_bridge_domain_sw_if_t *sw_ifs;
1519 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1522 sw_ifs = mp->sw_if_details;
1523 for (i = 0; i < n_sw_ifs; i++)
1529 sw_if_index = ntohl (sw_ifs->sw_if_index);
1532 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1534 if ((u32) p->value[0] == sw_if_index)
1536 sw_if_name = (u8 *)(p->key);
1541 print (vam->ofp, "%7d %3d %s", sw_if_index,
1542 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1543 "sw_if_index not found!");
1550 static void vl_api_bridge_domain_details_t_handler_json
1551 (vl_api_bridge_domain_details_t * mp)
1553 vat_main_t *vam = &vat_main;
1554 vat_json_node_t *node, *array = NULL;
1555 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1557 if (VAT_JSON_ARRAY != vam->json_tree.type)
1559 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1560 vat_json_init_array (&vam->json_tree);
1562 node = vat_json_array_add (&vam->json_tree);
1564 vat_json_init_object (node);
1565 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1566 vat_json_object_add_uint (node, "flood", mp->flood);
1567 vat_json_object_add_uint (node, "forward", mp->forward);
1568 vat_json_object_add_uint (node, "learn", mp->learn);
1569 vat_json_object_add_uint (node, "bvi_sw_if_index",
1570 ntohl (mp->bvi_sw_if_index));
1571 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
1572 array = vat_json_object_add (node, "sw_if");
1573 vat_json_init_array (array);
1579 vl_api_bridge_domain_sw_if_t *sw_ifs;
1582 sw_ifs = mp->sw_if_details;
1583 for (i = 0; i < n_sw_ifs; i++)
1585 node = vat_json_array_add (array);
1586 vat_json_init_object (node);
1587 vat_json_object_add_uint (node, "sw_if_index",
1588 ntohl (sw_ifs->sw_if_index));
1589 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1595 static void vl_api_control_ping_reply_t_handler
1596 (vl_api_control_ping_reply_t * mp)
1598 vat_main_t *vam = &vat_main;
1599 i32 retval = ntohl (mp->retval);
1600 if (vam->async_mode)
1602 vam->async_errors += (retval < 0);
1606 vam->retval = retval;
1607 vam->result_ready = 1;
1609 if (vam->socket_client_main)
1610 vam->socket_client_main->control_pings_outstanding--;
1613 static void vl_api_control_ping_reply_t_handler_json
1614 (vl_api_control_ping_reply_t * mp)
1616 vat_main_t *vam = &vat_main;
1617 i32 retval = ntohl (mp->retval);
1619 if (VAT_JSON_NONE != vam->json_tree.type)
1621 vat_json_print (vam->ofp, &vam->json_tree);
1622 vat_json_free (&vam->json_tree);
1623 vam->json_tree.type = VAT_JSON_NONE;
1628 vat_json_init_array (&vam->json_tree);
1629 vat_json_print (vam->ofp, &vam->json_tree);
1630 vam->json_tree.type = VAT_JSON_NONE;
1633 vam->retval = retval;
1634 vam->result_ready = 1;
1638 vl_api_bridge_domain_set_mac_age_reply_t_handler
1639 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1641 vat_main_t *vam = &vat_main;
1642 i32 retval = ntohl (mp->retval);
1643 if (vam->async_mode)
1645 vam->async_errors += (retval < 0);
1649 vam->retval = retval;
1650 vam->result_ready = 1;
1654 static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1655 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1657 vat_main_t *vam = &vat_main;
1658 vat_json_node_t node;
1660 vat_json_init_object (&node);
1661 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1663 vat_json_print (vam->ofp, &node);
1664 vat_json_free (&node);
1666 vam->retval = ntohl (mp->retval);
1667 vam->result_ready = 1;
1671 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1673 vat_main_t *vam = &vat_main;
1674 i32 retval = ntohl (mp->retval);
1675 if (vam->async_mode)
1677 vam->async_errors += (retval < 0);
1681 vam->retval = retval;
1682 vam->result_ready = 1;
1686 static void vl_api_l2_flags_reply_t_handler_json
1687 (vl_api_l2_flags_reply_t * mp)
1689 vat_main_t *vam = &vat_main;
1690 vat_json_node_t node;
1692 vat_json_init_object (&node);
1693 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1694 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1695 ntohl (mp->resulting_feature_bitmap));
1697 vat_json_print (vam->ofp, &node);
1698 vat_json_free (&node);
1700 vam->retval = ntohl (mp->retval);
1701 vam->result_ready = 1;
1704 static void vl_api_bridge_flags_reply_t_handler
1705 (vl_api_bridge_flags_reply_t * mp)
1707 vat_main_t *vam = &vat_main;
1708 i32 retval = ntohl (mp->retval);
1709 if (vam->async_mode)
1711 vam->async_errors += (retval < 0);
1715 vam->retval = retval;
1716 vam->result_ready = 1;
1720 static void vl_api_bridge_flags_reply_t_handler_json
1721 (vl_api_bridge_flags_reply_t * mp)
1723 vat_main_t *vam = &vat_main;
1724 vat_json_node_t node;
1726 vat_json_init_object (&node);
1727 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1728 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1729 ntohl (mp->resulting_feature_bitmap));
1731 vat_json_print (vam->ofp, &node);
1732 vat_json_free (&node);
1734 vam->retval = ntohl (mp->retval);
1735 vam->result_ready = 1;
1738 static void vl_api_tap_connect_reply_t_handler
1739 (vl_api_tap_connect_reply_t * mp)
1741 vat_main_t *vam = &vat_main;
1742 i32 retval = ntohl (mp->retval);
1743 if (vam->async_mode)
1745 vam->async_errors += (retval < 0);
1749 vam->retval = retval;
1750 vam->sw_if_index = ntohl (mp->sw_if_index);
1751 vam->result_ready = 1;
1756 static void vl_api_tap_connect_reply_t_handler_json
1757 (vl_api_tap_connect_reply_t * mp)
1759 vat_main_t *vam = &vat_main;
1760 vat_json_node_t node;
1762 vat_json_init_object (&node);
1763 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1764 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1766 vat_json_print (vam->ofp, &node);
1767 vat_json_free (&node);
1769 vam->retval = ntohl (mp->retval);
1770 vam->result_ready = 1;
1775 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1777 vat_main_t *vam = &vat_main;
1778 i32 retval = ntohl (mp->retval);
1779 if (vam->async_mode)
1781 vam->async_errors += (retval < 0);
1785 vam->retval = retval;
1786 vam->sw_if_index = ntohl (mp->sw_if_index);
1787 vam->result_ready = 1;
1791 static void vl_api_tap_modify_reply_t_handler_json
1792 (vl_api_tap_modify_reply_t * mp)
1794 vat_main_t *vam = &vat_main;
1795 vat_json_node_t node;
1797 vat_json_init_object (&node);
1798 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1799 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1801 vat_json_print (vam->ofp, &node);
1802 vat_json_free (&node);
1804 vam->retval = ntohl (mp->retval);
1805 vam->result_ready = 1;
1809 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1811 vat_main_t *vam = &vat_main;
1812 i32 retval = ntohl (mp->retval);
1813 if (vam->async_mode)
1815 vam->async_errors += (retval < 0);
1819 vam->retval = retval;
1820 vam->result_ready = 1;
1824 static void vl_api_tap_delete_reply_t_handler_json
1825 (vl_api_tap_delete_reply_t * mp)
1827 vat_main_t *vam = &vat_main;
1828 vat_json_node_t node;
1830 vat_json_init_object (&node);
1831 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1833 vat_json_print (vam->ofp, &node);
1834 vat_json_free (&node);
1836 vam->retval = ntohl (mp->retval);
1837 vam->result_ready = 1;
1841 vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp)
1843 vat_main_t *vam = &vat_main;
1844 i32 retval = ntohl (mp->retval);
1845 if (vam->async_mode)
1847 vam->async_errors += (retval < 0);
1851 vam->retval = retval;
1852 vam->sw_if_index = ntohl (mp->sw_if_index);
1853 vam->result_ready = 1;
1858 static void vl_api_tap_create_v2_reply_t_handler_json
1859 (vl_api_tap_create_v2_reply_t * mp)
1861 vat_main_t *vam = &vat_main;
1862 vat_json_node_t node;
1864 vat_json_init_object (&node);
1865 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1866 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1868 vat_json_print (vam->ofp, &node);
1869 vat_json_free (&node);
1871 vam->retval = ntohl (mp->retval);
1872 vam->result_ready = 1;
1877 vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp)
1879 vat_main_t *vam = &vat_main;
1880 i32 retval = ntohl (mp->retval);
1881 if (vam->async_mode)
1883 vam->async_errors += (retval < 0);
1887 vam->retval = retval;
1888 vam->result_ready = 1;
1892 static void vl_api_tap_delete_v2_reply_t_handler_json
1893 (vl_api_tap_delete_v2_reply_t * mp)
1895 vat_main_t *vam = &vat_main;
1896 vat_json_node_t node;
1898 vat_json_init_object (&node);
1899 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1901 vat_json_print (vam->ofp, &node);
1902 vat_json_free (&node);
1904 vam->retval = ntohl (mp->retval);
1905 vam->result_ready = 1;
1909 vl_api_bond_create_reply_t_handler (vl_api_bond_create_reply_t * mp)
1911 vat_main_t *vam = &vat_main;
1912 i32 retval = ntohl (mp->retval);
1914 if (vam->async_mode)
1916 vam->async_errors += (retval < 0);
1920 vam->retval = retval;
1921 vam->sw_if_index = ntohl (mp->sw_if_index);
1922 vam->result_ready = 1;
1926 static void vl_api_bond_create_reply_t_handler_json
1927 (vl_api_bond_create_reply_t * mp)
1929 vat_main_t *vam = &vat_main;
1930 vat_json_node_t node;
1932 vat_json_init_object (&node);
1933 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1934 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1936 vat_json_print (vam->ofp, &node);
1937 vat_json_free (&node);
1939 vam->retval = ntohl (mp->retval);
1940 vam->result_ready = 1;
1944 vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp)
1946 vat_main_t *vam = &vat_main;
1947 i32 retval = ntohl (mp->retval);
1949 if (vam->async_mode)
1951 vam->async_errors += (retval < 0);
1955 vam->retval = retval;
1956 vam->result_ready = 1;
1960 static void vl_api_bond_delete_reply_t_handler_json
1961 (vl_api_bond_delete_reply_t * mp)
1963 vat_main_t *vam = &vat_main;
1964 vat_json_node_t node;
1966 vat_json_init_object (&node);
1967 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1969 vat_json_print (vam->ofp, &node);
1970 vat_json_free (&node);
1972 vam->retval = ntohl (mp->retval);
1973 vam->result_ready = 1;
1977 vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
1979 vat_main_t *vam = &vat_main;
1980 i32 retval = ntohl (mp->retval);
1982 if (vam->async_mode)
1984 vam->async_errors += (retval < 0);
1988 vam->retval = retval;
1989 vam->result_ready = 1;
1993 static void vl_api_bond_enslave_reply_t_handler_json
1994 (vl_api_bond_enslave_reply_t * mp)
1996 vat_main_t *vam = &vat_main;
1997 vat_json_node_t node;
1999 vat_json_init_object (&node);
2000 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2002 vat_json_print (vam->ofp, &node);
2003 vat_json_free (&node);
2005 vam->retval = ntohl (mp->retval);
2006 vam->result_ready = 1;
2010 vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
2013 vat_main_t *vam = &vat_main;
2014 i32 retval = ntohl (mp->retval);
2016 if (vam->async_mode)
2018 vam->async_errors += (retval < 0);
2022 vam->retval = retval;
2023 vam->result_ready = 1;
2027 static void vl_api_bond_detach_slave_reply_t_handler_json
2028 (vl_api_bond_detach_slave_reply_t * mp)
2030 vat_main_t *vam = &vat_main;
2031 vat_json_node_t node;
2033 vat_json_init_object (&node);
2034 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2036 vat_json_print (vam->ofp, &node);
2037 vat_json_free (&node);
2039 vam->retval = ntohl (mp->retval);
2040 vam->result_ready = 1;
2043 static void vl_api_sw_interface_bond_details_t_handler
2044 (vl_api_sw_interface_bond_details_t * mp)
2046 vat_main_t *vam = &vat_main;
2049 "%-16s %-12d %-12U %-13U %-14u %-14u",
2050 mp->interface_name, ntohl (mp->sw_if_index),
2051 format_bond_mode, mp->mode, format_bond_load_balance, mp->lb,
2052 ntohl (mp->active_slaves), ntohl (mp->slaves));
2055 static void vl_api_sw_interface_bond_details_t_handler_json
2056 (vl_api_sw_interface_bond_details_t * mp)
2058 vat_main_t *vam = &vat_main;
2059 vat_json_node_t *node = NULL;
2061 if (VAT_JSON_ARRAY != vam->json_tree.type)
2063 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2064 vat_json_init_array (&vam->json_tree);
2066 node = vat_json_array_add (&vam->json_tree);
2068 vat_json_init_object (node);
2069 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2070 vat_json_object_add_string_copy (node, "interface_name",
2071 mp->interface_name);
2072 vat_json_object_add_uint (node, "mode", mp->mode);
2073 vat_json_object_add_uint (node, "load_balance", mp->lb);
2074 vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
2075 vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
2079 api_sw_interface_bond_dump (vat_main_t * vam)
2081 vl_api_sw_interface_bond_dump_t *mp;
2082 vl_api_control_ping_t *mp_ping;
2086 "\n%-16s %-12s %-12s %-13s %-14s %-14s",
2087 "interface name", "sw_if_index", "mode", "load balance",
2088 "active slaves", "slaves");
2090 /* Get list of bond interfaces */
2091 M (SW_INTERFACE_BOND_DUMP, mp);
2094 /* Use a control ping for synchronization */
2095 MPING (CONTROL_PING, mp_ping);
2102 static void vl_api_sw_interface_slave_details_t_handler
2103 (vl_api_sw_interface_slave_details_t * mp)
2105 vat_main_t *vam = &vat_main;
2108 "%-25s %-12d %-12d %d", mp->interface_name,
2109 ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout);
2112 static void vl_api_sw_interface_slave_details_t_handler_json
2113 (vl_api_sw_interface_slave_details_t * mp)
2115 vat_main_t *vam = &vat_main;
2116 vat_json_node_t *node = NULL;
2118 if (VAT_JSON_ARRAY != vam->json_tree.type)
2120 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2121 vat_json_init_array (&vam->json_tree);
2123 node = vat_json_array_add (&vam->json_tree);
2125 vat_json_init_object (node);
2126 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2127 vat_json_object_add_string_copy (node, "interface_name",
2128 mp->interface_name);
2129 vat_json_object_add_uint (node, "passive", mp->is_passive);
2130 vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout);
2134 api_sw_interface_slave_dump (vat_main_t * vam)
2136 unformat_input_t *i = vam->input;
2137 vl_api_sw_interface_slave_dump_t *mp;
2138 vl_api_control_ping_t *mp_ping;
2139 u32 sw_if_index = ~0;
2140 u8 sw_if_index_set = 0;
2143 /* Parse args required to build the message */
2144 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2146 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2147 sw_if_index_set = 1;
2148 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2149 sw_if_index_set = 1;
2154 if (sw_if_index_set == 0)
2156 errmsg ("missing vpp interface name. ");
2161 "\n%-25s %-12s %-12s %s",
2162 "slave interface name", "sw_if_index", "passive", "long_timeout");
2164 /* Get list of bond interfaces */
2165 M (SW_INTERFACE_SLAVE_DUMP, mp);
2166 mp->sw_if_index = ntohl (sw_if_index);
2169 /* Use a control ping for synchronization */
2170 MPING (CONTROL_PING, mp_ping);
2177 static void vl_api_mpls_tunnel_add_del_reply_t_handler
2178 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2180 vat_main_t *vam = &vat_main;
2181 i32 retval = ntohl (mp->retval);
2182 if (vam->async_mode)
2184 vam->async_errors += (retval < 0);
2188 vam->retval = retval;
2189 vam->sw_if_index = ntohl (mp->sw_if_index);
2190 vam->result_ready = 1;
2192 vam->regenerate_interface_table = 1;
2195 static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
2196 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2198 vat_main_t *vam = &vat_main;
2199 vat_json_node_t node;
2201 vat_json_init_object (&node);
2202 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2203 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
2204 ntohl (mp->sw_if_index));
2206 vat_json_print (vam->ofp, &node);
2207 vat_json_free (&node);
2209 vam->retval = ntohl (mp->retval);
2210 vam->result_ready = 1;
2213 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
2214 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2216 vat_main_t *vam = &vat_main;
2217 i32 retval = ntohl (mp->retval);
2218 if (vam->async_mode)
2220 vam->async_errors += (retval < 0);
2224 vam->retval = retval;
2225 vam->sw_if_index = ntohl (mp->sw_if_index);
2226 vam->result_ready = 1;
2230 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
2231 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2233 vat_main_t *vam = &vat_main;
2234 vat_json_node_t node;
2236 vat_json_init_object (&node);
2237 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2238 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2240 vat_json_print (vam->ofp, &node);
2241 vat_json_free (&node);
2243 vam->retval = ntohl (mp->retval);
2244 vam->result_ready = 1;
2247 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
2248 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2250 vat_main_t *vam = &vat_main;
2251 i32 retval = ntohl (mp->retval);
2252 if (vam->async_mode)
2254 vam->async_errors += (retval < 0);
2258 vam->retval = retval;
2259 vam->result_ready = 1;
2263 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
2264 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2266 vat_main_t *vam = &vat_main;
2267 vat_json_node_t node;
2269 vat_json_init_object (&node);
2270 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2271 vat_json_object_add_uint (&node, "fwd_entry_index",
2272 clib_net_to_host_u32 (mp->fwd_entry_index));
2274 vat_json_print (vam->ofp, &node);
2275 vat_json_free (&node);
2277 vam->retval = ntohl (mp->retval);
2278 vam->result_ready = 1;
2282 format_lisp_transport_protocol (u8 * s, va_list * args)
2284 u32 proto = va_arg (*args, u32);
2289 return format (s, "udp");
2291 return format (s, "api");
2298 static void vl_api_one_get_transport_protocol_reply_t_handler
2299 (vl_api_one_get_transport_protocol_reply_t * mp)
2301 vat_main_t *vam = &vat_main;
2302 i32 retval = ntohl (mp->retval);
2303 if (vam->async_mode)
2305 vam->async_errors += (retval < 0);
2309 u32 proto = mp->protocol;
2310 print (vam->ofp, "Transport protocol: %U",
2311 format_lisp_transport_protocol, proto);
2312 vam->retval = retval;
2313 vam->result_ready = 1;
2317 static void vl_api_one_get_transport_protocol_reply_t_handler_json
2318 (vl_api_one_get_transport_protocol_reply_t * mp)
2320 vat_main_t *vam = &vat_main;
2321 vat_json_node_t node;
2324 s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
2327 vat_json_init_object (&node);
2328 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2329 vat_json_object_add_string_copy (&node, "transport-protocol", s);
2332 vat_json_print (vam->ofp, &node);
2333 vat_json_free (&node);
2335 vam->retval = ntohl (mp->retval);
2336 vam->result_ready = 1;
2339 static void vl_api_one_add_del_locator_set_reply_t_handler
2340 (vl_api_one_add_del_locator_set_reply_t * mp)
2342 vat_main_t *vam = &vat_main;
2343 i32 retval = ntohl (mp->retval);
2344 if (vam->async_mode)
2346 vam->async_errors += (retval < 0);
2350 vam->retval = retval;
2351 vam->result_ready = 1;
2355 static void vl_api_one_add_del_locator_set_reply_t_handler_json
2356 (vl_api_one_add_del_locator_set_reply_t * mp)
2358 vat_main_t *vam = &vat_main;
2359 vat_json_node_t node;
2361 vat_json_init_object (&node);
2362 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2363 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
2365 vat_json_print (vam->ofp, &node);
2366 vat_json_free (&node);
2368 vam->retval = ntohl (mp->retval);
2369 vam->result_ready = 1;
2372 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
2373 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2375 vat_main_t *vam = &vat_main;
2376 i32 retval = ntohl (mp->retval);
2377 if (vam->async_mode)
2379 vam->async_errors += (retval < 0);
2383 vam->retval = retval;
2384 vam->sw_if_index = ntohl (mp->sw_if_index);
2385 vam->result_ready = 1;
2387 vam->regenerate_interface_table = 1;
2390 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
2391 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2393 vat_main_t *vam = &vat_main;
2394 vat_json_node_t node;
2396 vat_json_init_object (&node);
2397 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2398 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2400 vat_json_print (vam->ofp, &node);
2401 vat_json_free (&node);
2403 vam->retval = ntohl (mp->retval);
2404 vam->result_ready = 1;
2407 static void vl_api_vxlan_offload_rx_reply_t_handler
2408 (vl_api_vxlan_offload_rx_reply_t * mp)
2410 vat_main_t *vam = &vat_main;
2411 i32 retval = ntohl (mp->retval);
2412 if (vam->async_mode)
2414 vam->async_errors += (retval < 0);
2418 vam->retval = retval;
2419 vam->result_ready = 1;
2423 static void vl_api_vxlan_offload_rx_reply_t_handler_json
2424 (vl_api_vxlan_offload_rx_reply_t * mp)
2426 vat_main_t *vam = &vat_main;
2427 vat_json_node_t node;
2429 vat_json_init_object (&node);
2430 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2432 vat_json_print (vam->ofp, &node);
2433 vat_json_free (&node);
2435 vam->retval = ntohl (mp->retval);
2436 vam->result_ready = 1;
2439 static void vl_api_geneve_add_del_tunnel_reply_t_handler
2440 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2442 vat_main_t *vam = &vat_main;
2443 i32 retval = ntohl (mp->retval);
2444 if (vam->async_mode)
2446 vam->async_errors += (retval < 0);
2450 vam->retval = retval;
2451 vam->sw_if_index = ntohl (mp->sw_if_index);
2452 vam->result_ready = 1;
2456 static void vl_api_geneve_add_del_tunnel_reply_t_handler_json
2457 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2459 vat_main_t *vam = &vat_main;
2460 vat_json_node_t node;
2462 vat_json_init_object (&node);
2463 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2464 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2466 vat_json_print (vam->ofp, &node);
2467 vat_json_free (&node);
2469 vam->retval = ntohl (mp->retval);
2470 vam->result_ready = 1;
2473 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
2474 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2476 vat_main_t *vam = &vat_main;
2477 i32 retval = ntohl (mp->retval);
2478 if (vam->async_mode)
2480 vam->async_errors += (retval < 0);
2484 vam->retval = retval;
2485 vam->sw_if_index = ntohl (mp->sw_if_index);
2486 vam->result_ready = 1;
2488 vam->regenerate_interface_table = 1;
2491 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
2492 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2494 vat_main_t *vam = &vat_main;
2495 vat_json_node_t node;
2497 vat_json_init_object (&node);
2498 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2499 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2501 vat_json_print (vam->ofp, &node);
2502 vat_json_free (&node);
2504 vam->retval = ntohl (mp->retval);
2505 vam->result_ready = 1;
2508 static void vl_api_gre_add_del_tunnel_reply_t_handler
2509 (vl_api_gre_add_del_tunnel_reply_t * mp)
2511 vat_main_t *vam = &vat_main;
2512 i32 retval = ntohl (mp->retval);
2513 if (vam->async_mode)
2515 vam->async_errors += (retval < 0);
2519 vam->retval = retval;
2520 vam->sw_if_index = ntohl (mp->sw_if_index);
2521 vam->result_ready = 1;
2525 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
2526 (vl_api_gre_add_del_tunnel_reply_t * mp)
2528 vat_main_t *vam = &vat_main;
2529 vat_json_node_t node;
2531 vat_json_init_object (&node);
2532 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2533 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2535 vat_json_print (vam->ofp, &node);
2536 vat_json_free (&node);
2538 vam->retval = ntohl (mp->retval);
2539 vam->result_ready = 1;
2542 static void vl_api_create_vhost_user_if_reply_t_handler
2543 (vl_api_create_vhost_user_if_reply_t * mp)
2545 vat_main_t *vam = &vat_main;
2546 i32 retval = ntohl (mp->retval);
2547 if (vam->async_mode)
2549 vam->async_errors += (retval < 0);
2553 vam->retval = retval;
2554 vam->sw_if_index = ntohl (mp->sw_if_index);
2555 vam->result_ready = 1;
2557 vam->regenerate_interface_table = 1;
2560 static void vl_api_create_vhost_user_if_reply_t_handler_json
2561 (vl_api_create_vhost_user_if_reply_t * mp)
2563 vat_main_t *vam = &vat_main;
2564 vat_json_node_t node;
2566 vat_json_init_object (&node);
2567 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2568 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2570 vat_json_print (vam->ofp, &node);
2571 vat_json_free (&node);
2573 vam->retval = ntohl (mp->retval);
2574 vam->result_ready = 1;
2577 static void vl_api_dns_resolve_name_reply_t_handler
2578 (vl_api_dns_resolve_name_reply_t * mp)
2580 vat_main_t *vam = &vat_main;
2581 i32 retval = ntohl (mp->retval);
2582 if (vam->async_mode)
2584 vam->async_errors += (retval < 0);
2588 vam->retval = retval;
2589 vam->result_ready = 1;
2594 clib_warning ("ip4 address %U", format_ip4_address,
2595 (ip4_address_t *) mp->ip4_address);
2597 clib_warning ("ip6 address %U", format_ip6_address,
2598 (ip6_address_t *) mp->ip6_address);
2601 clib_warning ("retval %d", retval);
2605 static void vl_api_dns_resolve_name_reply_t_handler_json
2606 (vl_api_dns_resolve_name_reply_t * mp)
2608 clib_warning ("not implemented");
2611 static void vl_api_dns_resolve_ip_reply_t_handler
2612 (vl_api_dns_resolve_ip_reply_t * mp)
2614 vat_main_t *vam = &vat_main;
2615 i32 retval = ntohl (mp->retval);
2616 if (vam->async_mode)
2618 vam->async_errors += (retval < 0);
2622 vam->retval = retval;
2623 vam->result_ready = 1;
2627 clib_warning ("canonical name %s", mp->name);
2630 clib_warning ("retval %d", retval);
2634 static void vl_api_dns_resolve_ip_reply_t_handler_json
2635 (vl_api_dns_resolve_ip_reply_t * mp)
2637 clib_warning ("not implemented");
2641 static void vl_api_ip_address_details_t_handler
2642 (vl_api_ip_address_details_t * mp)
2644 vat_main_t *vam = &vat_main;
2645 static ip_address_details_t empty_ip_address_details = { {0} };
2646 ip_address_details_t *address = NULL;
2647 ip_details_t *current_ip_details = NULL;
2648 ip_details_t *details = NULL;
2650 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
2652 if (!details || vam->current_sw_if_index >= vec_len (details)
2653 || !details[vam->current_sw_if_index].present)
2655 errmsg ("ip address details arrived but not stored");
2656 errmsg ("ip_dump should be called first");
2660 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
2662 #define addresses (current_ip_details->addr)
2664 vec_validate_init_empty (addresses, vec_len (addresses),
2665 empty_ip_address_details);
2667 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
2669 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
2670 address->prefix_length = mp->prefix_length;
2674 static void vl_api_ip_address_details_t_handler_json
2675 (vl_api_ip_address_details_t * mp)
2677 vat_main_t *vam = &vat_main;
2678 vat_json_node_t *node = NULL;
2679 struct in6_addr ip6;
2682 if (VAT_JSON_ARRAY != vam->json_tree.type)
2684 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2685 vat_json_init_array (&vam->json_tree);
2687 node = vat_json_array_add (&vam->json_tree);
2689 vat_json_init_object (node);
2692 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
2693 vat_json_object_add_ip6 (node, "ip", ip6);
2697 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
2698 vat_json_object_add_ip4 (node, "ip", ip4);
2700 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
2704 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
2706 vat_main_t *vam = &vat_main;
2707 static ip_details_t empty_ip_details = { 0 };
2708 ip_details_t *ip = NULL;
2709 u32 sw_if_index = ~0;
2711 sw_if_index = ntohl (mp->sw_if_index);
2713 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2714 sw_if_index, empty_ip_details);
2716 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2723 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
2725 vat_main_t *vam = &vat_main;
2727 if (VAT_JSON_ARRAY != vam->json_tree.type)
2729 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2730 vat_json_init_array (&vam->json_tree);
2732 vat_json_array_add_uint (&vam->json_tree,
2733 clib_net_to_host_u32 (mp->sw_if_index));
2737 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
2739 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
2740 "router_addr %U host_mac %U",
2741 ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4",
2743 format_ip4_address, &mp->lease.host_address,
2744 format_ip4_address, &mp->lease.router_address,
2745 format_ethernet_address, mp->lease.host_mac);
2748 static void vl_api_dhcp_compl_event_t_handler_json
2749 (vl_api_dhcp_compl_event_t * mp)
2751 /* JSON output not supported */
2754 static void vl_api_get_first_msg_id_reply_t_handler
2755 (vl_api_get_first_msg_id_reply_t * mp)
2757 vat_main_t *vam = &vat_main;
2758 i32 retval = ntohl (mp->retval);
2760 if (vam->async_mode)
2762 vam->async_errors += (retval < 0);
2766 vam->retval = retval;
2767 vam->result_ready = 1;
2771 errmsg ("first message id %d", ntohs (mp->first_msg_id));
2775 static void vl_api_get_first_msg_id_reply_t_handler_json
2776 (vl_api_get_first_msg_id_reply_t * mp)
2778 vat_main_t *vam = &vat_main;
2779 vat_json_node_t node;
2781 vat_json_init_object (&node);
2782 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2783 vat_json_object_add_uint (&node, "first_msg_id",
2784 (uint) ntohs (mp->first_msg_id));
2786 vat_json_print (vam->ofp, &node);
2787 vat_json_free (&node);
2789 vam->retval = ntohl (mp->retval);
2790 vam->result_ready = 1;
2793 static void vl_api_get_node_graph_reply_t_handler
2794 (vl_api_get_node_graph_reply_t * mp)
2796 vat_main_t *vam = &vat_main;
2797 api_main_t *am = &api_main;
2798 i32 retval = ntohl (mp->retval);
2799 u8 *pvt_copy, *reply;
2804 if (vam->async_mode)
2806 vam->async_errors += (retval < 0);
2810 vam->retval = retval;
2811 vam->result_ready = 1;
2814 /* "Should never happen..." */
2818 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2819 pvt_copy = vec_dup (reply);
2821 /* Toss the shared-memory original... */
2822 pthread_mutex_lock (&am->vlib_rp->mutex);
2823 oldheap = svm_push_data_heap (am->vlib_rp);
2827 svm_pop_heap (oldheap);
2828 pthread_mutex_unlock (&am->vlib_rp->mutex);
2830 if (vam->graph_nodes)
2832 hash_free (vam->graph_node_index_by_name);
2834 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
2836 node = vam->graph_nodes[0][i];
2837 vec_free (node->name);
2838 vec_free (node->next_nodes);
2841 vec_free (vam->graph_nodes[0]);
2842 vec_free (vam->graph_nodes);
2845 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2846 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2847 vec_free (pvt_copy);
2849 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
2851 node = vam->graph_nodes[0][i];
2852 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2856 static void vl_api_get_node_graph_reply_t_handler_json
2857 (vl_api_get_node_graph_reply_t * mp)
2859 vat_main_t *vam = &vat_main;
2860 api_main_t *am = &api_main;
2862 vat_json_node_t node;
2865 /* $$$$ make this real? */
2866 vat_json_init_object (&node);
2867 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2868 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2870 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2872 /* Toss the shared-memory original... */
2873 pthread_mutex_lock (&am->vlib_rp->mutex);
2874 oldheap = svm_push_data_heap (am->vlib_rp);
2878 svm_pop_heap (oldheap);
2879 pthread_mutex_unlock (&am->vlib_rp->mutex);
2881 vat_json_print (vam->ofp, &node);
2882 vat_json_free (&node);
2884 vam->retval = ntohl (mp->retval);
2885 vam->result_ready = 1;
2889 vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
2891 vat_main_t *vam = &vat_main;
2896 s = format (s, "%=16d%=16d%=16d",
2897 ntohl (mp->sw_if_index), mp->priority, mp->weight);
2901 s = format (s, "%=16U%=16d%=16d",
2902 mp->is_ipv6 ? format_ip6_address :
2904 mp->ip_address, mp->priority, mp->weight);
2907 print (vam->ofp, "%v", s);
2912 vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
2914 vat_main_t *vam = &vat_main;
2915 vat_json_node_t *node = NULL;
2916 struct in6_addr ip6;
2919 if (VAT_JSON_ARRAY != vam->json_tree.type)
2921 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2922 vat_json_init_array (&vam->json_tree);
2924 node = vat_json_array_add (&vam->json_tree);
2925 vat_json_init_object (node);
2927 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2928 vat_json_object_add_uint (node, "priority", mp->priority);
2929 vat_json_object_add_uint (node, "weight", mp->weight);
2932 vat_json_object_add_uint (node, "sw_if_index",
2933 clib_net_to_host_u32 (mp->sw_if_index));
2938 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2939 vat_json_object_add_ip6 (node, "address", ip6);
2943 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2944 vat_json_object_add_ip4 (node, "address", ip4);
2950 vl_api_one_locator_set_details_t_handler (vl_api_one_locator_set_details_t *
2953 vat_main_t *vam = &vat_main;
2956 ls_name = format (0, "%s", mp->ls_name);
2958 print (vam->ofp, "%=10d%=15v", clib_net_to_host_u32 (mp->ls_index),
2964 vl_api_one_locator_set_details_t_handler_json
2965 (vl_api_one_locator_set_details_t * mp)
2967 vat_main_t *vam = &vat_main;
2968 vat_json_node_t *node = 0;
2971 ls_name = format (0, "%s", mp->ls_name);
2972 vec_add1 (ls_name, 0);
2974 if (VAT_JSON_ARRAY != vam->json_tree.type)
2976 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2977 vat_json_init_array (&vam->json_tree);
2979 node = vat_json_array_add (&vam->json_tree);
2981 vat_json_init_object (node);
2982 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2983 vat_json_object_add_uint (node, "ls_index",
2984 clib_net_to_host_u32 (mp->ls_index));
2992 } __attribute__ ((__packed__)) lisp_nsh_api_t;
2995 unformat_nsh_address (unformat_input_t * input, va_list * args)
2997 lisp_nsh_api_t *nsh = va_arg (*args, lisp_nsh_api_t *);
2998 return unformat (input, "SPI:%d SI:%d", &nsh->spi, &nsh->si);
3002 format_nsh_address_vat (u8 * s, va_list * args)
3004 nsh_t *a = va_arg (*args, nsh_t *);
3005 return format (s, "SPI:%d SI:%d", clib_net_to_host_u32 (a->spi), a->si);
3009 format_lisp_flat_eid (u8 * s, va_list * args)
3011 u32 type = va_arg (*args, u32);
3012 u8 *eid = va_arg (*args, u8 *);
3013 u32 eid_len = va_arg (*args, u32);
3018 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
3020 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
3022 return format (s, "%U", format_ethernet_address, eid);
3024 return format (s, "%U", format_nsh_address_vat, eid);
3030 format_lisp_eid_vat (u8 * s, va_list * args)
3032 u32 type = va_arg (*args, u32);
3033 u8 *eid = va_arg (*args, u8 *);
3034 u32 eid_len = va_arg (*args, u32);
3035 u8 *seid = va_arg (*args, u8 *);
3036 u32 seid_len = va_arg (*args, u32);
3037 u32 is_src_dst = va_arg (*args, u32);
3040 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
3042 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
3048 vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
3050 vat_main_t *vam = &vat_main;
3051 u8 *s = 0, *eid = 0;
3053 if (~0 == mp->locator_set_index)
3054 s = format (0, "action: %d", mp->action);
3056 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
3058 eid = format (0, "%U", format_lisp_eid_vat,
3062 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3065 print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
3066 clib_net_to_host_u32 (mp->vni),
3068 mp->is_local ? "local" : "remote",
3069 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
3070 clib_net_to_host_u16 (mp->key_id), mp->key);
3077 vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
3080 vat_main_t *vam = &vat_main;
3081 vat_json_node_t *node = 0;
3084 if (VAT_JSON_ARRAY != vam->json_tree.type)
3086 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3087 vat_json_init_array (&vam->json_tree);
3089 node = vat_json_array_add (&vam->json_tree);
3091 vat_json_init_object (node);
3092 if (~0 == mp->locator_set_index)
3093 vat_json_object_add_uint (node, "action", mp->action);
3095 vat_json_object_add_uint (node, "locator_set_index",
3096 clib_net_to_host_u32 (mp->locator_set_index));
3098 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
3099 if (mp->eid_type == 3)
3101 vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
3102 vat_json_init_object (nsh_json);
3103 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
3104 vat_json_object_add_uint (nsh_json, "spi",
3105 clib_net_to_host_u32 (nsh->spi));
3106 vat_json_object_add_uint (nsh_json, "si", nsh->si);
3110 eid = format (0, "%U", format_lisp_eid_vat,
3114 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3116 vat_json_object_add_string_copy (node, "eid", eid);
3119 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3120 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
3121 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
3125 vat_json_object_add_uint (node, "key_id",
3126 clib_net_to_host_u16 (mp->key_id));
3127 vat_json_object_add_string_copy (node, "key", mp->key);
3132 vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
3134 vat_main_t *vam = &vat_main;
3135 u8 *seid = 0, *deid = 0;
3136 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3138 deid = format (0, "%U", format_lisp_eid_vat,
3139 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3141 seid = format (0, "%U", format_lisp_eid_vat,
3142 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3148 format_ip_address_fcn = format_ip4_address;
3150 format_ip_address_fcn = format_ip6_address;
3153 print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
3154 clib_net_to_host_u32 (mp->vni),
3156 format_ip_address_fcn, mp->lloc,
3157 format_ip_address_fcn, mp->rloc,
3158 clib_net_to_host_u32 (mp->pkt_count),
3159 clib_net_to_host_u32 (mp->bytes));
3166 vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
3168 struct in6_addr ip6;
3170 vat_main_t *vam = &vat_main;
3171 vat_json_node_t *node = 0;
3172 u8 *deid = 0, *seid = 0;
3174 if (VAT_JSON_ARRAY != vam->json_tree.type)
3176 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3177 vat_json_init_array (&vam->json_tree);
3179 node = vat_json_array_add (&vam->json_tree);
3181 vat_json_init_object (node);
3182 deid = format (0, "%U", format_lisp_eid_vat,
3183 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3185 seid = format (0, "%U", format_lisp_eid_vat,
3186 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3191 vat_json_object_add_string_copy (node, "seid", seid);
3192 vat_json_object_add_string_copy (node, "deid", deid);
3193 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3197 clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
3198 vat_json_object_add_ip4 (node, "lloc", ip4);
3199 clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
3200 vat_json_object_add_ip4 (node, "rloc", ip4);
3204 clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
3205 vat_json_object_add_ip6 (node, "lloc", ip6);
3206 clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
3207 vat_json_object_add_ip6 (node, "rloc", ip6);
3209 vat_json_object_add_uint (node, "pkt_count",
3210 clib_net_to_host_u32 (mp->pkt_count));
3211 vat_json_object_add_uint (node, "bytes", clib_net_to_host_u32 (mp->bytes));
3218 vl_api_one_eid_table_map_details_t_handler
3219 (vl_api_one_eid_table_map_details_t * mp)
3221 vat_main_t *vam = &vat_main;
3223 u8 *line = format (0, "%=10d%=10d",
3224 clib_net_to_host_u32 (mp->vni),
3225 clib_net_to_host_u32 (mp->dp_table));
3226 print (vam->ofp, "%v", line);
3231 vl_api_one_eid_table_map_details_t_handler_json
3232 (vl_api_one_eid_table_map_details_t * mp)
3234 vat_main_t *vam = &vat_main;
3235 vat_json_node_t *node = NULL;
3237 if (VAT_JSON_ARRAY != vam->json_tree.type)
3239 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3240 vat_json_init_array (&vam->json_tree);
3242 node = vat_json_array_add (&vam->json_tree);
3243 vat_json_init_object (node);
3244 vat_json_object_add_uint (node, "dp_table",
3245 clib_net_to_host_u32 (mp->dp_table));
3246 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3250 vl_api_one_eid_table_vni_details_t_handler
3251 (vl_api_one_eid_table_vni_details_t * mp)
3253 vat_main_t *vam = &vat_main;
3255 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
3256 print (vam->ofp, "%v", line);
3261 vl_api_one_eid_table_vni_details_t_handler_json
3262 (vl_api_one_eid_table_vni_details_t * mp)
3264 vat_main_t *vam = &vat_main;
3265 vat_json_node_t *node = NULL;
3267 if (VAT_JSON_ARRAY != vam->json_tree.type)
3269 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3270 vat_json_init_array (&vam->json_tree);
3272 node = vat_json_array_add (&vam->json_tree);
3273 vat_json_init_object (node);
3274 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3278 vl_api_show_one_map_register_fallback_threshold_reply_t_handler
3279 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3281 vat_main_t *vam = &vat_main;
3282 int retval = clib_net_to_host_u32 (mp->retval);
3284 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3285 print (vam->ofp, "fallback threshold value: %d", mp->value);
3287 vam->retval = retval;
3288 vam->result_ready = 1;
3292 vl_api_show_one_map_register_fallback_threshold_reply_t_handler_json
3293 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3295 vat_main_t *vam = &vat_main;
3296 vat_json_node_t _node, *node = &_node;
3297 int retval = clib_net_to_host_u32 (mp->retval);
3299 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3300 vat_json_init_object (node);
3301 vat_json_object_add_uint (node, "value", mp->value);
3303 vat_json_print (vam->ofp, node);
3304 vat_json_free (node);
3306 vam->retval = retval;
3307 vam->result_ready = 1;
3311 vl_api_show_one_map_register_state_reply_t_handler
3312 (vl_api_show_one_map_register_state_reply_t * mp)
3314 vat_main_t *vam = &vat_main;
3315 int retval = clib_net_to_host_u32 (mp->retval);
3317 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3319 vam->retval = retval;
3320 vam->result_ready = 1;
3324 vl_api_show_one_map_register_state_reply_t_handler_json
3325 (vl_api_show_one_map_register_state_reply_t * mp)
3327 vat_main_t *vam = &vat_main;
3328 vat_json_node_t _node, *node = &_node;
3329 int retval = clib_net_to_host_u32 (mp->retval);
3331 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3333 vat_json_init_object (node);
3334 vat_json_object_add_string_copy (node, "state", s);
3336 vat_json_print (vam->ofp, node);
3337 vat_json_free (node);
3339 vam->retval = retval;
3340 vam->result_ready = 1;
3345 vl_api_show_one_rloc_probe_state_reply_t_handler
3346 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3348 vat_main_t *vam = &vat_main;
3349 int retval = clib_net_to_host_u32 (mp->retval);
3354 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3356 vam->retval = retval;
3357 vam->result_ready = 1;
3361 vl_api_show_one_rloc_probe_state_reply_t_handler_json
3362 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3364 vat_main_t *vam = &vat_main;
3365 vat_json_node_t _node, *node = &_node;
3366 int retval = clib_net_to_host_u32 (mp->retval);
3368 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3369 vat_json_init_object (node);
3370 vat_json_object_add_string_copy (node, "state", s);
3372 vat_json_print (vam->ofp, node);
3373 vat_json_free (node);
3375 vam->retval = retval;
3376 vam->result_ready = 1;
3381 vl_api_show_one_stats_enable_disable_reply_t_handler
3382 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3384 vat_main_t *vam = &vat_main;
3385 int retval = clib_net_to_host_u32 (mp->retval);
3390 print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
3392 vam->retval = retval;
3393 vam->result_ready = 1;
3397 vl_api_show_one_stats_enable_disable_reply_t_handler_json
3398 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3400 vat_main_t *vam = &vat_main;
3401 vat_json_node_t _node, *node = &_node;
3402 int retval = clib_net_to_host_u32 (mp->retval);
3404 u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
3405 vat_json_init_object (node);
3406 vat_json_object_add_string_copy (node, "state", s);
3408 vat_json_print (vam->ofp, node);
3409 vat_json_free (node);
3411 vam->retval = retval;
3412 vam->result_ready = 1;
3417 api_gpe_fwd_entry_net_to_host (vl_api_gpe_fwd_entry_t * e)
3419 e->dp_table = clib_net_to_host_u32 (e->dp_table);
3420 e->fwd_entry_index = clib_net_to_host_u32 (e->fwd_entry_index);
3421 e->vni = clib_net_to_host_u32 (e->vni);
3425 gpe_fwd_entries_get_reply_t_net_to_host
3426 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3430 mp->count = clib_net_to_host_u32 (mp->count);
3431 for (i = 0; i < mp->count; i++)
3433 api_gpe_fwd_entry_net_to_host (&mp->entries[i]);
3438 format_gpe_encap_mode (u8 * s, va_list * args)
3440 u32 mode = va_arg (*args, u32);
3445 return format (s, "lisp");
3447 return format (s, "vxlan");
3453 vl_api_gpe_get_encap_mode_reply_t_handler
3454 (vl_api_gpe_get_encap_mode_reply_t * mp)
3456 vat_main_t *vam = &vat_main;
3458 print (vam->ofp, "gpe mode: %U", format_gpe_encap_mode, mp->encap_mode);
3459 vam->retval = ntohl (mp->retval);
3460 vam->result_ready = 1;
3464 vl_api_gpe_get_encap_mode_reply_t_handler_json
3465 (vl_api_gpe_get_encap_mode_reply_t * mp)
3467 vat_main_t *vam = &vat_main;
3468 vat_json_node_t node;
3470 u8 *encap_mode = format (0, "%U", format_gpe_encap_mode, mp->encap_mode);
3471 vec_add1 (encap_mode, 0);
3473 vat_json_init_object (&node);
3474 vat_json_object_add_string_copy (&node, "gpe_mode", encap_mode);
3476 vec_free (encap_mode);
3477 vat_json_print (vam->ofp, &node);
3478 vat_json_free (&node);
3480 vam->retval = ntohl (mp->retval);
3481 vam->result_ready = 1;
3485 vl_api_gpe_fwd_entry_path_details_t_handler
3486 (vl_api_gpe_fwd_entry_path_details_t * mp)
3488 vat_main_t *vam = &vat_main;
3489 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3491 if (mp->lcl_loc.is_ip4)
3492 format_ip_address_fcn = format_ip4_address;
3494 format_ip_address_fcn = format_ip6_address;
3496 print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
3497 format_ip_address_fcn, &mp->lcl_loc,
3498 format_ip_address_fcn, &mp->rmt_loc);
3502 lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
3504 struct in6_addr ip6;
3509 clib_memcpy (&ip4, loc->addr, sizeof (ip4));
3510 vat_json_object_add_ip4 (n, "address", ip4);
3514 clib_memcpy (&ip6, loc->addr, sizeof (ip6));
3515 vat_json_object_add_ip6 (n, "address", ip6);
3517 vat_json_object_add_uint (n, "weight", loc->weight);
3521 vl_api_gpe_fwd_entry_path_details_t_handler_json
3522 (vl_api_gpe_fwd_entry_path_details_t * mp)
3524 vat_main_t *vam = &vat_main;
3525 vat_json_node_t *node = NULL;
3526 vat_json_node_t *loc_node;
3528 if (VAT_JSON_ARRAY != vam->json_tree.type)
3530 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3531 vat_json_init_array (&vam->json_tree);
3533 node = vat_json_array_add (&vam->json_tree);
3534 vat_json_init_object (node);
3536 loc_node = vat_json_object_add (node, "local_locator");
3537 vat_json_init_object (loc_node);
3538 lisp_fill_locator_node (loc_node, &mp->lcl_loc);
3540 loc_node = vat_json_object_add (node, "remote_locator");
3541 vat_json_init_object (loc_node);
3542 lisp_fill_locator_node (loc_node, &mp->rmt_loc);
3546 vl_api_gpe_fwd_entries_get_reply_t_handler
3547 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3549 vat_main_t *vam = &vat_main;
3551 int retval = clib_net_to_host_u32 (mp->retval);
3552 vl_api_gpe_fwd_entry_t *e;
3557 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3559 for (i = 0; i < mp->count; i++)
3561 e = &mp->entries[i];
3562 print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
3563 format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
3564 format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
3568 vam->retval = retval;
3569 vam->result_ready = 1;
3573 vl_api_gpe_fwd_entries_get_reply_t_handler_json
3574 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3577 vat_main_t *vam = &vat_main;
3578 vat_json_node_t *e = 0, root;
3580 int retval = clib_net_to_host_u32 (mp->retval);
3581 vl_api_gpe_fwd_entry_t *fwd;
3586 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3587 vat_json_init_array (&root);
3589 for (i = 0; i < mp->count; i++)
3591 e = vat_json_array_add (&root);
3592 fwd = &mp->entries[i];
3594 vat_json_init_object (e);
3595 vat_json_object_add_int (e, "fwd_entry_index", fwd->fwd_entry_index);
3596 vat_json_object_add_int (e, "dp_table", fwd->dp_table);
3597 vat_json_object_add_int (e, "vni", fwd->vni);
3598 vat_json_object_add_int (e, "action", fwd->action);
3600 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
3601 fwd->leid_prefix_len);
3603 vat_json_object_add_string_copy (e, "leid", s);
3606 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
3607 fwd->reid_prefix_len);
3609 vat_json_object_add_string_copy (e, "reid", s);
3613 vat_json_print (vam->ofp, &root);
3614 vat_json_free (&root);
3617 vam->retval = retval;
3618 vam->result_ready = 1;
3622 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler
3623 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3625 vat_main_t *vam = &vat_main;
3627 int retval = clib_net_to_host_u32 (mp->retval);
3628 vl_api_gpe_native_fwd_rpath_t *r;
3633 n = clib_net_to_host_u32 (mp->count);
3635 for (i = 0; i < n; i++)
3637 r = &mp->entries[i];
3638 print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
3639 clib_net_to_host_u32 (r->fib_index),
3640 clib_net_to_host_u32 (r->nh_sw_if_index),
3641 r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
3645 vam->retval = retval;
3646 vam->result_ready = 1;
3650 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler_json
3651 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3653 vat_main_t *vam = &vat_main;
3654 vat_json_node_t root, *e;
3656 int retval = clib_net_to_host_u32 (mp->retval);
3657 vl_api_gpe_native_fwd_rpath_t *r;
3663 n = clib_net_to_host_u32 (mp->count);
3664 vat_json_init_array (&root);
3666 for (i = 0; i < n; i++)
3668 e = vat_json_array_add (&root);
3669 vat_json_init_object (e);
3670 r = &mp->entries[i];
3672 format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
3675 vat_json_object_add_string_copy (e, "ip4", s);
3678 vat_json_object_add_uint (e, "fib_index",
3679 clib_net_to_host_u32 (r->fib_index));
3680 vat_json_object_add_uint (e, "nh_sw_if_index",
3681 clib_net_to_host_u32 (r->nh_sw_if_index));
3684 vat_json_print (vam->ofp, &root);
3685 vat_json_free (&root);
3688 vam->retval = retval;
3689 vam->result_ready = 1;
3693 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler
3694 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3696 vat_main_t *vam = &vat_main;
3698 int retval = clib_net_to_host_u32 (mp->retval);
3703 n = clib_net_to_host_u32 (mp->count);
3705 for (i = 0; i < n; i++)
3706 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->vnis[i]));
3709 vam->retval = retval;
3710 vam->result_ready = 1;
3714 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler_json
3715 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3717 vat_main_t *vam = &vat_main;
3718 vat_json_node_t root;
3720 int retval = clib_net_to_host_u32 (mp->retval);
3725 n = clib_net_to_host_u32 (mp->count);
3726 vat_json_init_array (&root);
3728 for (i = 0; i < n; i++)
3729 vat_json_array_add_uint (&root, clib_net_to_host_u32 (mp->vnis[i]));
3731 vat_json_print (vam->ofp, &root);
3732 vat_json_free (&root);
3735 vam->retval = retval;
3736 vam->result_ready = 1;
3740 vl_api_one_ndp_entries_get_reply_t_handler
3741 (vl_api_one_ndp_entries_get_reply_t * mp)
3743 vat_main_t *vam = &vat_main;
3745 int retval = clib_net_to_host_u32 (mp->retval);
3750 n = clib_net_to_host_u32 (mp->count);
3752 for (i = 0; i < n; i++)
3753 print (vam->ofp, "%U -> %U", format_ip6_address, &mp->entries[i].ip6,
3754 format_ethernet_address, mp->entries[i].mac);
3757 vam->retval = retval;
3758 vam->result_ready = 1;
3762 vl_api_one_ndp_entries_get_reply_t_handler_json
3763 (vl_api_one_ndp_entries_get_reply_t * mp)
3766 vat_main_t *vam = &vat_main;
3767 vat_json_node_t *e = 0, root;
3769 int retval = clib_net_to_host_u32 (mp->retval);
3770 vl_api_one_ndp_entry_t *arp_entry;
3775 n = clib_net_to_host_u32 (mp->count);
3776 vat_json_init_array (&root);
3778 for (i = 0; i < n; i++)
3780 e = vat_json_array_add (&root);
3781 arp_entry = &mp->entries[i];
3783 vat_json_init_object (e);
3784 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3787 vat_json_object_add_string_copy (e, "mac", s);
3790 s = format (0, "%U", format_ip6_address, &arp_entry->ip6);
3792 vat_json_object_add_string_copy (e, "ip6", s);
3796 vat_json_print (vam->ofp, &root);
3797 vat_json_free (&root);
3800 vam->retval = retval;
3801 vam->result_ready = 1;
3805 vl_api_one_l2_arp_entries_get_reply_t_handler
3806 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3808 vat_main_t *vam = &vat_main;
3810 int retval = clib_net_to_host_u32 (mp->retval);
3815 n = clib_net_to_host_u32 (mp->count);
3817 for (i = 0; i < n; i++)
3818 print (vam->ofp, "%U -> %U", format_ip4_address, &mp->entries[i].ip4,
3819 format_ethernet_address, mp->entries[i].mac);
3822 vam->retval = retval;
3823 vam->result_ready = 1;
3827 vl_api_one_l2_arp_entries_get_reply_t_handler_json
3828 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3831 vat_main_t *vam = &vat_main;
3832 vat_json_node_t *e = 0, root;
3834 int retval = clib_net_to_host_u32 (mp->retval);
3835 vl_api_one_l2_arp_entry_t *arp_entry;
3840 n = clib_net_to_host_u32 (mp->count);
3841 vat_json_init_array (&root);
3843 for (i = 0; i < n; i++)
3845 e = vat_json_array_add (&root);
3846 arp_entry = &mp->entries[i];
3848 vat_json_init_object (e);
3849 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3852 vat_json_object_add_string_copy (e, "mac", s);
3855 s = format (0, "%U", format_ip4_address, &arp_entry->ip4);
3857 vat_json_object_add_string_copy (e, "ip4", s);
3861 vat_json_print (vam->ofp, &root);
3862 vat_json_free (&root);
3865 vam->retval = retval;
3866 vam->result_ready = 1;
3870 vl_api_one_ndp_bd_get_reply_t_handler (vl_api_one_ndp_bd_get_reply_t * mp)
3872 vat_main_t *vam = &vat_main;
3874 int retval = clib_net_to_host_u32 (mp->retval);
3879 n = clib_net_to_host_u32 (mp->count);
3881 for (i = 0; i < n; i++)
3883 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3887 vam->retval = retval;
3888 vam->result_ready = 1;
3892 vl_api_one_ndp_bd_get_reply_t_handler_json
3893 (vl_api_one_ndp_bd_get_reply_t * mp)
3895 vat_main_t *vam = &vat_main;
3896 vat_json_node_t root;
3898 int retval = clib_net_to_host_u32 (mp->retval);
3903 n = clib_net_to_host_u32 (mp->count);
3904 vat_json_init_array (&root);
3906 for (i = 0; i < n; i++)
3908 vat_json_array_add_uint (&root,
3909 clib_net_to_host_u32 (mp->bridge_domains[i]));
3912 vat_json_print (vam->ofp, &root);
3913 vat_json_free (&root);
3916 vam->retval = retval;
3917 vam->result_ready = 1;
3921 vl_api_one_l2_arp_bd_get_reply_t_handler
3922 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3924 vat_main_t *vam = &vat_main;
3926 int retval = clib_net_to_host_u32 (mp->retval);
3931 n = clib_net_to_host_u32 (mp->count);
3933 for (i = 0; i < n; i++)
3935 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3939 vam->retval = retval;
3940 vam->result_ready = 1;
3944 vl_api_one_l2_arp_bd_get_reply_t_handler_json
3945 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3947 vat_main_t *vam = &vat_main;
3948 vat_json_node_t root;
3950 int retval = clib_net_to_host_u32 (mp->retval);
3955 n = clib_net_to_host_u32 (mp->count);
3956 vat_json_init_array (&root);
3958 for (i = 0; i < n; i++)
3960 vat_json_array_add_uint (&root,
3961 clib_net_to_host_u32 (mp->bridge_domains[i]));
3964 vat_json_print (vam->ofp, &root);
3965 vat_json_free (&root);
3968 vam->retval = retval;
3969 vam->result_ready = 1;
3973 vl_api_one_adjacencies_get_reply_t_handler
3974 (vl_api_one_adjacencies_get_reply_t * mp)
3976 vat_main_t *vam = &vat_main;
3978 int retval = clib_net_to_host_u32 (mp->retval);
3979 vl_api_one_adjacency_t *a;
3984 n = clib_net_to_host_u32 (mp->count);
3986 for (i = 0; i < n; i++)
3988 a = &mp->adjacencies[i];
3989 print (vam->ofp, "%U %40U",
3990 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
3991 format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
3995 vam->retval = retval;
3996 vam->result_ready = 1;
4000 vl_api_one_adjacencies_get_reply_t_handler_json
4001 (vl_api_one_adjacencies_get_reply_t * mp)
4004 vat_main_t *vam = &vat_main;
4005 vat_json_node_t *e = 0, root;
4007 int retval = clib_net_to_host_u32 (mp->retval);
4008 vl_api_one_adjacency_t *a;
4013 n = clib_net_to_host_u32 (mp->count);
4014 vat_json_init_array (&root);
4016 for (i = 0; i < n; i++)
4018 e = vat_json_array_add (&root);
4019 a = &mp->adjacencies[i];
4021 vat_json_init_object (e);
4022 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
4023 a->leid_prefix_len);
4025 vat_json_object_add_string_copy (e, "leid", s);
4028 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
4029 a->reid_prefix_len);
4031 vat_json_object_add_string_copy (e, "reid", s);
4035 vat_json_print (vam->ofp, &root);
4036 vat_json_free (&root);
4039 vam->retval = retval;
4040 vam->result_ready = 1;
4044 vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
4046 vat_main_t *vam = &vat_main;
4048 print (vam->ofp, "%=20U",
4049 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4054 vl_api_one_map_server_details_t_handler_json
4055 (vl_api_one_map_server_details_t * mp)
4057 vat_main_t *vam = &vat_main;
4058 vat_json_node_t *node = NULL;
4059 struct in6_addr ip6;
4062 if (VAT_JSON_ARRAY != vam->json_tree.type)
4064 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4065 vat_json_init_array (&vam->json_tree);
4067 node = vat_json_array_add (&vam->json_tree);
4069 vat_json_init_object (node);
4072 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4073 vat_json_object_add_ip6 (node, "map-server", ip6);
4077 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4078 vat_json_object_add_ip4 (node, "map-server", ip4);
4083 vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
4086 vat_main_t *vam = &vat_main;
4088 print (vam->ofp, "%=20U",
4089 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4094 vl_api_one_map_resolver_details_t_handler_json
4095 (vl_api_one_map_resolver_details_t * mp)
4097 vat_main_t *vam = &vat_main;
4098 vat_json_node_t *node = NULL;
4099 struct in6_addr ip6;
4102 if (VAT_JSON_ARRAY != vam->json_tree.type)
4104 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4105 vat_json_init_array (&vam->json_tree);
4107 node = vat_json_array_add (&vam->json_tree);
4109 vat_json_init_object (node);
4112 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4113 vat_json_object_add_ip6 (node, "map resolver", ip6);
4117 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4118 vat_json_object_add_ip4 (node, "map resolver", ip4);
4123 vl_api_show_one_status_reply_t_handler (vl_api_show_one_status_reply_t * mp)
4125 vat_main_t *vam = &vat_main;
4126 i32 retval = ntohl (mp->retval);
4130 print (vam->ofp, "feature: %s\ngpe: %s",
4131 mp->feature_status ? "enabled" : "disabled",
4132 mp->gpe_status ? "enabled" : "disabled");
4135 vam->retval = retval;
4136 vam->result_ready = 1;
4140 vl_api_show_one_status_reply_t_handler_json
4141 (vl_api_show_one_status_reply_t * mp)
4143 vat_main_t *vam = &vat_main;
4144 vat_json_node_t node;
4145 u8 *gpe_status = NULL;
4146 u8 *feature_status = NULL;
4148 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
4149 feature_status = format (0, "%s",
4150 mp->feature_status ? "enabled" : "disabled");
4151 vec_add1 (gpe_status, 0);
4152 vec_add1 (feature_status, 0);
4154 vat_json_init_object (&node);
4155 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
4156 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
4158 vec_free (gpe_status);
4159 vec_free (feature_status);
4161 vat_json_print (vam->ofp, &node);
4162 vat_json_free (&node);
4164 vam->retval = ntohl (mp->retval);
4165 vam->result_ready = 1;
4169 vl_api_one_get_map_request_itr_rlocs_reply_t_handler
4170 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4172 vat_main_t *vam = &vat_main;
4173 i32 retval = ntohl (mp->retval);
4177 print (vam->ofp, "%=20s", mp->locator_set_name);
4180 vam->retval = retval;
4181 vam->result_ready = 1;
4185 vl_api_one_get_map_request_itr_rlocs_reply_t_handler_json
4186 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4188 vat_main_t *vam = &vat_main;
4189 vat_json_node_t *node = NULL;
4191 if (VAT_JSON_ARRAY != vam->json_tree.type)
4193 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4194 vat_json_init_array (&vam->json_tree);
4196 node = vat_json_array_add (&vam->json_tree);
4198 vat_json_init_object (node);
4199 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
4201 vat_json_print (vam->ofp, node);
4202 vat_json_free (node);
4204 vam->retval = ntohl (mp->retval);
4205 vam->result_ready = 1;
4209 format_lisp_map_request_mode (u8 * s, va_list * args)
4211 u32 mode = va_arg (*args, u32);
4216 return format (0, "dst-only");
4218 return format (0, "src-dst");
4224 vl_api_show_one_map_request_mode_reply_t_handler
4225 (vl_api_show_one_map_request_mode_reply_t * mp)
4227 vat_main_t *vam = &vat_main;
4228 i32 retval = ntohl (mp->retval);
4232 u32 mode = mp->mode;
4233 print (vam->ofp, "map_request_mode: %U",
4234 format_lisp_map_request_mode, mode);
4237 vam->retval = retval;
4238 vam->result_ready = 1;
4242 vl_api_show_one_map_request_mode_reply_t_handler_json
4243 (vl_api_show_one_map_request_mode_reply_t * mp)
4245 vat_main_t *vam = &vat_main;
4246 vat_json_node_t node;
4251 s = format (0, "%U", format_lisp_map_request_mode, mode);
4254 vat_json_init_object (&node);
4255 vat_json_object_add_string_copy (&node, "map_request_mode", s);
4256 vat_json_print (vam->ofp, &node);
4257 vat_json_free (&node);
4260 vam->retval = ntohl (mp->retval);
4261 vam->result_ready = 1;
4265 vl_api_one_show_xtr_mode_reply_t_handler
4266 (vl_api_one_show_xtr_mode_reply_t * mp)
4268 vat_main_t *vam = &vat_main;
4269 i32 retval = ntohl (mp->retval);
4273 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4276 vam->retval = retval;
4277 vam->result_ready = 1;
4281 vl_api_one_show_xtr_mode_reply_t_handler_json
4282 (vl_api_one_show_xtr_mode_reply_t * mp)
4284 vat_main_t *vam = &vat_main;
4285 vat_json_node_t node;
4288 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4289 vec_add1 (status, 0);
4291 vat_json_init_object (&node);
4292 vat_json_object_add_string_copy (&node, "status", status);
4296 vat_json_print (vam->ofp, &node);
4297 vat_json_free (&node);
4299 vam->retval = ntohl (mp->retval);
4300 vam->result_ready = 1;
4304 vl_api_one_show_pitr_mode_reply_t_handler
4305 (vl_api_one_show_pitr_mode_reply_t * mp)
4307 vat_main_t *vam = &vat_main;
4308 i32 retval = ntohl (mp->retval);
4312 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4315 vam->retval = retval;
4316 vam->result_ready = 1;
4320 vl_api_one_show_pitr_mode_reply_t_handler_json
4321 (vl_api_one_show_pitr_mode_reply_t * mp)
4323 vat_main_t *vam = &vat_main;
4324 vat_json_node_t node;
4327 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4328 vec_add1 (status, 0);
4330 vat_json_init_object (&node);
4331 vat_json_object_add_string_copy (&node, "status", status);
4335 vat_json_print (vam->ofp, &node);
4336 vat_json_free (&node);
4338 vam->retval = ntohl (mp->retval);
4339 vam->result_ready = 1;
4343 vl_api_one_show_petr_mode_reply_t_handler
4344 (vl_api_one_show_petr_mode_reply_t * mp)
4346 vat_main_t *vam = &vat_main;
4347 i32 retval = ntohl (mp->retval);
4351 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4354 vam->retval = retval;
4355 vam->result_ready = 1;
4359 vl_api_one_show_petr_mode_reply_t_handler_json
4360 (vl_api_one_show_petr_mode_reply_t * mp)
4362 vat_main_t *vam = &vat_main;
4363 vat_json_node_t node;
4366 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4367 vec_add1 (status, 0);
4369 vat_json_init_object (&node);
4370 vat_json_object_add_string_copy (&node, "status", status);
4374 vat_json_print (vam->ofp, &node);
4375 vat_json_free (&node);
4377 vam->retval = ntohl (mp->retval);
4378 vam->result_ready = 1;
4382 vl_api_show_one_use_petr_reply_t_handler
4383 (vl_api_show_one_use_petr_reply_t * mp)
4385 vat_main_t *vam = &vat_main;
4386 i32 retval = ntohl (mp->retval);
4390 print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
4393 print (vam->ofp, "Proxy-ETR address; %U",
4394 mp->is_ip4 ? format_ip4_address : format_ip6_address,
4399 vam->retval = retval;
4400 vam->result_ready = 1;
4404 vl_api_show_one_use_petr_reply_t_handler_json
4405 (vl_api_show_one_use_petr_reply_t * mp)
4407 vat_main_t *vam = &vat_main;
4408 vat_json_node_t node;
4411 struct in6_addr ip6;
4413 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4414 vec_add1 (status, 0);
4416 vat_json_init_object (&node);
4417 vat_json_object_add_string_copy (&node, "status", status);
4422 clib_memcpy (&ip6, mp->address, sizeof (ip6));
4423 vat_json_object_add_ip6 (&node, "address", ip6);
4427 clib_memcpy (&ip4, mp->address, sizeof (ip4));
4428 vat_json_object_add_ip4 (&node, "address", ip4);
4434 vat_json_print (vam->ofp, &node);
4435 vat_json_free (&node);
4437 vam->retval = ntohl (mp->retval);
4438 vam->result_ready = 1;
4442 vl_api_show_one_nsh_mapping_reply_t_handler
4443 (vl_api_show_one_nsh_mapping_reply_t * mp)
4445 vat_main_t *vam = &vat_main;
4446 i32 retval = ntohl (mp->retval);
4450 print (vam->ofp, "%-20s%-16s",
4451 mp->is_set ? "set" : "not-set",
4452 mp->is_set ? (char *) mp->locator_set_name : "");
4455 vam->retval = retval;
4456 vam->result_ready = 1;
4460 vl_api_show_one_nsh_mapping_reply_t_handler_json
4461 (vl_api_show_one_nsh_mapping_reply_t * mp)
4463 vat_main_t *vam = &vat_main;
4464 vat_json_node_t node;
4467 status = format (0, "%s", mp->is_set ? "yes" : "no");
4468 vec_add1 (status, 0);
4470 vat_json_init_object (&node);
4471 vat_json_object_add_string_copy (&node, "is_set", status);
4474 vat_json_object_add_string_copy (&node, "locator_set",
4475 mp->locator_set_name);
4480 vat_json_print (vam->ofp, &node);
4481 vat_json_free (&node);
4483 vam->retval = ntohl (mp->retval);
4484 vam->result_ready = 1;
4488 vl_api_show_one_map_register_ttl_reply_t_handler
4489 (vl_api_show_one_map_register_ttl_reply_t * mp)
4491 vat_main_t *vam = &vat_main;
4492 i32 retval = ntohl (mp->retval);
4494 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4498 print (vam->ofp, "ttl: %u", mp->ttl);
4501 vam->retval = retval;
4502 vam->result_ready = 1;
4506 vl_api_show_one_map_register_ttl_reply_t_handler_json
4507 (vl_api_show_one_map_register_ttl_reply_t * mp)
4509 vat_main_t *vam = &vat_main;
4510 vat_json_node_t node;
4512 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4513 vat_json_init_object (&node);
4514 vat_json_object_add_uint (&node, "ttl", mp->ttl);
4516 vat_json_print (vam->ofp, &node);
4517 vat_json_free (&node);
4519 vam->retval = ntohl (mp->retval);
4520 vam->result_ready = 1;
4524 vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
4526 vat_main_t *vam = &vat_main;
4527 i32 retval = ntohl (mp->retval);
4531 print (vam->ofp, "%-20s%-16s",
4532 mp->status ? "enabled" : "disabled",
4533 mp->status ? (char *) mp->locator_set_name : "");
4536 vam->retval = retval;
4537 vam->result_ready = 1;
4541 vl_api_show_one_pitr_reply_t_handler_json (vl_api_show_one_pitr_reply_t * mp)
4543 vat_main_t *vam = &vat_main;
4544 vat_json_node_t node;
4547 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4548 vec_add1 (status, 0);
4550 vat_json_init_object (&node);
4551 vat_json_object_add_string_copy (&node, "status", status);
4554 vat_json_object_add_string_copy (&node, "locator_set",
4555 mp->locator_set_name);
4560 vat_json_print (vam->ofp, &node);
4561 vat_json_free (&node);
4563 vam->retval = ntohl (mp->retval);
4564 vam->result_ready = 1;
4568 format_policer_type (u8 * s, va_list * va)
4570 u32 i = va_arg (*va, u32);
4572 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
4573 s = format (s, "1r2c");
4574 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
4575 s = format (s, "1r3c");
4576 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
4577 s = format (s, "2r3c-2698");
4578 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
4579 s = format (s, "2r3c-4115");
4580 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
4581 s = format (s, "2r3c-mef5cf1");
4583 s = format (s, "ILLEGAL");
4588 format_policer_rate_type (u8 * s, va_list * va)
4590 u32 i = va_arg (*va, u32);
4592 if (i == SSE2_QOS_RATE_KBPS)
4593 s = format (s, "kbps");
4594 else if (i == SSE2_QOS_RATE_PPS)
4595 s = format (s, "pps");
4597 s = format (s, "ILLEGAL");
4602 format_policer_round_type (u8 * s, va_list * va)
4604 u32 i = va_arg (*va, u32);
4606 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
4607 s = format (s, "closest");
4608 else if (i == SSE2_QOS_ROUND_TO_UP)
4609 s = format (s, "up");
4610 else if (i == SSE2_QOS_ROUND_TO_DOWN)
4611 s = format (s, "down");
4613 s = format (s, "ILLEGAL");
4618 format_policer_action_type (u8 * s, va_list * va)
4620 u32 i = va_arg (*va, u32);
4622 if (i == SSE2_QOS_ACTION_DROP)
4623 s = format (s, "drop");
4624 else if (i == SSE2_QOS_ACTION_TRANSMIT)
4625 s = format (s, "transmit");
4626 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4627 s = format (s, "mark-and-transmit");
4629 s = format (s, "ILLEGAL");
4634 format_dscp (u8 * s, va_list * va)
4636 u32 i = va_arg (*va, u32);
4641 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
4645 return format (s, "ILLEGAL");
4647 s = format (s, "%s", t);
4652 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
4654 vat_main_t *vam = &vat_main;
4655 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
4657 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4658 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4660 conform_dscp_str = format (0, "");
4662 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4663 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4665 exceed_dscp_str = format (0, "");
4667 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4668 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4670 violate_dscp_str = format (0, "");
4672 print (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
4673 "rate type %U, round type %U, %s rate, %s color-aware, "
4674 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
4675 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
4676 "conform action %U%s, exceed action %U%s, violate action %U%s",
4678 format_policer_type, mp->type,
4681 clib_net_to_host_u64 (mp->cb),
4682 clib_net_to_host_u64 (mp->eb),
4683 format_policer_rate_type, mp->rate_type,
4684 format_policer_round_type, mp->round_type,
4685 mp->single_rate ? "single" : "dual",
4686 mp->color_aware ? "is" : "not",
4687 ntohl (mp->cir_tokens_per_period),
4688 ntohl (mp->pir_tokens_per_period),
4690 ntohl (mp->current_limit),
4691 ntohl (mp->current_bucket),
4692 ntohl (mp->extended_limit),
4693 ntohl (mp->extended_bucket),
4694 clib_net_to_host_u64 (mp->last_update_time),
4695 format_policer_action_type, mp->conform_action_type,
4697 format_policer_action_type, mp->exceed_action_type,
4699 format_policer_action_type, mp->violate_action_type,
4702 vec_free (conform_dscp_str);
4703 vec_free (exceed_dscp_str);
4704 vec_free (violate_dscp_str);
4707 static void vl_api_policer_details_t_handler_json
4708 (vl_api_policer_details_t * mp)
4710 vat_main_t *vam = &vat_main;
4711 vat_json_node_t *node;
4712 u8 *rate_type_str, *round_type_str, *type_str;
4713 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
4715 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
4717 format (0, "%U", format_policer_round_type, mp->round_type);
4718 type_str = format (0, "%U", format_policer_type, mp->type);
4719 conform_action_str = format (0, "%U", format_policer_action_type,
4720 mp->conform_action_type);
4721 exceed_action_str = format (0, "%U", format_policer_action_type,
4722 mp->exceed_action_type);
4723 violate_action_str = format (0, "%U", format_policer_action_type,
4724 mp->violate_action_type);
4726 if (VAT_JSON_ARRAY != vam->json_tree.type)
4728 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4729 vat_json_init_array (&vam->json_tree);
4731 node = vat_json_array_add (&vam->json_tree);
4733 vat_json_init_object (node);
4734 vat_json_object_add_string_copy (node, "name", mp->name);
4735 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
4736 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
4737 vat_json_object_add_uint (node, "cb", clib_net_to_host_u64 (mp->cb));
4738 vat_json_object_add_uint (node, "eb", clib_net_to_host_u64 (mp->eb));
4739 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
4740 vat_json_object_add_string_copy (node, "round_type", round_type_str);
4741 vat_json_object_add_string_copy (node, "type", type_str);
4742 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
4743 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
4744 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
4745 vat_json_object_add_uint (node, "cir_tokens_per_period",
4746 ntohl (mp->cir_tokens_per_period));
4747 vat_json_object_add_uint (node, "eir_tokens_per_period",
4748 ntohl (mp->pir_tokens_per_period));
4749 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
4750 vat_json_object_add_uint (node, "current_bucket",
4751 ntohl (mp->current_bucket));
4752 vat_json_object_add_uint (node, "extended_limit",
4753 ntohl (mp->extended_limit));
4754 vat_json_object_add_uint (node, "extended_bucket",
4755 ntohl (mp->extended_bucket));
4756 vat_json_object_add_uint (node, "last_update_time",
4757 ntohl (mp->last_update_time));
4758 vat_json_object_add_string_copy (node, "conform_action",
4759 conform_action_str);
4760 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4762 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4763 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
4764 vec_free (dscp_str);
4766 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
4767 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4769 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4770 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
4771 vec_free (dscp_str);
4773 vat_json_object_add_string_copy (node, "violate_action",
4774 violate_action_str);
4775 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4777 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4778 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
4779 vec_free (dscp_str);
4782 vec_free (rate_type_str);
4783 vec_free (round_type_str);
4784 vec_free (type_str);
4785 vec_free (conform_action_str);
4786 vec_free (exceed_action_str);
4787 vec_free (violate_action_str);
4791 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
4794 vat_main_t *vam = &vat_main;
4795 int i, count = ntohl (mp->count);
4798 print (vam->ofp, "classify table ids (%d) : ", count);
4799 for (i = 0; i < count; i++)
4801 print (vam->ofp, "%d", ntohl (mp->ids[i]));
4802 print (vam->ofp, (i < count - 1) ? "," : "");
4804 vam->retval = ntohl (mp->retval);
4805 vam->result_ready = 1;
4809 vl_api_classify_table_ids_reply_t_handler_json
4810 (vl_api_classify_table_ids_reply_t * mp)
4812 vat_main_t *vam = &vat_main;
4813 int i, count = ntohl (mp->count);
4817 vat_json_node_t node;
4819 vat_json_init_object (&node);
4820 for (i = 0; i < count; i++)
4822 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
4824 vat_json_print (vam->ofp, &node);
4825 vat_json_free (&node);
4827 vam->retval = ntohl (mp->retval);
4828 vam->result_ready = 1;
4832 vl_api_classify_table_by_interface_reply_t_handler
4833 (vl_api_classify_table_by_interface_reply_t * mp)
4835 vat_main_t *vam = &vat_main;
4838 table_id = ntohl (mp->l2_table_id);
4840 print (vam->ofp, "l2 table id : %d", table_id);
4842 print (vam->ofp, "l2 table id : No input ACL tables configured");
4843 table_id = ntohl (mp->ip4_table_id);
4845 print (vam->ofp, "ip4 table id : %d", table_id);
4847 print (vam->ofp, "ip4 table id : No input ACL tables configured");
4848 table_id = ntohl (mp->ip6_table_id);
4850 print (vam->ofp, "ip6 table id : %d", table_id);
4852 print (vam->ofp, "ip6 table id : No input ACL tables configured");
4853 vam->retval = ntohl (mp->retval);
4854 vam->result_ready = 1;
4858 vl_api_classify_table_by_interface_reply_t_handler_json
4859 (vl_api_classify_table_by_interface_reply_t * mp)
4861 vat_main_t *vam = &vat_main;
4862 vat_json_node_t node;
4864 vat_json_init_object (&node);
4866 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
4867 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
4868 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
4870 vat_json_print (vam->ofp, &node);
4871 vat_json_free (&node);
4873 vam->retval = ntohl (mp->retval);
4874 vam->result_ready = 1;
4877 static void vl_api_policer_add_del_reply_t_handler
4878 (vl_api_policer_add_del_reply_t * mp)
4880 vat_main_t *vam = &vat_main;
4881 i32 retval = ntohl (mp->retval);
4882 if (vam->async_mode)
4884 vam->async_errors += (retval < 0);
4888 vam->retval = retval;
4889 vam->result_ready = 1;
4890 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
4892 * Note: this is just barely thread-safe, depends on
4893 * the main thread spinning waiting for an answer...
4895 errmsg ("policer index %d", ntohl (mp->policer_index));
4899 static void vl_api_policer_add_del_reply_t_handler_json
4900 (vl_api_policer_add_del_reply_t * mp)
4902 vat_main_t *vam = &vat_main;
4903 vat_json_node_t node;
4905 vat_json_init_object (&node);
4906 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
4907 vat_json_object_add_uint (&node, "policer_index",
4908 ntohl (mp->policer_index));
4910 vat_json_print (vam->ofp, &node);
4911 vat_json_free (&node);
4913 vam->retval = ntohl (mp->retval);
4914 vam->result_ready = 1;
4917 /* Format hex dump. */
4919 format_hex_bytes (u8 * s, va_list * va)
4921 u8 *bytes = va_arg (*va, u8 *);
4922 int n_bytes = va_arg (*va, int);
4925 /* Print short or long form depending on byte count. */
4926 uword short_form = n_bytes <= 32;
4927 u32 indent = format_get_indent (s);
4932 for (i = 0; i < n_bytes; i++)
4934 if (!short_form && (i % 32) == 0)
4935 s = format (s, "%08x: ", i);
4936 s = format (s, "%02x", bytes[i]);
4937 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
4938 s = format (s, "\n%U", format_white_space, indent);
4945 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
4948 vat_main_t *vam = &vat_main;
4949 i32 retval = ntohl (mp->retval);
4952 print (vam->ofp, "classify table info :");
4953 print (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d",
4954 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
4955 ntohl (mp->miss_next_index));
4956 print (vam->ofp, "nbuckets: %d skip: %d match: %d",
4957 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
4958 ntohl (mp->match_n_vectors));
4959 print (vam->ofp, "mask: %U", format_hex_bytes, mp->mask,
4960 ntohl (mp->mask_length));
4962 vam->retval = retval;
4963 vam->result_ready = 1;
4967 vl_api_classify_table_info_reply_t_handler_json
4968 (vl_api_classify_table_info_reply_t * mp)
4970 vat_main_t *vam = &vat_main;
4971 vat_json_node_t node;
4973 i32 retval = ntohl (mp->retval);
4976 vat_json_init_object (&node);
4978 vat_json_object_add_int (&node, "sessions",
4979 ntohl (mp->active_sessions));
4980 vat_json_object_add_int (&node, "nexttbl",
4981 ntohl (mp->next_table_index));
4982 vat_json_object_add_int (&node, "nextnode",
4983 ntohl (mp->miss_next_index));
4984 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
4985 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
4986 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
4987 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
4988 ntohl (mp->mask_length), 0);
4989 vat_json_object_add_string_copy (&node, "mask", s);
4991 vat_json_print (vam->ofp, &node);
4992 vat_json_free (&node);
4994 vam->retval = ntohl (mp->retval);
4995 vam->result_ready = 1;
4999 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
5002 vat_main_t *vam = &vat_main;
5004 print (vam->ofp, "next_index: %d advance: %d opaque: %d ",
5005 ntohl (mp->hit_next_index), ntohl (mp->advance),
5006 ntohl (mp->opaque_index));
5007 print (vam->ofp, "mask: %U", format_hex_bytes, mp->match,
5008 ntohl (mp->match_length));
5012 vl_api_classify_session_details_t_handler_json
5013 (vl_api_classify_session_details_t * mp)
5015 vat_main_t *vam = &vat_main;
5016 vat_json_node_t *node = NULL;
5018 if (VAT_JSON_ARRAY != vam->json_tree.type)
5020 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5021 vat_json_init_array (&vam->json_tree);
5023 node = vat_json_array_add (&vam->json_tree);
5025 vat_json_init_object (node);
5026 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
5027 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
5028 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
5030 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
5032 vat_json_object_add_string_copy (node, "match", s);
5035 static void vl_api_pg_create_interface_reply_t_handler
5036 (vl_api_pg_create_interface_reply_t * mp)
5038 vat_main_t *vam = &vat_main;
5040 vam->retval = ntohl (mp->retval);
5041 vam->result_ready = 1;
5044 static void vl_api_pg_create_interface_reply_t_handler_json
5045 (vl_api_pg_create_interface_reply_t * mp)
5047 vat_main_t *vam = &vat_main;
5048 vat_json_node_t node;
5050 i32 retval = ntohl (mp->retval);
5053 vat_json_init_object (&node);
5055 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
5057 vat_json_print (vam->ofp, &node);
5058 vat_json_free (&node);
5060 vam->retval = ntohl (mp->retval);
5061 vam->result_ready = 1;
5064 static void vl_api_policer_classify_details_t_handler
5065 (vl_api_policer_classify_details_t * mp)
5067 vat_main_t *vam = &vat_main;
5069 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5070 ntohl (mp->table_index));
5073 static void vl_api_policer_classify_details_t_handler_json
5074 (vl_api_policer_classify_details_t * mp)
5076 vat_main_t *vam = &vat_main;
5077 vat_json_node_t *node;
5079 if (VAT_JSON_ARRAY != vam->json_tree.type)
5081 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5082 vat_json_init_array (&vam->json_tree);
5084 node = vat_json_array_add (&vam->json_tree);
5086 vat_json_init_object (node);
5087 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5088 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5091 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
5092 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5094 vat_main_t *vam = &vat_main;
5095 i32 retval = ntohl (mp->retval);
5096 if (vam->async_mode)
5098 vam->async_errors += (retval < 0);
5102 vam->retval = retval;
5103 vam->sw_if_index = ntohl (mp->sw_if_index);
5104 vam->result_ready = 1;
5106 vam->regenerate_interface_table = 1;
5109 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
5110 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5112 vat_main_t *vam = &vat_main;
5113 vat_json_node_t node;
5115 vat_json_init_object (&node);
5116 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
5117 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
5119 vat_json_print (vam->ofp, &node);
5120 vat_json_free (&node);
5122 vam->retval = ntohl (mp->retval);
5123 vam->result_ready = 1;
5126 static void vl_api_flow_classify_details_t_handler
5127 (vl_api_flow_classify_details_t * mp)
5129 vat_main_t *vam = &vat_main;
5131 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5132 ntohl (mp->table_index));
5135 static void vl_api_flow_classify_details_t_handler_json
5136 (vl_api_flow_classify_details_t * mp)
5138 vat_main_t *vam = &vat_main;
5139 vat_json_node_t *node;
5141 if (VAT_JSON_ARRAY != vam->json_tree.type)
5143 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5144 vat_json_init_array (&vam->json_tree);
5146 node = vat_json_array_add (&vam->json_tree);
5148 vat_json_init_object (node);
5149 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5150 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5153 #define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler
5154 #define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler
5155 #define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler
5156 #define vl_api_one_l2_arp_entries_get_reply_t_endian vl_noop_handler
5157 #define vl_api_one_l2_arp_entries_get_reply_t_print vl_noop_handler
5158 #define vl_api_one_l2_arp_bd_get_reply_t_endian vl_noop_handler
5159 #define vl_api_one_ndp_bd_get_reply_t_endian vl_noop_handler
5160 #define vl_api_one_ndp_bd_get_reply_t_print vl_noop_handler
5161 #define vl_api_one_ndp_entries_get_reply_t_print vl_noop_handler
5162 #define vl_api_one_ndp_entries_get_reply_t_endian vl_noop_handler
5165 * Generate boilerplate reply handlers, which
5166 * dig the return value out of the xxx_reply_t API message,
5167 * stick it into vam->retval, and set vam->result_ready
5169 * Could also do this by pointing N message decode slots at
5170 * a single function, but that could break in subtle ways.
5173 #define foreach_standard_reply_retval_handler \
5174 _(sw_interface_set_flags_reply) \
5175 _(sw_interface_add_del_address_reply) \
5176 _(sw_interface_set_rx_mode_reply) \
5177 _(sw_interface_set_rx_placement_reply) \
5178 _(sw_interface_set_table_reply) \
5179 _(sw_interface_set_mpls_enable_reply) \
5180 _(sw_interface_set_vpath_reply) \
5181 _(sw_interface_set_vxlan_bypass_reply) \
5182 _(sw_interface_set_geneve_bypass_reply) \
5183 _(sw_interface_set_vxlan_gpe_bypass_reply) \
5184 _(sw_interface_set_l2_bridge_reply) \
5185 _(bridge_domain_add_del_reply) \
5186 _(sw_interface_set_l2_xconnect_reply) \
5187 _(l2fib_add_del_reply) \
5188 _(l2fib_flush_int_reply) \
5189 _(l2fib_flush_bd_reply) \
5190 _(ip_add_del_route_reply) \
5191 _(ip_table_add_del_reply) \
5192 _(ip_mroute_add_del_reply) \
5193 _(mpls_route_add_del_reply) \
5194 _(mpls_table_add_del_reply) \
5195 _(mpls_ip_bind_unbind_reply) \
5196 _(bier_route_add_del_reply) \
5197 _(bier_table_add_del_reply) \
5198 _(proxy_arp_add_del_reply) \
5199 _(proxy_arp_intfc_enable_disable_reply) \
5200 _(sw_interface_set_unnumbered_reply) \
5201 _(ip_neighbor_add_del_reply) \
5202 _(oam_add_del_reply) \
5203 _(reset_fib_reply) \
5204 _(dhcp_proxy_config_reply) \
5205 _(dhcp_proxy_set_vss_reply) \
5206 _(dhcp_client_config_reply) \
5207 _(set_ip_flow_hash_reply) \
5208 _(sw_interface_ip6_enable_disable_reply) \
5209 _(ip6nd_proxy_add_del_reply) \
5210 _(sw_interface_ip6nd_ra_prefix_reply) \
5211 _(sw_interface_ip6nd_ra_config_reply) \
5212 _(set_arp_neighbor_limit_reply) \
5213 _(l2_patch_add_del_reply) \
5214 _(sr_mpls_policy_add_reply) \
5215 _(sr_mpls_policy_mod_reply) \
5216 _(sr_mpls_policy_del_reply) \
5217 _(sr_policy_add_reply) \
5218 _(sr_policy_mod_reply) \
5219 _(sr_policy_del_reply) \
5220 _(sr_localsid_add_del_reply) \
5221 _(sr_steering_add_del_reply) \
5222 _(classify_add_del_session_reply) \
5223 _(classify_set_interface_ip_table_reply) \
5224 _(classify_set_interface_l2_tables_reply) \
5225 _(l2tpv3_set_tunnel_cookies_reply) \
5226 _(l2tpv3_interface_enable_disable_reply) \
5227 _(l2tpv3_set_lookup_key_reply) \
5228 _(l2_fib_clear_table_reply) \
5229 _(l2_interface_efp_filter_reply) \
5230 _(l2_interface_vlan_tag_rewrite_reply) \
5231 _(modify_vhost_user_if_reply) \
5232 _(delete_vhost_user_if_reply) \
5233 _(ip_probe_neighbor_reply) \
5234 _(ip_scan_neighbor_enable_disable_reply) \
5235 _(want_ip4_arp_events_reply) \
5236 _(want_ip6_nd_events_reply) \
5237 _(want_l2_macs_events_reply) \
5238 _(input_acl_set_interface_reply) \
5239 _(ipsec_spd_add_del_reply) \
5240 _(ipsec_interface_add_del_spd_reply) \
5241 _(ipsec_spd_add_del_entry_reply) \
5242 _(ipsec_sad_add_del_entry_reply) \
5243 _(ipsec_sa_set_key_reply) \
5244 _(ipsec_tunnel_if_add_del_reply) \
5245 _(ipsec_tunnel_if_set_key_reply) \
5246 _(ipsec_tunnel_if_set_sa_reply) \
5247 _(ikev2_profile_add_del_reply) \
5248 _(ikev2_profile_set_auth_reply) \
5249 _(ikev2_profile_set_id_reply) \
5250 _(ikev2_profile_set_ts_reply) \
5251 _(ikev2_set_local_key_reply) \
5252 _(ikev2_set_responder_reply) \
5253 _(ikev2_set_ike_transforms_reply) \
5254 _(ikev2_set_esp_transforms_reply) \
5255 _(ikev2_set_sa_lifetime_reply) \
5256 _(ikev2_initiate_sa_init_reply) \
5257 _(ikev2_initiate_del_ike_sa_reply) \
5258 _(ikev2_initiate_del_child_sa_reply) \
5259 _(ikev2_initiate_rekey_child_sa_reply) \
5260 _(delete_loopback_reply) \
5261 _(bd_ip_mac_add_del_reply) \
5262 _(bd_ip_mac_flush_reply) \
5263 _(want_interface_events_reply) \
5264 _(cop_interface_enable_disable_reply) \
5265 _(cop_whitelist_enable_disable_reply) \
5266 _(sw_interface_clear_stats_reply) \
5267 _(ioam_enable_reply) \
5268 _(ioam_disable_reply) \
5269 _(one_add_del_locator_reply) \
5270 _(one_add_del_local_eid_reply) \
5271 _(one_add_del_remote_mapping_reply) \
5272 _(one_add_del_adjacency_reply) \
5273 _(one_add_del_map_resolver_reply) \
5274 _(one_add_del_map_server_reply) \
5275 _(one_enable_disable_reply) \
5276 _(one_rloc_probe_enable_disable_reply) \
5277 _(one_map_register_enable_disable_reply) \
5278 _(one_map_register_set_ttl_reply) \
5279 _(one_set_transport_protocol_reply) \
5280 _(one_map_register_fallback_threshold_reply) \
5281 _(one_pitr_set_locator_set_reply) \
5282 _(one_map_request_mode_reply) \
5283 _(one_add_del_map_request_itr_rlocs_reply) \
5284 _(one_eid_table_add_del_map_reply) \
5285 _(one_use_petr_reply) \
5286 _(one_stats_enable_disable_reply) \
5287 _(one_add_del_l2_arp_entry_reply) \
5288 _(one_add_del_ndp_entry_reply) \
5289 _(one_stats_flush_reply) \
5290 _(one_enable_disable_xtr_mode_reply) \
5291 _(one_enable_disable_pitr_mode_reply) \
5292 _(one_enable_disable_petr_mode_reply) \
5293 _(gpe_enable_disable_reply) \
5294 _(gpe_set_encap_mode_reply) \
5295 _(gpe_add_del_iface_reply) \
5296 _(gpe_add_del_native_fwd_rpath_reply) \
5297 _(af_packet_delete_reply) \
5298 _(policer_classify_set_interface_reply) \
5299 _(netmap_create_reply) \
5300 _(netmap_delete_reply) \
5301 _(set_ipfix_exporter_reply) \
5302 _(set_ipfix_classify_stream_reply) \
5303 _(ipfix_classify_table_add_del_reply) \
5304 _(flow_classify_set_interface_reply) \
5305 _(sw_interface_span_enable_disable_reply) \
5306 _(pg_capture_reply) \
5307 _(pg_enable_disable_reply) \
5308 _(ip_source_and_port_range_check_add_del_reply) \
5309 _(ip_source_and_port_range_check_interface_add_del_reply)\
5310 _(delete_subif_reply) \
5311 _(l2_interface_pbb_tag_rewrite_reply) \
5313 _(feature_enable_disable_reply) \
5314 _(sw_interface_tag_add_del_reply) \
5315 _(hw_interface_set_mtu_reply) \
5316 _(p2p_ethernet_add_reply) \
5317 _(p2p_ethernet_del_reply) \
5318 _(lldp_config_reply) \
5319 _(sw_interface_set_lldp_reply) \
5320 _(tcp_configure_src_addresses_reply) \
5321 _(dns_enable_disable_reply) \
5322 _(dns_name_server_add_del_reply) \
5323 _(session_rule_add_del_reply) \
5324 _(ip_container_proxy_add_del_reply) \
5325 _(output_acl_set_interface_reply) \
5326 _(qos_record_enable_disable_reply)
5329 static void vl_api_##n##_t_handler \
5330 (vl_api_##n##_t * mp) \
5332 vat_main_t * vam = &vat_main; \
5333 i32 retval = ntohl(mp->retval); \
5334 if (vam->async_mode) { \
5335 vam->async_errors += (retval < 0); \
5337 vam->retval = retval; \
5338 vam->result_ready = 1; \
5341 foreach_standard_reply_retval_handler;
5345 static void vl_api_##n##_t_handler_json \
5346 (vl_api_##n##_t * mp) \
5348 vat_main_t * vam = &vat_main; \
5349 vat_json_node_t node; \
5350 vat_json_init_object(&node); \
5351 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5352 vat_json_print(vam->ofp, &node); \
5353 vam->retval = ntohl(mp->retval); \
5354 vam->result_ready = 1; \
5356 foreach_standard_reply_retval_handler;
5360 * Table of message reply handlers, must include boilerplate handlers
5364 #define foreach_vpe_api_reply_msg \
5365 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
5366 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
5367 _(SW_INTERFACE_DETAILS, sw_interface_details) \
5368 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5369 _(CONTROL_PING_REPLY, control_ping_reply) \
5370 _(CLI_REPLY, cli_reply) \
5371 _(CLI_INBAND_REPLY, cli_inband_reply) \
5372 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5373 sw_interface_add_del_address_reply) \
5374 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
5375 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
5376 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
5377 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5378 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5379 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5380 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
5381 _(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
5382 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
5383 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5384 sw_interface_set_l2_xconnect_reply) \
5385 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5386 sw_interface_set_l2_bridge_reply) \
5387 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5388 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
5389 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
5390 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
5391 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5392 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
5393 _(L2_FLAGS_REPLY, l2_flags_reply) \
5394 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
5395 _(TAP_CONNECT_REPLY, tap_connect_reply) \
5396 _(TAP_MODIFY_REPLY, tap_modify_reply) \
5397 _(TAP_DELETE_REPLY, tap_delete_reply) \
5398 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
5399 _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5400 _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5401 _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
5402 _(BOND_CREATE_REPLY, bond_create_reply) \
5403 _(BOND_DELETE_REPLY, bond_delete_reply) \
5404 _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5405 _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5406 _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5407 _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
5408 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
5409 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
5410 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
5411 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
5412 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5413 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
5414 _(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5415 _(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
5416 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5417 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5418 proxy_arp_intfc_enable_disable_reply) \
5419 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5420 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5421 sw_interface_set_unnumbered_reply) \
5422 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
5423 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5424 _(CREATE_SUBIF_REPLY, create_subif_reply) \
5425 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
5426 _(RESET_FIB_REPLY, reset_fib_reply) \
5427 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
5428 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
5429 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
5430 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5431 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5432 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5433 sw_interface_ip6_enable_disable_reply) \
5434 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5435 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
5436 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5437 sw_interface_ip6nd_ra_prefix_reply) \
5438 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5439 sw_interface_ip6nd_ra_config_reply) \
5440 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5441 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
5442 _(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5443 _(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5444 _(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
5445 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5446 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5447 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5448 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5449 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
5450 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5451 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5452 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5453 classify_set_interface_ip_table_reply) \
5454 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5455 classify_set_interface_l2_tables_reply) \
5456 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5457 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5458 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5459 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5460 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5461 l2tpv3_interface_enable_disable_reply) \
5462 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5463 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5464 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
5465 _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
5466 _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
5467 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
5468 _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
5469 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
5470 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5471 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5472 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5473 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5474 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5475 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5476 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5477 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5478 _(SHOW_VERSION_REPLY, show_version_reply) \
5479 _(SHOW_THREADS_REPLY, show_threads_reply) \
5480 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
5481 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
5482 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5483 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
5484 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
5485 _(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
5486 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5487 _(IP4_ARP_EVENT, ip4_arp_event) \
5488 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5489 _(IP6_ND_EVENT, ip6_nd_event) \
5490 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5491 _(L2_MACS_EVENT, l2_macs_event) \
5492 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5493 _(IP_ADDRESS_DETAILS, ip_address_details) \
5494 _(IP_DETAILS, ip_details) \
5495 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5496 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
5497 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
5498 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
5499 _(IPSEC_SA_DETAILS, ipsec_sa_details) \
5500 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
5501 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
5502 _(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \
5503 _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
5504 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
5505 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
5506 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
5507 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
5508 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
5509 _(IKEV2_SET_RESPONDER_REPLY, ikev2_set_responder_reply) \
5510 _(IKEV2_SET_IKE_TRANSFORMS_REPLY, ikev2_set_ike_transforms_reply) \
5511 _(IKEV2_SET_ESP_TRANSFORMS_REPLY, ikev2_set_esp_transforms_reply) \
5512 _(IKEV2_SET_SA_LIFETIME_REPLY, ikev2_set_sa_lifetime_reply) \
5513 _(IKEV2_INITIATE_SA_INIT_REPLY, ikev2_initiate_sa_init_reply) \
5514 _(IKEV2_INITIATE_DEL_IKE_SA_REPLY, ikev2_initiate_del_ike_sa_reply) \
5515 _(IKEV2_INITIATE_DEL_CHILD_SA_REPLY, ikev2_initiate_del_child_sa_reply) \
5516 _(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \
5517 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5518 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
5519 _(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
5520 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
5521 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
5522 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
5523 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5524 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5525 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5526 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5527 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5528 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5529 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
5530 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5531 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5532 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5533 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5534 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5535 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5536 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5537 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5538 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5539 one_map_register_enable_disable_reply) \
5540 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
5541 _(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5542 _(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
5543 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5544 one_map_register_fallback_threshold_reply) \
5545 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5546 one_rloc_probe_enable_disable_reply) \
5547 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
5548 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
5549 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5550 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5551 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5552 _(ONE_LOCATOR_DETAILS, one_locator_details) \
5553 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5554 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5555 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5556 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5557 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5558 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
5559 _(ONE_STATS_DETAILS, one_stats_details) \
5560 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
5561 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5562 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5563 show_one_stats_enable_disable_reply) \
5564 _(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5565 _(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5566 _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
5567 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5568 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5569 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
5570 _(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5571 _(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5572 one_enable_disable_pitr_mode_reply) \
5573 _(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5574 one_enable_disable_petr_mode_reply) \
5575 _(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5576 _(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5577 _(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
5578 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5579 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
5580 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
5581 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5582 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
5583 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
5584 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
5585 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5586 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5587 gpe_add_del_native_fwd_rpath_reply) \
5588 _(GPE_FWD_ENTRY_PATH_DETAILS, \
5589 gpe_fwd_entry_path_details) \
5590 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5591 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5592 one_add_del_map_request_itr_rlocs_reply) \
5593 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5594 one_get_map_request_itr_rlocs_reply) \
5595 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
5596 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
5597 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
5598 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5599 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5600 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5601 show_one_map_register_state_reply) \
5602 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
5603 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5604 show_one_map_register_fallback_threshold_reply) \
5605 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5606 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
5607 _(AF_PACKET_DETAILS, af_packet_details) \
5608 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5609 _(POLICER_DETAILS, policer_details) \
5610 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5611 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5612 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
5613 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5614 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5615 _(MPLS_FIB_DETAILS, mpls_fib_details) \
5616 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5617 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5618 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5619 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5620 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5621 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5622 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5623 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5624 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5625 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5626 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5627 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5628 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5629 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5630 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5631 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5632 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5633 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5634 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5635 ip_source_and_port_range_check_add_del_reply) \
5636 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5637 ip_source_and_port_range_check_interface_add_del_reply) \
5638 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
5639 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5640 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5641 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5642 _(SET_PUNT_REPLY, set_punt_reply) \
5643 _(IP_FIB_DETAILS, ip_fib_details) \
5644 _(IP6_FIB_DETAILS, ip6_fib_details) \
5645 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5646 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5647 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5648 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
5649 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5650 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5651 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5652 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5653 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5654 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
5655 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
5656 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5657 _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5658 _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
5659 _(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
5660 _(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
5661 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
5662 _(SESSION_RULES_DETAILS, session_rules_details) \
5663 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
5664 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
5665 _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
5667 #define foreach_standalone_reply_msg \
5668 _(SW_INTERFACE_EVENT, sw_interface_event)
5676 #define STR_VTR_OP_CASE(op) \
5677 case L2_VTR_ ## op: \
5681 str_vtr_op (u32 vtr_op)
5685 STR_VTR_OP_CASE (DISABLED);
5686 STR_VTR_OP_CASE (PUSH_1);
5687 STR_VTR_OP_CASE (PUSH_2);
5688 STR_VTR_OP_CASE (POP_1);
5689 STR_VTR_OP_CASE (POP_2);
5690 STR_VTR_OP_CASE (TRANSLATE_1_1);
5691 STR_VTR_OP_CASE (TRANSLATE_1_2);
5692 STR_VTR_OP_CASE (TRANSLATE_2_1);
5693 STR_VTR_OP_CASE (TRANSLATE_2_2);
5700 dump_sub_interface_table (vat_main_t * vam)
5702 const sw_interface_subif_t *sub = NULL;
5704 if (vam->json_output)
5707 ("JSON output supported only for VPE API calls and dump_stats_table");
5712 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5713 "Interface", "sw_if_index",
5714 "sub id", "dot1ad", "tags", "outer id",
5715 "inner id", "exact", "default", "outer any", "inner any");
5717 vec_foreach (sub, vam->sw_if_subif_table)
5720 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5721 sub->interface_name,
5723 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5724 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5725 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5726 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5727 if (sub->vtr_op != L2_VTR_DISABLED)
5730 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5731 "tag1: %d tag2: %d ]",
5732 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5733 sub->vtr_tag1, sub->vtr_tag2);
5741 name_sort_cmp (void *a1, void *a2)
5743 name_sort_t *n1 = a1;
5744 name_sort_t *n2 = a2;
5746 return strcmp ((char *) n1->name, (char *) n2->name);
5750 dump_interface_table (vat_main_t * vam)
5753 name_sort_t *nses = 0, *ns;
5755 if (vam->json_output)
5758 ("JSON output supported only for VPE API calls and dump_stats_table");
5763 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5765 vec_add2 (nses, ns, 1);
5766 ns->name = (u8 *)(p->key);
5767 ns->value = (u32) p->value[0];
5771 vec_sort_with_function (nses, name_sort_cmp);
5773 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5774 vec_foreach (ns, nses)
5776 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5783 dump_ip_table (vat_main_t * vam, int is_ipv6)
5785 const ip_details_t *det = NULL;
5786 const ip_address_details_t *address = NULL;
5789 print (vam->ofp, "%-12s", "sw_if_index");
5791 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5798 print (vam->ofp, "%-12d", i);
5799 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5804 vec_foreach (address, det->addr)
5808 is_ipv6 ? format_ip6_address : format_ip4_address,
5809 address->ip, address->prefix_length);
5817 dump_ipv4_table (vat_main_t * vam)
5819 if (vam->json_output)
5822 ("JSON output supported only for VPE API calls and dump_stats_table");
5826 return dump_ip_table (vam, 0);
5830 dump_ipv6_table (vat_main_t * vam)
5832 if (vam->json_output)
5835 ("JSON output supported only for VPE API calls and dump_stats_table");
5839 return dump_ip_table (vam, 1);
5843 * Pass CLI buffers directly in the CLI_INBAND API message,
5844 * instead of an additional shared memory area.
5847 exec_inband (vat_main_t * vam)
5849 vl_api_cli_inband_t *mp;
5850 unformat_input_t *i = vam->input;
5853 if (vec_len (i->buffer) == 0)
5856 if (vam->exec_mode == 0 && unformat (i, "mode"))
5861 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5868 * In order for the CLI command to work, it
5869 * must be a vector ending in \n, not a C-string ending
5872 u32 len = vec_len (vam->input->buffer);
5873 M2 (CLI_INBAND, mp, len);
5874 vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
5878 /* json responses may or may not include a useful reply... */
5879 if (vec_len (vam->cmd_reply))
5880 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
5885 exec (vat_main_t * vam)
5887 return exec_inband (vam);
5891 api_create_loopback (vat_main_t * vam)
5893 unformat_input_t *i = vam->input;
5894 vl_api_create_loopback_t *mp;
5895 vl_api_create_loopback_instance_t *mp_lbi;
5898 u8 is_specified = 0;
5899 u32 user_instance = 0;
5902 clib_memset (mac_address, 0, sizeof (mac_address));
5904 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5906 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5908 if (unformat (i, "instance %d", &user_instance))
5916 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5917 mp_lbi->is_specified = is_specified;
5919 mp_lbi->user_instance = htonl (user_instance);
5921 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5926 /* Construct the API message */
5927 M (CREATE_LOOPBACK, mp);
5929 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5938 api_delete_loopback (vat_main_t * vam)
5940 unformat_input_t *i = vam->input;
5941 vl_api_delete_loopback_t *mp;
5942 u32 sw_if_index = ~0;
5945 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5947 if (unformat (i, "sw_if_index %d", &sw_if_index))
5953 if (sw_if_index == ~0)
5955 errmsg ("missing sw_if_index");
5959 /* Construct the API message */
5960 M (DELETE_LOOPBACK, mp);
5961 mp->sw_if_index = ntohl (sw_if_index);
5969 api_want_interface_events (vat_main_t * vam)
5971 unformat_input_t *i = vam->input;
5972 vl_api_want_interface_events_t *mp;
5976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5978 if (unformat (i, "enable"))
5980 else if (unformat (i, "disable"))
5988 errmsg ("missing enable|disable");
5992 M (WANT_INTERFACE_EVENTS, mp);
5993 mp->enable_disable = enable;
5995 vam->interface_event_display = enable;
6003 /* Note: non-static, called once to set up the initial intfc table */
6005 api_sw_interface_dump (vat_main_t * vam)
6007 vl_api_sw_interface_dump_t *mp;
6008 vl_api_control_ping_t *mp_ping;
6010 name_sort_t *nses = 0, *ns;
6011 sw_interface_subif_t *sub = NULL;
6014 /* Toss the old name table */
6016 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
6018 vec_add2 (nses, ns, 1);
6019 ns->name = (u8 *)(p->key);
6020 ns->value = (u32) p->value[0];
6024 hash_free (vam->sw_if_index_by_interface_name);
6026 vec_foreach (ns, nses) vec_free (ns->name);
6030 vec_foreach (sub, vam->sw_if_subif_table)
6032 vec_free (sub->interface_name);
6034 vec_free (vam->sw_if_subif_table);
6036 /* recreate the interface name hash table */
6037 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
6040 * Ask for all interface names. Otherwise, the epic catalog of
6041 * name filters becomes ridiculously long, and vat ends up needing
6042 * to be taught about new interface types.
6044 M (SW_INTERFACE_DUMP, mp);
6047 /* Use a control ping for synchronization */
6048 MPING (CONTROL_PING, mp_ping);
6056 api_sw_interface_set_flags (vat_main_t * vam)
6058 unformat_input_t *i = vam->input;
6059 vl_api_sw_interface_set_flags_t *mp;
6061 u8 sw_if_index_set = 0;
6065 /* Parse args required to build the message */
6066 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6068 if (unformat (i, "admin-up"))
6070 else if (unformat (i, "admin-down"))
6073 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6074 sw_if_index_set = 1;
6075 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6076 sw_if_index_set = 1;
6081 if (sw_if_index_set == 0)
6083 errmsg ("missing interface name or sw_if_index");
6087 /* Construct the API message */
6088 M (SW_INTERFACE_SET_FLAGS, mp);
6089 mp->sw_if_index = ntohl (sw_if_index);
6090 mp->admin_up_down = admin_up;
6095 /* Wait for a reply, return the good/bad news... */
6101 api_sw_interface_set_rx_mode (vat_main_t * vam)
6103 unformat_input_t *i = vam->input;
6104 vl_api_sw_interface_set_rx_mode_t *mp;
6106 u8 sw_if_index_set = 0;
6108 u8 queue_id_valid = 0;
6110 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6112 /* Parse args required to build the message */
6113 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6115 if (unformat (i, "queue %d", &queue_id))
6117 else if (unformat (i, "polling"))
6118 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6119 else if (unformat (i, "interrupt"))
6120 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6121 else if (unformat (i, "adaptive"))
6122 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6124 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6125 sw_if_index_set = 1;
6126 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6127 sw_if_index_set = 1;
6132 if (sw_if_index_set == 0)
6134 errmsg ("missing interface name or sw_if_index");
6137 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6139 errmsg ("missing rx-mode");
6143 /* Construct the API message */
6144 M (SW_INTERFACE_SET_RX_MODE, mp);
6145 mp->sw_if_index = ntohl (sw_if_index);
6147 mp->queue_id_valid = queue_id_valid;
6148 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6153 /* Wait for a reply, return the good/bad news... */
6159 api_sw_interface_set_rx_placement (vat_main_t * vam)
6161 unformat_input_t *i = vam->input;
6162 vl_api_sw_interface_set_rx_placement_t *mp;
6164 u8 sw_if_index_set = 0;
6167 u32 queue_id, thread_index;
6169 /* Parse args required to build the message */
6170 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6172 if (unformat (i, "queue %d", &queue_id))
6174 else if (unformat (i, "main"))
6176 else if (unformat (i, "worker %d", &thread_index))
6179 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6180 sw_if_index_set = 1;
6181 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6182 sw_if_index_set = 1;
6187 if (sw_if_index_set == 0)
6189 errmsg ("missing interface name or sw_if_index");
6195 /* Construct the API message */
6196 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6197 mp->sw_if_index = ntohl (sw_if_index);
6198 mp->worker_id = ntohl (thread_index);
6199 mp->queue_id = ntohl (queue_id);
6200 mp->is_main = is_main;
6204 /* Wait for a reply, return the good/bad news... */
6209 static void vl_api_sw_interface_rx_placement_details_t_handler
6210 (vl_api_sw_interface_rx_placement_details_t * mp)
6212 vat_main_t *vam = &vat_main;
6213 u32 worker_id = ntohl (mp->worker_id);
6216 "\n%-11d %-11s %-6d %-5d %-9s",
6217 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
6218 worker_id, ntohl (mp->queue_id),
6220 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
6223 static void vl_api_sw_interface_rx_placement_details_t_handler_json
6224 (vl_api_sw_interface_rx_placement_details_t * mp)
6226 vat_main_t *vam = &vat_main;
6227 vat_json_node_t *node = NULL;
6229 if (VAT_JSON_ARRAY != vam->json_tree.type)
6231 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6232 vat_json_init_array (&vam->json_tree);
6234 node = vat_json_array_add (&vam->json_tree);
6236 vat_json_init_object (node);
6237 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6238 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
6239 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
6240 vat_json_object_add_uint (node, "mode", mp->mode);
6244 api_sw_interface_rx_placement_dump (vat_main_t * vam)
6246 unformat_input_t *i = vam->input;
6247 vl_api_sw_interface_rx_placement_dump_t *mp;
6248 vl_api_control_ping_t *mp_ping;
6251 u8 sw_if_index_set = 0;
6253 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6255 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6257 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6264 "\n%-11s %-11s %-6s %-5s %-4s",
6265 "sw_if_index", "main/worker", "thread", "queue", "mode");
6267 /* Dump Interface rx placement */
6268 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
6270 if (sw_if_index_set)
6271 mp->sw_if_index = htonl (sw_if_index);
6273 mp->sw_if_index = ~0;
6277 /* Use a control ping for synchronization */
6278 MPING (CONTROL_PING, mp_ping);
6286 api_sw_interface_clear_stats (vat_main_t * vam)
6288 unformat_input_t *i = vam->input;
6289 vl_api_sw_interface_clear_stats_t *mp;
6291 u8 sw_if_index_set = 0;
6294 /* Parse args required to build the message */
6295 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6297 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6298 sw_if_index_set = 1;
6299 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6300 sw_if_index_set = 1;
6305 /* Construct the API message */
6306 M (SW_INTERFACE_CLEAR_STATS, mp);
6308 if (sw_if_index_set == 1)
6309 mp->sw_if_index = ntohl (sw_if_index);
6311 mp->sw_if_index = ~0;
6316 /* Wait for a reply, return the good/bad news... */
6322 api_sw_interface_add_del_address (vat_main_t * vam)
6324 unformat_input_t *i = vam->input;
6325 vl_api_sw_interface_add_del_address_t *mp;
6327 u8 sw_if_index_set = 0;
6328 u8 is_add = 1, del_all = 0;
6329 u32 address_length = 0;
6330 u8 v4_address_set = 0;
6331 u8 v6_address_set = 0;
6332 ip4_address_t v4address;
6333 ip6_address_t v6address;
6336 /* Parse args required to build the message */
6337 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6339 if (unformat (i, "del-all"))
6341 else if (unformat (i, "del"))
6344 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6345 sw_if_index_set = 1;
6346 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6347 sw_if_index_set = 1;
6348 else if (unformat (i, "%U/%d",
6349 unformat_ip4_address, &v4address, &address_length))
6351 else if (unformat (i, "%U/%d",
6352 unformat_ip6_address, &v6address, &address_length))
6358 if (sw_if_index_set == 0)
6360 errmsg ("missing interface name or sw_if_index");
6363 if (v4_address_set && v6_address_set)
6365 errmsg ("both v4 and v6 addresses set");
6368 if (!v4_address_set && !v6_address_set && !del_all)
6370 errmsg ("no addresses set");
6374 /* Construct the API message */
6375 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
6377 mp->sw_if_index = ntohl (sw_if_index);
6378 mp->is_add = is_add;
6379 mp->del_all = del_all;
6383 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6387 clib_memcpy (mp->address, &v4address, sizeof (v4address));
6389 mp->address_length = address_length;
6394 /* Wait for a reply, return good/bad news */
6400 api_sw_interface_set_mpls_enable (vat_main_t * vam)
6402 unformat_input_t *i = vam->input;
6403 vl_api_sw_interface_set_mpls_enable_t *mp;
6405 u8 sw_if_index_set = 0;
6409 /* Parse args required to build the message */
6410 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6412 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6413 sw_if_index_set = 1;
6414 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6415 sw_if_index_set = 1;
6416 else if (unformat (i, "disable"))
6418 else if (unformat (i, "dis"))
6424 if (sw_if_index_set == 0)
6426 errmsg ("missing interface name or sw_if_index");
6430 /* Construct the API message */
6431 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
6433 mp->sw_if_index = ntohl (sw_if_index);
6434 mp->enable = enable;
6439 /* Wait for a reply... */
6445 api_sw_interface_set_table (vat_main_t * vam)
6447 unformat_input_t *i = vam->input;
6448 vl_api_sw_interface_set_table_t *mp;
6449 u32 sw_if_index, vrf_id = 0;
6450 u8 sw_if_index_set = 0;
6454 /* Parse args required to build the message */
6455 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6457 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6458 sw_if_index_set = 1;
6459 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6460 sw_if_index_set = 1;
6461 else if (unformat (i, "vrf %d", &vrf_id))
6463 else if (unformat (i, "ipv6"))
6469 if (sw_if_index_set == 0)
6471 errmsg ("missing interface name or sw_if_index");
6475 /* Construct the API message */
6476 M (SW_INTERFACE_SET_TABLE, mp);
6478 mp->sw_if_index = ntohl (sw_if_index);
6479 mp->is_ipv6 = is_ipv6;
6480 mp->vrf_id = ntohl (vrf_id);
6485 /* Wait for a reply... */
6490 static void vl_api_sw_interface_get_table_reply_t_handler
6491 (vl_api_sw_interface_get_table_reply_t * mp)
6493 vat_main_t *vam = &vat_main;
6495 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6497 vam->retval = ntohl (mp->retval);
6498 vam->result_ready = 1;
6502 static void vl_api_sw_interface_get_table_reply_t_handler_json
6503 (vl_api_sw_interface_get_table_reply_t * mp)
6505 vat_main_t *vam = &vat_main;
6506 vat_json_node_t node;
6508 vat_json_init_object (&node);
6509 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6510 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6512 vat_json_print (vam->ofp, &node);
6513 vat_json_free (&node);
6515 vam->retval = ntohl (mp->retval);
6516 vam->result_ready = 1;
6520 api_sw_interface_get_table (vat_main_t * vam)
6522 unformat_input_t *i = vam->input;
6523 vl_api_sw_interface_get_table_t *mp;
6525 u8 sw_if_index_set = 0;
6529 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6531 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6532 sw_if_index_set = 1;
6533 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6534 sw_if_index_set = 1;
6535 else if (unformat (i, "ipv6"))
6541 if (sw_if_index_set == 0)
6543 errmsg ("missing interface name or sw_if_index");
6547 M (SW_INTERFACE_GET_TABLE, mp);
6548 mp->sw_if_index = htonl (sw_if_index);
6549 mp->is_ipv6 = is_ipv6;
6557 api_sw_interface_set_vpath (vat_main_t * vam)
6559 unformat_input_t *i = vam->input;
6560 vl_api_sw_interface_set_vpath_t *mp;
6561 u32 sw_if_index = 0;
6562 u8 sw_if_index_set = 0;
6566 /* Parse args required to build the message */
6567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6569 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6570 sw_if_index_set = 1;
6571 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6572 sw_if_index_set = 1;
6573 else if (unformat (i, "enable"))
6575 else if (unformat (i, "disable"))
6581 if (sw_if_index_set == 0)
6583 errmsg ("missing interface name or sw_if_index");
6587 /* Construct the API message */
6588 M (SW_INTERFACE_SET_VPATH, mp);
6590 mp->sw_if_index = ntohl (sw_if_index);
6591 mp->enable = is_enable;
6596 /* Wait for a reply... */
6602 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6604 unformat_input_t *i = vam->input;
6605 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6606 u32 sw_if_index = 0;
6607 u8 sw_if_index_set = 0;
6612 /* Parse args required to build the message */
6613 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6615 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6616 sw_if_index_set = 1;
6617 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6618 sw_if_index_set = 1;
6619 else if (unformat (i, "enable"))
6621 else if (unformat (i, "disable"))
6623 else if (unformat (i, "ip4"))
6625 else if (unformat (i, "ip6"))
6631 if (sw_if_index_set == 0)
6633 errmsg ("missing interface name or sw_if_index");
6637 /* Construct the API message */
6638 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6640 mp->sw_if_index = ntohl (sw_if_index);
6641 mp->enable = is_enable;
6642 mp->is_ipv6 = is_ipv6;
6647 /* Wait for a reply... */
6653 api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6655 unformat_input_t *i = vam->input;
6656 vl_api_sw_interface_set_geneve_bypass_t *mp;
6657 u32 sw_if_index = 0;
6658 u8 sw_if_index_set = 0;
6663 /* Parse args required to build the message */
6664 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6666 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6667 sw_if_index_set = 1;
6668 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6669 sw_if_index_set = 1;
6670 else if (unformat (i, "enable"))
6672 else if (unformat (i, "disable"))
6674 else if (unformat (i, "ip4"))
6676 else if (unformat (i, "ip6"))
6682 if (sw_if_index_set == 0)
6684 errmsg ("missing interface name or sw_if_index");
6688 /* Construct the API message */
6689 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
6691 mp->sw_if_index = ntohl (sw_if_index);
6692 mp->enable = is_enable;
6693 mp->is_ipv6 = is_ipv6;
6698 /* Wait for a reply... */
6704 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6706 unformat_input_t *i = vam->input;
6707 vl_api_sw_interface_set_l2_xconnect_t *mp;
6709 u8 rx_sw_if_index_set = 0;
6711 u8 tx_sw_if_index_set = 0;
6715 /* Parse args required to build the message */
6716 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6718 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6719 rx_sw_if_index_set = 1;
6720 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6721 tx_sw_if_index_set = 1;
6722 else if (unformat (i, "rx"))
6724 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6726 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6728 rx_sw_if_index_set = 1;
6733 else if (unformat (i, "tx"))
6735 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6737 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6739 tx_sw_if_index_set = 1;
6744 else if (unformat (i, "enable"))
6746 else if (unformat (i, "disable"))
6752 if (rx_sw_if_index_set == 0)
6754 errmsg ("missing rx interface name or rx_sw_if_index");
6758 if (enable && (tx_sw_if_index_set == 0))
6760 errmsg ("missing tx interface name or tx_sw_if_index");
6764 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
6766 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6767 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6768 mp->enable = enable;
6776 api_sw_interface_set_l2_bridge (vat_main_t * vam)
6778 unformat_input_t *i = vam->input;
6779 vl_api_sw_interface_set_l2_bridge_t *mp;
6780 vl_api_l2_port_type_t port_type;
6782 u8 rx_sw_if_index_set = 0;
6789 port_type = L2_API_PORT_TYPE_NORMAL;
6791 /* Parse args required to build the message */
6792 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6794 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6795 rx_sw_if_index_set = 1;
6796 else if (unformat (i, "bd_id %d", &bd_id))
6800 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6801 rx_sw_if_index_set = 1;
6802 else if (unformat (i, "shg %d", &shg))
6804 else if (unformat (i, "bvi"))
6805 port_type = L2_API_PORT_TYPE_BVI;
6806 else if (unformat (i, "uu-fwd"))
6807 port_type = L2_API_PORT_TYPE_UU_FWD;
6808 else if (unformat (i, "enable"))
6810 else if (unformat (i, "disable"))
6816 if (rx_sw_if_index_set == 0)
6818 errmsg ("missing rx interface name or sw_if_index");
6822 if (enable && (bd_id_set == 0))
6824 errmsg ("missing bridge domain");
6828 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
6830 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6831 mp->bd_id = ntohl (bd_id);
6833 mp->port_type = ntohl (port_type);
6834 mp->enable = enable;
6842 api_bridge_domain_dump (vat_main_t * vam)
6844 unformat_input_t *i = vam->input;
6845 vl_api_bridge_domain_dump_t *mp;
6846 vl_api_control_ping_t *mp_ping;
6850 /* Parse args required to build the message */
6851 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6853 if (unformat (i, "bd_id %d", &bd_id))
6859 M (BRIDGE_DOMAIN_DUMP, mp);
6860 mp->bd_id = ntohl (bd_id);
6863 /* Use a control ping for synchronization */
6864 MPING (CONTROL_PING, mp_ping);
6872 api_bridge_domain_add_del (vat_main_t * vam)
6874 unformat_input_t *i = vam->input;
6875 vl_api_bridge_domain_add_del_t *mp;
6878 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
6883 /* Parse args required to build the message */
6884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6886 if (unformat (i, "bd_id %d", &bd_id))
6888 else if (unformat (i, "flood %d", &flood))
6890 else if (unformat (i, "uu-flood %d", &uu_flood))
6892 else if (unformat (i, "forward %d", &forward))
6894 else if (unformat (i, "learn %d", &learn))
6896 else if (unformat (i, "arp-term %d", &arp_term))
6898 else if (unformat (i, "mac-age %d", &mac_age))
6900 else if (unformat (i, "bd-tag %s", &bd_tag))
6902 else if (unformat (i, "del"))
6905 flood = uu_flood = forward = learn = 0;
6913 errmsg ("missing bridge domain");
6920 errmsg ("mac age must be less than 256 ");
6925 if ((bd_tag) && (vec_len (bd_tag) > 63))
6927 errmsg ("bd-tag cannot be longer than 63");
6932 M (BRIDGE_DOMAIN_ADD_DEL, mp);
6934 mp->bd_id = ntohl (bd_id);
6936 mp->uu_flood = uu_flood;
6937 mp->forward = forward;
6939 mp->arp_term = arp_term;
6940 mp->is_add = is_add;
6941 mp->mac_age = (u8) mac_age;
6944 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
6945 mp->bd_tag[vec_len (bd_tag)] = 0;
6956 api_l2fib_flush_bd (vat_main_t * vam)
6958 unformat_input_t *i = vam->input;
6959 vl_api_l2fib_flush_bd_t *mp;
6963 /* Parse args required to build the message */
6964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6966 if (unformat (i, "bd_id %d", &bd_id));
6973 errmsg ("missing bridge domain");
6977 M (L2FIB_FLUSH_BD, mp);
6979 mp->bd_id = htonl (bd_id);
6987 api_l2fib_flush_int (vat_main_t * vam)
6989 unformat_input_t *i = vam->input;
6990 vl_api_l2fib_flush_int_t *mp;
6991 u32 sw_if_index = ~0;
6994 /* Parse args required to build the message */
6995 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6997 if (unformat (i, "sw_if_index %d", &sw_if_index));
6999 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
7004 if (sw_if_index == ~0)
7006 errmsg ("missing interface name or sw_if_index");
7010 M (L2FIB_FLUSH_INT, mp);
7012 mp->sw_if_index = ntohl (sw_if_index);
7020 api_l2fib_add_del (vat_main_t * vam)
7022 unformat_input_t *i = vam->input;
7023 vl_api_l2fib_add_del_t *mp;
7029 u32 sw_if_index = 0;
7030 u8 sw_if_index_set = 0;
7039 /* Parse args required to build the message */
7040 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7042 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
7044 else if (unformat (i, "bd_id %d", &bd_id))
7046 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7047 sw_if_index_set = 1;
7048 else if (unformat (i, "sw_if"))
7050 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7053 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7054 sw_if_index_set = 1;
7059 else if (unformat (i, "static"))
7061 else if (unformat (i, "filter"))
7066 else if (unformat (i, "bvi"))
7071 else if (unformat (i, "del"))
7073 else if (unformat (i, "count %d", &count))
7081 errmsg ("missing mac address");
7087 errmsg ("missing bridge domain");
7091 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7093 errmsg ("missing interface name or sw_if_index");
7099 /* Turn on async mode */
7100 vam->async_mode = 1;
7101 vam->async_errors = 0;
7102 before = vat_time_now (vam);
7105 for (j = 0; j < count; j++)
7107 M (L2FIB_ADD_DEL, mp);
7109 clib_memcpy (mp->mac, mac, 6);
7110 mp->bd_id = ntohl (bd_id);
7111 mp->is_add = is_add;
7112 mp->sw_if_index = ntohl (sw_if_index);
7116 mp->static_mac = static_mac;
7117 mp->filter_mac = filter_mac;
7118 mp->bvi_mac = bvi_mac;
7120 increment_mac_address (mac);
7127 vl_api_control_ping_t *mp_ping;
7130 /* Shut off async mode */
7131 vam->async_mode = 0;
7133 MPING (CONTROL_PING, mp_ping);
7136 timeout = vat_time_now (vam) + 1.0;
7137 while (vat_time_now (vam) < timeout)
7138 if (vam->result_ready == 1)
7143 if (vam->retval == -99)
7146 if (vam->async_errors > 0)
7148 errmsg ("%d asynchronous errors", vam->async_errors);
7151 vam->async_errors = 0;
7152 after = vat_time_now (vam);
7154 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7155 count, after - before, count / (after - before));
7161 /* Wait for a reply... */
7165 /* Return the good/bad news */
7166 return (vam->retval);
7170 api_bridge_domain_set_mac_age (vat_main_t * vam)
7172 unformat_input_t *i = vam->input;
7173 vl_api_bridge_domain_set_mac_age_t *mp;
7178 /* Parse args required to build the message */
7179 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7181 if (unformat (i, "bd_id %d", &bd_id));
7182 else if (unformat (i, "mac-age %d", &mac_age));
7189 errmsg ("missing bridge domain");
7195 errmsg ("mac age must be less than 256 ");
7199 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7201 mp->bd_id = htonl (bd_id);
7202 mp->mac_age = (u8) mac_age;
7210 api_l2_flags (vat_main_t * vam)
7212 unformat_input_t *i = vam->input;
7213 vl_api_l2_flags_t *mp;
7216 u8 sw_if_index_set = 0;
7220 /* Parse args required to build the message */
7221 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7223 if (unformat (i, "sw_if_index %d", &sw_if_index))
7224 sw_if_index_set = 1;
7225 else if (unformat (i, "sw_if"))
7227 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7230 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7231 sw_if_index_set = 1;
7236 else if (unformat (i, "learn"))
7238 else if (unformat (i, "forward"))
7240 else if (unformat (i, "flood"))
7242 else if (unformat (i, "uu-flood"))
7243 flags |= L2_UU_FLOOD;
7244 else if (unformat (i, "arp-term"))
7245 flags |= L2_ARP_TERM;
7246 else if (unformat (i, "off"))
7248 else if (unformat (i, "disable"))
7254 if (sw_if_index_set == 0)
7256 errmsg ("missing interface name or sw_if_index");
7262 mp->sw_if_index = ntohl (sw_if_index);
7263 mp->feature_bitmap = ntohl (flags);
7264 mp->is_set = is_set;
7272 api_bridge_flags (vat_main_t * vam)
7274 unformat_input_t *i = vam->input;
7275 vl_api_bridge_flags_t *mp;
7279 bd_flags_t flags = 0;
7282 /* Parse args required to build the message */
7283 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7285 if (unformat (i, "bd_id %d", &bd_id))
7287 else if (unformat (i, "learn"))
7288 flags |= BRIDGE_API_FLAG_LEARN;
7289 else if (unformat (i, "forward"))
7290 flags |= BRIDGE_API_FLAG_FWD;
7291 else if (unformat (i, "flood"))
7292 flags |= BRIDGE_API_FLAG_FLOOD;
7293 else if (unformat (i, "uu-flood"))
7294 flags |= BRIDGE_API_FLAG_UU_FLOOD;
7295 else if (unformat (i, "arp-term"))
7296 flags |= BRIDGE_API_FLAG_ARP_TERM;
7297 else if (unformat (i, "off"))
7299 else if (unformat (i, "disable"))
7307 errmsg ("missing bridge domain");
7311 M (BRIDGE_FLAGS, mp);
7313 mp->bd_id = ntohl (bd_id);
7314 mp->flags = ntohl (flags);
7315 mp->is_set = is_set;
7323 api_bd_ip_mac_add_del (vat_main_t * vam)
7325 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
7326 vl_api_mac_address_t mac = { 0 };
7327 unformat_input_t *i = vam->input;
7328 vl_api_bd_ip_mac_add_del_t *mp;
7340 /* Parse args required to build the message */
7341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7343 if (unformat (i, "bd_id %d", &bd_id))
7347 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
7351 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
7355 else if (unformat (i, "del"))
7363 errmsg ("missing bridge domain");
7366 else if (ip_set == 0)
7368 errmsg ("missing IP address");
7371 else if (mac_set == 0)
7373 errmsg ("missing MAC address");
7377 M (BD_IP_MAC_ADD_DEL, mp);
7379 mp->bd_id = ntohl (bd_id);
7380 mp->is_add = is_add;
7382 clib_memcpy (&mp->ip, &ip, sizeof (ip));
7383 clib_memcpy (&mp->mac, &mac, sizeof (mac));
7391 api_bd_ip_mac_flush (vat_main_t * vam)
7393 unformat_input_t *i = vam->input;
7394 vl_api_bd_ip_mac_flush_t *mp;
7399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7401 if (unformat (i, "bd_id %d", &bd_id))
7411 errmsg ("missing bridge domain");
7415 M (BD_IP_MAC_FLUSH, mp);
7417 mp->bd_id = ntohl (bd_id);
7424 static void vl_api_bd_ip_mac_details_t_handler
7425 (vl_api_bd_ip_mac_details_t * mp)
7427 vat_main_t *vam = &vat_main;
7432 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7435 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7438 "\n%-5d %-7s %-20U %-30s",
7439 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7440 format_ethernet_address, mp->mac_address, ip);
7445 static void vl_api_bd_ip_mac_details_t_handler_json
7446 (vl_api_bd_ip_mac_details_t * mp)
7448 vat_main_t *vam = &vat_main;
7449 vat_json_node_t *node = NULL;
7451 if (VAT_JSON_ARRAY != vam->json_tree.type)
7453 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7454 vat_json_init_array (&vam->json_tree);
7456 node = vat_json_array_add (&vam->json_tree);
7458 vat_json_init_object (node);
7459 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7460 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
7461 vat_json_object_add_string_copy (node, "mac_address",
7462 format (0, "%U", format_ethernet_address,
7468 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7471 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7472 vat_json_object_add_string_copy (node, "ip_address", ip);
7477 api_bd_ip_mac_dump (vat_main_t * vam)
7479 unformat_input_t *i = vam->input;
7480 vl_api_bd_ip_mac_dump_t *mp;
7481 vl_api_control_ping_t *mp_ping;
7486 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7488 if (unformat (i, "bd_id %d", &bd_id))
7497 "\n%-5s %-7s %-20s %-30s",
7498 "bd_id", "is_ipv6", "mac_address", "ip_address");
7500 /* Dump Bridge Domain Ip to Mac entries */
7501 M (BD_IP_MAC_DUMP, mp);
7504 mp->bd_id = htonl (bd_id);
7510 /* Use a control ping for synchronization */
7511 MPING (CONTROL_PING, mp_ping);
7519 api_tap_connect (vat_main_t * vam)
7521 unformat_input_t *i = vam->input;
7522 vl_api_tap_connect_t *mp;
7528 ip4_address_t ip4_address;
7530 int ip4_address_set = 0;
7531 ip6_address_t ip6_address;
7533 int ip6_address_set = 0;
7536 clib_memset (mac_address, 0, sizeof (mac_address));
7538 /* Parse args required to build the message */
7539 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7541 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7545 else if (unformat (i, "random-mac"))
7547 else if (unformat (i, "tapname %s", &tap_name))
7549 else if (unformat (i, "tag %s", &tag))
7551 else if (unformat (i, "address %U/%d",
7552 unformat_ip4_address, &ip4_address, &ip4_mask_width))
7553 ip4_address_set = 1;
7554 else if (unformat (i, "address %U/%d",
7555 unformat_ip6_address, &ip6_address, &ip6_mask_width))
7556 ip6_address_set = 1;
7563 errmsg ("missing tap name");
7566 if (vec_len (tap_name) > 63)
7568 errmsg ("tap name too long");
7571 vec_add1 (tap_name, 0);
7573 if (vec_len (tag) > 63)
7575 errmsg ("tag too long");
7579 /* Construct the API message */
7580 M (TAP_CONNECT, mp);
7582 mp->use_random_mac = random_mac;
7583 clib_memcpy (mp->mac_address, mac_address, 6);
7584 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7586 clib_memcpy (mp->tag, tag, vec_len (tag));
7588 if (ip4_address_set)
7590 mp->ip4_address_set = 1;
7591 clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address));
7592 mp->ip4_mask_width = ip4_mask_width;
7594 if (ip6_address_set)
7596 mp->ip6_address_set = 1;
7597 clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address));
7598 mp->ip6_mask_width = ip6_mask_width;
7601 vec_free (tap_name);
7607 /* Wait for a reply... */
7613 api_tap_modify (vat_main_t * vam)
7615 unformat_input_t *i = vam->input;
7616 vl_api_tap_modify_t *mp;
7621 u32 sw_if_index = ~0;
7622 u8 sw_if_index_set = 0;
7625 clib_memset (mac_address, 0, sizeof (mac_address));
7627 /* Parse args required to build the message */
7628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7630 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7631 sw_if_index_set = 1;
7632 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7633 sw_if_index_set = 1;
7634 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7638 else if (unformat (i, "random-mac"))
7640 else if (unformat (i, "tapname %s", &tap_name))
7646 if (sw_if_index_set == 0)
7648 errmsg ("missing vpp interface name");
7653 errmsg ("missing tap name");
7656 if (vec_len (tap_name) > 63)
7658 errmsg ("tap name too long");
7660 vec_add1 (tap_name, 0);
7662 /* Construct the API message */
7665 mp->use_random_mac = random_mac;
7666 mp->sw_if_index = ntohl (sw_if_index);
7667 clib_memcpy (mp->mac_address, mac_address, 6);
7668 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7669 vec_free (tap_name);
7674 /* Wait for a reply... */
7680 api_tap_delete (vat_main_t * vam)
7682 unformat_input_t *i = vam->input;
7683 vl_api_tap_delete_t *mp;
7684 u32 sw_if_index = ~0;
7685 u8 sw_if_index_set = 0;
7688 /* Parse args required to build the message */
7689 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7691 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7692 sw_if_index_set = 1;
7693 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7694 sw_if_index_set = 1;
7699 if (sw_if_index_set == 0)
7701 errmsg ("missing vpp interface name");
7705 /* Construct the API message */
7708 mp->sw_if_index = ntohl (sw_if_index);
7713 /* Wait for a reply... */
7719 api_tap_create_v2 (vat_main_t * vam)
7721 unformat_input_t *i = vam->input;
7722 vl_api_tap_create_v2_t *mp;
7726 u8 *host_if_name = 0;
7728 u8 host_mac_addr[6];
7729 u8 host_mac_addr_set = 0;
7730 u8 *host_bridge = 0;
7731 ip4_address_t host_ip4_addr;
7732 ip4_address_t host_ip4_gw;
7733 u8 host_ip4_gw_set = 0;
7734 u32 host_ip4_prefix_len = 0;
7735 ip6_address_t host_ip6_addr;
7736 ip6_address_t host_ip6_gw;
7737 u8 host_ip6_gw_set = 0;
7738 u32 host_ip6_prefix_len = 0;
7740 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7742 clib_memset (mac_address, 0, sizeof (mac_address));
7744 /* Parse args required to build the message */
7745 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7747 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7751 else if (unformat (i, "id %u", &id))
7753 else if (unformat (i, "host-if-name %s", &host_if_name))
7755 else if (unformat (i, "host-ns %s", &host_ns))
7757 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
7759 host_mac_addr_set = 1;
7760 else if (unformat (i, "host-bridge %s", &host_bridge))
7762 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
7763 &host_ip4_addr, &host_ip4_prefix_len))
7765 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
7766 &host_ip6_addr, &host_ip6_prefix_len))
7768 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
7770 host_ip4_gw_set = 1;
7771 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
7773 host_ip6_gw_set = 1;
7774 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
7776 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
7782 if (vec_len (host_if_name) > 63)
7784 errmsg ("tap name too long. ");
7787 if (vec_len (host_ns) > 63)
7789 errmsg ("host name space too long. ");
7792 if (vec_len (host_bridge) > 63)
7794 errmsg ("host bridge name too long. ");
7797 if (host_ip4_prefix_len > 32)
7799 errmsg ("host ip4 prefix length not valid. ");
7802 if (host_ip6_prefix_len > 128)
7804 errmsg ("host ip6 prefix length not valid. ");
7807 if (!is_pow2 (rx_ring_sz))
7809 errmsg ("rx ring size must be power of 2. ");
7812 if (rx_ring_sz > 32768)
7814 errmsg ("rx ring size must be 32768 or lower. ");
7817 if (!is_pow2 (tx_ring_sz))
7819 errmsg ("tx ring size must be power of 2. ");
7822 if (tx_ring_sz > 32768)
7824 errmsg ("tx ring size must be 32768 or lower. ");
7828 /* Construct the API message */
7829 M (TAP_CREATE_V2, mp);
7831 mp->use_random_mac = random_mac;
7833 mp->id = ntohl (id);
7834 mp->host_namespace_set = host_ns != 0;
7835 mp->host_bridge_set = host_bridge != 0;
7836 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
7837 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
7838 mp->rx_ring_sz = ntohs (rx_ring_sz);
7839 mp->tx_ring_sz = ntohs (tx_ring_sz);
7841 if (random_mac == 0)
7842 clib_memcpy (mp->mac_address, mac_address, 6);
7843 if (host_mac_addr_set)
7844 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
7846 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
7848 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
7850 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
7851 if (host_ip4_prefix_len)
7852 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
7853 if (host_ip6_prefix_len)
7854 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
7855 if (host_ip4_gw_set)
7856 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
7857 if (host_ip6_gw_set)
7858 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
7861 vec_free (host_if_name);
7862 vec_free (host_bridge);
7867 /* Wait for a reply... */
7873 api_tap_delete_v2 (vat_main_t * vam)
7875 unformat_input_t *i = vam->input;
7876 vl_api_tap_delete_v2_t *mp;
7877 u32 sw_if_index = ~0;
7878 u8 sw_if_index_set = 0;
7881 /* Parse args required to build the message */
7882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7884 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7885 sw_if_index_set = 1;
7886 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7887 sw_if_index_set = 1;
7892 if (sw_if_index_set == 0)
7894 errmsg ("missing vpp interface name. ");
7898 /* Construct the API message */
7899 M (TAP_DELETE_V2, mp);
7901 mp->sw_if_index = ntohl (sw_if_index);
7906 /* Wait for a reply... */
7912 api_bond_create (vat_main_t * vam)
7914 unformat_input_t *i = vam->input;
7915 vl_api_bond_create_t *mp;
7923 clib_memset (mac_address, 0, sizeof (mac_address));
7926 /* Parse args required to build the message */
7927 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7929 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
7931 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
7932 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
7934 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
7941 if (mode_is_set == 0)
7943 errmsg ("Missing bond mode. ");
7947 /* Construct the API message */
7948 M (BOND_CREATE, mp);
7950 mp->use_custom_mac = custom_mac;
7956 clib_memcpy (mp->mac_address, mac_address, 6);
7961 /* Wait for a reply... */
7967 api_bond_delete (vat_main_t * vam)
7969 unformat_input_t *i = vam->input;
7970 vl_api_bond_delete_t *mp;
7971 u32 sw_if_index = ~0;
7972 u8 sw_if_index_set = 0;
7975 /* Parse args required to build the message */
7976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7978 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7979 sw_if_index_set = 1;
7980 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7981 sw_if_index_set = 1;
7986 if (sw_if_index_set == 0)
7988 errmsg ("missing vpp interface name. ");
7992 /* Construct the API message */
7993 M (BOND_DELETE, mp);
7995 mp->sw_if_index = ntohl (sw_if_index);
8000 /* Wait for a reply... */
8006 api_bond_enslave (vat_main_t * vam)
8008 unformat_input_t *i = vam->input;
8009 vl_api_bond_enslave_t *mp;
8010 u32 bond_sw_if_index;
8014 u32 bond_sw_if_index_is_set = 0;
8016 u8 sw_if_index_is_set = 0;
8018 /* Parse args required to build the message */
8019 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8021 if (unformat (i, "sw_if_index %d", &sw_if_index))
8022 sw_if_index_is_set = 1;
8023 else if (unformat (i, "bond %u", &bond_sw_if_index))
8024 bond_sw_if_index_is_set = 1;
8025 else if (unformat (i, "passive %d", &is_passive))
8027 else if (unformat (i, "long-timeout %d", &is_long_timeout))
8033 if (bond_sw_if_index_is_set == 0)
8035 errmsg ("Missing bond sw_if_index. ");
8038 if (sw_if_index_is_set == 0)
8040 errmsg ("Missing slave sw_if_index. ");
8044 /* Construct the API message */
8045 M (BOND_ENSLAVE, mp);
8047 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
8048 mp->sw_if_index = ntohl (sw_if_index);
8049 mp->is_long_timeout = is_long_timeout;
8050 mp->is_passive = is_passive;
8055 /* Wait for a reply... */
8061 api_bond_detach_slave (vat_main_t * vam)
8063 unformat_input_t *i = vam->input;
8064 vl_api_bond_detach_slave_t *mp;
8065 u32 sw_if_index = ~0;
8066 u8 sw_if_index_set = 0;
8069 /* Parse args required to build the message */
8070 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8072 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8073 sw_if_index_set = 1;
8074 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8075 sw_if_index_set = 1;
8080 if (sw_if_index_set == 0)
8082 errmsg ("missing vpp interface name. ");
8086 /* Construct the API message */
8087 M (BOND_DETACH_SLAVE, mp);
8089 mp->sw_if_index = ntohl (sw_if_index);
8094 /* Wait for a reply... */
8100 api_ip_table_add_del (vat_main_t * vam)
8102 unformat_input_t *i = vam->input;
8103 vl_api_ip_table_add_del_t *mp;
8109 /* Parse args required to build the message */
8110 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8112 if (unformat (i, "ipv6"))
8114 else if (unformat (i, "del"))
8116 else if (unformat (i, "add"))
8118 else if (unformat (i, "table %d", &table_id))
8122 clib_warning ("parse error '%U'", format_unformat_error, i);
8129 errmsg ("missing table-ID");
8133 /* Construct the API message */
8134 M (IP_TABLE_ADD_DEL, mp);
8136 mp->table_id = ntohl (table_id);
8137 mp->is_ipv6 = is_ipv6;
8138 mp->is_add = is_add;
8143 /* Wait for a reply... */
8150 api_ip_add_del_route (vat_main_t * vam)
8152 unformat_input_t *i = vam->input;
8153 vl_api_ip_add_del_route_t *mp;
8154 u32 sw_if_index = ~0, vrf_id = 0;
8156 u8 is_local = 0, is_drop = 0;
8157 u8 is_unreach = 0, is_prohibit = 0;
8159 u32 next_hop_weight = 1;
8160 u8 is_multipath = 0;
8162 u8 address_length_set = 0;
8163 u32 next_hop_table_id = 0;
8164 u32 resolve_attempts = 0;
8165 u32 dst_address_length = 0;
8166 u8 next_hop_set = 0;
8167 ip4_address_t v4_dst_address, v4_next_hop_address;
8168 ip6_address_t v6_dst_address, v6_next_hop_address;
8172 u32 random_add_del = 0;
8173 u32 *random_vector = 0;
8175 u32 random_seed = 0xdeaddabe;
8176 u32 classify_table_index = ~0;
8178 u8 resolve_host = 0, resolve_attached = 0;
8179 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8180 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8181 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8183 clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8184 clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
8185 /* Parse args required to build the message */
8186 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8188 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8190 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8192 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8197 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8202 else if (unformat (i, "/%d", &dst_address_length))
8204 address_length_set = 1;
8207 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8208 &v4_next_hop_address))
8212 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8213 &v6_next_hop_address))
8219 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8223 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8227 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8229 else if (unformat (i, "weight %d", &next_hop_weight))
8231 else if (unformat (i, "drop"))
8235 else if (unformat (i, "null-send-unreach"))
8239 else if (unformat (i, "null-send-prohibit"))
8243 else if (unformat (i, "local"))
8247 else if (unformat (i, "classify %d", &classify_table_index))
8251 else if (unformat (i, "del"))
8253 else if (unformat (i, "add"))
8255 else if (unformat (i, "resolve-via-host"))
8257 else if (unformat (i, "resolve-via-attached"))
8258 resolve_attached = 1;
8259 else if (unformat (i, "multipath"))
8261 else if (unformat (i, "vrf %d", &vrf_id))
8263 else if (unformat (i, "count %d", &count))
8265 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8267 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8269 else if (unformat (i, "out-label %d", &next_hop_out_label))
8271 vl_api_fib_mpls_label_t fib_label = {
8272 .label = ntohl (next_hop_out_label),
8276 vec_add1 (next_hop_out_label_stack, fib_label);
8278 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8280 else if (unformat (i, "random"))
8282 else if (unformat (i, "seed %d", &random_seed))
8286 clib_warning ("parse error '%U'", format_unformat_error, i);
8291 if (!next_hop_set && !is_drop && !is_local &&
8292 !is_classify && !is_unreach && !is_prohibit &&
8293 MPLS_LABEL_INVALID == next_hop_via_label)
8296 ("next hop / local / drop / unreach / prohibit / classify not set");
8300 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8302 errmsg ("next hop and next-hop via label set");
8305 if (address_set == 0)
8307 errmsg ("missing addresses");
8311 if (address_length_set == 0)
8313 errmsg ("missing address length");
8317 /* Generate a pile of unique, random routes */
8320 u32 this_random_address;
8321 random_hash = hash_create (count, sizeof (uword));
8323 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8324 for (j = 0; j <= count; j++)
8328 this_random_address = random_u32 (&random_seed);
8329 this_random_address =
8330 clib_host_to_net_u32 (this_random_address);
8332 while (hash_get (random_hash, this_random_address));
8333 vec_add1 (random_vector, this_random_address);
8334 hash_set (random_hash, this_random_address, 1);
8336 hash_free (random_hash);
8337 v4_dst_address.as_u32 = random_vector[0];
8342 /* Turn on async mode */
8343 vam->async_mode = 1;
8344 vam->async_errors = 0;
8345 before = vat_time_now (vam);
8348 for (j = 0; j < count; j++)
8350 /* Construct the API message */
8351 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8352 vec_len (next_hop_out_label_stack));
8354 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8355 mp->table_id = ntohl (vrf_id);
8357 mp->is_add = is_add;
8358 mp->is_drop = is_drop;
8359 mp->is_unreach = is_unreach;
8360 mp->is_prohibit = is_prohibit;
8361 mp->is_ipv6 = is_ipv6;
8362 mp->is_local = is_local;
8363 mp->is_classify = is_classify;
8364 mp->is_multipath = is_multipath;
8365 mp->is_resolve_host = resolve_host;
8366 mp->is_resolve_attached = resolve_attached;
8367 mp->next_hop_weight = next_hop_weight;
8368 mp->next_hop_preference = 0;
8369 mp->dst_address_length = dst_address_length;
8370 mp->next_hop_table_id = ntohl (next_hop_table_id);
8371 mp->classify_table_index = ntohl (classify_table_index);
8372 mp->next_hop_via_label = ntohl (next_hop_via_label);
8373 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8374 if (0 != mp->next_hop_n_out_labels)
8376 memcpy (mp->next_hop_out_label_stack,
8377 next_hop_out_label_stack,
8378 (vec_len (next_hop_out_label_stack) *
8379 sizeof (vl_api_fib_mpls_label_t)));
8380 vec_free (next_hop_out_label_stack);
8385 clib_memcpy (mp->dst_address, &v6_dst_address,
8386 sizeof (v6_dst_address));
8388 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8389 sizeof (v6_next_hop_address));
8390 increment_v6_address (&v6_dst_address);
8394 clib_memcpy (mp->dst_address, &v4_dst_address,
8395 sizeof (v4_dst_address));
8397 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8398 sizeof (v4_next_hop_address));
8400 v4_dst_address.as_u32 = random_vector[j + 1];
8402 increment_v4_address (&v4_dst_address);
8406 /* If we receive SIGTERM, stop now... */
8411 /* When testing multiple add/del ops, use a control-ping to sync */
8414 vl_api_control_ping_t *mp_ping;
8418 /* Shut off async mode */
8419 vam->async_mode = 0;
8421 MPING (CONTROL_PING, mp_ping);
8424 timeout = vat_time_now (vam) + 1.0;
8425 while (vat_time_now (vam) < timeout)
8426 if (vam->result_ready == 1)
8431 if (vam->retval == -99)
8434 if (vam->async_errors > 0)
8436 errmsg ("%d asynchronous errors", vam->async_errors);
8439 vam->async_errors = 0;
8440 after = vat_time_now (vam);
8442 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8446 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8447 count, after - before, count / (after - before));
8453 /* Wait for a reply... */
8458 /* Return the good/bad news */
8459 return (vam->retval);
8463 api_ip_mroute_add_del (vat_main_t * vam)
8465 unformat_input_t *i = vam->input;
8466 vl_api_ip_mroute_add_del_t *mp;
8467 u32 sw_if_index = ~0, vrf_id = 0;
8472 u32 grp_address_length = 0;
8473 ip4_address_t v4_grp_address, v4_src_address;
8474 ip6_address_t v6_grp_address, v6_src_address;
8475 mfib_itf_flags_t iflags = 0;
8476 mfib_entry_flags_t eflags = 0;
8479 /* Parse args required to build the message */
8480 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8482 if (unformat (i, "sw_if_index %d", &sw_if_index))
8484 else if (unformat (i, "%U %U",
8485 unformat_ip4_address, &v4_src_address,
8486 unformat_ip4_address, &v4_grp_address))
8488 grp_address_length = 64;
8492 else if (unformat (i, "%U %U",
8493 unformat_ip6_address, &v6_src_address,
8494 unformat_ip6_address, &v6_grp_address))
8496 grp_address_length = 256;
8500 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8502 clib_memset (&v4_src_address, 0, sizeof (v4_src_address));
8503 grp_address_length = 32;
8507 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8509 clib_memset (&v6_src_address, 0, sizeof (v6_src_address));
8510 grp_address_length = 128;
8514 else if (unformat (i, "/%d", &grp_address_length))
8516 else if (unformat (i, "local"))
8520 else if (unformat (i, "del"))
8522 else if (unformat (i, "add"))
8524 else if (unformat (i, "vrf %d", &vrf_id))
8526 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8528 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8532 clib_warning ("parse error '%U'", format_unformat_error, i);
8537 if (address_set == 0)
8539 errmsg ("missing addresses\n");
8543 /* Construct the API message */
8544 M (IP_MROUTE_ADD_DEL, mp);
8546 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8547 mp->table_id = ntohl (vrf_id);
8549 mp->is_add = is_add;
8550 mp->is_ipv6 = is_ipv6;
8551 mp->is_local = is_local;
8552 mp->itf_flags = ntohl (iflags);
8553 mp->entry_flags = ntohl (eflags);
8554 mp->grp_address_length = grp_address_length;
8555 mp->grp_address_length = ntohs (mp->grp_address_length);
8559 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8560 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8564 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8565 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8571 /* Wait for a reply... */
8577 api_mpls_table_add_del (vat_main_t * vam)
8579 unformat_input_t *i = vam->input;
8580 vl_api_mpls_table_add_del_t *mp;
8585 /* Parse args required to build the message */
8586 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8588 if (unformat (i, "table %d", &table_id))
8590 else if (unformat (i, "del"))
8592 else if (unformat (i, "add"))
8596 clib_warning ("parse error '%U'", format_unformat_error, i);
8603 errmsg ("missing table-ID");
8607 /* Construct the API message */
8608 M (MPLS_TABLE_ADD_DEL, mp);
8610 mp->mt_table_id = ntohl (table_id);
8611 mp->mt_is_add = is_add;
8616 /* Wait for a reply... */
8623 api_mpls_route_add_del (vat_main_t * vam)
8625 unformat_input_t *i = vam->input;
8626 vl_api_mpls_route_add_del_t *mp;
8627 u32 sw_if_index = ~0, table_id = 0;
8629 u32 next_hop_weight = 1;
8630 u8 is_multipath = 0;
8631 u32 next_hop_table_id = 0;
8632 u8 next_hop_set = 0;
8633 ip4_address_t v4_next_hop_address = {
8636 ip6_address_t v6_next_hop_address = { {0} };
8640 u32 classify_table_index = ~0;
8642 u8 resolve_host = 0, resolve_attached = 0;
8643 u8 is_interface_rx = 0;
8644 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8645 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8646 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8647 mpls_label_t local_label = MPLS_LABEL_INVALID;
8649 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
8651 /* Parse args required to build the message */
8652 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8654 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8656 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8658 else if (unformat (i, "%d", &local_label))
8660 else if (unformat (i, "eos"))
8662 else if (unformat (i, "non-eos"))
8664 else if (unformat (i, "via %U", unformat_ip4_address,
8665 &v4_next_hop_address))
8668 next_hop_proto = DPO_PROTO_IP4;
8670 else if (unformat (i, "via %U", unformat_ip6_address,
8671 &v6_next_hop_address))
8674 next_hop_proto = DPO_PROTO_IP6;
8676 else if (unformat (i, "weight %d", &next_hop_weight))
8678 else if (unformat (i, "classify %d", &classify_table_index))
8682 else if (unformat (i, "del"))
8684 else if (unformat (i, "add"))
8686 else if (unformat (i, "resolve-via-host"))
8688 else if (unformat (i, "resolve-via-attached"))
8689 resolve_attached = 1;
8690 else if (unformat (i, "multipath"))
8692 else if (unformat (i, "count %d", &count))
8694 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
8697 next_hop_proto = DPO_PROTO_IP4;
8699 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
8702 next_hop_proto = DPO_PROTO_IP6;
8706 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
8710 next_hop_proto = DPO_PROTO_ETHERNET;
8711 is_interface_rx = 1;
8713 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
8716 next_hop_proto = DPO_PROTO_ETHERNET;
8717 is_interface_rx = 1;
8719 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
8721 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8723 else if (unformat (i, "out-label %d", &next_hop_out_label))
8725 vl_api_fib_mpls_label_t fib_label = {
8726 .label = ntohl (next_hop_out_label),
8730 vec_add1 (next_hop_out_label_stack, fib_label);
8734 clib_warning ("parse error '%U'", format_unformat_error, i);
8739 if (!next_hop_set && !is_classify)
8741 errmsg ("next hop / classify not set");
8745 if (MPLS_LABEL_INVALID == local_label)
8747 errmsg ("missing label");
8753 /* Turn on async mode */
8754 vam->async_mode = 1;
8755 vam->async_errors = 0;
8756 before = vat_time_now (vam);
8759 for (j = 0; j < count; j++)
8761 /* Construct the API message */
8762 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
8763 vec_len (next_hop_out_label_stack));
8765 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
8766 mp->mr_table_id = ntohl (table_id);
8768 mp->mr_is_add = is_add;
8769 mp->mr_next_hop_proto = next_hop_proto;
8770 mp->mr_is_classify = is_classify;
8771 mp->mr_is_multipath = is_multipath;
8772 mp->mr_is_resolve_host = resolve_host;
8773 mp->mr_is_resolve_attached = resolve_attached;
8774 mp->mr_is_interface_rx = is_interface_rx;
8775 mp->mr_next_hop_weight = next_hop_weight;
8776 mp->mr_next_hop_preference = 0;
8777 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
8778 mp->mr_classify_table_index = ntohl (classify_table_index);
8779 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
8780 mp->mr_label = ntohl (local_label);
8781 mp->mr_eos = is_eos;
8783 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8784 if (0 != mp->mr_next_hop_n_out_labels)
8786 memcpy (mp->mr_next_hop_out_label_stack,
8787 next_hop_out_label_stack,
8788 vec_len (next_hop_out_label_stack) *
8789 sizeof (vl_api_fib_mpls_label_t));
8790 vec_free (next_hop_out_label_stack);
8795 if (DPO_PROTO_IP4 == next_hop_proto)
8797 clib_memcpy (mp->mr_next_hop,
8798 &v4_next_hop_address,
8799 sizeof (v4_next_hop_address));
8801 else if (DPO_PROTO_IP6 == next_hop_proto)
8804 clib_memcpy (mp->mr_next_hop,
8805 &v6_next_hop_address,
8806 sizeof (v6_next_hop_address));
8813 /* If we receive SIGTERM, stop now... */
8818 /* When testing multiple add/del ops, use a control-ping to sync */
8821 vl_api_control_ping_t *mp_ping;
8825 /* Shut off async mode */
8826 vam->async_mode = 0;
8828 MPING (CONTROL_PING, mp_ping);
8831 timeout = vat_time_now (vam) + 1.0;
8832 while (vat_time_now (vam) < timeout)
8833 if (vam->result_ready == 1)
8838 if (vam->retval == -99)
8841 if (vam->async_errors > 0)
8843 errmsg ("%d asynchronous errors", vam->async_errors);
8846 vam->async_errors = 0;
8847 after = vat_time_now (vam);
8849 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8853 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8854 count, after - before, count / (after - before));
8860 /* Wait for a reply... */
8865 /* Return the good/bad news */
8866 return (vam->retval);
8870 api_mpls_ip_bind_unbind (vat_main_t * vam)
8872 unformat_input_t *i = vam->input;
8873 vl_api_mpls_ip_bind_unbind_t *mp;
8874 u32 ip_table_id = 0;
8877 ip4_address_t v4_address;
8878 ip6_address_t v6_address;
8881 mpls_label_t local_label = MPLS_LABEL_INVALID;
8884 /* Parse args required to build the message */
8885 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8887 if (unformat (i, "%U/%d", unformat_ip4_address,
8888 &v4_address, &address_length))
8893 else if (unformat (i, "%U/%d", unformat_ip6_address,
8894 &v6_address, &address_length))
8899 else if (unformat (i, "%d", &local_label))
8901 else if (unformat (i, "table-id %d", &ip_table_id))
8903 else if (unformat (i, "unbind"))
8905 else if (unformat (i, "bind"))
8909 clib_warning ("parse error '%U'", format_unformat_error, i);
8916 errmsg ("IP address not set");
8920 if (MPLS_LABEL_INVALID == local_label)
8922 errmsg ("missing label");
8926 /* Construct the API message */
8927 M (MPLS_IP_BIND_UNBIND, mp);
8929 mp->mb_is_bind = is_bind;
8930 mp->mb_is_ip4 = is_ip4;
8931 mp->mb_ip_table_id = ntohl (ip_table_id);
8932 mp->mb_mpls_table_id = 0;
8933 mp->mb_label = ntohl (local_label);
8934 mp->mb_address_length = address_length;
8937 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
8939 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
8944 /* Wait for a reply... */
8950 api_sr_mpls_policy_add (vat_main_t * vam)
8952 unformat_input_t *i = vam->input;
8953 vl_api_sr_mpls_policy_add_t *mp;
8959 u32 *segments = NULL;
8962 /* Parse args required to build the message */
8963 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8965 if (unformat (i, "bsid %d", &bsid))
8967 else if (unformat (i, "weight %d", &weight))
8969 else if (unformat (i, "spray"))
8971 else if (unformat (i, "next %d", &sid))
8974 vec_add1 (segments, htonl (sid));
8978 clib_warning ("parse error '%U'", format_unformat_error, i);
8985 errmsg ("bsid not set");
8989 if (n_segments == 0)
8991 errmsg ("no sid in segment stack");
8995 /* Construct the API message */
8996 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
8998 mp->bsid = htonl (bsid);
8999 mp->weight = htonl (weight);
9001 mp->n_segments = n_segments;
9002 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
9003 vec_free (segments);
9008 /* Wait for a reply... */
9014 api_sr_mpls_policy_del (vat_main_t * vam)
9016 unformat_input_t *i = vam->input;
9017 vl_api_sr_mpls_policy_del_t *mp;
9021 /* Parse args required to build the message */
9022 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9024 if (unformat (i, "bsid %d", &bsid))
9028 clib_warning ("parse error '%U'", format_unformat_error, i);
9035 errmsg ("bsid not set");
9039 /* Construct the API message */
9040 M (SR_MPLS_POLICY_DEL, mp);
9042 mp->bsid = htonl (bsid);
9047 /* Wait for a reply... */
9053 api_bier_table_add_del (vat_main_t * vam)
9055 unformat_input_t *i = vam->input;
9056 vl_api_bier_table_add_del_t *mp;
9058 u32 set = 0, sub_domain = 0, hdr_len = 3;
9059 mpls_label_t local_label = MPLS_LABEL_INVALID;
9062 /* Parse args required to build the message */
9063 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9065 if (unformat (i, "sub-domain %d", &sub_domain))
9067 else if (unformat (i, "set %d", &set))
9069 else if (unformat (i, "label %d", &local_label))
9071 else if (unformat (i, "hdr-len %d", &hdr_len))
9073 else if (unformat (i, "add"))
9075 else if (unformat (i, "del"))
9079 clib_warning ("parse error '%U'", format_unformat_error, i);
9084 if (MPLS_LABEL_INVALID == local_label)
9086 errmsg ("missing label\n");
9090 /* Construct the API message */
9091 M (BIER_TABLE_ADD_DEL, mp);
9093 mp->bt_is_add = is_add;
9094 mp->bt_label = ntohl (local_label);
9095 mp->bt_tbl_id.bt_set = set;
9096 mp->bt_tbl_id.bt_sub_domain = sub_domain;
9097 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
9102 /* Wait for a reply... */
9109 api_bier_route_add_del (vat_main_t * vam)
9111 unformat_input_t *i = vam->input;
9112 vl_api_bier_route_add_del_t *mp;
9114 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
9115 ip4_address_t v4_next_hop_address;
9116 ip6_address_t v6_next_hop_address;
9117 u8 next_hop_set = 0;
9118 u8 next_hop_proto_is_ip4 = 1;
9119 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9122 /* Parse args required to build the message */
9123 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9125 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
9127 next_hop_proto_is_ip4 = 1;
9130 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
9132 next_hop_proto_is_ip4 = 0;
9135 if (unformat (i, "sub-domain %d", &sub_domain))
9137 else if (unformat (i, "set %d", &set))
9139 else if (unformat (i, "hdr-len %d", &hdr_len))
9141 else if (unformat (i, "bp %d", &bp))
9143 else if (unformat (i, "add"))
9145 else if (unformat (i, "del"))
9147 else if (unformat (i, "out-label %d", &next_hop_out_label))
9151 clib_warning ("parse error '%U'", format_unformat_error, i);
9156 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9158 errmsg ("next hop / label set\n");
9163 errmsg ("bit=position not set\n");
9167 /* Construct the API message */
9168 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
9170 mp->br_is_add = is_add;
9171 mp->br_tbl_id.bt_set = set;
9172 mp->br_tbl_id.bt_sub_domain = sub_domain;
9173 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9174 mp->br_bp = ntohs (bp);
9176 mp->br_paths[0].n_labels = 1;
9177 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
9178 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9180 if (next_hop_proto_is_ip4)
9182 clib_memcpy (mp->br_paths[0].next_hop,
9183 &v4_next_hop_address, sizeof (v4_next_hop_address));
9187 clib_memcpy (mp->br_paths[0].next_hop,
9188 &v6_next_hop_address, sizeof (v6_next_hop_address));
9194 /* Wait for a reply... */
9201 api_proxy_arp_add_del (vat_main_t * vam)
9203 unformat_input_t *i = vam->input;
9204 vl_api_proxy_arp_add_del_t *mp;
9207 ip4_address_t lo, hi;
9211 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9213 if (unformat (i, "vrf %d", &vrf_id))
9215 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
9216 unformat_ip4_address, &hi))
9218 else if (unformat (i, "del"))
9222 clib_warning ("parse error '%U'", format_unformat_error, i);
9229 errmsg ("address range not set");
9233 M (PROXY_ARP_ADD_DEL, mp);
9235 mp->proxy.vrf_id = ntohl (vrf_id);
9236 mp->is_add = is_add;
9237 clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address));
9238 clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address));
9246 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9248 unformat_input_t *i = vam->input;
9249 vl_api_proxy_arp_intfc_enable_disable_t *mp;
9252 u8 sw_if_index_set = 0;
9255 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9257 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9258 sw_if_index_set = 1;
9259 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9260 sw_if_index_set = 1;
9261 else if (unformat (i, "enable"))
9263 else if (unformat (i, "disable"))
9267 clib_warning ("parse error '%U'", format_unformat_error, i);
9272 if (sw_if_index_set == 0)
9274 errmsg ("missing interface name or sw_if_index");
9278 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
9280 mp->sw_if_index = ntohl (sw_if_index);
9281 mp->enable_disable = enable;
9289 api_mpls_tunnel_add_del (vat_main_t * vam)
9291 unformat_input_t *i = vam->input;
9292 vl_api_mpls_tunnel_add_del_t *mp;
9296 u32 sw_if_index = ~0;
9297 u32 next_hop_sw_if_index = ~0;
9298 u32 next_hop_proto_is_ip4 = 1;
9300 u32 next_hop_table_id = 0;
9301 ip4_address_t v4_next_hop_address = {
9304 ip6_address_t v6_next_hop_address = { {0} };
9305 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
9306 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
9307 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9310 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9312 if (unformat (i, "add"))
9316 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
9318 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9320 else if (unformat (i, "via %U",
9321 unformat_ip4_address, &v4_next_hop_address))
9323 next_hop_proto_is_ip4 = 1;
9325 else if (unformat (i, "via %U",
9326 unformat_ip6_address, &v6_next_hop_address))
9328 next_hop_proto_is_ip4 = 0;
9330 else if (unformat (i, "via-label %d", &next_hop_via_label))
9334 (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index))
9336 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9338 else if (unformat (i, "l2-only"))
9340 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9342 else if (unformat (i, "out-label %d", &next_hop_out_label))
9344 vl_api_fib_mpls_label_t fib_label = {
9345 .label = ntohl (next_hop_out_label),
9349 vec_add1 (next_hop_out_label_stack, fib_label);
9353 clib_warning ("parse error '%U'", format_unformat_error, i);
9358 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9359 vec_len (next_hop_out_label_stack));
9361 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9362 mp->mt_sw_if_index = ntohl (sw_if_index);
9363 mp->mt_is_add = is_add;
9364 mp->mt_l2_only = l2_only;
9365 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9366 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
9367 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
9368 mp->mt_next_hop_weight = 1;
9369 mp->mt_next_hop_preference = 0;
9371 mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
9373 if (0 != mp->mt_next_hop_n_out_labels)
9375 clib_memcpy (mp->mt_next_hop_out_label_stack,
9376 next_hop_out_label_stack,
9377 (vec_len (next_hop_out_label_stack) *
9378 sizeof (vl_api_fib_mpls_label_t)));
9379 vec_free (next_hop_out_label_stack);
9382 if (next_hop_proto_is_ip4)
9384 clib_memcpy (mp->mt_next_hop,
9385 &v4_next_hop_address, sizeof (v4_next_hop_address));
9389 clib_memcpy (mp->mt_next_hop,
9390 &v6_next_hop_address, sizeof (v6_next_hop_address));
9399 api_sw_interface_set_unnumbered (vat_main_t * vam)
9401 unformat_input_t *i = vam->input;
9402 vl_api_sw_interface_set_unnumbered_t *mp;
9404 u32 unnum_sw_index = ~0;
9406 u8 sw_if_index_set = 0;
9409 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9411 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9412 sw_if_index_set = 1;
9413 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9414 sw_if_index_set = 1;
9415 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9417 else if (unformat (i, "del"))
9421 clib_warning ("parse error '%U'", format_unformat_error, i);
9426 if (sw_if_index_set == 0)
9428 errmsg ("missing interface name or sw_if_index");
9432 M (SW_INTERFACE_SET_UNNUMBERED, mp);
9434 mp->sw_if_index = ntohl (sw_if_index);
9435 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9436 mp->is_add = is_add;
9444 api_ip_neighbor_add_del (vat_main_t * vam)
9446 unformat_input_t *i = vam->input;
9447 vl_api_ip_neighbor_add_del_t *mp;
9449 u8 sw_if_index_set = 0;
9452 u8 is_no_fib_entry = 0;
9455 u8 v4_address_set = 0;
9456 u8 v6_address_set = 0;
9457 ip4_address_t v4address;
9458 ip6_address_t v6address;
9461 clib_memset (mac_address, 0, sizeof (mac_address));
9463 /* Parse args required to build the message */
9464 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9466 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
9470 else if (unformat (i, "del"))
9473 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9474 sw_if_index_set = 1;
9475 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9476 sw_if_index_set = 1;
9477 else if (unformat (i, "is_static"))
9479 else if (unformat (i, "no-fib-entry"))
9480 is_no_fib_entry = 1;
9481 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
9483 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
9487 clib_warning ("parse error '%U'", format_unformat_error, i);
9492 if (sw_if_index_set == 0)
9494 errmsg ("missing interface name or sw_if_index");
9497 if (v4_address_set && v6_address_set)
9499 errmsg ("both v4 and v6 addresses set");
9502 if (!v4_address_set && !v6_address_set)
9504 errmsg ("no address set");
9508 /* Construct the API message */
9509 M (IP_NEIGHBOR_ADD_DEL, mp);
9511 mp->sw_if_index = ntohl (sw_if_index);
9512 mp->is_add = is_add;
9513 mp->is_static = is_static;
9514 mp->is_no_adj_fib = is_no_fib_entry;
9516 clib_memcpy (mp->mac_address, mac_address, 6);
9520 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
9524 /* mp->is_ipv6 = 0; via clib_memset in M macro above */
9525 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
9531 /* Wait for a reply, return good/bad news */
9537 api_create_vlan_subif (vat_main_t * vam)
9539 unformat_input_t *i = vam->input;
9540 vl_api_create_vlan_subif_t *mp;
9542 u8 sw_if_index_set = 0;
9547 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9549 if (unformat (i, "sw_if_index %d", &sw_if_index))
9550 sw_if_index_set = 1;
9552 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9553 sw_if_index_set = 1;
9554 else if (unformat (i, "vlan %d", &vlan_id))
9558 clib_warning ("parse error '%U'", format_unformat_error, i);
9563 if (sw_if_index_set == 0)
9565 errmsg ("missing interface name or sw_if_index");
9569 if (vlan_id_set == 0)
9571 errmsg ("missing vlan_id");
9574 M (CREATE_VLAN_SUBIF, mp);
9576 mp->sw_if_index = ntohl (sw_if_index);
9577 mp->vlan_id = ntohl (vlan_id);
9584 #define foreach_create_subif_bit \
9591 _(outer_vlan_id_any) \
9592 _(inner_vlan_id_any)
9595 api_create_subif (vat_main_t * vam)
9597 unformat_input_t *i = vam->input;
9598 vl_api_create_subif_t *mp;
9600 u8 sw_if_index_set = 0;
9607 u32 exact_match = 0;
9608 u32 default_sub = 0;
9609 u32 outer_vlan_id_any = 0;
9610 u32 inner_vlan_id_any = 0;
9612 u16 outer_vlan_id = 0;
9613 u16 inner_vlan_id = 0;
9616 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9618 if (unformat (i, "sw_if_index %d", &sw_if_index))
9619 sw_if_index_set = 1;
9621 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9622 sw_if_index_set = 1;
9623 else if (unformat (i, "sub_id %d", &sub_id))
9625 else if (unformat (i, "outer_vlan_id %d", &tmp))
9626 outer_vlan_id = tmp;
9627 else if (unformat (i, "inner_vlan_id %d", &tmp))
9628 inner_vlan_id = tmp;
9630 #define _(a) else if (unformat (i, #a)) a = 1 ;
9631 foreach_create_subif_bit
9635 clib_warning ("parse error '%U'", format_unformat_error, i);
9640 if (sw_if_index_set == 0)
9642 errmsg ("missing interface name or sw_if_index");
9646 if (sub_id_set == 0)
9648 errmsg ("missing sub_id");
9651 M (CREATE_SUBIF, mp);
9653 mp->sw_if_index = ntohl (sw_if_index);
9654 mp->sub_id = ntohl (sub_id);
9656 #define _(a) mp->a = a;
9657 foreach_create_subif_bit;
9660 mp->outer_vlan_id = ntohs (outer_vlan_id);
9661 mp->inner_vlan_id = ntohs (inner_vlan_id);
9669 api_oam_add_del (vat_main_t * vam)
9671 unformat_input_t *i = vam->input;
9672 vl_api_oam_add_del_t *mp;
9675 ip4_address_t src, dst;
9680 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9682 if (unformat (i, "vrf %d", &vrf_id))
9684 else if (unformat (i, "src %U", unformat_ip4_address, &src))
9686 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
9688 else if (unformat (i, "del"))
9692 clib_warning ("parse error '%U'", format_unformat_error, i);
9699 errmsg ("missing src addr");
9705 errmsg ("missing dst addr");
9709 M (OAM_ADD_DEL, mp);
9711 mp->vrf_id = ntohl (vrf_id);
9712 mp->is_add = is_add;
9713 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
9714 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
9722 api_reset_fib (vat_main_t * vam)
9724 unformat_input_t *i = vam->input;
9725 vl_api_reset_fib_t *mp;
9731 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9733 if (unformat (i, "vrf %d", &vrf_id))
9735 else if (unformat (i, "ipv6"))
9739 clib_warning ("parse error '%U'", format_unformat_error, i);
9744 if (vrf_id_set == 0)
9746 errmsg ("missing vrf id");
9752 mp->vrf_id = ntohl (vrf_id);
9753 mp->is_ipv6 = is_ipv6;
9761 api_dhcp_proxy_config (vat_main_t * vam)
9763 unformat_input_t *i = vam->input;
9764 vl_api_dhcp_proxy_config_t *mp;
9766 u32 server_vrf_id = 0;
9768 u8 v4_address_set = 0;
9769 u8 v6_address_set = 0;
9770 ip4_address_t v4address;
9771 ip6_address_t v6address;
9772 u8 v4_src_address_set = 0;
9773 u8 v6_src_address_set = 0;
9774 ip4_address_t v4srcaddress;
9775 ip6_address_t v6srcaddress;
9778 /* Parse args required to build the message */
9779 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9781 if (unformat (i, "del"))
9783 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
9785 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
9787 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
9789 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
9791 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
9792 v4_src_address_set = 1;
9793 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
9794 v6_src_address_set = 1;
9799 if (v4_address_set && v6_address_set)
9801 errmsg ("both v4 and v6 server addresses set");
9804 if (!v4_address_set && !v6_address_set)
9806 errmsg ("no server addresses set");
9810 if (v4_src_address_set && v6_src_address_set)
9812 errmsg ("both v4 and v6 src addresses set");
9815 if (!v4_src_address_set && !v6_src_address_set)
9817 errmsg ("no src addresses set");
9821 if (!(v4_src_address_set && v4_address_set) &&
9822 !(v6_src_address_set && v6_address_set))
9824 errmsg ("no matching server and src addresses set");
9828 /* Construct the API message */
9829 M (DHCP_PROXY_CONFIG, mp);
9831 mp->is_add = is_add;
9832 mp->rx_vrf_id = ntohl (rx_vrf_id);
9833 mp->server_vrf_id = ntohl (server_vrf_id);
9837 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
9838 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
9842 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
9843 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
9849 /* Wait for a reply, return good/bad news */
9854 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
9855 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
9858 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
9860 vat_main_t *vam = &vat_main;
9861 u32 i, count = mp->count;
9862 vl_api_dhcp_server_t *s;
9866 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9867 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9868 ntohl (mp->rx_vrf_id),
9869 format_ip6_address, mp->dhcp_src_address,
9870 mp->vss_type, mp->vss_vpn_ascii_id,
9871 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9874 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9875 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9876 ntohl (mp->rx_vrf_id),
9877 format_ip4_address, mp->dhcp_src_address,
9878 mp->vss_type, mp->vss_vpn_ascii_id,
9879 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9881 for (i = 0; i < count; i++)
9883 s = &mp->servers[i];
9887 " Server Table-ID %d, Server Address %U",
9888 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
9891 " Server Table-ID %d, Server Address %U",
9892 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
9896 static void vl_api_dhcp_proxy_details_t_handler_json
9897 (vl_api_dhcp_proxy_details_t * mp)
9899 vat_main_t *vam = &vat_main;
9900 vat_json_node_t *node = NULL;
9901 u32 i, count = mp->count;
9903 struct in6_addr ip6;
9904 vl_api_dhcp_server_t *s;
9906 if (VAT_JSON_ARRAY != vam->json_tree.type)
9908 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9909 vat_json_init_array (&vam->json_tree);
9911 node = vat_json_array_add (&vam->json_tree);
9913 vat_json_init_object (node);
9914 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
9915 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
9916 sizeof (mp->vss_type));
9917 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
9918 mp->vss_vpn_ascii_id);
9919 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
9920 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
9924 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
9925 vat_json_object_add_ip6 (node, "src_address", ip6);
9929 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
9930 vat_json_object_add_ip4 (node, "src_address", ip4);
9933 for (i = 0; i < count; i++)
9935 s = &mp->servers[i];
9937 vat_json_object_add_uint (node, "server-table-id",
9938 ntohl (s->server_vrf_id));
9942 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
9943 vat_json_object_add_ip4 (node, "src_address", ip4);
9947 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
9948 vat_json_object_add_ip6 (node, "server_address", ip6);
9954 api_dhcp_proxy_dump (vat_main_t * vam)
9956 unformat_input_t *i = vam->input;
9957 vl_api_control_ping_t *mp_ping;
9958 vl_api_dhcp_proxy_dump_t *mp;
9962 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9964 if (unformat (i, "ipv6"))
9968 clib_warning ("parse error '%U'", format_unformat_error, i);
9973 M (DHCP_PROXY_DUMP, mp);
9975 mp->is_ip6 = is_ipv6;
9978 /* Use a control ping for synchronization */
9979 MPING (CONTROL_PING, mp_ping);
9987 api_dhcp_proxy_set_vss (vat_main_t * vam)
9989 unformat_input_t *i = vam->input;
9990 vl_api_dhcp_proxy_set_vss_t *mp;
9994 u8 vss_type = VSS_TYPE_DEFAULT;
9995 u8 *vpn_ascii_id = 0;
10000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10002 if (unformat (i, "tbl_id %d", &tbl_id))
10004 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
10005 vss_type = VSS_TYPE_ASCII;
10006 else if (unformat (i, "fib_id %d", &fib_id))
10007 vss_type = VSS_TYPE_VPN_ID;
10008 else if (unformat (i, "oui %d", &oui))
10009 vss_type = VSS_TYPE_VPN_ID;
10010 else if (unformat (i, "ipv6"))
10012 else if (unformat (i, "del"))
10020 errmsg ("missing tbl_id ");
10021 vec_free (vpn_ascii_id);
10025 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
10027 errmsg ("vpn_ascii_id cannot be longer than 128 ");
10028 vec_free (vpn_ascii_id);
10032 M (DHCP_PROXY_SET_VSS, mp);
10033 mp->tbl_id = ntohl (tbl_id);
10034 mp->vss_type = vss_type;
10037 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
10038 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
10040 mp->vpn_index = ntohl (fib_id);
10041 mp->oui = ntohl (oui);
10042 mp->is_ipv6 = is_ipv6;
10043 mp->is_add = is_add;
10048 vec_free (vpn_ascii_id);
10053 api_dhcp_client_config (vat_main_t * vam)
10055 unformat_input_t *i = vam->input;
10056 vl_api_dhcp_client_config_t *mp;
10058 u8 sw_if_index_set = 0;
10061 u8 disable_event = 0;
10064 /* Parse args required to build the message */
10065 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10067 if (unformat (i, "del"))
10070 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10071 sw_if_index_set = 1;
10072 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10073 sw_if_index_set = 1;
10074 else if (unformat (i, "hostname %s", &hostname))
10076 else if (unformat (i, "disable_event"))
10082 if (sw_if_index_set == 0)
10084 errmsg ("missing interface name or sw_if_index");
10088 if (vec_len (hostname) > 63)
10090 errmsg ("hostname too long");
10092 vec_add1 (hostname, 0);
10094 /* Construct the API message */
10095 M (DHCP_CLIENT_CONFIG, mp);
10097 mp->is_add = is_add;
10098 mp->client.sw_if_index = htonl (sw_if_index);
10099 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
10100 vec_free (hostname);
10101 mp->client.want_dhcp_event = disable_event ? 0 : 1;
10102 mp->client.pid = htonl (getpid ());
10107 /* Wait for a reply, return good/bad news */
10113 api_set_ip_flow_hash (vat_main_t * vam)
10115 unformat_input_t *i = vam->input;
10116 vl_api_set_ip_flow_hash_t *mp;
10128 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10130 if (unformat (i, "vrf %d", &vrf_id))
10132 else if (unformat (i, "ipv6"))
10134 else if (unformat (i, "src"))
10136 else if (unformat (i, "dst"))
10138 else if (unformat (i, "sport"))
10140 else if (unformat (i, "dport"))
10142 else if (unformat (i, "proto"))
10144 else if (unformat (i, "reverse"))
10149 clib_warning ("parse error '%U'", format_unformat_error, i);
10154 if (vrf_id_set == 0)
10156 errmsg ("missing vrf id");
10160 M (SET_IP_FLOW_HASH, mp);
10166 mp->reverse = reverse;
10167 mp->vrf_id = ntohl (vrf_id);
10168 mp->is_ipv6 = is_ipv6;
10176 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
10178 unformat_input_t *i = vam->input;
10179 vl_api_sw_interface_ip6_enable_disable_t *mp;
10181 u8 sw_if_index_set = 0;
10185 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10187 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10188 sw_if_index_set = 1;
10189 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10190 sw_if_index_set = 1;
10191 else if (unformat (i, "enable"))
10193 else if (unformat (i, "disable"))
10197 clib_warning ("parse error '%U'", format_unformat_error, i);
10202 if (sw_if_index_set == 0)
10204 errmsg ("missing interface name or sw_if_index");
10208 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
10210 mp->sw_if_index = ntohl (sw_if_index);
10211 mp->enable = enable;
10219 api_ip6nd_proxy_add_del (vat_main_t * vam)
10221 unformat_input_t *i = vam->input;
10222 vl_api_ip6nd_proxy_add_del_t *mp;
10223 u32 sw_if_index = ~0;
10224 u8 v6_address_set = 0;
10225 ip6_address_t v6address;
10229 /* Parse args required to build the message */
10230 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10232 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10234 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10236 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
10237 v6_address_set = 1;
10238 if (unformat (i, "del"))
10242 clib_warning ("parse error '%U'", format_unformat_error, i);
10247 if (sw_if_index == ~0)
10249 errmsg ("missing interface name or sw_if_index");
10252 if (!v6_address_set)
10254 errmsg ("no address set");
10258 /* Construct the API message */
10259 M (IP6ND_PROXY_ADD_DEL, mp);
10261 mp->is_del = is_del;
10262 mp->sw_if_index = ntohl (sw_if_index);
10263 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10268 /* Wait for a reply, return good/bad news */
10274 api_ip6nd_proxy_dump (vat_main_t * vam)
10276 vl_api_ip6nd_proxy_dump_t *mp;
10277 vl_api_control_ping_t *mp_ping;
10280 M (IP6ND_PROXY_DUMP, mp);
10284 /* Use a control ping for synchronization */
10285 MPING (CONTROL_PING, mp_ping);
10292 static void vl_api_ip6nd_proxy_details_t_handler
10293 (vl_api_ip6nd_proxy_details_t * mp)
10295 vat_main_t *vam = &vat_main;
10297 print (vam->ofp, "host %U sw_if_index %d",
10298 format_ip6_address, mp->address, ntohl (mp->sw_if_index));
10301 static void vl_api_ip6nd_proxy_details_t_handler_json
10302 (vl_api_ip6nd_proxy_details_t * mp)
10304 vat_main_t *vam = &vat_main;
10305 struct in6_addr ip6;
10306 vat_json_node_t *node = NULL;
10308 if (VAT_JSON_ARRAY != vam->json_tree.type)
10310 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10311 vat_json_init_array (&vam->json_tree);
10313 node = vat_json_array_add (&vam->json_tree);
10315 vat_json_init_object (node);
10316 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10318 clib_memcpy (&ip6, mp->address, sizeof (ip6));
10319 vat_json_object_add_ip6 (node, "host", ip6);
10323 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10325 unformat_input_t *i = vam->input;
10326 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
10328 u8 sw_if_index_set = 0;
10329 u32 address_length = 0;
10330 u8 v6_address_set = 0;
10331 ip6_address_t v6address;
10332 u8 use_default = 0;
10333 u8 no_advertise = 0;
10335 u8 no_autoconfig = 0;
10338 u32 val_lifetime = 0;
10339 u32 pref_lifetime = 0;
10342 /* Parse args required to build the message */
10343 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10345 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10346 sw_if_index_set = 1;
10347 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10348 sw_if_index_set = 1;
10349 else if (unformat (i, "%U/%d",
10350 unformat_ip6_address, &v6address, &address_length))
10351 v6_address_set = 1;
10352 else if (unformat (i, "val_life %d", &val_lifetime))
10354 else if (unformat (i, "pref_life %d", &pref_lifetime))
10356 else if (unformat (i, "def"))
10358 else if (unformat (i, "noadv"))
10360 else if (unformat (i, "offl"))
10362 else if (unformat (i, "noauto"))
10364 else if (unformat (i, "nolink"))
10366 else if (unformat (i, "isno"))
10370 clib_warning ("parse error '%U'", format_unformat_error, i);
10375 if (sw_if_index_set == 0)
10377 errmsg ("missing interface name or sw_if_index");
10380 if (!v6_address_set)
10382 errmsg ("no address set");
10386 /* Construct the API message */
10387 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
10389 mp->sw_if_index = ntohl (sw_if_index);
10390 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10391 mp->address_length = address_length;
10392 mp->use_default = use_default;
10393 mp->no_advertise = no_advertise;
10394 mp->off_link = off_link;
10395 mp->no_autoconfig = no_autoconfig;
10396 mp->no_onlink = no_onlink;
10398 mp->val_lifetime = ntohl (val_lifetime);
10399 mp->pref_lifetime = ntohl (pref_lifetime);
10404 /* Wait for a reply, return good/bad news */
10410 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10412 unformat_input_t *i = vam->input;
10413 vl_api_sw_interface_ip6nd_ra_config_t *mp;
10415 u8 sw_if_index_set = 0;
10420 u8 send_unicast = 0;
10423 u8 default_router = 0;
10424 u32 max_interval = 0;
10425 u32 min_interval = 0;
10427 u32 initial_count = 0;
10428 u32 initial_interval = 0;
10432 /* Parse args required to build the message */
10433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10435 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10436 sw_if_index_set = 1;
10437 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10438 sw_if_index_set = 1;
10439 else if (unformat (i, "maxint %d", &max_interval))
10441 else if (unformat (i, "minint %d", &min_interval))
10443 else if (unformat (i, "life %d", &lifetime))
10445 else if (unformat (i, "count %d", &initial_count))
10447 else if (unformat (i, "interval %d", &initial_interval))
10449 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10451 else if (unformat (i, "managed"))
10453 else if (unformat (i, "other"))
10455 else if (unformat (i, "ll"))
10457 else if (unformat (i, "send"))
10459 else if (unformat (i, "cease"))
10461 else if (unformat (i, "isno"))
10463 else if (unformat (i, "def"))
10464 default_router = 1;
10467 clib_warning ("parse error '%U'", format_unformat_error, i);
10472 if (sw_if_index_set == 0)
10474 errmsg ("missing interface name or sw_if_index");
10478 /* Construct the API message */
10479 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
10481 mp->sw_if_index = ntohl (sw_if_index);
10482 mp->max_interval = ntohl (max_interval);
10483 mp->min_interval = ntohl (min_interval);
10484 mp->lifetime = ntohl (lifetime);
10485 mp->initial_count = ntohl (initial_count);
10486 mp->initial_interval = ntohl (initial_interval);
10487 mp->suppress = suppress;
10488 mp->managed = managed;
10490 mp->ll_option = ll_option;
10491 mp->send_unicast = send_unicast;
10494 mp->default_router = default_router;
10499 /* Wait for a reply, return good/bad news */
10505 api_set_arp_neighbor_limit (vat_main_t * vam)
10507 unformat_input_t *i = vam->input;
10508 vl_api_set_arp_neighbor_limit_t *mp;
10514 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10516 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10518 else if (unformat (i, "ipv6"))
10522 clib_warning ("parse error '%U'", format_unformat_error, i);
10527 if (limit_set == 0)
10529 errmsg ("missing limit value");
10533 M (SET_ARP_NEIGHBOR_LIMIT, mp);
10535 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10536 mp->is_ipv6 = is_ipv6;
10544 api_l2_patch_add_del (vat_main_t * vam)
10546 unformat_input_t *i = vam->input;
10547 vl_api_l2_patch_add_del_t *mp;
10548 u32 rx_sw_if_index;
10549 u8 rx_sw_if_index_set = 0;
10550 u32 tx_sw_if_index;
10551 u8 tx_sw_if_index_set = 0;
10555 /* Parse args required to build the message */
10556 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10558 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10559 rx_sw_if_index_set = 1;
10560 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10561 tx_sw_if_index_set = 1;
10562 else if (unformat (i, "rx"))
10564 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10566 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10568 rx_sw_if_index_set = 1;
10573 else if (unformat (i, "tx"))
10575 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10577 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10579 tx_sw_if_index_set = 1;
10584 else if (unformat (i, "del"))
10590 if (rx_sw_if_index_set == 0)
10592 errmsg ("missing rx interface name or rx_sw_if_index");
10596 if (tx_sw_if_index_set == 0)
10598 errmsg ("missing tx interface name or tx_sw_if_index");
10602 M (L2_PATCH_ADD_DEL, mp);
10604 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10605 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10606 mp->is_add = is_add;
10614 u8 localsid_addr[16];
10623 api_sr_localsid_add_del (vat_main_t * vam)
10625 unformat_input_t *i = vam->input;
10626 vl_api_sr_localsid_add_del_t *mp;
10629 ip6_address_t localsid;
10633 u32 fib_table = ~(u32) 0;
10634 ip6_address_t nh_addr6;
10635 ip4_address_t nh_addr4;
10636 clib_memset (&nh_addr6, 0, sizeof (ip6_address_t));
10637 clib_memset (&nh_addr4, 0, sizeof (ip4_address_t));
10639 bool nexthop_set = 0;
10643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10645 if (unformat (i, "del"))
10647 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
10648 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10650 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
10652 else if (unformat (i, "behavior %u", &behavior));
10653 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10654 else if (unformat (i, "fib-table %u", &fib_table));
10655 else if (unformat (i, "end.psp %u", &behavior));
10660 M (SR_LOCALSID_ADD_DEL, mp);
10662 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
10665 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
10666 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
10668 mp->behavior = behavior;
10669 mp->sw_if_index = ntohl (sw_if_index);
10670 mp->fib_table = ntohl (fib_table);
10671 mp->end_psp = end_psp;
10672 mp->is_del = is_del;
10680 api_ioam_enable (vat_main_t * vam)
10682 unformat_input_t *input = vam->input;
10683 vl_api_ioam_enable_t *mp;
10685 int has_trace_option = 0;
10686 int has_pot_option = 0;
10687 int has_seqno_option = 0;
10688 int has_analyse_option = 0;
10691 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10693 if (unformat (input, "trace"))
10694 has_trace_option = 1;
10695 else if (unformat (input, "pot"))
10696 has_pot_option = 1;
10697 else if (unformat (input, "seqno"))
10698 has_seqno_option = 1;
10699 else if (unformat (input, "analyse"))
10700 has_analyse_option = 1;
10704 M (IOAM_ENABLE, mp);
10705 mp->id = htons (id);
10706 mp->seqno = has_seqno_option;
10707 mp->analyse = has_analyse_option;
10708 mp->pot_enable = has_pot_option;
10709 mp->trace_enable = has_trace_option;
10718 api_ioam_disable (vat_main_t * vam)
10720 vl_api_ioam_disable_t *mp;
10723 M (IOAM_DISABLE, mp);
10729 #define foreach_tcp_proto_field \
10733 #define foreach_udp_proto_field \
10737 #define foreach_ip4_proto_field \
10749 u16 src_port, dst_port;
10752 #if VPP_API_TEST_BUILTIN == 0
10754 unformat_tcp_mask (unformat_input_t * input, va_list * args)
10756 u8 **maskp = va_arg (*args, u8 **);
10758 u8 found_something = 0;
10761 #define _(a) u8 a=0;
10762 foreach_tcp_proto_field;
10765 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10768 #define _(a) else if (unformat (input, #a)) a=1;
10769 foreach_tcp_proto_field
10775 #define _(a) found_something += a;
10776 foreach_tcp_proto_field;
10779 if (found_something == 0)
10782 vec_validate (mask, sizeof (*tcp) - 1);
10784 tcp = (tcp_header_t *) mask;
10786 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
10787 foreach_tcp_proto_field;
10795 unformat_udp_mask (unformat_input_t * input, va_list * args)
10797 u8 **maskp = va_arg (*args, u8 **);
10799 u8 found_something = 0;
10802 #define _(a) u8 a=0;
10803 foreach_udp_proto_field;
10806 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10809 #define _(a) else if (unformat (input, #a)) a=1;
10810 foreach_udp_proto_field
10816 #define _(a) found_something += a;
10817 foreach_udp_proto_field;
10820 if (found_something == 0)
10823 vec_validate (mask, sizeof (*udp) - 1);
10825 udp = (udp_header_t *) mask;
10827 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
10828 foreach_udp_proto_field;
10836 unformat_l4_mask (unformat_input_t * input, va_list * args)
10838 u8 **maskp = va_arg (*args, u8 **);
10839 u16 src_port = 0, dst_port = 0;
10840 tcpudp_header_t *tcpudp;
10842 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10844 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
10846 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
10848 else if (unformat (input, "src_port"))
10850 else if (unformat (input, "dst_port"))
10856 if (!src_port && !dst_port)
10860 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
10862 tcpudp = (tcpudp_header_t *) mask;
10863 tcpudp->src_port = src_port;
10864 tcpudp->dst_port = dst_port;
10872 unformat_ip4_mask (unformat_input_t * input, va_list * args)
10874 u8 **maskp = va_arg (*args, u8 **);
10876 u8 found_something = 0;
10879 #define _(a) u8 a=0;
10880 foreach_ip4_proto_field;
10886 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10888 if (unformat (input, "version"))
10890 else if (unformat (input, "hdr_length"))
10892 else if (unformat (input, "src"))
10894 else if (unformat (input, "dst"))
10896 else if (unformat (input, "proto"))
10899 #define _(a) else if (unformat (input, #a)) a=1;
10900 foreach_ip4_proto_field
10906 #define _(a) found_something += a;
10907 foreach_ip4_proto_field;
10910 if (found_something == 0)
10913 vec_validate (mask, sizeof (*ip) - 1);
10915 ip = (ip4_header_t *) mask;
10917 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10918 foreach_ip4_proto_field;
10921 ip->ip_version_and_header_length = 0;
10924 ip->ip_version_and_header_length |= 0xF0;
10927 ip->ip_version_and_header_length |= 0x0F;
10933 #define foreach_ip6_proto_field \
10936 _(payload_length) \
10941 unformat_ip6_mask (unformat_input_t * input, va_list * args)
10943 u8 **maskp = va_arg (*args, u8 **);
10945 u8 found_something = 0;
10947 u32 ip_version_traffic_class_and_flow_label;
10949 #define _(a) u8 a=0;
10950 foreach_ip6_proto_field;
10953 u8 traffic_class = 0;
10956 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10958 if (unformat (input, "version"))
10960 else if (unformat (input, "traffic-class"))
10962 else if (unformat (input, "flow-label"))
10964 else if (unformat (input, "src"))
10966 else if (unformat (input, "dst"))
10968 else if (unformat (input, "proto"))
10971 #define _(a) else if (unformat (input, #a)) a=1;
10972 foreach_ip6_proto_field
10978 #define _(a) found_something += a;
10979 foreach_ip6_proto_field;
10982 if (found_something == 0)
10985 vec_validate (mask, sizeof (*ip) - 1);
10987 ip = (ip6_header_t *) mask;
10989 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10990 foreach_ip6_proto_field;
10993 ip_version_traffic_class_and_flow_label = 0;
10996 ip_version_traffic_class_and_flow_label |= 0xF0000000;
10999 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
11002 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
11004 ip->ip_version_traffic_class_and_flow_label =
11005 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11012 unformat_l3_mask (unformat_input_t * input, va_list * args)
11014 u8 **maskp = va_arg (*args, u8 **);
11016 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11018 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
11020 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
11029 unformat_l2_mask (unformat_input_t * input, va_list * args)
11031 u8 **maskp = va_arg (*args, u8 **);
11038 u8 ignore_tag1 = 0;
11039 u8 ignore_tag2 = 0;
11046 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11048 if (unformat (input, "src"))
11050 else if (unformat (input, "dst"))
11052 else if (unformat (input, "proto"))
11054 else if (unformat (input, "tag1"))
11056 else if (unformat (input, "tag2"))
11058 else if (unformat (input, "ignore-tag1"))
11060 else if (unformat (input, "ignore-tag2"))
11062 else if (unformat (input, "cos1"))
11064 else if (unformat (input, "cos2"))
11066 else if (unformat (input, "dot1q"))
11068 else if (unformat (input, "dot1ad"))
11073 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
11074 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11077 if (tag1 || ignore_tag1 || cos1 || dot1q)
11079 if (tag2 || ignore_tag2 || cos2 || dot1ad)
11082 vec_validate (mask, len - 1);
11085 clib_memset (mask, 0xff, 6);
11088 clib_memset (mask + 6, 0xff, 6);
11090 if (tag2 || dot1ad)
11092 /* inner vlan tag */
11101 mask[21] = mask[20] = 0xff;
11122 mask[16] = mask[17] = 0xff;
11132 mask[12] = mask[13] = 0xff;
11139 unformat_classify_mask (unformat_input_t * input, va_list * args)
11141 u8 **maskp = va_arg (*args, u8 **);
11142 u32 *skipp = va_arg (*args, u32 *);
11143 u32 *matchp = va_arg (*args, u32 *);
11151 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11153 if (unformat (input, "hex %U", unformat_hex_string, &mask))
11155 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
11157 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
11159 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
11173 if (mask || l2 || l3 || l4)
11175 if (l2 || l3 || l4)
11177 /* "With a free Ethernet header in every package" */
11179 vec_validate (l2, 13);
11183 vec_append (mask, l3);
11188 vec_append (mask, l4);
11193 /* Scan forward looking for the first significant mask octet */
11194 for (i = 0; i < vec_len (mask); i++)
11198 /* compute (skip, match) params */
11199 *skipp = i / sizeof (u32x4);
11200 vec_delete (mask, *skipp * sizeof (u32x4), 0);
11202 /* Pad mask to an even multiple of the vector size */
11203 while (vec_len (mask) % sizeof (u32x4))
11204 vec_add1 (mask, 0);
11206 match = vec_len (mask) / sizeof (u32x4);
11208 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
11210 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11211 if (*tmp || *(tmp + 1))
11216 clib_warning ("BUG: match 0");
11218 _vec_len (mask) = match * sizeof (u32x4);
11228 #endif /* VPP_API_TEST_BUILTIN */
11230 #define foreach_l2_next \
11232 _(ethernet, ETHERNET_INPUT) \
11233 _(ip4, IP4_INPUT) \
11237 unformat_l2_next_index (unformat_input_t * input, va_list * args)
11239 u32 *miss_next_indexp = va_arg (*args, u32 *);
11240 u32 next_index = 0;
11244 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11248 if (unformat (input, "%d", &tmp))
11257 *miss_next_indexp = next_index;
11261 #define foreach_ip_next \
11264 _(rewrite, REWRITE)
11267 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
11269 u32 *miss_next_indexp = va_arg (*args, u32 *);
11270 u32 next_index = 0;
11274 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11278 if (unformat (input, "%d", &tmp))
11287 *miss_next_indexp = next_index;
11291 #define foreach_acl_next \
11295 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
11297 u32 *miss_next_indexp = va_arg (*args, u32 *);
11298 u32 next_index = 0;
11302 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11306 if (unformat (input, "permit"))
11311 else if (unformat (input, "%d", &tmp))
11320 *miss_next_indexp = next_index;
11325 unformat_policer_precolor (unformat_input_t * input, va_list * args)
11327 u32 *r = va_arg (*args, u32 *);
11329 if (unformat (input, "conform-color"))
11330 *r = POLICE_CONFORM;
11331 else if (unformat (input, "exceed-color"))
11332 *r = POLICE_EXCEED;
11340 api_classify_add_del_table (vat_main_t * vam)
11342 unformat_input_t *i = vam->input;
11343 vl_api_classify_add_del_table_t *mp;
11350 u32 table_index = ~0;
11351 u32 next_table_index = ~0;
11352 u32 miss_next_index = ~0;
11353 u32 memory_size = 32 << 20;
11355 u32 current_data_flag = 0;
11356 int current_data_offset = 0;
11359 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11361 if (unformat (i, "del"))
11363 else if (unformat (i, "del-chain"))
11368 else if (unformat (i, "buckets %d", &nbuckets))
11370 else if (unformat (i, "memory_size %d", &memory_size))
11372 else if (unformat (i, "skip %d", &skip))
11374 else if (unformat (i, "match %d", &match))
11376 else if (unformat (i, "table %d", &table_index))
11378 else if (unformat (i, "mask %U", unformat_classify_mask,
11379 &mask, &skip, &match))
11381 else if (unformat (i, "next-table %d", &next_table_index))
11383 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
11386 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11389 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
11392 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
11394 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
11400 if (is_add && mask == 0)
11402 errmsg ("Mask required");
11406 if (is_add && skip == ~0)
11408 errmsg ("skip count required");
11412 if (is_add && match == ~0)
11414 errmsg ("match count required");
11418 if (!is_add && table_index == ~0)
11420 errmsg ("table index required for delete");
11424 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
11426 mp->is_add = is_add;
11427 mp->del_chain = del_chain;
11428 mp->table_index = ntohl (table_index);
11429 mp->nbuckets = ntohl (nbuckets);
11430 mp->memory_size = ntohl (memory_size);
11431 mp->skip_n_vectors = ntohl (skip);
11432 mp->match_n_vectors = ntohl (match);
11433 mp->next_table_index = ntohl (next_table_index);
11434 mp->miss_next_index = ntohl (miss_next_index);
11435 mp->current_data_flag = ntohl (current_data_flag);
11436 mp->current_data_offset = ntohl (current_data_offset);
11437 mp->mask_len = ntohl (vec_len (mask));
11438 clib_memcpy (mp->mask, mask, vec_len (mask));
11447 #if VPP_API_TEST_BUILTIN == 0
11449 unformat_l4_match (unformat_input_t * input, va_list * args)
11451 u8 **matchp = va_arg (*args, u8 **);
11453 u8 *proto_header = 0;
11459 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11461 if (unformat (input, "src_port %d", &src_port))
11463 else if (unformat (input, "dst_port %d", &dst_port))
11469 h.src_port = clib_host_to_net_u16 (src_port);
11470 h.dst_port = clib_host_to_net_u16 (dst_port);
11471 vec_validate (proto_header, sizeof (h) - 1);
11472 memcpy (proto_header, &h, sizeof (h));
11474 *matchp = proto_header;
11480 unformat_ip4_match (unformat_input_t * input, va_list * args)
11482 u8 **matchp = va_arg (*args, u8 **);
11487 int hdr_length = 0;
11488 u32 hdr_length_val;
11489 int src = 0, dst = 0;
11490 ip4_address_t src_val, dst_val;
11497 int fragment_id = 0;
11498 u32 fragment_id_val;
11504 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11506 if (unformat (input, "version %d", &version_val))
11508 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11510 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11512 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11514 else if (unformat (input, "proto %d", &proto_val))
11516 else if (unformat (input, "tos %d", &tos_val))
11518 else if (unformat (input, "length %d", &length_val))
11520 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11522 else if (unformat (input, "ttl %d", &ttl_val))
11524 else if (unformat (input, "checksum %d", &checksum_val))
11530 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11531 + ttl + checksum == 0)
11535 * Aligned because we use the real comparison functions
11537 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11539 ip = (ip4_header_t *) match;
11541 /* These are realistically matched in practice */
11543 ip->src_address.as_u32 = src_val.as_u32;
11546 ip->dst_address.as_u32 = dst_val.as_u32;
11549 ip->protocol = proto_val;
11552 /* These are not, but they're included for completeness */
11554 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11557 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11563 ip->length = clib_host_to_net_u16 (length_val);
11569 ip->checksum = clib_host_to_net_u16 (checksum_val);
11576 unformat_ip6_match (unformat_input_t * input, va_list * args)
11578 u8 **matchp = va_arg (*args, u8 **);
11583 u8 traffic_class = 0;
11584 u32 traffic_class_val = 0;
11587 int src = 0, dst = 0;
11588 ip6_address_t src_val, dst_val;
11591 int payload_length = 0;
11592 u32 payload_length_val;
11595 u32 ip_version_traffic_class_and_flow_label;
11597 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11599 if (unformat (input, "version %d", &version_val))
11601 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11603 else if (unformat (input, "flow_label %d", &flow_label_val))
11605 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11607 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11609 else if (unformat (input, "proto %d", &proto_val))
11611 else if (unformat (input, "payload_length %d", &payload_length_val))
11612 payload_length = 1;
11613 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11619 if (version + traffic_class + flow_label + src + dst + proto +
11620 payload_length + hop_limit == 0)
11624 * Aligned because we use the real comparison functions
11626 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11628 ip = (ip6_header_t *) match;
11631 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11634 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11637 ip->protocol = proto_val;
11639 ip_version_traffic_class_and_flow_label = 0;
11642 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11645 ip_version_traffic_class_and_flow_label |=
11646 (traffic_class_val & 0xFF) << 20;
11649 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11651 ip->ip_version_traffic_class_and_flow_label =
11652 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11654 if (payload_length)
11655 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11658 ip->hop_limit = hop_limit_val;
11665 unformat_l3_match (unformat_input_t * input, va_list * args)
11667 u8 **matchp = va_arg (*args, u8 **);
11669 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11671 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
11673 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
11682 unformat_vlan_tag (unformat_input_t * input, va_list * args)
11684 u8 *tagp = va_arg (*args, u8 *);
11687 if (unformat (input, "%d", &tag))
11689 tagp[0] = (tag >> 8) & 0x0F;
11690 tagp[1] = tag & 0xFF;
11698 unformat_l2_match (unformat_input_t * input, va_list * args)
11700 u8 **matchp = va_arg (*args, u8 **);
11713 u8 ignore_tag1 = 0;
11714 u8 ignore_tag2 = 0;
11720 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11722 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
11725 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
11727 else if (unformat (input, "proto %U",
11728 unformat_ethernet_type_host_byte_order, &proto_val))
11730 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
11732 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
11734 else if (unformat (input, "ignore-tag1"))
11736 else if (unformat (input, "ignore-tag2"))
11738 else if (unformat (input, "cos1 %d", &cos1_val))
11740 else if (unformat (input, "cos2 %d", &cos2_val))
11745 if ((src + dst + proto + tag1 + tag2 +
11746 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11749 if (tag1 || ignore_tag1 || cos1)
11751 if (tag2 || ignore_tag2 || cos2)
11754 vec_validate_aligned (match, len - 1, sizeof (u32x4));
11757 clib_memcpy (match, dst_val, 6);
11760 clib_memcpy (match + 6, src_val, 6);
11764 /* inner vlan tag */
11765 match[19] = tag2_val[1];
11766 match[18] = tag2_val[0];
11768 match[18] |= (cos2_val & 0x7) << 5;
11771 match[21] = proto_val & 0xff;
11772 match[20] = proto_val >> 8;
11776 match[15] = tag1_val[1];
11777 match[14] = tag1_val[0];
11780 match[14] |= (cos1_val & 0x7) << 5;
11786 match[15] = tag1_val[1];
11787 match[14] = tag1_val[0];
11790 match[17] = proto_val & 0xff;
11791 match[16] = proto_val >> 8;
11794 match[14] |= (cos1_val & 0x7) << 5;
11800 match[18] |= (cos2_val & 0x7) << 5;
11802 match[14] |= (cos1_val & 0x7) << 5;
11805 match[13] = proto_val & 0xff;
11806 match[12] = proto_val >> 8;
11814 unformat_qos_source (unformat_input_t * input, va_list * args)
11816 int *qs = va_arg (*args, int *);
11818 if (unformat (input, "ip"))
11819 *qs = QOS_SOURCE_IP;
11820 else if (unformat (input, "mpls"))
11821 *qs = QOS_SOURCE_MPLS;
11822 else if (unformat (input, "ext"))
11823 *qs = QOS_SOURCE_EXT;
11824 else if (unformat (input, "vlan"))
11825 *qs = QOS_SOURCE_VLAN;
11834 api_unformat_classify_match (unformat_input_t * input, va_list * args)
11836 u8 **matchp = va_arg (*args, u8 **);
11837 u32 skip_n_vectors = va_arg (*args, u32);
11838 u32 match_n_vectors = va_arg (*args, u32);
11845 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11847 if (unformat (input, "hex %U", unformat_hex_string, &match))
11849 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
11851 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
11853 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
11867 if (match || l2 || l3 || l4)
11869 if (l2 || l3 || l4)
11871 /* "Win a free Ethernet header in every packet" */
11873 vec_validate_aligned (l2, 13, sizeof (u32x4));
11877 vec_append_aligned (match, l3, sizeof (u32x4));
11882 vec_append_aligned (match, l4, sizeof (u32x4));
11887 /* Make sure the vector is big enough even if key is all 0's */
11888 vec_validate_aligned
11889 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
11892 /* Set size, include skipped vectors */
11893 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
11904 api_classify_add_del_session (vat_main_t * vam)
11906 unformat_input_t *i = vam->input;
11907 vl_api_classify_add_del_session_t *mp;
11909 u32 table_index = ~0;
11910 u32 hit_next_index = ~0;
11911 u32 opaque_index = ~0;
11914 u32 skip_n_vectors = 0;
11915 u32 match_n_vectors = 0;
11921 * Warning: you have to supply skip_n and match_n
11922 * because the API client cant simply look at the classify
11926 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11928 if (unformat (i, "del"))
11930 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
11933 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
11936 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
11939 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
11941 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
11943 else if (unformat (i, "opaque-index %d", &opaque_index))
11945 else if (unformat (i, "skip_n %d", &skip_n_vectors))
11947 else if (unformat (i, "match_n %d", &match_n_vectors))
11949 else if (unformat (i, "match %U", api_unformat_classify_match,
11950 &match, skip_n_vectors, match_n_vectors))
11952 else if (unformat (i, "advance %d", &advance))
11954 else if (unformat (i, "table-index %d", &table_index))
11956 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
11958 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
11960 else if (unformat (i, "action %d", &action))
11962 else if (unformat (i, "metadata %d", &metadata))
11968 if (table_index == ~0)
11970 errmsg ("Table index required");
11974 if (is_add && match == 0)
11976 errmsg ("Match value required");
11980 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
11982 mp->is_add = is_add;
11983 mp->table_index = ntohl (table_index);
11984 mp->hit_next_index = ntohl (hit_next_index);
11985 mp->opaque_index = ntohl (opaque_index);
11986 mp->advance = ntohl (advance);
11987 mp->action = action;
11988 mp->metadata = ntohl (metadata);
11989 mp->match_len = ntohl (vec_len (match));
11990 clib_memcpy (mp->match, match, vec_len (match));
11999 api_classify_set_interface_ip_table (vat_main_t * vam)
12001 unformat_input_t *i = vam->input;
12002 vl_api_classify_set_interface_ip_table_t *mp;
12004 int sw_if_index_set;
12005 u32 table_index = ~0;
12009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12011 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12012 sw_if_index_set = 1;
12013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12014 sw_if_index_set = 1;
12015 else if (unformat (i, "table %d", &table_index))
12019 clib_warning ("parse error '%U'", format_unformat_error, i);
12024 if (sw_if_index_set == 0)
12026 errmsg ("missing interface name or sw_if_index");
12031 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
12033 mp->sw_if_index = ntohl (sw_if_index);
12034 mp->table_index = ntohl (table_index);
12035 mp->is_ipv6 = is_ipv6;
12043 api_classify_set_interface_l2_tables (vat_main_t * vam)
12045 unformat_input_t *i = vam->input;
12046 vl_api_classify_set_interface_l2_tables_t *mp;
12048 int sw_if_index_set;
12049 u32 ip4_table_index = ~0;
12050 u32 ip6_table_index = ~0;
12051 u32 other_table_index = ~0;
12055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12057 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12058 sw_if_index_set = 1;
12059 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12060 sw_if_index_set = 1;
12061 else if (unformat (i, "ip4-table %d", &ip4_table_index))
12063 else if (unformat (i, "ip6-table %d", &ip6_table_index))
12065 else if (unformat (i, "other-table %d", &other_table_index))
12067 else if (unformat (i, "is-input %d", &is_input))
12071 clib_warning ("parse error '%U'", format_unformat_error, i);
12076 if (sw_if_index_set == 0)
12078 errmsg ("missing interface name or sw_if_index");
12083 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
12085 mp->sw_if_index = ntohl (sw_if_index);
12086 mp->ip4_table_index = ntohl (ip4_table_index);
12087 mp->ip6_table_index = ntohl (ip6_table_index);
12088 mp->other_table_index = ntohl (other_table_index);
12089 mp->is_input = (u8) is_input;
12097 api_set_ipfix_exporter (vat_main_t * vam)
12099 unformat_input_t *i = vam->input;
12100 vl_api_set_ipfix_exporter_t *mp;
12101 ip4_address_t collector_address;
12102 u8 collector_address_set = 0;
12103 u32 collector_port = ~0;
12104 ip4_address_t src_address;
12105 u8 src_address_set = 0;
12108 u32 template_interval = ~0;
12109 u8 udp_checksum = 0;
12112 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12114 if (unformat (i, "collector_address %U", unformat_ip4_address,
12115 &collector_address))
12116 collector_address_set = 1;
12117 else if (unformat (i, "collector_port %d", &collector_port))
12119 else if (unformat (i, "src_address %U", unformat_ip4_address,
12121 src_address_set = 1;
12122 else if (unformat (i, "vrf_id %d", &vrf_id))
12124 else if (unformat (i, "path_mtu %d", &path_mtu))
12126 else if (unformat (i, "template_interval %d", &template_interval))
12128 else if (unformat (i, "udp_checksum"))
12134 if (collector_address_set == 0)
12136 errmsg ("collector_address required");
12140 if (src_address_set == 0)
12142 errmsg ("src_address required");
12146 M (SET_IPFIX_EXPORTER, mp);
12148 memcpy (mp->collector_address, collector_address.data,
12149 sizeof (collector_address.data));
12150 mp->collector_port = htons ((u16) collector_port);
12151 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
12152 mp->vrf_id = htonl (vrf_id);
12153 mp->path_mtu = htonl (path_mtu);
12154 mp->template_interval = htonl (template_interval);
12155 mp->udp_checksum = udp_checksum;
12163 api_set_ipfix_classify_stream (vat_main_t * vam)
12165 unformat_input_t *i = vam->input;
12166 vl_api_set_ipfix_classify_stream_t *mp;
12168 u32 src_port = UDP_DST_PORT_ipfix;
12171 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12173 if (unformat (i, "domain %d", &domain_id))
12175 else if (unformat (i, "src_port %d", &src_port))
12179 errmsg ("unknown input `%U'", format_unformat_error, i);
12184 M (SET_IPFIX_CLASSIFY_STREAM, mp);
12186 mp->domain_id = htonl (domain_id);
12187 mp->src_port = htons ((u16) src_port);
12195 api_ipfix_classify_table_add_del (vat_main_t * vam)
12197 unformat_input_t *i = vam->input;
12198 vl_api_ipfix_classify_table_add_del_t *mp;
12200 u32 classify_table_index = ~0;
12202 u8 transport_protocol = 255;
12205 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12207 if (unformat (i, "add"))
12209 else if (unformat (i, "del"))
12211 else if (unformat (i, "table %d", &classify_table_index))
12213 else if (unformat (i, "ip4"))
12215 else if (unformat (i, "ip6"))
12217 else if (unformat (i, "tcp"))
12218 transport_protocol = 6;
12219 else if (unformat (i, "udp"))
12220 transport_protocol = 17;
12223 errmsg ("unknown input `%U'", format_unformat_error, i);
12230 errmsg ("expecting: add|del");
12233 if (classify_table_index == ~0)
12235 errmsg ("classifier table not specified");
12238 if (ip_version == 0)
12240 errmsg ("IP version not specified");
12244 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
12246 mp->is_add = is_add;
12247 mp->table_id = htonl (classify_table_index);
12248 mp->ip_version = ip_version;
12249 mp->transport_protocol = transport_protocol;
12257 api_get_node_index (vat_main_t * vam)
12259 unformat_input_t *i = vam->input;
12260 vl_api_get_node_index_t *mp;
12264 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12266 if (unformat (i, "node %s", &name))
12273 errmsg ("node name required");
12276 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12278 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12282 M (GET_NODE_INDEX, mp);
12283 clib_memcpy (mp->node_name, name, vec_len (name));
12292 api_get_next_index (vat_main_t * vam)
12294 unformat_input_t *i = vam->input;
12295 vl_api_get_next_index_t *mp;
12296 u8 *node_name = 0, *next_node_name = 0;
12299 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12301 if (unformat (i, "node-name %s", &node_name))
12303 else if (unformat (i, "next-node-name %s", &next_node_name))
12307 if (node_name == 0)
12309 errmsg ("node name required");
12312 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12314 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12318 if (next_node_name == 0)
12320 errmsg ("next node name required");
12323 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12325 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12329 M (GET_NEXT_INDEX, mp);
12330 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12331 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12332 vec_free (node_name);
12333 vec_free (next_node_name);
12341 api_add_node_next (vat_main_t * vam)
12343 unformat_input_t *i = vam->input;
12344 vl_api_add_node_next_t *mp;
12349 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12351 if (unformat (i, "node %s", &name))
12353 else if (unformat (i, "next %s", &next))
12360 errmsg ("node name required");
12363 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12365 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12370 errmsg ("next node required");
12373 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12375 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12379 M (ADD_NODE_NEXT, mp);
12380 clib_memcpy (mp->node_name, name, vec_len (name));
12381 clib_memcpy (mp->next_name, next, vec_len (next));
12391 api_l2tpv3_create_tunnel (vat_main_t * vam)
12393 unformat_input_t *i = vam->input;
12394 ip6_address_t client_address, our_address;
12395 int client_address_set = 0;
12396 int our_address_set = 0;
12397 u32 local_session_id = 0;
12398 u32 remote_session_id = 0;
12399 u64 local_cookie = 0;
12400 u64 remote_cookie = 0;
12401 u8 l2_sublayer_present = 0;
12402 vl_api_l2tpv3_create_tunnel_t *mp;
12405 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12407 if (unformat (i, "client_address %U", unformat_ip6_address,
12409 client_address_set = 1;
12410 else if (unformat (i, "our_address %U", unformat_ip6_address,
12412 our_address_set = 1;
12413 else if (unformat (i, "local_session_id %d", &local_session_id))
12415 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12417 else if (unformat (i, "local_cookie %lld", &local_cookie))
12419 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12421 else if (unformat (i, "l2-sublayer-present"))
12422 l2_sublayer_present = 1;
12427 if (client_address_set == 0)
12429 errmsg ("client_address required");
12433 if (our_address_set == 0)
12435 errmsg ("our_address required");
12439 M (L2TPV3_CREATE_TUNNEL, mp);
12441 clib_memcpy (mp->client_address, client_address.as_u8,
12442 sizeof (mp->client_address));
12444 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12446 mp->local_session_id = ntohl (local_session_id);
12447 mp->remote_session_id = ntohl (remote_session_id);
12448 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12449 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12450 mp->l2_sublayer_present = l2_sublayer_present;
12459 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12461 unformat_input_t *i = vam->input;
12463 u8 sw_if_index_set = 0;
12464 u64 new_local_cookie = 0;
12465 u64 new_remote_cookie = 0;
12466 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
12469 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12471 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12472 sw_if_index_set = 1;
12473 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12474 sw_if_index_set = 1;
12475 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12477 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12483 if (sw_if_index_set == 0)
12485 errmsg ("missing interface name or sw_if_index");
12489 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
12491 mp->sw_if_index = ntohl (sw_if_index);
12492 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12493 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12501 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12503 unformat_input_t *i = vam->input;
12504 vl_api_l2tpv3_interface_enable_disable_t *mp;
12506 u8 sw_if_index_set = 0;
12507 u8 enable_disable = 1;
12510 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12512 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12513 sw_if_index_set = 1;
12514 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12515 sw_if_index_set = 1;
12516 else if (unformat (i, "enable"))
12517 enable_disable = 1;
12518 else if (unformat (i, "disable"))
12519 enable_disable = 0;
12524 if (sw_if_index_set == 0)
12526 errmsg ("missing interface name or sw_if_index");
12530 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
12532 mp->sw_if_index = ntohl (sw_if_index);
12533 mp->enable_disable = enable_disable;
12541 api_l2tpv3_set_lookup_key (vat_main_t * vam)
12543 unformat_input_t *i = vam->input;
12544 vl_api_l2tpv3_set_lookup_key_t *mp;
12548 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12550 if (unformat (i, "lookup_v6_src"))
12551 key = L2T_LOOKUP_SRC_ADDRESS;
12552 else if (unformat (i, "lookup_v6_dst"))
12553 key = L2T_LOOKUP_DST_ADDRESS;
12554 else if (unformat (i, "lookup_session_id"))
12555 key = L2T_LOOKUP_SESSION_ID;
12560 if (key == (u8) ~ 0)
12562 errmsg ("l2tp session lookup key unset");
12566 M (L2TPV3_SET_LOOKUP_KEY, mp);
12575 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12576 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12578 vat_main_t *vam = &vat_main;
12580 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12581 format_ip6_address, mp->our_address,
12582 format_ip6_address, mp->client_address,
12583 clib_net_to_host_u32 (mp->sw_if_index));
12586 " local cookies %016llx %016llx remote cookie %016llx",
12587 clib_net_to_host_u64 (mp->local_cookie[0]),
12588 clib_net_to_host_u64 (mp->local_cookie[1]),
12589 clib_net_to_host_u64 (mp->remote_cookie));
12591 print (vam->ofp, " local session-id %d remote session-id %d",
12592 clib_net_to_host_u32 (mp->local_session_id),
12593 clib_net_to_host_u32 (mp->remote_session_id));
12595 print (vam->ofp, " l2 specific sublayer %s\n",
12596 mp->l2_sublayer_present ? "preset" : "absent");
12600 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12601 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12603 vat_main_t *vam = &vat_main;
12604 vat_json_node_t *node = NULL;
12605 struct in6_addr addr;
12607 if (VAT_JSON_ARRAY != vam->json_tree.type)
12609 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12610 vat_json_init_array (&vam->json_tree);
12612 node = vat_json_array_add (&vam->json_tree);
12614 vat_json_init_object (node);
12616 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12617 vat_json_object_add_ip6 (node, "our_address", addr);
12618 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12619 vat_json_object_add_ip6 (node, "client_address", addr);
12621 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12622 vat_json_init_array (lc);
12623 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12624 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12625 vat_json_object_add_uint (node, "remote_cookie",
12626 clib_net_to_host_u64 (mp->remote_cookie));
12628 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12629 vat_json_object_add_uint (node, "local_session_id",
12630 clib_net_to_host_u32 (mp->local_session_id));
12631 vat_json_object_add_uint (node, "remote_session_id",
12632 clib_net_to_host_u32 (mp->remote_session_id));
12633 vat_json_object_add_string_copy (node, "l2_sublayer",
12634 mp->l2_sublayer_present ? (u8 *) "present"
12635 : (u8 *) "absent");
12639 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12641 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
12642 vl_api_control_ping_t *mp_ping;
12645 /* Get list of l2tpv3-tunnel interfaces */
12646 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
12649 /* Use a control ping for synchronization */
12650 MPING (CONTROL_PING, mp_ping);
12658 static void vl_api_sw_interface_tap_details_t_handler
12659 (vl_api_sw_interface_tap_details_t * mp)
12661 vat_main_t *vam = &vat_main;
12663 print (vam->ofp, "%-16s %d",
12664 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
12667 static void vl_api_sw_interface_tap_details_t_handler_json
12668 (vl_api_sw_interface_tap_details_t * mp)
12670 vat_main_t *vam = &vat_main;
12671 vat_json_node_t *node = NULL;
12673 if (VAT_JSON_ARRAY != vam->json_tree.type)
12675 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12676 vat_json_init_array (&vam->json_tree);
12678 node = vat_json_array_add (&vam->json_tree);
12680 vat_json_init_object (node);
12681 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12682 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12686 api_sw_interface_tap_dump (vat_main_t * vam)
12688 vl_api_sw_interface_tap_dump_t *mp;
12689 vl_api_control_ping_t *mp_ping;
12692 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
12693 /* Get list of tap interfaces */
12694 M (SW_INTERFACE_TAP_DUMP, mp);
12697 /* Use a control ping for synchronization */
12698 MPING (CONTROL_PING, mp_ping);
12705 static void vl_api_sw_interface_tap_v2_details_t_handler
12706 (vl_api_sw_interface_tap_v2_details_t * mp)
12708 vat_main_t *vam = &vat_main;
12710 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
12711 mp->host_ip4_prefix_len);
12712 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
12713 mp->host_ip6_prefix_len);
12716 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s",
12717 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
12718 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12719 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
12720 mp->host_bridge, ip4, ip6);
12726 static void vl_api_sw_interface_tap_v2_details_t_handler_json
12727 (vl_api_sw_interface_tap_v2_details_t * mp)
12729 vat_main_t *vam = &vat_main;
12730 vat_json_node_t *node = NULL;
12732 if (VAT_JSON_ARRAY != vam->json_tree.type)
12734 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12735 vat_json_init_array (&vam->json_tree);
12737 node = vat_json_array_add (&vam->json_tree);
12739 vat_json_init_object (node);
12740 vat_json_object_add_uint (node, "id", ntohl (mp->id));
12741 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12742 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12743 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12744 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12745 vat_json_object_add_string_copy (node, "host_mac_addr",
12746 format (0, "%U", format_ethernet_address,
12747 &mp->host_mac_addr));
12748 vat_json_object_add_string_copy (node, "host_namespace",
12749 mp->host_namespace);
12750 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
12751 vat_json_object_add_string_copy (node, "host_ip4_addr",
12752 format (0, "%U/%d", format_ip4_address,
12754 mp->host_ip4_prefix_len));
12755 vat_json_object_add_string_copy (node, "host_ip6_addr",
12756 format (0, "%U/%d", format_ip6_address,
12758 mp->host_ip6_prefix_len));
12763 api_sw_interface_tap_v2_dump (vat_main_t * vam)
12765 vl_api_sw_interface_tap_v2_dump_t *mp;
12766 vl_api_control_ping_t *mp_ping;
12770 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
12771 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
12772 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
12775 /* Get list of tap interfaces */
12776 M (SW_INTERFACE_TAP_V2_DUMP, mp);
12779 /* Use a control ping for synchronization */
12780 MPING (CONTROL_PING, mp_ping);
12788 api_vxlan_offload_rx (vat_main_t * vam)
12790 unformat_input_t *line_input = vam->input;
12791 vl_api_vxlan_offload_rx_t *mp;
12792 u32 hw_if_index = ~0, rx_if_index = ~0;
12796 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12798 if (unformat (line_input, "del"))
12800 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
12803 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
12805 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
12808 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
12812 errmsg ("parse error '%U'", format_unformat_error, line_input);
12817 if (hw_if_index == ~0)
12819 errmsg ("no hw interface");
12823 if (rx_if_index == ~0)
12825 errmsg ("no rx tunnel");
12829 M (VXLAN_OFFLOAD_RX, mp);
12831 mp->hw_if_index = ntohl (hw_if_index);
12832 mp->sw_if_index = ntohl (rx_if_index);
12833 mp->enable = is_add;
12840 static uword unformat_vxlan_decap_next
12841 (unformat_input_t * input, va_list * args)
12843 u32 *result = va_arg (*args, u32 *);
12846 if (unformat (input, "l2"))
12847 *result = VXLAN_INPUT_NEXT_L2_INPUT;
12848 else if (unformat (input, "%d", &tmp))
12856 api_vxlan_add_del_tunnel (vat_main_t * vam)
12858 unformat_input_t *line_input = vam->input;
12859 vl_api_vxlan_add_del_tunnel_t *mp;
12860 ip46_address_t src, dst;
12862 u8 ipv4_set = 0, ipv6_set = 0;
12867 u32 mcast_sw_if_index = ~0;
12868 u32 encap_vrf_id = 0;
12869 u32 decap_next_index = ~0;
12873 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12874 clib_memset (&src, 0, sizeof src);
12875 clib_memset (&dst, 0, sizeof dst);
12877 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12879 if (unformat (line_input, "del"))
12881 else if (unformat (line_input, "instance %d", &instance))
12884 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12890 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12896 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
12902 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
12907 else if (unformat (line_input, "group %U %U",
12908 unformat_ip4_address, &dst.ip4,
12909 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12911 grp_set = dst_set = 1;
12914 else if (unformat (line_input, "group %U",
12915 unformat_ip4_address, &dst.ip4))
12917 grp_set = dst_set = 1;
12920 else if (unformat (line_input, "group %U %U",
12921 unformat_ip6_address, &dst.ip6,
12922 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12924 grp_set = dst_set = 1;
12927 else if (unformat (line_input, "group %U",
12928 unformat_ip6_address, &dst.ip6))
12930 grp_set = dst_set = 1;
12934 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12936 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12938 else if (unformat (line_input, "decap-next %U",
12939 unformat_vxlan_decap_next, &decap_next_index))
12941 else if (unformat (line_input, "vni %d", &vni))
12945 errmsg ("parse error '%U'", format_unformat_error, line_input);
12952 errmsg ("tunnel src address not specified");
12957 errmsg ("tunnel dst address not specified");
12961 if (grp_set && !ip46_address_is_multicast (&dst))
12963 errmsg ("tunnel group address not multicast");
12966 if (grp_set && mcast_sw_if_index == ~0)
12968 errmsg ("tunnel nonexistent multicast device");
12971 if (grp_set == 0 && ip46_address_is_multicast (&dst))
12973 errmsg ("tunnel dst address must be unicast");
12978 if (ipv4_set && ipv6_set)
12980 errmsg ("both IPv4 and IPv6 addresses specified");
12984 if ((vni == 0) || (vni >> 24))
12986 errmsg ("vni not specified or out of range");
12990 M (VXLAN_ADD_DEL_TUNNEL, mp);
12994 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
12995 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
12999 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
13000 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
13003 mp->instance = htonl (instance);
13004 mp->encap_vrf_id = ntohl (encap_vrf_id);
13005 mp->decap_next_index = ntohl (decap_next_index);
13006 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13007 mp->vni = ntohl (vni);
13008 mp->is_add = is_add;
13009 mp->is_ipv6 = ipv6_set;
13016 static void vl_api_vxlan_tunnel_details_t_handler
13017 (vl_api_vxlan_tunnel_details_t * mp)
13019 vat_main_t *vam = &vat_main;
13020 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13021 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13023 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
13024 ntohl (mp->sw_if_index),
13025 ntohl (mp->instance),
13026 format_ip46_address, &src, IP46_TYPE_ANY,
13027 format_ip46_address, &dst, IP46_TYPE_ANY,
13028 ntohl (mp->encap_vrf_id),
13029 ntohl (mp->decap_next_index), ntohl (mp->vni),
13030 ntohl (mp->mcast_sw_if_index));
13033 static void vl_api_vxlan_tunnel_details_t_handler_json
13034 (vl_api_vxlan_tunnel_details_t * mp)
13036 vat_main_t *vam = &vat_main;
13037 vat_json_node_t *node = NULL;
13039 if (VAT_JSON_ARRAY != vam->json_tree.type)
13041 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13042 vat_json_init_array (&vam->json_tree);
13044 node = vat_json_array_add (&vam->json_tree);
13046 vat_json_init_object (node);
13047 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13049 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13053 struct in6_addr ip6;
13055 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13056 vat_json_object_add_ip6 (node, "src_address", ip6);
13057 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13058 vat_json_object_add_ip6 (node, "dst_address", ip6);
13062 struct in_addr ip4;
13064 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13065 vat_json_object_add_ip4 (node, "src_address", ip4);
13066 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13067 vat_json_object_add_ip4 (node, "dst_address", ip4);
13069 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13070 vat_json_object_add_uint (node, "decap_next_index",
13071 ntohl (mp->decap_next_index));
13072 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13073 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13074 vat_json_object_add_uint (node, "mcast_sw_if_index",
13075 ntohl (mp->mcast_sw_if_index));
13079 api_vxlan_tunnel_dump (vat_main_t * vam)
13081 unformat_input_t *i = vam->input;
13082 vl_api_vxlan_tunnel_dump_t *mp;
13083 vl_api_control_ping_t *mp_ping;
13085 u8 sw_if_index_set = 0;
13088 /* Parse args required to build the message */
13089 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13091 if (unformat (i, "sw_if_index %d", &sw_if_index))
13092 sw_if_index_set = 1;
13097 if (sw_if_index_set == 0)
13102 if (!vam->json_output)
13104 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
13105 "sw_if_index", "instance", "src_address", "dst_address",
13106 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13109 /* Get list of vxlan-tunnel interfaces */
13110 M (VXLAN_TUNNEL_DUMP, mp);
13112 mp->sw_if_index = htonl (sw_if_index);
13116 /* Use a control ping for synchronization */
13117 MPING (CONTROL_PING, mp_ping);
13124 static uword unformat_geneve_decap_next
13125 (unformat_input_t * input, va_list * args)
13127 u32 *result = va_arg (*args, u32 *);
13130 if (unformat (input, "l2"))
13131 *result = GENEVE_INPUT_NEXT_L2_INPUT;
13132 else if (unformat (input, "%d", &tmp))
13140 api_geneve_add_del_tunnel (vat_main_t * vam)
13142 unformat_input_t *line_input = vam->input;
13143 vl_api_geneve_add_del_tunnel_t *mp;
13144 ip46_address_t src, dst;
13146 u8 ipv4_set = 0, ipv6_set = 0;
13150 u32 mcast_sw_if_index = ~0;
13151 u32 encap_vrf_id = 0;
13152 u32 decap_next_index = ~0;
13156 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13157 clib_memset (&src, 0, sizeof src);
13158 clib_memset (&dst, 0, sizeof dst);
13160 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13162 if (unformat (line_input, "del"))
13165 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13171 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13177 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13183 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13188 else if (unformat (line_input, "group %U %U",
13189 unformat_ip4_address, &dst.ip4,
13190 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13192 grp_set = dst_set = 1;
13195 else if (unformat (line_input, "group %U",
13196 unformat_ip4_address, &dst.ip4))
13198 grp_set = dst_set = 1;
13201 else if (unformat (line_input, "group %U %U",
13202 unformat_ip6_address, &dst.ip6,
13203 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13205 grp_set = dst_set = 1;
13208 else if (unformat (line_input, "group %U",
13209 unformat_ip6_address, &dst.ip6))
13211 grp_set = dst_set = 1;
13215 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13217 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13219 else if (unformat (line_input, "decap-next %U",
13220 unformat_geneve_decap_next, &decap_next_index))
13222 else if (unformat (line_input, "vni %d", &vni))
13226 errmsg ("parse error '%U'", format_unformat_error, line_input);
13233 errmsg ("tunnel src address not specified");
13238 errmsg ("tunnel dst address not specified");
13242 if (grp_set && !ip46_address_is_multicast (&dst))
13244 errmsg ("tunnel group address not multicast");
13247 if (grp_set && mcast_sw_if_index == ~0)
13249 errmsg ("tunnel nonexistent multicast device");
13252 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13254 errmsg ("tunnel dst address must be unicast");
13259 if (ipv4_set && ipv6_set)
13261 errmsg ("both IPv4 and IPv6 addresses specified");
13265 if ((vni == 0) || (vni >> 24))
13267 errmsg ("vni not specified or out of range");
13271 M (GENEVE_ADD_DEL_TUNNEL, mp);
13275 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13276 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13280 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13281 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13283 mp->encap_vrf_id = ntohl (encap_vrf_id);
13284 mp->decap_next_index = ntohl (decap_next_index);
13285 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13286 mp->vni = ntohl (vni);
13287 mp->is_add = is_add;
13288 mp->is_ipv6 = ipv6_set;
13295 static void vl_api_geneve_tunnel_details_t_handler
13296 (vl_api_geneve_tunnel_details_t * mp)
13298 vat_main_t *vam = &vat_main;
13299 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13300 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13302 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13303 ntohl (mp->sw_if_index),
13304 format_ip46_address, &src, IP46_TYPE_ANY,
13305 format_ip46_address, &dst, IP46_TYPE_ANY,
13306 ntohl (mp->encap_vrf_id),
13307 ntohl (mp->decap_next_index), ntohl (mp->vni),
13308 ntohl (mp->mcast_sw_if_index));
13311 static void vl_api_geneve_tunnel_details_t_handler_json
13312 (vl_api_geneve_tunnel_details_t * mp)
13314 vat_main_t *vam = &vat_main;
13315 vat_json_node_t *node = NULL;
13317 if (VAT_JSON_ARRAY != vam->json_tree.type)
13319 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13320 vat_json_init_array (&vam->json_tree);
13322 node = vat_json_array_add (&vam->json_tree);
13324 vat_json_init_object (node);
13325 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13328 struct in6_addr ip6;
13330 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13331 vat_json_object_add_ip6 (node, "src_address", ip6);
13332 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13333 vat_json_object_add_ip6 (node, "dst_address", ip6);
13337 struct in_addr ip4;
13339 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13340 vat_json_object_add_ip4 (node, "src_address", ip4);
13341 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13342 vat_json_object_add_ip4 (node, "dst_address", ip4);
13344 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13345 vat_json_object_add_uint (node, "decap_next_index",
13346 ntohl (mp->decap_next_index));
13347 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13348 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13349 vat_json_object_add_uint (node, "mcast_sw_if_index",
13350 ntohl (mp->mcast_sw_if_index));
13354 api_geneve_tunnel_dump (vat_main_t * vam)
13356 unformat_input_t *i = vam->input;
13357 vl_api_geneve_tunnel_dump_t *mp;
13358 vl_api_control_ping_t *mp_ping;
13360 u8 sw_if_index_set = 0;
13363 /* Parse args required to build the message */
13364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13366 if (unformat (i, "sw_if_index %d", &sw_if_index))
13367 sw_if_index_set = 1;
13372 if (sw_if_index_set == 0)
13377 if (!vam->json_output)
13379 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13380 "sw_if_index", "local_address", "remote_address",
13381 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13384 /* Get list of geneve-tunnel interfaces */
13385 M (GENEVE_TUNNEL_DUMP, mp);
13387 mp->sw_if_index = htonl (sw_if_index);
13391 /* Use a control ping for synchronization */
13392 M (CONTROL_PING, mp_ping);
13400 api_gre_add_del_tunnel (vat_main_t * vam)
13402 unformat_input_t *line_input = vam->input;
13403 vl_api_gre_add_del_tunnel_t *mp;
13404 ip4_address_t src4, dst4;
13405 ip6_address_t src6, dst6;
13409 u8 t_type = GRE_TUNNEL_TYPE_L3;
13412 u32 outer_fib_id = 0;
13413 u32 session_id = 0;
13417 clib_memset (&src4, 0, sizeof src4);
13418 clib_memset (&dst4, 0, sizeof dst4);
13419 clib_memset (&src6, 0, sizeof src6);
13420 clib_memset (&dst6, 0, sizeof dst6);
13422 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13424 if (unformat (line_input, "del"))
13426 else if (unformat (line_input, "instance %d", &instance))
13428 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
13433 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
13438 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
13443 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
13448 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13450 else if (unformat (line_input, "teb"))
13451 t_type = GRE_TUNNEL_TYPE_TEB;
13452 else if (unformat (line_input, "erspan %d", &session_id))
13453 t_type = GRE_TUNNEL_TYPE_ERSPAN;
13456 errmsg ("parse error '%U'", format_unformat_error, line_input);
13463 errmsg ("tunnel src address not specified");
13468 errmsg ("tunnel dst address not specified");
13471 if (ipv4_set && ipv6_set)
13473 errmsg ("both IPv4 and IPv6 addresses specified");
13478 M (GRE_ADD_DEL_TUNNEL, mp);
13482 clib_memcpy (&mp->src_address, &src4, 4);
13483 clib_memcpy (&mp->dst_address, &dst4, 4);
13487 clib_memcpy (&mp->src_address, &src6, 16);
13488 clib_memcpy (&mp->dst_address, &dst6, 16);
13490 mp->instance = htonl (instance);
13491 mp->outer_fib_id = htonl (outer_fib_id);
13492 mp->is_add = is_add;
13493 mp->session_id = htons ((u16) session_id);
13494 mp->tunnel_type = t_type;
13495 mp->is_ipv6 = ipv6_set;
13502 static void vl_api_gre_tunnel_details_t_handler
13503 (vl_api_gre_tunnel_details_t * mp)
13505 vat_main_t *vam = &vat_main;
13506 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
13507 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
13509 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
13510 ntohl (mp->sw_if_index),
13511 ntohl (mp->instance),
13512 format_ip46_address, &src, IP46_TYPE_ANY,
13513 format_ip46_address, &dst, IP46_TYPE_ANY,
13514 mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id));
13517 static void vl_api_gre_tunnel_details_t_handler_json
13518 (vl_api_gre_tunnel_details_t * mp)
13520 vat_main_t *vam = &vat_main;
13521 vat_json_node_t *node = NULL;
13522 struct in_addr ip4;
13523 struct in6_addr ip6;
13525 if (VAT_JSON_ARRAY != vam->json_tree.type)
13527 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13528 vat_json_init_array (&vam->json_tree);
13530 node = vat_json_array_add (&vam->json_tree);
13532 vat_json_init_object (node);
13533 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13534 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13537 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
13538 vat_json_object_add_ip4 (node, "src_address", ip4);
13539 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
13540 vat_json_object_add_ip4 (node, "dst_address", ip4);
13544 clib_memcpy (&ip6, &mp->src_address, sizeof (ip6));
13545 vat_json_object_add_ip6 (node, "src_address", ip6);
13546 clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
13547 vat_json_object_add_ip6 (node, "dst_address", ip6);
13549 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type);
13550 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
13551 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
13552 vat_json_object_add_uint (node, "session_id", mp->session_id);
13556 api_gre_tunnel_dump (vat_main_t * vam)
13558 unformat_input_t *i = vam->input;
13559 vl_api_gre_tunnel_dump_t *mp;
13560 vl_api_control_ping_t *mp_ping;
13562 u8 sw_if_index_set = 0;
13565 /* Parse args required to build the message */
13566 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13568 if (unformat (i, "sw_if_index %d", &sw_if_index))
13569 sw_if_index_set = 1;
13574 if (sw_if_index_set == 0)
13579 if (!vam->json_output)
13581 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13582 "sw_if_index", "instance", "src_address", "dst_address",
13583 "tunnel_type", "outer_fib_id", "session_id");
13586 /* Get list of gre-tunnel interfaces */
13587 M (GRE_TUNNEL_DUMP, mp);
13589 mp->sw_if_index = htonl (sw_if_index);
13593 /* Use a control ping for synchronization */
13594 MPING (CONTROL_PING, mp_ping);
13602 api_l2_fib_clear_table (vat_main_t * vam)
13604 // unformat_input_t * i = vam->input;
13605 vl_api_l2_fib_clear_table_t *mp;
13608 M (L2_FIB_CLEAR_TABLE, mp);
13616 api_l2_interface_efp_filter (vat_main_t * vam)
13618 unformat_input_t *i = vam->input;
13619 vl_api_l2_interface_efp_filter_t *mp;
13622 u8 sw_if_index_set = 0;
13625 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13627 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13628 sw_if_index_set = 1;
13629 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13630 sw_if_index_set = 1;
13631 else if (unformat (i, "enable"))
13633 else if (unformat (i, "disable"))
13637 clib_warning ("parse error '%U'", format_unformat_error, i);
13642 if (sw_if_index_set == 0)
13644 errmsg ("missing sw_if_index");
13648 M (L2_INTERFACE_EFP_FILTER, mp);
13650 mp->sw_if_index = ntohl (sw_if_index);
13651 mp->enable_disable = enable;
13658 #define foreach_vtr_op \
13659 _("disable", L2_VTR_DISABLED) \
13660 _("push-1", L2_VTR_PUSH_1) \
13661 _("push-2", L2_VTR_PUSH_2) \
13662 _("pop-1", L2_VTR_POP_1) \
13663 _("pop-2", L2_VTR_POP_2) \
13664 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
13665 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
13666 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
13667 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
13670 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
13672 unformat_input_t *i = vam->input;
13673 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
13675 u8 sw_if_index_set = 0;
13678 u32 push_dot1q = 1;
13683 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13685 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13686 sw_if_index_set = 1;
13687 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13688 sw_if_index_set = 1;
13689 else if (unformat (i, "vtr_op %d", &vtr_op))
13691 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
13694 else if (unformat (i, "push_dot1q %d", &push_dot1q))
13696 else if (unformat (i, "tag1 %d", &tag1))
13698 else if (unformat (i, "tag2 %d", &tag2))
13702 clib_warning ("parse error '%U'", format_unformat_error, i);
13707 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
13709 errmsg ("missing vtr operation or sw_if_index");
13713 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
13714 mp->sw_if_index = ntohl (sw_if_index);
13715 mp->vtr_op = ntohl (vtr_op);
13716 mp->push_dot1q = ntohl (push_dot1q);
13717 mp->tag1 = ntohl (tag1);
13718 mp->tag2 = ntohl (tag2);
13726 api_create_vhost_user_if (vat_main_t * vam)
13728 unformat_input_t *i = vam->input;
13729 vl_api_create_vhost_user_if_t *mp;
13732 u8 file_name_set = 0;
13733 u32 custom_dev_instance = ~0;
13735 u8 use_custom_mac = 0;
13736 u8 disable_mrg_rxbuf = 0;
13737 u8 disable_indirect_desc = 0;
13741 /* Shut up coverity */
13742 clib_memset (hwaddr, 0, sizeof (hwaddr));
13744 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13746 if (unformat (i, "socket %s", &file_name))
13750 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13752 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
13753 use_custom_mac = 1;
13754 else if (unformat (i, "server"))
13756 else if (unformat (i, "disable_mrg_rxbuf"))
13757 disable_mrg_rxbuf = 1;
13758 else if (unformat (i, "disable_indirect_desc"))
13759 disable_indirect_desc = 1;
13760 else if (unformat (i, "tag %s", &tag))
13766 if (file_name_set == 0)
13768 errmsg ("missing socket file name");
13772 if (vec_len (file_name) > 255)
13774 errmsg ("socket file name too long");
13777 vec_add1 (file_name, 0);
13779 M (CREATE_VHOST_USER_IF, mp);
13781 mp->is_server = is_server;
13782 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
13783 mp->disable_indirect_desc = disable_indirect_desc;
13784 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13785 vec_free (file_name);
13786 if (custom_dev_instance != ~0)
13789 mp->custom_dev_instance = ntohl (custom_dev_instance);
13792 mp->use_custom_mac = use_custom_mac;
13793 clib_memcpy (mp->mac_address, hwaddr, 6);
13795 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
13804 api_modify_vhost_user_if (vat_main_t * vam)
13806 unformat_input_t *i = vam->input;
13807 vl_api_modify_vhost_user_if_t *mp;
13810 u8 file_name_set = 0;
13811 u32 custom_dev_instance = ~0;
13812 u8 sw_if_index_set = 0;
13813 u32 sw_if_index = (u32) ~ 0;
13816 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13818 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13819 sw_if_index_set = 1;
13820 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13821 sw_if_index_set = 1;
13822 else if (unformat (i, "socket %s", &file_name))
13826 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13828 else if (unformat (i, "server"))
13834 if (sw_if_index_set == 0)
13836 errmsg ("missing sw_if_index or interface name");
13840 if (file_name_set == 0)
13842 errmsg ("missing socket file name");
13846 if (vec_len (file_name) > 255)
13848 errmsg ("socket file name too long");
13851 vec_add1 (file_name, 0);
13853 M (MODIFY_VHOST_USER_IF, mp);
13855 mp->sw_if_index = ntohl (sw_if_index);
13856 mp->is_server = is_server;
13857 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13858 vec_free (file_name);
13859 if (custom_dev_instance != ~0)
13862 mp->custom_dev_instance = ntohl (custom_dev_instance);
13871 api_delete_vhost_user_if (vat_main_t * vam)
13873 unformat_input_t *i = vam->input;
13874 vl_api_delete_vhost_user_if_t *mp;
13875 u32 sw_if_index = ~0;
13876 u8 sw_if_index_set = 0;
13879 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13881 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13882 sw_if_index_set = 1;
13883 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13884 sw_if_index_set = 1;
13889 if (sw_if_index_set == 0)
13891 errmsg ("missing sw_if_index or interface name");
13896 M (DELETE_VHOST_USER_IF, mp);
13898 mp->sw_if_index = ntohl (sw_if_index);
13905 static void vl_api_sw_interface_vhost_user_details_t_handler
13906 (vl_api_sw_interface_vhost_user_details_t * mp)
13908 vat_main_t *vam = &vat_main;
13910 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
13911 (char *) mp->interface_name,
13912 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
13913 clib_net_to_host_u64 (mp->features), mp->is_server,
13914 ntohl (mp->num_regions), (char *) mp->sock_filename);
13915 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
13918 static void vl_api_sw_interface_vhost_user_details_t_handler_json
13919 (vl_api_sw_interface_vhost_user_details_t * mp)
13921 vat_main_t *vam = &vat_main;
13922 vat_json_node_t *node = NULL;
13924 if (VAT_JSON_ARRAY != vam->json_tree.type)
13926 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13927 vat_json_init_array (&vam->json_tree);
13929 node = vat_json_array_add (&vam->json_tree);
13931 vat_json_init_object (node);
13932 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13933 vat_json_object_add_string_copy (node, "interface_name",
13934 mp->interface_name);
13935 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
13936 ntohl (mp->virtio_net_hdr_sz));
13937 vat_json_object_add_uint (node, "features",
13938 clib_net_to_host_u64 (mp->features));
13939 vat_json_object_add_uint (node, "is_server", mp->is_server);
13940 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
13941 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
13942 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
13946 api_sw_interface_vhost_user_dump (vat_main_t * vam)
13948 vl_api_sw_interface_vhost_user_dump_t *mp;
13949 vl_api_control_ping_t *mp_ping;
13952 "Interface name idx hdr_sz features server regions filename");
13954 /* Get list of vhost-user interfaces */
13955 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
13958 /* Use a control ping for synchronization */
13959 MPING (CONTROL_PING, mp_ping);
13967 api_show_version (vat_main_t * vam)
13969 vl_api_show_version_t *mp;
13972 M (SHOW_VERSION, mp);
13981 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
13983 unformat_input_t *line_input = vam->input;
13984 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
13985 ip4_address_t local4, remote4;
13986 ip6_address_t local6, remote6;
13988 u8 ipv4_set = 0, ipv6_set = 0;
13992 u32 mcast_sw_if_index = ~0;
13993 u32 encap_vrf_id = 0;
13994 u32 decap_vrf_id = 0;
14000 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
14001 clib_memset (&local4, 0, sizeof local4);
14002 clib_memset (&remote4, 0, sizeof remote4);
14003 clib_memset (&local6, 0, sizeof local6);
14004 clib_memset (&remote6, 0, sizeof remote6);
14006 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14008 if (unformat (line_input, "del"))
14010 else if (unformat (line_input, "local %U",
14011 unformat_ip4_address, &local4))
14016 else if (unformat (line_input, "remote %U",
14017 unformat_ip4_address, &remote4))
14022 else if (unformat (line_input, "local %U",
14023 unformat_ip6_address, &local6))
14028 else if (unformat (line_input, "remote %U",
14029 unformat_ip6_address, &remote6))
14034 else if (unformat (line_input, "group %U %U",
14035 unformat_ip4_address, &remote4,
14036 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14038 grp_set = remote_set = 1;
14041 else if (unformat (line_input, "group %U",
14042 unformat_ip4_address, &remote4))
14044 grp_set = remote_set = 1;
14047 else if (unformat (line_input, "group %U %U",
14048 unformat_ip6_address, &remote6,
14049 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14051 grp_set = remote_set = 1;
14054 else if (unformat (line_input, "group %U",
14055 unformat_ip6_address, &remote6))
14057 grp_set = remote_set = 1;
14061 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
14063 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
14065 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
14067 else if (unformat (line_input, "vni %d", &vni))
14069 else if (unformat (line_input, "next-ip4"))
14071 else if (unformat (line_input, "next-ip6"))
14073 else if (unformat (line_input, "next-ethernet"))
14075 else if (unformat (line_input, "next-nsh"))
14079 errmsg ("parse error '%U'", format_unformat_error, line_input);
14084 if (local_set == 0)
14086 errmsg ("tunnel local address not specified");
14089 if (remote_set == 0)
14091 errmsg ("tunnel remote address not specified");
14094 if (grp_set && mcast_sw_if_index == ~0)
14096 errmsg ("tunnel nonexistent multicast device");
14099 if (ipv4_set && ipv6_set)
14101 errmsg ("both IPv4 and IPv6 addresses specified");
14107 errmsg ("vni not specified");
14111 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
14116 clib_memcpy (&mp->local, &local6, sizeof (local6));
14117 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
14121 clib_memcpy (&mp->local, &local4, sizeof (local4));
14122 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
14125 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
14126 mp->encap_vrf_id = ntohl (encap_vrf_id);
14127 mp->decap_vrf_id = ntohl (decap_vrf_id);
14128 mp->protocol = protocol;
14129 mp->vni = ntohl (vni);
14130 mp->is_add = is_add;
14131 mp->is_ipv6 = ipv6_set;
14138 static void vl_api_vxlan_gpe_tunnel_details_t_handler
14139 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14141 vat_main_t *vam = &vat_main;
14142 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
14143 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
14145 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
14146 ntohl (mp->sw_if_index),
14147 format_ip46_address, &local, IP46_TYPE_ANY,
14148 format_ip46_address, &remote, IP46_TYPE_ANY,
14149 ntohl (mp->vni), mp->protocol,
14150 ntohl (mp->mcast_sw_if_index),
14151 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
14155 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
14156 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14158 vat_main_t *vam = &vat_main;
14159 vat_json_node_t *node = NULL;
14160 struct in_addr ip4;
14161 struct in6_addr ip6;
14163 if (VAT_JSON_ARRAY != vam->json_tree.type)
14165 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14166 vat_json_init_array (&vam->json_tree);
14168 node = vat_json_array_add (&vam->json_tree);
14170 vat_json_init_object (node);
14171 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14174 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
14175 vat_json_object_add_ip6 (node, "local", ip6);
14176 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
14177 vat_json_object_add_ip6 (node, "remote", ip6);
14181 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
14182 vat_json_object_add_ip4 (node, "local", ip4);
14183 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
14184 vat_json_object_add_ip4 (node, "remote", ip4);
14186 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
14187 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
14188 vat_json_object_add_uint (node, "mcast_sw_if_index",
14189 ntohl (mp->mcast_sw_if_index));
14190 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
14191 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
14192 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
14196 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14198 unformat_input_t *i = vam->input;
14199 vl_api_vxlan_gpe_tunnel_dump_t *mp;
14200 vl_api_control_ping_t *mp_ping;
14202 u8 sw_if_index_set = 0;
14205 /* Parse args required to build the message */
14206 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14208 if (unformat (i, "sw_if_index %d", &sw_if_index))
14209 sw_if_index_set = 1;
14214 if (sw_if_index_set == 0)
14219 if (!vam->json_output)
14221 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
14222 "sw_if_index", "local", "remote", "vni",
14223 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
14226 /* Get list of vxlan-tunnel interfaces */
14227 M (VXLAN_GPE_TUNNEL_DUMP, mp);
14229 mp->sw_if_index = htonl (sw_if_index);
14233 /* Use a control ping for synchronization */
14234 MPING (CONTROL_PING, mp_ping);
14241 static void vl_api_l2_fib_table_details_t_handler
14242 (vl_api_l2_fib_table_details_t * mp)
14244 vat_main_t *vam = &vat_main;
14246 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14248 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
14249 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14253 static void vl_api_l2_fib_table_details_t_handler_json
14254 (vl_api_l2_fib_table_details_t * mp)
14256 vat_main_t *vam = &vat_main;
14257 vat_json_node_t *node = NULL;
14259 if (VAT_JSON_ARRAY != vam->json_tree.type)
14261 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14262 vat_json_init_array (&vam->json_tree);
14264 node = vat_json_array_add (&vam->json_tree);
14266 vat_json_init_object (node);
14267 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
14268 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
14269 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14270 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14271 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14272 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14276 api_l2_fib_table_dump (vat_main_t * vam)
14278 unformat_input_t *i = vam->input;
14279 vl_api_l2_fib_table_dump_t *mp;
14280 vl_api_control_ping_t *mp_ping;
14285 /* Parse args required to build the message */
14286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14288 if (unformat (i, "bd_id %d", &bd_id))
14294 if (bd_id_set == 0)
14296 errmsg ("missing bridge domain");
14300 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14302 /* Get list of l2 fib entries */
14303 M (L2_FIB_TABLE_DUMP, mp);
14305 mp->bd_id = ntohl (bd_id);
14308 /* Use a control ping for synchronization */
14309 MPING (CONTROL_PING, mp_ping);
14318 api_interface_name_renumber (vat_main_t * vam)
14320 unformat_input_t *line_input = vam->input;
14321 vl_api_interface_name_renumber_t *mp;
14322 u32 sw_if_index = ~0;
14323 u32 new_show_dev_instance = ~0;
14326 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14328 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14331 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14333 else if (unformat (line_input, "new_show_dev_instance %d",
14334 &new_show_dev_instance))
14340 if (sw_if_index == ~0)
14342 errmsg ("missing interface name or sw_if_index");
14346 if (new_show_dev_instance == ~0)
14348 errmsg ("missing new_show_dev_instance");
14352 M (INTERFACE_NAME_RENUMBER, mp);
14354 mp->sw_if_index = ntohl (sw_if_index);
14355 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14363 api_ip_probe_neighbor (vat_main_t * vam)
14365 unformat_input_t *i = vam->input;
14366 vl_api_ip_probe_neighbor_t *mp;
14374 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14376 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14378 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14380 else if (unformat (i, "address %U", unformat_ip4_address, dst_adr))
14382 else if (unformat (i, "address %U", unformat_ip6_address, dst_adr))
14393 errmsg ("missing interface");
14399 errmsg ("missing addresses");
14403 M (IP_PROBE_NEIGHBOR, mp);
14405 mp->sw_if_index = ntohl (sw_if_index);
14406 mp->is_ipv6 = is_ipv6;
14407 clib_memcpy (mp->dst_address, dst_adr, sizeof (dst_adr));
14415 api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14417 unformat_input_t *i = vam->input;
14418 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14419 u8 mode = IP_SCAN_V46_NEIGHBORS;
14420 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14423 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14425 if (unformat (i, "ip4"))
14426 mode = IP_SCAN_V4_NEIGHBORS;
14427 else if (unformat (i, "ip6"))
14428 mode = IP_SCAN_V6_NEIGHBORS;
14429 if (unformat (i, "both"))
14430 mode = IP_SCAN_V46_NEIGHBORS;
14431 else if (unformat (i, "disable"))
14432 mode = IP_SCAN_DISABLED;
14433 else if (unformat (i, "interval %d", &interval))
14435 else if (unformat (i, "max-time %d", &time))
14437 else if (unformat (i, "max-update %d", &update))
14439 else if (unformat (i, "delay %d", &delay))
14441 else if (unformat (i, "stale %d", &stale))
14447 if (interval > 255)
14449 errmsg ("interval cannot exceed 255 minutes.");
14454 errmsg ("max-time cannot exceed 255 usec.");
14459 errmsg ("max-update cannot exceed 255.");
14464 errmsg ("delay cannot exceed 255 msec.");
14469 errmsg ("stale cannot exceed 255 minutes.");
14473 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14475 mp->scan_interval = interval;
14476 mp->max_proc_time = time;
14477 mp->max_update = update;
14478 mp->scan_int_delay = delay;
14479 mp->stale_threshold = stale;
14487 api_want_ip4_arp_events (vat_main_t * vam)
14489 unformat_input_t *line_input = vam->input;
14490 vl_api_want_ip4_arp_events_t *mp;
14491 ip4_address_t address;
14492 int address_set = 0;
14493 u32 enable_disable = 1;
14496 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14498 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14500 else if (unformat (line_input, "del"))
14501 enable_disable = 0;
14506 if (address_set == 0)
14508 errmsg ("missing addresses");
14512 M (WANT_IP4_ARP_EVENTS, mp);
14513 mp->enable_disable = enable_disable;
14514 mp->pid = htonl (getpid ());
14515 mp->address = address.as_u32;
14523 api_want_ip6_nd_events (vat_main_t * vam)
14525 unformat_input_t *line_input = vam->input;
14526 vl_api_want_ip6_nd_events_t *mp;
14527 ip6_address_t address;
14528 int address_set = 0;
14529 u32 enable_disable = 1;
14532 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14534 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
14536 else if (unformat (line_input, "del"))
14537 enable_disable = 0;
14542 if (address_set == 0)
14544 errmsg ("missing addresses");
14548 M (WANT_IP6_ND_EVENTS, mp);
14549 mp->enable_disable = enable_disable;
14550 mp->pid = htonl (getpid ());
14551 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
14559 api_want_l2_macs_events (vat_main_t * vam)
14561 unformat_input_t *line_input = vam->input;
14562 vl_api_want_l2_macs_events_t *mp;
14563 u8 enable_disable = 1;
14564 u32 scan_delay = 0;
14565 u32 max_macs_in_event = 0;
14566 u32 learn_limit = 0;
14569 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14571 if (unformat (line_input, "learn-limit %d", &learn_limit))
14573 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14575 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14577 else if (unformat (line_input, "disable"))
14578 enable_disable = 0;
14583 M (WANT_L2_MACS_EVENTS, mp);
14584 mp->enable_disable = enable_disable;
14585 mp->pid = htonl (getpid ());
14586 mp->learn_limit = htonl (learn_limit);
14587 mp->scan_delay = (u8) scan_delay;
14588 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14595 api_input_acl_set_interface (vat_main_t * vam)
14597 unformat_input_t *i = vam->input;
14598 vl_api_input_acl_set_interface_t *mp;
14600 int sw_if_index_set;
14601 u32 ip4_table_index = ~0;
14602 u32 ip6_table_index = ~0;
14603 u32 l2_table_index = ~0;
14607 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14609 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14610 sw_if_index_set = 1;
14611 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14612 sw_if_index_set = 1;
14613 else if (unformat (i, "del"))
14615 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14617 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14619 else if (unformat (i, "l2-table %d", &l2_table_index))
14623 clib_warning ("parse error '%U'", format_unformat_error, i);
14628 if (sw_if_index_set == 0)
14630 errmsg ("missing interface name or sw_if_index");
14634 M (INPUT_ACL_SET_INTERFACE, mp);
14636 mp->sw_if_index = ntohl (sw_if_index);
14637 mp->ip4_table_index = ntohl (ip4_table_index);
14638 mp->ip6_table_index = ntohl (ip6_table_index);
14639 mp->l2_table_index = ntohl (l2_table_index);
14640 mp->is_add = is_add;
14648 api_output_acl_set_interface (vat_main_t * vam)
14650 unformat_input_t *i = vam->input;
14651 vl_api_output_acl_set_interface_t *mp;
14653 int sw_if_index_set;
14654 u32 ip4_table_index = ~0;
14655 u32 ip6_table_index = ~0;
14656 u32 l2_table_index = ~0;
14660 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14662 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14663 sw_if_index_set = 1;
14664 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14665 sw_if_index_set = 1;
14666 else if (unformat (i, "del"))
14668 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14670 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14672 else if (unformat (i, "l2-table %d", &l2_table_index))
14676 clib_warning ("parse error '%U'", format_unformat_error, i);
14681 if (sw_if_index_set == 0)
14683 errmsg ("missing interface name or sw_if_index");
14687 M (OUTPUT_ACL_SET_INTERFACE, mp);
14689 mp->sw_if_index = ntohl (sw_if_index);
14690 mp->ip4_table_index = ntohl (ip4_table_index);
14691 mp->ip6_table_index = ntohl (ip6_table_index);
14692 mp->l2_table_index = ntohl (l2_table_index);
14693 mp->is_add = is_add;
14701 api_ip_address_dump (vat_main_t * vam)
14703 unformat_input_t *i = vam->input;
14704 vl_api_ip_address_dump_t *mp;
14705 vl_api_control_ping_t *mp_ping;
14706 u32 sw_if_index = ~0;
14707 u8 sw_if_index_set = 0;
14712 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14714 if (unformat (i, "sw_if_index %d", &sw_if_index))
14715 sw_if_index_set = 1;
14717 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14718 sw_if_index_set = 1;
14719 else if (unformat (i, "ipv4"))
14721 else if (unformat (i, "ipv6"))
14727 if (ipv4_set && ipv6_set)
14729 errmsg ("ipv4 and ipv6 flags cannot be both set");
14733 if ((!ipv4_set) && (!ipv6_set))
14735 errmsg ("no ipv4 nor ipv6 flag set");
14739 if (sw_if_index_set == 0)
14741 errmsg ("missing interface name or sw_if_index");
14745 vam->current_sw_if_index = sw_if_index;
14746 vam->is_ipv6 = ipv6_set;
14748 M (IP_ADDRESS_DUMP, mp);
14749 mp->sw_if_index = ntohl (sw_if_index);
14750 mp->is_ipv6 = ipv6_set;
14753 /* Use a control ping for synchronization */
14754 MPING (CONTROL_PING, mp_ping);
14762 api_ip_dump (vat_main_t * vam)
14764 vl_api_ip_dump_t *mp;
14765 vl_api_control_ping_t *mp_ping;
14766 unformat_input_t *in = vam->input;
14773 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
14775 if (unformat (in, "ipv4"))
14777 else if (unformat (in, "ipv6"))
14783 if (ipv4_set && ipv6_set)
14785 errmsg ("ipv4 and ipv6 flags cannot be both set");
14789 if ((!ipv4_set) && (!ipv6_set))
14791 errmsg ("no ipv4 nor ipv6 flag set");
14795 is_ipv6 = ipv6_set;
14796 vam->is_ipv6 = is_ipv6;
14798 /* free old data */
14799 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
14801 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
14803 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
14806 mp->is_ipv6 = ipv6_set;
14809 /* Use a control ping for synchronization */
14810 MPING (CONTROL_PING, mp_ping);
14818 api_ipsec_spd_add_del (vat_main_t * vam)
14820 unformat_input_t *i = vam->input;
14821 vl_api_ipsec_spd_add_del_t *mp;
14826 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14828 if (unformat (i, "spd_id %d", &spd_id))
14830 else if (unformat (i, "del"))
14834 clib_warning ("parse error '%U'", format_unformat_error, i);
14840 errmsg ("spd_id must be set");
14844 M (IPSEC_SPD_ADD_DEL, mp);
14846 mp->spd_id = ntohl (spd_id);
14847 mp->is_add = is_add;
14855 api_ipsec_interface_add_del_spd (vat_main_t * vam)
14857 unformat_input_t *i = vam->input;
14858 vl_api_ipsec_interface_add_del_spd_t *mp;
14860 u8 sw_if_index_set = 0;
14861 u32 spd_id = (u32) ~ 0;
14865 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14867 if (unformat (i, "del"))
14869 else if (unformat (i, "spd_id %d", &spd_id))
14872 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14873 sw_if_index_set = 1;
14874 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14875 sw_if_index_set = 1;
14878 clib_warning ("parse error '%U'", format_unformat_error, i);
14884 if (spd_id == (u32) ~ 0)
14886 errmsg ("spd_id must be set");
14890 if (sw_if_index_set == 0)
14892 errmsg ("missing interface name or sw_if_index");
14896 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
14898 mp->spd_id = ntohl (spd_id);
14899 mp->sw_if_index = ntohl (sw_if_index);
14900 mp->is_add = is_add;
14908 api_ipsec_spd_add_del_entry (vat_main_t * vam)
14910 unformat_input_t *i = vam->input;
14911 vl_api_ipsec_spd_add_del_entry_t *mp;
14912 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
14913 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
14915 u32 rport_start = 0, rport_stop = (u32) ~ 0;
14916 u32 lport_start = 0, lport_stop = (u32) ~ 0;
14917 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
14918 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
14921 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
14922 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
14923 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
14924 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
14925 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
14926 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
14928 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14930 if (unformat (i, "del"))
14932 if (unformat (i, "outbound"))
14934 if (unformat (i, "inbound"))
14936 else if (unformat (i, "spd_id %d", &spd_id))
14938 else if (unformat (i, "sa_id %d", &sa_id))
14940 else if (unformat (i, "priority %d", &priority))
14942 else if (unformat (i, "protocol %d", &protocol))
14944 else if (unformat (i, "lport_start %d", &lport_start))
14946 else if (unformat (i, "lport_stop %d", &lport_stop))
14948 else if (unformat (i, "rport_start %d", &rport_start))
14950 else if (unformat (i, "rport_stop %d", &rport_stop))
14954 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
14960 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
14967 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
14973 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
14980 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
14986 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
14993 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
14999 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
15005 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
15007 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
15009 clib_warning ("unsupported action: 'resolve'");
15015 clib_warning ("parse error '%U'", format_unformat_error, i);
15021 M (IPSEC_SPD_ADD_DEL_ENTRY, mp);
15023 mp->spd_id = ntohl (spd_id);
15024 mp->priority = ntohl (priority);
15025 mp->is_outbound = is_outbound;
15027 mp->is_ipv6 = is_ipv6;
15028 if (is_ipv6 || is_ip_any)
15030 clib_memcpy (mp->remote_address_start, &raddr6_start,
15031 sizeof (ip6_address_t));
15032 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
15033 sizeof (ip6_address_t));
15034 clib_memcpy (mp->local_address_start, &laddr6_start,
15035 sizeof (ip6_address_t));
15036 clib_memcpy (mp->local_address_stop, &laddr6_stop,
15037 sizeof (ip6_address_t));
15041 clib_memcpy (mp->remote_address_start, &raddr4_start,
15042 sizeof (ip4_address_t));
15043 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
15044 sizeof (ip4_address_t));
15045 clib_memcpy (mp->local_address_start, &laddr4_start,
15046 sizeof (ip4_address_t));
15047 clib_memcpy (mp->local_address_stop, &laddr4_stop,
15048 sizeof (ip4_address_t));
15050 mp->protocol = (u8) protocol;
15051 mp->local_port_start = ntohs ((u16) lport_start);
15052 mp->local_port_stop = ntohs ((u16) lport_stop);
15053 mp->remote_port_start = ntohs ((u16) rport_start);
15054 mp->remote_port_stop = ntohs ((u16) rport_stop);
15055 mp->policy = (u8) policy;
15056 mp->sa_id = ntohl (sa_id);
15057 mp->is_add = is_add;
15058 mp->is_ip_any = is_ip_any;
15065 api_ipsec_sad_add_del_entry (vat_main_t * vam)
15067 unformat_input_t *i = vam->input;
15068 vl_api_ipsec_sad_add_del_entry_t *mp;
15069 u32 sad_id = 0, spi = 0;
15070 u8 *ck = 0, *ik = 0;
15073 u8 protocol = IPSEC_PROTOCOL_AH;
15074 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
15075 u32 crypto_alg = 0, integ_alg = 0;
15076 ip4_address_t tun_src4;
15077 ip4_address_t tun_dst4;
15078 ip6_address_t tun_src6;
15079 ip6_address_t tun_dst6;
15082 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15084 if (unformat (i, "del"))
15086 else if (unformat (i, "sad_id %d", &sad_id))
15088 else if (unformat (i, "spi %d", &spi))
15090 else if (unformat (i, "esp"))
15091 protocol = IPSEC_PROTOCOL_ESP;
15092 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
15095 is_tunnel_ipv6 = 0;
15097 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
15100 is_tunnel_ipv6 = 0;
15102 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
15105 is_tunnel_ipv6 = 1;
15107 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
15110 is_tunnel_ipv6 = 1;
15114 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15116 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15118 clib_warning ("unsupported crypto-alg: '%U'",
15119 format_ipsec_crypto_alg, crypto_alg);
15123 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15127 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15129 if (integ_alg >= IPSEC_INTEG_N_ALG)
15131 clib_warning ("unsupported integ-alg: '%U'",
15132 format_ipsec_integ_alg, integ_alg);
15136 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15140 clib_warning ("parse error '%U'", format_unformat_error, i);
15146 M (IPSEC_SAD_ADD_DEL_ENTRY, mp);
15148 mp->sad_id = ntohl (sad_id);
15149 mp->is_add = is_add;
15150 mp->protocol = protocol;
15151 mp->spi = ntohl (spi);
15152 mp->is_tunnel = is_tunnel;
15153 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
15154 mp->crypto_algorithm = crypto_alg;
15155 mp->integrity_algorithm = integ_alg;
15156 mp->crypto_key_length = vec_len (ck);
15157 mp->integrity_key_length = vec_len (ik);
15159 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15160 mp->crypto_key_length = sizeof (mp->crypto_key);
15162 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15163 mp->integrity_key_length = sizeof (mp->integrity_key);
15166 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15168 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15172 if (is_tunnel_ipv6)
15174 clib_memcpy (mp->tunnel_src_address, &tun_src6,
15175 sizeof (ip6_address_t));
15176 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
15177 sizeof (ip6_address_t));
15181 clib_memcpy (mp->tunnel_src_address, &tun_src4,
15182 sizeof (ip4_address_t));
15183 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
15184 sizeof (ip4_address_t));
15194 api_ipsec_sa_set_key (vat_main_t * vam)
15196 unformat_input_t *i = vam->input;
15197 vl_api_ipsec_sa_set_key_t *mp;
15199 u8 *ck = 0, *ik = 0;
15202 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15204 if (unformat (i, "sa_id %d", &sa_id))
15206 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15208 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15212 clib_warning ("parse error '%U'", format_unformat_error, i);
15217 M (IPSEC_SA_SET_KEY, mp);
15219 mp->sa_id = ntohl (sa_id);
15220 mp->crypto_key_length = vec_len (ck);
15221 mp->integrity_key_length = vec_len (ik);
15223 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15224 mp->crypto_key_length = sizeof (mp->crypto_key);
15226 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15227 mp->integrity_key_length = sizeof (mp->integrity_key);
15230 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15232 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15240 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
15242 unformat_input_t *i = vam->input;
15243 vl_api_ipsec_tunnel_if_add_del_t *mp;
15244 u32 local_spi = 0, remote_spi = 0;
15245 u32 crypto_alg = 0, integ_alg = 0;
15246 u8 *lck = NULL, *rck = NULL;
15247 u8 *lik = NULL, *rik = NULL;
15248 ip4_address_t local_ip = { {0} };
15249 ip4_address_t remote_ip = { {0} };
15252 u8 anti_replay = 0;
15257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15259 if (unformat (i, "del"))
15261 else if (unformat (i, "esn"))
15263 else if (unformat (i, "anti_replay"))
15265 else if (unformat (i, "local_spi %d", &local_spi))
15267 else if (unformat (i, "remote_spi %d", &remote_spi))
15269 else if (unformat (i, "local_ip %U", unformat_ip4_address, &local_ip))
15271 else if (unformat (i, "remote_ip %U", unformat_ip4_address, &remote_ip))
15273 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
15276 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
15278 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
15280 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
15284 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15286 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15288 errmsg ("unsupported crypto-alg: '%U'\n",
15289 format_ipsec_crypto_alg, crypto_alg);
15295 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15297 if (integ_alg >= IPSEC_INTEG_N_ALG)
15299 errmsg ("unsupported integ-alg: '%U'\n",
15300 format_ipsec_integ_alg, integ_alg);
15304 else if (unformat (i, "instance %u", &instance))
15308 errmsg ("parse error '%U'\n", format_unformat_error, i);
15313 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
15315 mp->is_add = is_add;
15317 mp->anti_replay = anti_replay;
15319 clib_memcpy (mp->local_ip, &local_ip, sizeof (ip4_address_t));
15320 clib_memcpy (mp->remote_ip, &remote_ip, sizeof (ip4_address_t));
15322 mp->local_spi = htonl (local_spi);
15323 mp->remote_spi = htonl (remote_spi);
15324 mp->crypto_alg = (u8) crypto_alg;
15326 mp->local_crypto_key_len = 0;
15329 mp->local_crypto_key_len = vec_len (lck);
15330 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15331 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15332 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15335 mp->remote_crypto_key_len = 0;
15338 mp->remote_crypto_key_len = vec_len (rck);
15339 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15340 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15341 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15344 mp->integ_alg = (u8) integ_alg;
15346 mp->local_integ_key_len = 0;
15349 mp->local_integ_key_len = vec_len (lik);
15350 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15351 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15352 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15355 mp->remote_integ_key_len = 0;
15358 mp->remote_integ_key_len = vec_len (rik);
15359 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15360 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15361 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15366 mp->renumber = renumber;
15367 mp->show_instance = ntohl (instance);
15376 vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15378 vat_main_t *vam = &vat_main;
15380 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
15381 "crypto_key %U integ_alg %u integ_key %U use_esn %u "
15382 "use_anti_replay %u is_tunnel %u is_tunnel_ip6 %u "
15383 "tunnel_src_addr %U tunnel_dst_addr %U "
15384 "salt %u seq_outbound %lu last_seq_inbound %lu "
15385 "replay_window %lu total_data_size %lu\n",
15386 ntohl (mp->sa_id), ntohl (mp->sw_if_index), ntohl (mp->spi),
15388 mp->crypto_alg, format_hex_bytes, mp->crypto_key, mp->crypto_key_len,
15389 mp->integ_alg, format_hex_bytes, mp->integ_key, mp->integ_key_len,
15390 mp->use_esn, mp->use_anti_replay, mp->is_tunnel, mp->is_tunnel_ip6,
15391 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15392 mp->tunnel_src_addr,
15393 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15394 mp->tunnel_dst_addr,
15396 clib_net_to_host_u64 (mp->seq_outbound),
15397 clib_net_to_host_u64 (mp->last_seq_inbound),
15398 clib_net_to_host_u64 (mp->replay_window),
15399 clib_net_to_host_u64 (mp->total_data_size));
15402 #define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15403 #define vl_api_ipsec_sa_details_t_print vl_noop_handler
15405 static void vl_api_ipsec_sa_details_t_handler_json
15406 (vl_api_ipsec_sa_details_t * mp)
15408 vat_main_t *vam = &vat_main;
15409 vat_json_node_t *node = NULL;
15410 struct in_addr src_ip4, dst_ip4;
15411 struct in6_addr src_ip6, dst_ip6;
15413 if (VAT_JSON_ARRAY != vam->json_tree.type)
15415 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15416 vat_json_init_array (&vam->json_tree);
15418 node = vat_json_array_add (&vam->json_tree);
15420 vat_json_init_object (node);
15421 vat_json_object_add_uint (node, "sa_id", ntohl (mp->sa_id));
15422 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15423 vat_json_object_add_uint (node, "spi", ntohl (mp->spi));
15424 vat_json_object_add_uint (node, "proto", mp->protocol);
15425 vat_json_object_add_uint (node, "crypto_alg", mp->crypto_alg);
15426 vat_json_object_add_uint (node, "integ_alg", mp->integ_alg);
15427 vat_json_object_add_uint (node, "use_esn", mp->use_esn);
15428 vat_json_object_add_uint (node, "use_anti_replay", mp->use_anti_replay);
15429 vat_json_object_add_uint (node, "is_tunnel", mp->is_tunnel);
15430 vat_json_object_add_uint (node, "is_tunnel_ip6", mp->is_tunnel_ip6);
15431 vat_json_object_add_bytes (node, "crypto_key", mp->crypto_key,
15432 mp->crypto_key_len);
15433 vat_json_object_add_bytes (node, "integ_key", mp->integ_key,
15434 mp->integ_key_len);
15435 if (mp->is_tunnel_ip6)
15437 clib_memcpy (&src_ip6, mp->tunnel_src_addr, sizeof (src_ip6));
15438 vat_json_object_add_ip6 (node, "tunnel_src_addr", src_ip6);
15439 clib_memcpy (&dst_ip6, mp->tunnel_dst_addr, sizeof (dst_ip6));
15440 vat_json_object_add_ip6 (node, "tunnel_dst_addr", dst_ip6);
15444 clib_memcpy (&src_ip4, mp->tunnel_src_addr, sizeof (src_ip4));
15445 vat_json_object_add_ip4 (node, "tunnel_src_addr", src_ip4);
15446 clib_memcpy (&dst_ip4, mp->tunnel_dst_addr, sizeof (dst_ip4));
15447 vat_json_object_add_ip4 (node, "tunnel_dst_addr", dst_ip4);
15449 vat_json_object_add_uint (node, "replay_window",
15450 clib_net_to_host_u64 (mp->replay_window));
15451 vat_json_object_add_uint (node, "total_data_size",
15452 clib_net_to_host_u64 (mp->total_data_size));
15457 api_ipsec_sa_dump (vat_main_t * vam)
15459 unformat_input_t *i = vam->input;
15460 vl_api_ipsec_sa_dump_t *mp;
15461 vl_api_control_ping_t *mp_ping;
15465 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15467 if (unformat (i, "sa_id %d", &sa_id))
15471 clib_warning ("parse error '%U'", format_unformat_error, i);
15476 M (IPSEC_SA_DUMP, mp);
15478 mp->sa_id = ntohl (sa_id);
15482 /* Use a control ping for synchronization */
15483 M (CONTROL_PING, mp_ping);
15491 api_ipsec_tunnel_if_set_key (vat_main_t * vam)
15493 unformat_input_t *i = vam->input;
15494 vl_api_ipsec_tunnel_if_set_key_t *mp;
15495 u32 sw_if_index = ~0;
15496 u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE;
15501 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15503 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15506 if (unformat (i, "local crypto %U", unformat_ipsec_crypto_alg, &alg))
15507 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO;
15509 if (unformat (i, "remote crypto %U", unformat_ipsec_crypto_alg, &alg))
15510 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO;
15511 else if (unformat (i, "local integ %U", unformat_ipsec_integ_alg, &alg))
15512 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG;
15514 if (unformat (i, "remote integ %U", unformat_ipsec_integ_alg, &alg))
15515 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG;
15516 else if (unformat (i, "%U", unformat_hex_string, &key))
15520 clib_warning ("parse error '%U'", format_unformat_error, i);
15525 if (sw_if_index == ~0)
15527 errmsg ("interface must be specified");
15531 if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE)
15533 errmsg ("key type must be specified");
15539 errmsg ("algorithm must be specified");
15543 if (vec_len (key) == 0)
15545 errmsg ("key must be specified");
15549 M (IPSEC_TUNNEL_IF_SET_KEY, mp);
15551 mp->sw_if_index = htonl (sw_if_index);
15553 mp->key_type = key_type;
15554 mp->key_len = vec_len (key);
15555 clib_memcpy (mp->key, key, vec_len (key));
15564 api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15566 unformat_input_t *i = vam->input;
15567 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15568 u32 sw_if_index = ~0;
15570 u8 is_outbound = (u8) ~ 0;
15573 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15575 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15577 else if (unformat (i, "sa_id %d", &sa_id))
15579 else if (unformat (i, "outbound"))
15581 else if (unformat (i, "inbound"))
15585 clib_warning ("parse error '%U'", format_unformat_error, i);
15590 if (sw_if_index == ~0)
15592 errmsg ("interface must be specified");
15598 errmsg ("SA ID must be specified");
15602 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15604 mp->sw_if_index = htonl (sw_if_index);
15605 mp->sa_id = htonl (sa_id);
15606 mp->is_outbound = is_outbound;
15615 api_ikev2_profile_add_del (vat_main_t * vam)
15617 unformat_input_t *i = vam->input;
15618 vl_api_ikev2_profile_add_del_t *mp;
15623 const char *valid_chars = "a-zA-Z0-9_";
15625 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15627 if (unformat (i, "del"))
15629 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15630 vec_add1 (name, 0);
15633 errmsg ("parse error '%U'", format_unformat_error, i);
15638 if (!vec_len (name))
15640 errmsg ("profile name must be specified");
15644 if (vec_len (name) > 64)
15646 errmsg ("profile name too long");
15650 M (IKEV2_PROFILE_ADD_DEL, mp);
15652 clib_memcpy (mp->name, name, vec_len (name));
15653 mp->is_add = is_add;
15662 api_ikev2_profile_set_auth (vat_main_t * vam)
15664 unformat_input_t *i = vam->input;
15665 vl_api_ikev2_profile_set_auth_t *mp;
15668 u32 auth_method = 0;
15672 const char *valid_chars = "a-zA-Z0-9_";
15674 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15676 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15677 vec_add1 (name, 0);
15678 else if (unformat (i, "auth_method %U",
15679 unformat_ikev2_auth_method, &auth_method))
15681 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
15683 else if (unformat (i, "auth_data %v", &data))
15687 errmsg ("parse error '%U'", format_unformat_error, i);
15692 if (!vec_len (name))
15694 errmsg ("profile name must be specified");
15698 if (vec_len (name) > 64)
15700 errmsg ("profile name too long");
15704 if (!vec_len (data))
15706 errmsg ("auth_data must be specified");
15712 errmsg ("auth_method must be specified");
15716 M (IKEV2_PROFILE_SET_AUTH, mp);
15718 mp->is_hex = is_hex;
15719 mp->auth_method = (u8) auth_method;
15720 mp->data_len = vec_len (data);
15721 clib_memcpy (mp->name, name, vec_len (name));
15722 clib_memcpy (mp->data, data, vec_len (data));
15732 api_ikev2_profile_set_id (vat_main_t * vam)
15734 unformat_input_t *i = vam->input;
15735 vl_api_ikev2_profile_set_id_t *mp;
15743 const char *valid_chars = "a-zA-Z0-9_";
15745 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15747 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15748 vec_add1 (name, 0);
15749 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
15751 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
15753 data = vec_new (u8, 4);
15754 clib_memcpy (data, ip4.as_u8, 4);
15756 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
15758 else if (unformat (i, "id_data %v", &data))
15760 else if (unformat (i, "local"))
15762 else if (unformat (i, "remote"))
15766 errmsg ("parse error '%U'", format_unformat_error, i);
15771 if (!vec_len (name))
15773 errmsg ("profile name must be specified");
15777 if (vec_len (name) > 64)
15779 errmsg ("profile name too long");
15783 if (!vec_len (data))
15785 errmsg ("id_data must be specified");
15791 errmsg ("id_type must be specified");
15795 M (IKEV2_PROFILE_SET_ID, mp);
15797 mp->is_local = is_local;
15798 mp->id_type = (u8) id_type;
15799 mp->data_len = vec_len (data);
15800 clib_memcpy (mp->name, name, vec_len (name));
15801 clib_memcpy (mp->data, data, vec_len (data));
15811 api_ikev2_profile_set_ts (vat_main_t * vam)
15813 unformat_input_t *i = vam->input;
15814 vl_api_ikev2_profile_set_ts_t *mp;
15817 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
15818 ip4_address_t start_addr, end_addr;
15820 const char *valid_chars = "a-zA-Z0-9_";
15823 start_addr.as_u32 = 0;
15824 end_addr.as_u32 = (u32) ~ 0;
15826 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15828 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15829 vec_add1 (name, 0);
15830 else if (unformat (i, "protocol %d", &proto))
15832 else if (unformat (i, "start_port %d", &start_port))
15834 else if (unformat (i, "end_port %d", &end_port))
15837 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
15839 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
15841 else if (unformat (i, "local"))
15843 else if (unformat (i, "remote"))
15847 errmsg ("parse error '%U'", format_unformat_error, i);
15852 if (!vec_len (name))
15854 errmsg ("profile name must be specified");
15858 if (vec_len (name) > 64)
15860 errmsg ("profile name too long");
15864 M (IKEV2_PROFILE_SET_TS, mp);
15866 mp->is_local = is_local;
15867 mp->proto = (u8) proto;
15868 mp->start_port = (u16) start_port;
15869 mp->end_port = (u16) end_port;
15870 mp->start_addr = start_addr.as_u32;
15871 mp->end_addr = end_addr.as_u32;
15872 clib_memcpy (mp->name, name, vec_len (name));
15881 api_ikev2_set_local_key (vat_main_t * vam)
15883 unformat_input_t *i = vam->input;
15884 vl_api_ikev2_set_local_key_t *mp;
15888 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15890 if (unformat (i, "file %v", &file))
15891 vec_add1 (file, 0);
15894 errmsg ("parse error '%U'", format_unformat_error, i);
15899 if (!vec_len (file))
15901 errmsg ("RSA key file must be specified");
15905 if (vec_len (file) > 256)
15907 errmsg ("file name too long");
15911 M (IKEV2_SET_LOCAL_KEY, mp);
15913 clib_memcpy (mp->key_file, file, vec_len (file));
15922 api_ikev2_set_responder (vat_main_t * vam)
15924 unformat_input_t *i = vam->input;
15925 vl_api_ikev2_set_responder_t *mp;
15928 u32 sw_if_index = ~0;
15929 ip4_address_t address;
15931 const char *valid_chars = "a-zA-Z0-9_";
15933 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15936 (i, "%U interface %d address %U", unformat_token, valid_chars,
15937 &name, &sw_if_index, unformat_ip4_address, &address))
15938 vec_add1 (name, 0);
15941 errmsg ("parse error '%U'", format_unformat_error, i);
15946 if (!vec_len (name))
15948 errmsg ("profile name must be specified");
15952 if (vec_len (name) > 64)
15954 errmsg ("profile name too long");
15958 M (IKEV2_SET_RESPONDER, mp);
15960 clib_memcpy (mp->name, name, vec_len (name));
15963 mp->sw_if_index = sw_if_index;
15964 clib_memcpy (mp->address, &address, sizeof (address));
15972 api_ikev2_set_ike_transforms (vat_main_t * vam)
15974 unformat_input_t *i = vam->input;
15975 vl_api_ikev2_set_ike_transforms_t *mp;
15978 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
15980 const char *valid_chars = "a-zA-Z0-9_";
15982 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15984 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
15985 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
15986 vec_add1 (name, 0);
15989 errmsg ("parse error '%U'", format_unformat_error, i);
15994 if (!vec_len (name))
15996 errmsg ("profile name must be specified");
16000 if (vec_len (name) > 64)
16002 errmsg ("profile name too long");
16006 M (IKEV2_SET_IKE_TRANSFORMS, mp);
16008 clib_memcpy (mp->name, name, vec_len (name));
16010 mp->crypto_alg = crypto_alg;
16011 mp->crypto_key_size = crypto_key_size;
16012 mp->integ_alg = integ_alg;
16013 mp->dh_group = dh_group;
16022 api_ikev2_set_esp_transforms (vat_main_t * vam)
16024 unformat_input_t *i = vam->input;
16025 vl_api_ikev2_set_esp_transforms_t *mp;
16028 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
16030 const char *valid_chars = "a-zA-Z0-9_";
16032 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16034 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
16035 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
16036 vec_add1 (name, 0);
16039 errmsg ("parse error '%U'", format_unformat_error, i);
16044 if (!vec_len (name))
16046 errmsg ("profile name must be specified");
16050 if (vec_len (name) > 64)
16052 errmsg ("profile name too long");
16056 M (IKEV2_SET_ESP_TRANSFORMS, mp);
16058 clib_memcpy (mp->name, name, vec_len (name));
16060 mp->crypto_alg = crypto_alg;
16061 mp->crypto_key_size = crypto_key_size;
16062 mp->integ_alg = integ_alg;
16063 mp->dh_group = dh_group;
16071 api_ikev2_set_sa_lifetime (vat_main_t * vam)
16073 unformat_input_t *i = vam->input;
16074 vl_api_ikev2_set_sa_lifetime_t *mp;
16077 u64 lifetime, lifetime_maxdata;
16078 u32 lifetime_jitter, handover;
16080 const char *valid_chars = "a-zA-Z0-9_";
16082 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16084 if (unformat (i, "%U %lu %u %u %lu", unformat_token, valid_chars, &name,
16085 &lifetime, &lifetime_jitter, &handover,
16086 &lifetime_maxdata))
16087 vec_add1 (name, 0);
16090 errmsg ("parse error '%U'", format_unformat_error, i);
16095 if (!vec_len (name))
16097 errmsg ("profile name must be specified");
16101 if (vec_len (name) > 64)
16103 errmsg ("profile name too long");
16107 M (IKEV2_SET_SA_LIFETIME, mp);
16109 clib_memcpy (mp->name, name, vec_len (name));
16111 mp->lifetime = lifetime;
16112 mp->lifetime_jitter = lifetime_jitter;
16113 mp->handover = handover;
16114 mp->lifetime_maxdata = lifetime_maxdata;
16122 api_ikev2_initiate_sa_init (vat_main_t * vam)
16124 unformat_input_t *i = vam->input;
16125 vl_api_ikev2_initiate_sa_init_t *mp;
16129 const char *valid_chars = "a-zA-Z0-9_";
16131 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16133 if (unformat (i, "%U", unformat_token, valid_chars, &name))
16134 vec_add1 (name, 0);
16137 errmsg ("parse error '%U'", format_unformat_error, i);
16142 if (!vec_len (name))
16144 errmsg ("profile name must be specified");
16148 if (vec_len (name) > 64)
16150 errmsg ("profile name too long");
16154 M (IKEV2_INITIATE_SA_INIT, mp);
16156 clib_memcpy (mp->name, name, vec_len (name));
16165 api_ikev2_initiate_del_ike_sa (vat_main_t * vam)
16167 unformat_input_t *i = vam->input;
16168 vl_api_ikev2_initiate_del_ike_sa_t *mp;
16173 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16175 if (unformat (i, "%lx", &ispi))
16179 errmsg ("parse error '%U'", format_unformat_error, i);
16184 M (IKEV2_INITIATE_DEL_IKE_SA, mp);
16194 api_ikev2_initiate_del_child_sa (vat_main_t * vam)
16196 unformat_input_t *i = vam->input;
16197 vl_api_ikev2_initiate_del_child_sa_t *mp;
16202 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16204 if (unformat (i, "%x", &ispi))
16208 errmsg ("parse error '%U'", format_unformat_error, i);
16213 M (IKEV2_INITIATE_DEL_CHILD_SA, mp);
16223 api_ikev2_initiate_rekey_child_sa (vat_main_t * vam)
16225 unformat_input_t *i = vam->input;
16226 vl_api_ikev2_initiate_rekey_child_sa_t *mp;
16231 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16233 if (unformat (i, "%x", &ispi))
16237 errmsg ("parse error '%U'", format_unformat_error, i);
16242 M (IKEV2_INITIATE_REKEY_CHILD_SA, mp);
16252 api_get_first_msg_id (vat_main_t * vam)
16254 vl_api_get_first_msg_id_t *mp;
16255 unformat_input_t *i = vam->input;
16260 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16262 if (unformat (i, "client %s", &name))
16270 errmsg ("missing client name");
16273 vec_add1 (name, 0);
16275 if (vec_len (name) > 63)
16277 errmsg ("client name too long");
16281 M (GET_FIRST_MSG_ID, mp);
16282 clib_memcpy (mp->name, name, vec_len (name));
16289 api_cop_interface_enable_disable (vat_main_t * vam)
16291 unformat_input_t *line_input = vam->input;
16292 vl_api_cop_interface_enable_disable_t *mp;
16293 u32 sw_if_index = ~0;
16294 u8 enable_disable = 1;
16297 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16299 if (unformat (line_input, "disable"))
16300 enable_disable = 0;
16301 if (unformat (line_input, "enable"))
16302 enable_disable = 1;
16303 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16304 vam, &sw_if_index))
16306 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16312 if (sw_if_index == ~0)
16314 errmsg ("missing interface name or sw_if_index");
16318 /* Construct the API message */
16319 M (COP_INTERFACE_ENABLE_DISABLE, mp);
16320 mp->sw_if_index = ntohl (sw_if_index);
16321 mp->enable_disable = enable_disable;
16325 /* Wait for the reply */
16331 api_cop_whitelist_enable_disable (vat_main_t * vam)
16333 unformat_input_t *line_input = vam->input;
16334 vl_api_cop_whitelist_enable_disable_t *mp;
16335 u32 sw_if_index = ~0;
16336 u8 ip4 = 0, ip6 = 0, default_cop = 0;
16340 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16342 if (unformat (line_input, "ip4"))
16344 else if (unformat (line_input, "ip6"))
16346 else if (unformat (line_input, "default"))
16348 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16349 vam, &sw_if_index))
16351 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16353 else if (unformat (line_input, "fib-id %d", &fib_id))
16359 if (sw_if_index == ~0)
16361 errmsg ("missing interface name or sw_if_index");
16365 /* Construct the API message */
16366 M (COP_WHITELIST_ENABLE_DISABLE, mp);
16367 mp->sw_if_index = ntohl (sw_if_index);
16368 mp->fib_id = ntohl (fib_id);
16371 mp->default_cop = default_cop;
16375 /* Wait for the reply */
16381 api_get_node_graph (vat_main_t * vam)
16383 vl_api_get_node_graph_t *mp;
16386 M (GET_NODE_GRAPH, mp);
16390 /* Wait for the reply */
16396 /** Used for parsing LISP eids */
16397 typedef CLIB_PACKED(struct{
16398 u8 addr[16]; /**< eid address */
16399 u32 len; /**< prefix length if IP */
16400 u8 type; /**< type of eid */
16405 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
16407 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
16409 clib_memset (a, 0, sizeof (a[0]));
16411 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
16413 a->type = 0; /* ipv4 type */
16415 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
16417 a->type = 1; /* ipv6 type */
16419 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
16421 a->type = 2; /* mac type */
16423 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
16425 a->type = 3; /* NSH type */
16426 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
16427 nsh->spi = clib_host_to_net_u32 (nsh->spi);
16434 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
16443 lisp_eid_size_vat (u8 type)
16460 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
16462 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
16466 api_one_add_del_locator_set (vat_main_t * vam)
16468 unformat_input_t *input = vam->input;
16469 vl_api_one_add_del_locator_set_t *mp;
16471 u8 *locator_set_name = NULL;
16472 u8 locator_set_name_set = 0;
16473 vl_api_local_locator_t locator, *locators = 0;
16474 u32 sw_if_index, priority, weight;
16478 /* Parse args required to build the message */
16479 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16481 if (unformat (input, "del"))
16485 else if (unformat (input, "locator-set %s", &locator_set_name))
16487 locator_set_name_set = 1;
16489 else if (unformat (input, "sw_if_index %u p %u w %u",
16490 &sw_if_index, &priority, &weight))
16492 locator.sw_if_index = htonl (sw_if_index);
16493 locator.priority = priority;
16494 locator.weight = weight;
16495 vec_add1 (locators, locator);
16499 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
16500 &sw_if_index, &priority, &weight))
16502 locator.sw_if_index = htonl (sw_if_index);
16503 locator.priority = priority;
16504 locator.weight = weight;
16505 vec_add1 (locators, locator);
16511 if (locator_set_name_set == 0)
16513 errmsg ("missing locator-set name");
16514 vec_free (locators);
16518 if (vec_len (locator_set_name) > 64)
16520 errmsg ("locator-set name too long");
16521 vec_free (locator_set_name);
16522 vec_free (locators);
16525 vec_add1 (locator_set_name, 0);
16527 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
16529 /* Construct the API message */
16530 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
16532 mp->is_add = is_add;
16533 clib_memcpy (mp->locator_set_name, locator_set_name,
16534 vec_len (locator_set_name));
16535 vec_free (locator_set_name);
16537 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
16539 clib_memcpy (mp->locators, locators, data_len);
16540 vec_free (locators);
16545 /* Wait for a reply... */
16550 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
16553 api_one_add_del_locator (vat_main_t * vam)
16555 unformat_input_t *input = vam->input;
16556 vl_api_one_add_del_locator_t *mp;
16557 u32 tmp_if_index = ~0;
16558 u32 sw_if_index = ~0;
16559 u8 sw_if_index_set = 0;
16560 u8 sw_if_index_if_name_set = 0;
16562 u8 priority_set = 0;
16566 u8 *locator_set_name = NULL;
16567 u8 locator_set_name_set = 0;
16570 /* Parse args required to build the message */
16571 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16573 if (unformat (input, "del"))
16577 else if (unformat (input, "locator-set %s", &locator_set_name))
16579 locator_set_name_set = 1;
16581 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
16584 sw_if_index_if_name_set = 1;
16585 sw_if_index = tmp_if_index;
16587 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
16589 sw_if_index_set = 1;
16590 sw_if_index = tmp_if_index;
16592 else if (unformat (input, "p %d", &priority))
16596 else if (unformat (input, "w %d", &weight))
16604 if (locator_set_name_set == 0)
16606 errmsg ("missing locator-set name");
16610 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
16612 errmsg ("missing sw_if_index");
16613 vec_free (locator_set_name);
16617 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
16619 errmsg ("cannot use both params interface name and sw_if_index");
16620 vec_free (locator_set_name);
16624 if (priority_set == 0)
16626 errmsg ("missing locator-set priority");
16627 vec_free (locator_set_name);
16631 if (weight_set == 0)
16633 errmsg ("missing locator-set weight");
16634 vec_free (locator_set_name);
16638 if (vec_len (locator_set_name) > 64)
16640 errmsg ("locator-set name too long");
16641 vec_free (locator_set_name);
16644 vec_add1 (locator_set_name, 0);
16646 /* Construct the API message */
16647 M (ONE_ADD_DEL_LOCATOR, mp);
16649 mp->is_add = is_add;
16650 mp->sw_if_index = ntohl (sw_if_index);
16651 mp->priority = priority;
16652 mp->weight = weight;
16653 clib_memcpy (mp->locator_set_name, locator_set_name,
16654 vec_len (locator_set_name));
16655 vec_free (locator_set_name);
16660 /* Wait for a reply... */
16665 #define api_lisp_add_del_locator api_one_add_del_locator
16668 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
16670 u32 *key_id = va_arg (*args, u32 *);
16673 if (unformat (input, "%s", &s))
16675 if (!strcmp ((char *) s, "sha1"))
16676 key_id[0] = HMAC_SHA_1_96;
16677 else if (!strcmp ((char *) s, "sha256"))
16678 key_id[0] = HMAC_SHA_256_128;
16681 clib_warning ("invalid key_id: '%s'", s);
16682 key_id[0] = HMAC_NO_KEY;
16693 api_one_add_del_local_eid (vat_main_t * vam)
16695 unformat_input_t *input = vam->input;
16696 vl_api_one_add_del_local_eid_t *mp;
16699 lisp_eid_vat_t _eid, *eid = &_eid;
16700 u8 *locator_set_name = 0;
16701 u8 locator_set_name_set = 0;
16707 /* Parse args required to build the message */
16708 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16710 if (unformat (input, "del"))
16714 else if (unformat (input, "vni %d", &vni))
16718 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
16722 else if (unformat (input, "locator-set %s", &locator_set_name))
16724 locator_set_name_set = 1;
16726 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
16728 else if (unformat (input, "secret-key %_%v%_", &key))
16734 if (locator_set_name_set == 0)
16736 errmsg ("missing locator-set name");
16742 errmsg ("EID address not set!");
16743 vec_free (locator_set_name);
16747 if (key && (0 == key_id))
16749 errmsg ("invalid key_id!");
16753 if (vec_len (key) > 64)
16755 errmsg ("key too long");
16760 if (vec_len (locator_set_name) > 64)
16762 errmsg ("locator-set name too long");
16763 vec_free (locator_set_name);
16766 vec_add1 (locator_set_name, 0);
16768 /* Construct the API message */
16769 M (ONE_ADD_DEL_LOCAL_EID, mp);
16771 mp->is_add = is_add;
16772 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
16773 mp->eid_type = eid->type;
16774 mp->prefix_len = eid->len;
16775 mp->vni = clib_host_to_net_u32 (vni);
16776 mp->key_id = clib_host_to_net_u16 (key_id);
16777 clib_memcpy (mp->locator_set_name, locator_set_name,
16778 vec_len (locator_set_name));
16779 clib_memcpy (mp->key, key, vec_len (key));
16781 vec_free (locator_set_name);
16787 /* Wait for a reply... */
16792 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
16795 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
16797 u32 dp_table = 0, vni = 0;;
16798 unformat_input_t *input = vam->input;
16799 vl_api_gpe_add_del_fwd_entry_t *mp;
16801 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
16802 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
16803 u8 rmt_eid_set = 0, lcl_eid_set = 0;
16804 u32 action = ~0, w;
16805 ip4_address_t rmt_rloc4, lcl_rloc4;
16806 ip6_address_t rmt_rloc6, lcl_rloc6;
16807 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
16810 clib_memset (&rloc, 0, sizeof (rloc));
16812 /* Parse args required to build the message */
16813 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16815 if (unformat (input, "del"))
16817 else if (unformat (input, "add"))
16819 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
16823 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
16827 else if (unformat (input, "vrf %d", &dp_table))
16829 else if (unformat (input, "bd %d", &dp_table))
16831 else if (unformat (input, "vni %d", &vni))
16833 else if (unformat (input, "w %d", &w))
16837 errmsg ("No RLOC configured for setting priority/weight!");
16840 curr_rloc->weight = w;
16842 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
16843 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
16847 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
16849 vec_add1 (lcl_locs, rloc);
16851 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
16852 vec_add1 (rmt_locs, rloc);
16853 /* weight saved in rmt loc */
16854 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16856 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
16857 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
16860 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
16862 vec_add1 (lcl_locs, rloc);
16864 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
16865 vec_add1 (rmt_locs, rloc);
16866 /* weight saved in rmt loc */
16867 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16869 else if (unformat (input, "action %d", &action))
16875 clib_warning ("parse error '%U'", format_unformat_error, input);
16882 errmsg ("remote eid addresses not set");
16886 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
16888 errmsg ("eid types don't match");
16892 if (0 == rmt_locs && (u32) ~ 0 == action)
16894 errmsg ("action not set for negative mapping");
16898 /* Construct the API message */
16899 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
16900 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
16902 mp->is_add = is_add;
16903 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
16904 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
16905 mp->eid_type = rmt_eid->type;
16906 mp->dp_table = clib_host_to_net_u32 (dp_table);
16907 mp->vni = clib_host_to_net_u32 (vni);
16908 mp->rmt_len = rmt_eid->len;
16909 mp->lcl_len = lcl_eid->len;
16910 mp->action = action;
16912 if (0 != rmt_locs && 0 != lcl_locs)
16914 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
16915 clib_memcpy (mp->locs, lcl_locs,
16916 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
16918 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
16919 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
16920 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
16922 vec_free (lcl_locs);
16923 vec_free (rmt_locs);
16928 /* Wait for a reply... */
16934 api_one_add_del_map_server (vat_main_t * vam)
16936 unformat_input_t *input = vam->input;
16937 vl_api_one_add_del_map_server_t *mp;
16941 ip4_address_t ipv4;
16942 ip6_address_t ipv6;
16945 /* Parse args required to build the message */
16946 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16948 if (unformat (input, "del"))
16952 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16956 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16964 if (ipv4_set && ipv6_set)
16966 errmsg ("both eid v4 and v6 addresses set");
16970 if (!ipv4_set && !ipv6_set)
16972 errmsg ("eid addresses not set");
16976 /* Construct the API message */
16977 M (ONE_ADD_DEL_MAP_SERVER, mp);
16979 mp->is_add = is_add;
16983 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16988 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16994 /* Wait for a reply... */
16999 #define api_lisp_add_del_map_server api_one_add_del_map_server
17002 api_one_add_del_map_resolver (vat_main_t * vam)
17004 unformat_input_t *input = vam->input;
17005 vl_api_one_add_del_map_resolver_t *mp;
17009 ip4_address_t ipv4;
17010 ip6_address_t ipv6;
17013 /* Parse args required to build the message */
17014 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17016 if (unformat (input, "del"))
17020 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
17024 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
17032 if (ipv4_set && ipv6_set)
17034 errmsg ("both eid v4 and v6 addresses set");
17038 if (!ipv4_set && !ipv6_set)
17040 errmsg ("eid addresses not set");
17044 /* Construct the API message */
17045 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
17047 mp->is_add = is_add;
17051 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
17056 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
17062 /* Wait for a reply... */
17067 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
17070 api_lisp_gpe_enable_disable (vat_main_t * vam)
17072 unformat_input_t *input = vam->input;
17073 vl_api_gpe_enable_disable_t *mp;
17078 /* Parse args required to build the message */
17079 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17081 if (unformat (input, "enable"))
17086 else if (unformat (input, "disable"))
17097 errmsg ("Value not set");
17101 /* Construct the API message */
17102 M (GPE_ENABLE_DISABLE, mp);
17109 /* Wait for a reply... */
17115 api_one_rloc_probe_enable_disable (vat_main_t * vam)
17117 unformat_input_t *input = vam->input;
17118 vl_api_one_rloc_probe_enable_disable_t *mp;
17123 /* Parse args required to build the message */
17124 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17126 if (unformat (input, "enable"))
17131 else if (unformat (input, "disable"))
17139 errmsg ("Value not set");
17143 /* Construct the API message */
17144 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
17146 mp->is_enabled = is_en;
17151 /* Wait for a reply... */
17156 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
17159 api_one_map_register_enable_disable (vat_main_t * vam)
17161 unformat_input_t *input = vam->input;
17162 vl_api_one_map_register_enable_disable_t *mp;
17167 /* Parse args required to build the message */
17168 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17170 if (unformat (input, "enable"))
17175 else if (unformat (input, "disable"))
17183 errmsg ("Value not set");
17187 /* Construct the API message */
17188 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
17190 mp->is_enabled = is_en;
17195 /* Wait for a reply... */
17200 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
17203 api_one_enable_disable (vat_main_t * vam)
17205 unformat_input_t *input = vam->input;
17206 vl_api_one_enable_disable_t *mp;
17211 /* Parse args required to build the message */
17212 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17214 if (unformat (input, "enable"))
17219 else if (unformat (input, "disable"))
17229 errmsg ("Value not set");
17233 /* Construct the API message */
17234 M (ONE_ENABLE_DISABLE, mp);
17241 /* Wait for a reply... */
17246 #define api_lisp_enable_disable api_one_enable_disable
17249 api_one_enable_disable_xtr_mode (vat_main_t * vam)
17251 unformat_input_t *input = vam->input;
17252 vl_api_one_enable_disable_xtr_mode_t *mp;
17257 /* Parse args required to build the message */
17258 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17260 if (unformat (input, "enable"))
17265 else if (unformat (input, "disable"))
17275 errmsg ("Value not set");
17279 /* Construct the API message */
17280 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
17287 /* Wait for a reply... */
17293 api_one_show_xtr_mode (vat_main_t * vam)
17295 vl_api_one_show_xtr_mode_t *mp;
17298 /* Construct the API message */
17299 M (ONE_SHOW_XTR_MODE, mp);
17304 /* Wait for a reply... */
17310 api_one_enable_disable_pitr_mode (vat_main_t * vam)
17312 unformat_input_t *input = vam->input;
17313 vl_api_one_enable_disable_pitr_mode_t *mp;
17318 /* Parse args required to build the message */
17319 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17321 if (unformat (input, "enable"))
17326 else if (unformat (input, "disable"))
17336 errmsg ("Value not set");
17340 /* Construct the API message */
17341 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
17348 /* Wait for a reply... */
17354 api_one_show_pitr_mode (vat_main_t * vam)
17356 vl_api_one_show_pitr_mode_t *mp;
17359 /* Construct the API message */
17360 M (ONE_SHOW_PITR_MODE, mp);
17365 /* Wait for a reply... */
17371 api_one_enable_disable_petr_mode (vat_main_t * vam)
17373 unformat_input_t *input = vam->input;
17374 vl_api_one_enable_disable_petr_mode_t *mp;
17379 /* Parse args required to build the message */
17380 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17382 if (unformat (input, "enable"))
17387 else if (unformat (input, "disable"))
17397 errmsg ("Value not set");
17401 /* Construct the API message */
17402 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
17409 /* Wait for a reply... */
17415 api_one_show_petr_mode (vat_main_t * vam)
17417 vl_api_one_show_petr_mode_t *mp;
17420 /* Construct the API message */
17421 M (ONE_SHOW_PETR_MODE, mp);
17426 /* Wait for a reply... */
17432 api_show_one_map_register_state (vat_main_t * vam)
17434 vl_api_show_one_map_register_state_t *mp;
17437 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
17442 /* wait for reply */
17447 #define api_show_lisp_map_register_state api_show_one_map_register_state
17450 api_show_one_rloc_probe_state (vat_main_t * vam)
17452 vl_api_show_one_rloc_probe_state_t *mp;
17455 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
17460 /* wait for reply */
17465 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
17468 api_one_add_del_ndp_entry (vat_main_t * vam)
17470 vl_api_one_add_del_ndp_entry_t *mp;
17471 unformat_input_t *input = vam->input;
17476 u8 mac[6] = { 0, };
17477 u8 ip6[16] = { 0, };
17481 /* Parse args required to build the message */
17482 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17484 if (unformat (input, "del"))
17486 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17488 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
17490 else if (unformat (input, "bd %d", &bd))
17494 errmsg ("parse error '%U'", format_unformat_error, input);
17499 if (!bd_set || !ip_set || (!mac_set && is_add))
17501 errmsg ("Missing BD, IP or MAC!");
17505 M (ONE_ADD_DEL_NDP_ENTRY, mp);
17506 mp->is_add = is_add;
17507 clib_memcpy (mp->mac, mac, 6);
17508 mp->bd = clib_host_to_net_u32 (bd);
17509 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
17514 /* wait for reply */
17520 api_one_add_del_l2_arp_entry (vat_main_t * vam)
17522 vl_api_one_add_del_l2_arp_entry_t *mp;
17523 unformat_input_t *input = vam->input;
17528 u8 mac[6] = { 0, };
17529 u32 ip4 = 0, bd = ~0;
17532 /* Parse args required to build the message */
17533 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17535 if (unformat (input, "del"))
17537 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17539 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
17541 else if (unformat (input, "bd %d", &bd))
17545 errmsg ("parse error '%U'", format_unformat_error, input);
17550 if (!bd_set || !ip_set || (!mac_set && is_add))
17552 errmsg ("Missing BD, IP or MAC!");
17556 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
17557 mp->is_add = is_add;
17558 clib_memcpy (mp->mac, mac, 6);
17559 mp->bd = clib_host_to_net_u32 (bd);
17565 /* wait for reply */
17571 api_one_ndp_bd_get (vat_main_t * vam)
17573 vl_api_one_ndp_bd_get_t *mp;
17576 M (ONE_NDP_BD_GET, mp);
17581 /* wait for reply */
17587 api_one_ndp_entries_get (vat_main_t * vam)
17589 vl_api_one_ndp_entries_get_t *mp;
17590 unformat_input_t *input = vam->input;
17595 /* Parse args required to build the message */
17596 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17598 if (unformat (input, "bd %d", &bd))
17602 errmsg ("parse error '%U'", format_unformat_error, input);
17609 errmsg ("Expected bridge domain!");
17613 M (ONE_NDP_ENTRIES_GET, mp);
17614 mp->bd = clib_host_to_net_u32 (bd);
17619 /* wait for reply */
17625 api_one_l2_arp_bd_get (vat_main_t * vam)
17627 vl_api_one_l2_arp_bd_get_t *mp;
17630 M (ONE_L2_ARP_BD_GET, mp);
17635 /* wait for reply */
17641 api_one_l2_arp_entries_get (vat_main_t * vam)
17643 vl_api_one_l2_arp_entries_get_t *mp;
17644 unformat_input_t *input = vam->input;
17649 /* Parse args required to build the message */
17650 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17652 if (unformat (input, "bd %d", &bd))
17656 errmsg ("parse error '%U'", format_unformat_error, input);
17663 errmsg ("Expected bridge domain!");
17667 M (ONE_L2_ARP_ENTRIES_GET, mp);
17668 mp->bd = clib_host_to_net_u32 (bd);
17673 /* wait for reply */
17679 api_one_stats_enable_disable (vat_main_t * vam)
17681 vl_api_one_stats_enable_disable_t *mp;
17682 unformat_input_t *input = vam->input;
17687 /* Parse args required to build the message */
17688 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17690 if (unformat (input, "enable"))
17695 else if (unformat (input, "disable"))
17705 errmsg ("Value not set");
17709 M (ONE_STATS_ENABLE_DISABLE, mp);
17715 /* wait for reply */
17721 api_show_one_stats_enable_disable (vat_main_t * vam)
17723 vl_api_show_one_stats_enable_disable_t *mp;
17726 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
17731 /* wait for reply */
17737 api_show_one_map_request_mode (vat_main_t * vam)
17739 vl_api_show_one_map_request_mode_t *mp;
17742 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
17747 /* wait for reply */
17752 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
17755 api_one_map_request_mode (vat_main_t * vam)
17757 unformat_input_t *input = vam->input;
17758 vl_api_one_map_request_mode_t *mp;
17762 /* Parse args required to build the message */
17763 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17765 if (unformat (input, "dst-only"))
17767 else if (unformat (input, "src-dst"))
17771 errmsg ("parse error '%U'", format_unformat_error, input);
17776 M (ONE_MAP_REQUEST_MODE, mp);
17783 /* wait for reply */
17788 #define api_lisp_map_request_mode api_one_map_request_mode
17791 * Enable/disable ONE proxy ITR.
17793 * @param vam vpp API test context
17794 * @return return code
17797 api_one_pitr_set_locator_set (vat_main_t * vam)
17799 u8 ls_name_set = 0;
17800 unformat_input_t *input = vam->input;
17801 vl_api_one_pitr_set_locator_set_t *mp;
17806 /* Parse args required to build the message */
17807 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17809 if (unformat (input, "del"))
17811 else if (unformat (input, "locator-set %s", &ls_name))
17815 errmsg ("parse error '%U'", format_unformat_error, input);
17822 errmsg ("locator-set name not set!");
17826 M (ONE_PITR_SET_LOCATOR_SET, mp);
17828 mp->is_add = is_add;
17829 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17830 vec_free (ls_name);
17835 /* wait for reply */
17840 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
17843 api_one_nsh_set_locator_set (vat_main_t * vam)
17845 u8 ls_name_set = 0;
17846 unformat_input_t *input = vam->input;
17847 vl_api_one_nsh_set_locator_set_t *mp;
17852 /* Parse args required to build the message */
17853 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17855 if (unformat (input, "del"))
17857 else if (unformat (input, "ls %s", &ls_name))
17861 errmsg ("parse error '%U'", format_unformat_error, input);
17866 if (!ls_name_set && is_add)
17868 errmsg ("locator-set name not set!");
17872 M (ONE_NSH_SET_LOCATOR_SET, mp);
17874 mp->is_add = is_add;
17875 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17876 vec_free (ls_name);
17881 /* wait for reply */
17887 api_show_one_pitr (vat_main_t * vam)
17889 vl_api_show_one_pitr_t *mp;
17892 if (!vam->json_output)
17894 print (vam->ofp, "%=20s", "lisp status:");
17897 M (SHOW_ONE_PITR, mp);
17901 /* Wait for a reply... */
17906 #define api_show_lisp_pitr api_show_one_pitr
17909 api_one_use_petr (vat_main_t * vam)
17911 unformat_input_t *input = vam->input;
17912 vl_api_one_use_petr_t *mp;
17917 clib_memset (&ip, 0, sizeof (ip));
17919 /* Parse args required to build the message */
17920 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17922 if (unformat (input, "disable"))
17925 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
17928 ip_addr_version (&ip) = IP4;
17931 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
17934 ip_addr_version (&ip) = IP6;
17938 errmsg ("parse error '%U'", format_unformat_error, input);
17943 M (ONE_USE_PETR, mp);
17945 mp->is_add = is_add;
17948 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
17950 clib_memcpy (mp->address, &ip, 4);
17952 clib_memcpy (mp->address, &ip, 16);
17958 /* wait for reply */
17963 #define api_lisp_use_petr api_one_use_petr
17966 api_show_one_nsh_mapping (vat_main_t * vam)
17968 vl_api_show_one_use_petr_t *mp;
17971 if (!vam->json_output)
17973 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
17976 M (SHOW_ONE_NSH_MAPPING, mp);
17980 /* Wait for a reply... */
17986 api_show_one_use_petr (vat_main_t * vam)
17988 vl_api_show_one_use_petr_t *mp;
17991 if (!vam->json_output)
17993 print (vam->ofp, "%=20s", "Proxy-ETR status:");
17996 M (SHOW_ONE_USE_PETR, mp);
18000 /* Wait for a reply... */
18005 #define api_show_lisp_use_petr api_show_one_use_petr
18008 * Add/delete mapping between vni and vrf
18011 api_one_eid_table_add_del_map (vat_main_t * vam)
18013 unformat_input_t *input = vam->input;
18014 vl_api_one_eid_table_add_del_map_t *mp;
18015 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
18016 u32 vni, vrf, bd_index;
18019 /* Parse args required to build the message */
18020 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18022 if (unformat (input, "del"))
18024 else if (unformat (input, "vrf %d", &vrf))
18026 else if (unformat (input, "bd_index %d", &bd_index))
18028 else if (unformat (input, "vni %d", &vni))
18034 if (!vni_set || (!vrf_set && !bd_index_set))
18036 errmsg ("missing arguments!");
18040 if (vrf_set && bd_index_set)
18042 errmsg ("error: both vrf and bd entered!");
18046 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
18048 mp->is_add = is_add;
18049 mp->vni = htonl (vni);
18050 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
18051 mp->is_l2 = bd_index_set;
18056 /* wait for reply */
18061 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
18064 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
18066 u32 *action = va_arg (*args, u32 *);
18069 if (unformat (input, "%s", &s))
18071 if (!strcmp ((char *) s, "no-action"))
18073 else if (!strcmp ((char *) s, "natively-forward"))
18075 else if (!strcmp ((char *) s, "send-map-request"))
18077 else if (!strcmp ((char *) s, "drop"))
18081 clib_warning ("invalid action: '%s'", s);
18093 * Add/del remote mapping to/from ONE control plane
18095 * @param vam vpp API test context
18096 * @return return code
18099 api_one_add_del_remote_mapping (vat_main_t * vam)
18101 unformat_input_t *input = vam->input;
18102 vl_api_one_add_del_remote_mapping_t *mp;
18104 lisp_eid_vat_t _eid, *eid = &_eid;
18105 lisp_eid_vat_t _seid, *seid = &_seid;
18106 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
18107 u32 action = ~0, p, w, data_len;
18108 ip4_address_t rloc4;
18109 ip6_address_t rloc6;
18110 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
18113 clib_memset (&rloc, 0, sizeof (rloc));
18115 /* Parse args required to build the message */
18116 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18118 if (unformat (input, "del-all"))
18122 else if (unformat (input, "del"))
18126 else if (unformat (input, "add"))
18130 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
18134 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
18138 else if (unformat (input, "vni %d", &vni))
18142 else if (unformat (input, "p %d w %d", &p, &w))
18146 errmsg ("No RLOC configured for setting priority/weight!");
18149 curr_rloc->priority = p;
18150 curr_rloc->weight = w;
18152 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
18155 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
18156 vec_add1 (rlocs, rloc);
18157 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18159 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
18162 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
18163 vec_add1 (rlocs, rloc);
18164 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18166 else if (unformat (input, "action %U",
18167 unformat_negative_mapping_action, &action))
18173 clib_warning ("parse error '%U'", format_unformat_error, input);
18180 errmsg ("missing params!");
18184 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
18186 errmsg ("no action set for negative map-reply!");
18190 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
18192 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
18193 mp->is_add = is_add;
18194 mp->vni = htonl (vni);
18195 mp->action = (u8) action;
18196 mp->is_src_dst = seid_set;
18197 mp->eid_len = eid->len;
18198 mp->seid_len = seid->len;
18199 mp->del_all = del_all;
18200 mp->eid_type = eid->type;
18201 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
18202 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
18204 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
18205 clib_memcpy (mp->rlocs, rlocs, data_len);
18211 /* Wait for a reply... */
18216 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
18219 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
18220 * forwarding entries in data-plane accordingly.
18222 * @param vam vpp API test context
18223 * @return return code
18226 api_one_add_del_adjacency (vat_main_t * vam)
18228 unformat_input_t *input = vam->input;
18229 vl_api_one_add_del_adjacency_t *mp;
18231 ip4_address_t leid4, reid4;
18232 ip6_address_t leid6, reid6;
18233 u8 reid_mac[6] = { 0 };
18234 u8 leid_mac[6] = { 0 };
18235 u8 reid_type, leid_type;
18236 u32 leid_len = 0, reid_len = 0, len;
18240 leid_type = reid_type = (u8) ~ 0;
18242 /* Parse args required to build the message */
18243 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18245 if (unformat (input, "del"))
18249 else if (unformat (input, "add"))
18253 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
18256 reid_type = 0; /* ipv4 */
18259 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
18262 reid_type = 1; /* ipv6 */
18265 else if (unformat (input, "reid %U", unformat_ethernet_address,
18268 reid_type = 2; /* mac */
18270 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
18273 leid_type = 0; /* ipv4 */
18276 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
18279 leid_type = 1; /* ipv6 */
18282 else if (unformat (input, "leid %U", unformat_ethernet_address,
18285 leid_type = 2; /* mac */
18287 else if (unformat (input, "vni %d", &vni))
18293 errmsg ("parse error '%U'", format_unformat_error, input);
18298 if ((u8) ~ 0 == reid_type)
18300 errmsg ("missing params!");
18304 if (leid_type != reid_type)
18306 errmsg ("remote and local EIDs are of different types!");
18310 M (ONE_ADD_DEL_ADJACENCY, mp);
18311 mp->is_add = is_add;
18312 mp->vni = htonl (vni);
18313 mp->leid_len = leid_len;
18314 mp->reid_len = reid_len;
18315 mp->eid_type = reid_type;
18317 switch (mp->eid_type)
18320 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
18321 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
18324 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
18325 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
18328 clib_memcpy (mp->leid, leid_mac, 6);
18329 clib_memcpy (mp->reid, reid_mac, 6);
18332 errmsg ("unknown EID type %d!", mp->eid_type);
18339 /* Wait for a reply... */
18344 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
18347 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
18349 u32 *mode = va_arg (*args, u32 *);
18351 if (unformat (input, "lisp"))
18353 else if (unformat (input, "vxlan"))
18362 api_gpe_get_encap_mode (vat_main_t * vam)
18364 vl_api_gpe_get_encap_mode_t *mp;
18367 /* Construct the API message */
18368 M (GPE_GET_ENCAP_MODE, mp);
18373 /* Wait for a reply... */
18379 api_gpe_set_encap_mode (vat_main_t * vam)
18381 unformat_input_t *input = vam->input;
18382 vl_api_gpe_set_encap_mode_t *mp;
18386 /* Parse args required to build the message */
18387 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18389 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
18395 /* Construct the API message */
18396 M (GPE_SET_ENCAP_MODE, mp);
18403 /* Wait for a reply... */
18409 api_lisp_gpe_add_del_iface (vat_main_t * vam)
18411 unformat_input_t *input = vam->input;
18412 vl_api_gpe_add_del_iface_t *mp;
18413 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
18414 u32 dp_table = 0, vni = 0;
18417 /* Parse args required to build the message */
18418 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18420 if (unformat (input, "up"))
18425 else if (unformat (input, "down"))
18430 else if (unformat (input, "table_id %d", &dp_table))
18434 else if (unformat (input, "bd_id %d", &dp_table))
18439 else if (unformat (input, "vni %d", &vni))
18447 if (action_set == 0)
18449 errmsg ("Action not set");
18452 if (dp_table_set == 0 || vni_set == 0)
18454 errmsg ("vni and dp_table must be set");
18458 /* Construct the API message */
18459 M (GPE_ADD_DEL_IFACE, mp);
18461 mp->is_add = is_add;
18462 mp->dp_table = clib_host_to_net_u32 (dp_table);
18464 mp->vni = clib_host_to_net_u32 (vni);
18469 /* Wait for a reply... */
18475 api_one_map_register_fallback_threshold (vat_main_t * vam)
18477 unformat_input_t *input = vam->input;
18478 vl_api_one_map_register_fallback_threshold_t *mp;
18483 /* Parse args required to build the message */
18484 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18486 if (unformat (input, "%u", &value))
18490 clib_warning ("parse error '%U'", format_unformat_error, input);
18497 errmsg ("fallback threshold value is missing!");
18501 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18502 mp->value = clib_host_to_net_u32 (value);
18507 /* Wait for a reply... */
18513 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
18515 vl_api_show_one_map_register_fallback_threshold_t *mp;
18518 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18523 /* Wait for a reply... */
18529 unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
18531 u32 *proto = va_arg (*args, u32 *);
18533 if (unformat (input, "udp"))
18535 else if (unformat (input, "api"))
18544 api_one_set_transport_protocol (vat_main_t * vam)
18546 unformat_input_t *input = vam->input;
18547 vl_api_one_set_transport_protocol_t *mp;
18552 /* Parse args required to build the message */
18553 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18555 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
18559 clib_warning ("parse error '%U'", format_unformat_error, input);
18566 errmsg ("Transport protocol missing!");
18570 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
18571 mp->protocol = (u8) protocol;
18576 /* Wait for a reply... */
18582 api_one_get_transport_protocol (vat_main_t * vam)
18584 vl_api_one_get_transport_protocol_t *mp;
18587 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
18592 /* Wait for a reply... */
18598 api_one_map_register_set_ttl (vat_main_t * vam)
18600 unformat_input_t *input = vam->input;
18601 vl_api_one_map_register_set_ttl_t *mp;
18606 /* Parse args required to build the message */
18607 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18609 if (unformat (input, "%u", &ttl))
18613 clib_warning ("parse error '%U'", format_unformat_error, input);
18620 errmsg ("TTL value missing!");
18624 M (ONE_MAP_REGISTER_SET_TTL, mp);
18625 mp->ttl = clib_host_to_net_u32 (ttl);
18630 /* Wait for a reply... */
18636 api_show_one_map_register_ttl (vat_main_t * vam)
18638 vl_api_show_one_map_register_ttl_t *mp;
18641 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
18646 /* Wait for a reply... */
18652 * Add/del map request itr rlocs from ONE control plane and updates
18654 * @param vam vpp API test context
18655 * @return return code
18658 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
18660 unformat_input_t *input = vam->input;
18661 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
18662 u8 *locator_set_name = 0;
18663 u8 locator_set_name_set = 0;
18667 /* Parse args required to build the message */
18668 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18670 if (unformat (input, "del"))
18674 else if (unformat (input, "%_%v%_", &locator_set_name))
18676 locator_set_name_set = 1;
18680 clib_warning ("parse error '%U'", format_unformat_error, input);
18685 if (is_add && !locator_set_name_set)
18687 errmsg ("itr-rloc is not set!");
18691 if (is_add && vec_len (locator_set_name) > 64)
18693 errmsg ("itr-rloc locator-set name too long");
18694 vec_free (locator_set_name);
18698 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
18699 mp->is_add = is_add;
18702 clib_memcpy (mp->locator_set_name, locator_set_name,
18703 vec_len (locator_set_name));
18707 clib_memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
18709 vec_free (locator_set_name);
18714 /* Wait for a reply... */
18719 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
18722 api_one_locator_dump (vat_main_t * vam)
18724 unformat_input_t *input = vam->input;
18725 vl_api_one_locator_dump_t *mp;
18726 vl_api_control_ping_t *mp_ping;
18727 u8 is_index_set = 0, is_name_set = 0;
18732 /* Parse args required to build the message */
18733 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18735 if (unformat (input, "ls_name %_%v%_", &ls_name))
18739 else if (unformat (input, "ls_index %d", &ls_index))
18745 errmsg ("parse error '%U'", format_unformat_error, input);
18750 if (!is_index_set && !is_name_set)
18752 errmsg ("error: expected one of index or name!");
18756 if (is_index_set && is_name_set)
18758 errmsg ("error: only one param expected!");
18762 if (vec_len (ls_name) > 62)
18764 errmsg ("error: locator set name too long!");
18768 if (!vam->json_output)
18770 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
18773 M (ONE_LOCATOR_DUMP, mp);
18774 mp->is_index_set = is_index_set;
18777 mp->ls_index = clib_host_to_net_u32 (ls_index);
18780 vec_add1 (ls_name, 0);
18781 strncpy ((char *) mp->ls_name, (char *) ls_name,
18782 sizeof (mp->ls_name) - 1);
18788 /* Use a control ping for synchronization */
18789 MPING (CONTROL_PING, mp_ping);
18792 /* Wait for a reply... */
18797 #define api_lisp_locator_dump api_one_locator_dump
18800 api_one_locator_set_dump (vat_main_t * vam)
18802 vl_api_one_locator_set_dump_t *mp;
18803 vl_api_control_ping_t *mp_ping;
18804 unformat_input_t *input = vam->input;
18808 /* Parse args required to build the message */
18809 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18811 if (unformat (input, "local"))
18815 else if (unformat (input, "remote"))
18821 errmsg ("parse error '%U'", format_unformat_error, input);
18826 if (!vam->json_output)
18828 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
18831 M (ONE_LOCATOR_SET_DUMP, mp);
18833 mp->filter = filter;
18838 /* Use a control ping for synchronization */
18839 MPING (CONTROL_PING, mp_ping);
18842 /* Wait for a reply... */
18847 #define api_lisp_locator_set_dump api_one_locator_set_dump
18850 api_one_eid_table_map_dump (vat_main_t * vam)
18854 unformat_input_t *input = vam->input;
18855 vl_api_one_eid_table_map_dump_t *mp;
18856 vl_api_control_ping_t *mp_ping;
18859 /* Parse args required to build the message */
18860 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18862 if (unformat (input, "l2"))
18867 else if (unformat (input, "l3"))
18874 errmsg ("parse error '%U'", format_unformat_error, input);
18881 errmsg ("expected one of 'l2' or 'l3' parameter!");
18885 if (!vam->json_output)
18887 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
18890 M (ONE_EID_TABLE_MAP_DUMP, mp);
18896 /* Use a control ping for synchronization */
18897 MPING (CONTROL_PING, mp_ping);
18900 /* Wait for a reply... */
18905 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
18908 api_one_eid_table_vni_dump (vat_main_t * vam)
18910 vl_api_one_eid_table_vni_dump_t *mp;
18911 vl_api_control_ping_t *mp_ping;
18914 if (!vam->json_output)
18916 print (vam->ofp, "VNI");
18919 M (ONE_EID_TABLE_VNI_DUMP, mp);
18924 /* Use a control ping for synchronization */
18925 MPING (CONTROL_PING, mp_ping);
18928 /* Wait for a reply... */
18933 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
18936 api_one_eid_table_dump (vat_main_t * vam)
18938 unformat_input_t *i = vam->input;
18939 vl_api_one_eid_table_dump_t *mp;
18940 vl_api_control_ping_t *mp_ping;
18941 struct in_addr ip4;
18942 struct in6_addr ip6;
18944 u8 eid_type = ~0, eid_set = 0;
18945 u32 prefix_length = ~0, t, vni = 0;
18948 lisp_nsh_api_t nsh;
18950 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18952 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
18958 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
18964 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
18969 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
18974 else if (unformat (i, "vni %d", &t))
18978 else if (unformat (i, "local"))
18982 else if (unformat (i, "remote"))
18988 errmsg ("parse error '%U'", format_unformat_error, i);
18993 if (!vam->json_output)
18995 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
18996 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
18999 M (ONE_EID_TABLE_DUMP, mp);
19001 mp->filter = filter;
19005 mp->vni = htonl (vni);
19006 mp->eid_type = eid_type;
19010 mp->prefix_length = prefix_length;
19011 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
19014 mp->prefix_length = prefix_length;
19015 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
19018 clib_memcpy (mp->eid, mac, sizeof (mac));
19021 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
19024 errmsg ("unknown EID type %d!", eid_type);
19032 /* Use a control ping for synchronization */
19033 MPING (CONTROL_PING, mp_ping);
19036 /* Wait for a reply... */
19041 #define api_lisp_eid_table_dump api_one_eid_table_dump
19044 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
19046 unformat_input_t *i = vam->input;
19047 vl_api_gpe_fwd_entries_get_t *mp;
19052 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19054 if (unformat (i, "vni %d", &vni))
19060 errmsg ("parse error '%U'", format_unformat_error, i);
19067 errmsg ("vni not set!");
19071 if (!vam->json_output)
19073 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
19077 M (GPE_FWD_ENTRIES_GET, mp);
19078 mp->vni = clib_host_to_net_u32 (vni);
19083 /* Wait for a reply... */
19088 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
19089 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
19090 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
19091 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
19092 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
19093 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
19094 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
19095 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
19098 api_one_adjacencies_get (vat_main_t * vam)
19100 unformat_input_t *i = vam->input;
19101 vl_api_one_adjacencies_get_t *mp;
19106 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19108 if (unformat (i, "vni %d", &vni))
19114 errmsg ("parse error '%U'", format_unformat_error, i);
19121 errmsg ("vni not set!");
19125 if (!vam->json_output)
19127 print (vam->ofp, "%s %40s", "leid", "reid");
19130 M (ONE_ADJACENCIES_GET, mp);
19131 mp->vni = clib_host_to_net_u32 (vni);
19136 /* Wait for a reply... */
19141 #define api_lisp_adjacencies_get api_one_adjacencies_get
19144 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
19146 unformat_input_t *i = vam->input;
19147 vl_api_gpe_native_fwd_rpaths_get_t *mp;
19149 u8 ip_family_set = 0, is_ip4 = 1;
19151 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19153 if (unformat (i, "ip4"))
19158 else if (unformat (i, "ip6"))
19165 errmsg ("parse error '%U'", format_unformat_error, i);
19170 if (!ip_family_set)
19172 errmsg ("ip family not set!");
19176 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
19177 mp->is_ip4 = is_ip4;
19182 /* Wait for a reply... */
19188 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
19190 vl_api_gpe_fwd_entry_vnis_get_t *mp;
19193 if (!vam->json_output)
19195 print (vam->ofp, "VNIs");
19198 M (GPE_FWD_ENTRY_VNIS_GET, mp);
19203 /* Wait for a reply... */
19209 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
19211 unformat_input_t *i = vam->input;
19212 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
19214 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
19215 struct in_addr ip4;
19216 struct in6_addr ip6;
19217 u32 table_id = 0, nh_sw_if_index = ~0;
19219 clib_memset (&ip4, 0, sizeof (ip4));
19220 clib_memset (&ip6, 0, sizeof (ip6));
19222 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19224 if (unformat (i, "del"))
19226 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
19227 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19232 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
19233 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19238 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
19242 nh_sw_if_index = ~0;
19244 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
19248 nh_sw_if_index = ~0;
19250 else if (unformat (i, "table %d", &table_id))
19254 errmsg ("parse error '%U'", format_unformat_error, i);
19261 errmsg ("nh addr not set!");
19265 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
19266 mp->is_add = is_add;
19267 mp->table_id = clib_host_to_net_u32 (table_id);
19268 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
19269 mp->is_ip4 = is_ip4;
19271 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
19273 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
19278 /* Wait for a reply... */
19284 api_one_map_server_dump (vat_main_t * vam)
19286 vl_api_one_map_server_dump_t *mp;
19287 vl_api_control_ping_t *mp_ping;
19290 if (!vam->json_output)
19292 print (vam->ofp, "%=20s", "Map server");
19295 M (ONE_MAP_SERVER_DUMP, mp);
19299 /* Use a control ping for synchronization */
19300 MPING (CONTROL_PING, mp_ping);
19303 /* Wait for a reply... */
19308 #define api_lisp_map_server_dump api_one_map_server_dump
19311 api_one_map_resolver_dump (vat_main_t * vam)
19313 vl_api_one_map_resolver_dump_t *mp;
19314 vl_api_control_ping_t *mp_ping;
19317 if (!vam->json_output)
19319 print (vam->ofp, "%=20s", "Map resolver");
19322 M (ONE_MAP_RESOLVER_DUMP, mp);
19326 /* Use a control ping for synchronization */
19327 MPING (CONTROL_PING, mp_ping);
19330 /* Wait for a reply... */
19335 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
19338 api_one_stats_flush (vat_main_t * vam)
19340 vl_api_one_stats_flush_t *mp;
19343 M (ONE_STATS_FLUSH, mp);
19350 api_one_stats_dump (vat_main_t * vam)
19352 vl_api_one_stats_dump_t *mp;
19353 vl_api_control_ping_t *mp_ping;
19356 M (ONE_STATS_DUMP, mp);
19360 /* Use a control ping for synchronization */
19361 MPING (CONTROL_PING, mp_ping);
19364 /* Wait for a reply... */
19370 api_show_one_status (vat_main_t * vam)
19372 vl_api_show_one_status_t *mp;
19375 if (!vam->json_output)
19377 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
19380 M (SHOW_ONE_STATUS, mp);
19383 /* Wait for a reply... */
19388 #define api_show_lisp_status api_show_one_status
19391 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
19393 vl_api_gpe_fwd_entry_path_dump_t *mp;
19394 vl_api_control_ping_t *mp_ping;
19395 unformat_input_t *i = vam->input;
19396 u32 fwd_entry_index = ~0;
19399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19401 if (unformat (i, "index %d", &fwd_entry_index))
19407 if (~0 == fwd_entry_index)
19409 errmsg ("no index specified!");
19413 if (!vam->json_output)
19415 print (vam->ofp, "first line");
19418 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
19422 /* Use a control ping for synchronization */
19423 MPING (CONTROL_PING, mp_ping);
19426 /* Wait for a reply... */
19432 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
19434 vl_api_one_get_map_request_itr_rlocs_t *mp;
19437 if (!vam->json_output)
19439 print (vam->ofp, "%=20s", "itr-rlocs:");
19442 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
19445 /* Wait for a reply... */
19450 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
19453 api_af_packet_create (vat_main_t * vam)
19455 unformat_input_t *i = vam->input;
19456 vl_api_af_packet_create_t *mp;
19457 u8 *host_if_name = 0;
19459 u8 random_hw_addr = 1;
19462 clib_memset (hw_addr, 0, sizeof (hw_addr));
19464 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19466 if (unformat (i, "name %s", &host_if_name))
19467 vec_add1 (host_if_name, 0);
19468 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19469 random_hw_addr = 0;
19474 if (!vec_len (host_if_name))
19476 errmsg ("host-interface name must be specified");
19480 if (vec_len (host_if_name) > 64)
19482 errmsg ("host-interface name too long");
19486 M (AF_PACKET_CREATE, mp);
19488 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19489 clib_memcpy (mp->hw_addr, hw_addr, 6);
19490 mp->use_random_hw_addr = random_hw_addr;
19491 vec_free (host_if_name);
19499 fprintf (vam->ofp ? vam->ofp : stderr,
19500 " new sw_if_index = %d\n", vam->sw_if_index);
19507 api_af_packet_delete (vat_main_t * vam)
19509 unformat_input_t *i = vam->input;
19510 vl_api_af_packet_delete_t *mp;
19511 u8 *host_if_name = 0;
19514 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19516 if (unformat (i, "name %s", &host_if_name))
19517 vec_add1 (host_if_name, 0);
19522 if (!vec_len (host_if_name))
19524 errmsg ("host-interface name must be specified");
19528 if (vec_len (host_if_name) > 64)
19530 errmsg ("host-interface name too long");
19534 M (AF_PACKET_DELETE, mp);
19536 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19537 vec_free (host_if_name);
19544 static void vl_api_af_packet_details_t_handler
19545 (vl_api_af_packet_details_t * mp)
19547 vat_main_t *vam = &vat_main;
19549 print (vam->ofp, "%-16s %d",
19550 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
19553 static void vl_api_af_packet_details_t_handler_json
19554 (vl_api_af_packet_details_t * mp)
19556 vat_main_t *vam = &vat_main;
19557 vat_json_node_t *node = NULL;
19559 if (VAT_JSON_ARRAY != vam->json_tree.type)
19561 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19562 vat_json_init_array (&vam->json_tree);
19564 node = vat_json_array_add (&vam->json_tree);
19566 vat_json_init_object (node);
19567 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
19568 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
19572 api_af_packet_dump (vat_main_t * vam)
19574 vl_api_af_packet_dump_t *mp;
19575 vl_api_control_ping_t *mp_ping;
19578 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
19579 /* Get list of tap interfaces */
19580 M (AF_PACKET_DUMP, mp);
19583 /* Use a control ping for synchronization */
19584 MPING (CONTROL_PING, mp_ping);
19592 api_policer_add_del (vat_main_t * vam)
19594 unformat_input_t *i = vam->input;
19595 vl_api_policer_add_del_t *mp;
19605 u8 color_aware = 0;
19606 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
19609 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
19610 conform_action.dscp = 0;
19611 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
19612 exceed_action.dscp = 0;
19613 violate_action.action_type = SSE2_QOS_ACTION_DROP;
19614 violate_action.dscp = 0;
19616 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19618 if (unformat (i, "del"))
19620 else if (unformat (i, "name %s", &name))
19621 vec_add1 (name, 0);
19622 else if (unformat (i, "cir %u", &cir))
19624 else if (unformat (i, "eir %u", &eir))
19626 else if (unformat (i, "cb %u", &cb))
19628 else if (unformat (i, "eb %u", &eb))
19630 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
19633 else if (unformat (i, "round_type %U", unformat_policer_round_type,
19636 else if (unformat (i, "type %U", unformat_policer_type, &type))
19638 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
19641 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
19644 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
19647 else if (unformat (i, "color-aware"))
19653 if (!vec_len (name))
19655 errmsg ("policer name must be specified");
19659 if (vec_len (name) > 64)
19661 errmsg ("policer name too long");
19665 M (POLICER_ADD_DEL, mp);
19667 clib_memcpy (mp->name, name, vec_len (name));
19669 mp->is_add = is_add;
19670 mp->cir = ntohl (cir);
19671 mp->eir = ntohl (eir);
19672 mp->cb = clib_net_to_host_u64 (cb);
19673 mp->eb = clib_net_to_host_u64 (eb);
19674 mp->rate_type = rate_type;
19675 mp->round_type = round_type;
19677 mp->conform_action_type = conform_action.action_type;
19678 mp->conform_dscp = conform_action.dscp;
19679 mp->exceed_action_type = exceed_action.action_type;
19680 mp->exceed_dscp = exceed_action.dscp;
19681 mp->violate_action_type = violate_action.action_type;
19682 mp->violate_dscp = violate_action.dscp;
19683 mp->color_aware = color_aware;
19691 api_policer_dump (vat_main_t * vam)
19693 unformat_input_t *i = vam->input;
19694 vl_api_policer_dump_t *mp;
19695 vl_api_control_ping_t *mp_ping;
19696 u8 *match_name = 0;
19697 u8 match_name_valid = 0;
19700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19702 if (unformat (i, "name %s", &match_name))
19704 vec_add1 (match_name, 0);
19705 match_name_valid = 1;
19711 M (POLICER_DUMP, mp);
19712 mp->match_name_valid = match_name_valid;
19713 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
19714 vec_free (match_name);
19718 /* Use a control ping for synchronization */
19719 MPING (CONTROL_PING, mp_ping);
19722 /* Wait for a reply... */
19728 api_policer_classify_set_interface (vat_main_t * vam)
19730 unformat_input_t *i = vam->input;
19731 vl_api_policer_classify_set_interface_t *mp;
19733 int sw_if_index_set;
19734 u32 ip4_table_index = ~0;
19735 u32 ip6_table_index = ~0;
19736 u32 l2_table_index = ~0;
19740 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19742 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19743 sw_if_index_set = 1;
19744 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19745 sw_if_index_set = 1;
19746 else if (unformat (i, "del"))
19748 else if (unformat (i, "ip4-table %d", &ip4_table_index))
19750 else if (unformat (i, "ip6-table %d", &ip6_table_index))
19752 else if (unformat (i, "l2-table %d", &l2_table_index))
19756 clib_warning ("parse error '%U'", format_unformat_error, i);
19761 if (sw_if_index_set == 0)
19763 errmsg ("missing interface name or sw_if_index");
19767 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
19769 mp->sw_if_index = ntohl (sw_if_index);
19770 mp->ip4_table_index = ntohl (ip4_table_index);
19771 mp->ip6_table_index = ntohl (ip6_table_index);
19772 mp->l2_table_index = ntohl (l2_table_index);
19773 mp->is_add = is_add;
19781 api_policer_classify_dump (vat_main_t * vam)
19783 unformat_input_t *i = vam->input;
19784 vl_api_policer_classify_dump_t *mp;
19785 vl_api_control_ping_t *mp_ping;
19786 u8 type = POLICER_CLASSIFY_N_TABLES;
19789 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
19793 errmsg ("classify table type must be specified");
19797 if (!vam->json_output)
19799 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
19802 M (POLICER_CLASSIFY_DUMP, mp);
19807 /* Use a control ping for synchronization */
19808 MPING (CONTROL_PING, mp_ping);
19811 /* Wait for a reply... */
19817 api_netmap_create (vat_main_t * vam)
19819 unformat_input_t *i = vam->input;
19820 vl_api_netmap_create_t *mp;
19823 u8 random_hw_addr = 1;
19828 clib_memset (hw_addr, 0, sizeof (hw_addr));
19830 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19832 if (unformat (i, "name %s", &if_name))
19833 vec_add1 (if_name, 0);
19834 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19835 random_hw_addr = 0;
19836 else if (unformat (i, "pipe"))
19838 else if (unformat (i, "master"))
19840 else if (unformat (i, "slave"))
19846 if (!vec_len (if_name))
19848 errmsg ("interface name must be specified");
19852 if (vec_len (if_name) > 64)
19854 errmsg ("interface name too long");
19858 M (NETMAP_CREATE, mp);
19860 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19861 clib_memcpy (mp->hw_addr, hw_addr, 6);
19862 mp->use_random_hw_addr = random_hw_addr;
19863 mp->is_pipe = is_pipe;
19864 mp->is_master = is_master;
19865 vec_free (if_name);
19873 api_netmap_delete (vat_main_t * vam)
19875 unformat_input_t *i = vam->input;
19876 vl_api_netmap_delete_t *mp;
19880 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19882 if (unformat (i, "name %s", &if_name))
19883 vec_add1 (if_name, 0);
19888 if (!vec_len (if_name))
19890 errmsg ("interface name must be specified");
19894 if (vec_len (if_name) > 64)
19896 errmsg ("interface name too long");
19900 M (NETMAP_DELETE, mp);
19902 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19903 vec_free (if_name);
19911 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
19913 if (fp->afi == IP46_TYPE_IP6)
19915 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19916 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19917 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19918 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19919 format_ip6_address, fp->next_hop);
19920 else if (fp->afi == IP46_TYPE_IP4)
19922 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19923 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19924 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19925 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19926 format_ip4_address, fp->next_hop);
19930 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
19931 vl_api_fib_path_t * fp)
19933 struct in_addr ip4;
19934 struct in6_addr ip6;
19936 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19937 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19938 vat_json_object_add_uint (node, "is_local", fp->is_local);
19939 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19940 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19941 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19942 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19943 if (fp->afi == IP46_TYPE_IP4)
19945 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19946 vat_json_object_add_ip4 (node, "next_hop", ip4);
19948 else if (fp->afi == IP46_TYPE_IP6)
19950 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19951 vat_json_object_add_ip6 (node, "next_hop", ip6);
19956 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
19958 vat_main_t *vam = &vat_main;
19959 int count = ntohl (mp->mt_count);
19960 vl_api_fib_path_t *fp;
19963 print (vam->ofp, "[%d]: sw_if_index %d via:",
19964 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
19966 for (i = 0; i < count; i++)
19968 vl_api_mpls_fib_path_print (vam, fp);
19972 print (vam->ofp, "");
19975 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
19976 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
19979 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
19981 vat_main_t *vam = &vat_main;
19982 vat_json_node_t *node = NULL;
19983 int count = ntohl (mp->mt_count);
19984 vl_api_fib_path_t *fp;
19987 if (VAT_JSON_ARRAY != vam->json_tree.type)
19989 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19990 vat_json_init_array (&vam->json_tree);
19992 node = vat_json_array_add (&vam->json_tree);
19994 vat_json_init_object (node);
19995 vat_json_object_add_uint (node, "tunnel_index",
19996 ntohl (mp->mt_tunnel_index));
19997 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
19999 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
20002 for (i = 0; i < count; i++)
20004 vl_api_mpls_fib_path_json_print (node, fp);
20010 api_mpls_tunnel_dump (vat_main_t * vam)
20012 vl_api_mpls_tunnel_dump_t *mp;
20013 vl_api_control_ping_t *mp_ping;
20014 u32 sw_if_index = ~0;
20017 /* Parse args required to build the message */
20018 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
20020 if (unformat (vam->input, "sw_if_index %d", &sw_if_index))
20024 print (vam->ofp, " sw_if_index %d", sw_if_index);
20026 M (MPLS_TUNNEL_DUMP, mp);
20027 mp->sw_if_index = htonl (sw_if_index);
20030 /* Use a control ping for synchronization */
20031 MPING (CONTROL_PING, mp_ping);
20038 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
20039 #define vl_api_mpls_fib_details_t_print vl_noop_handler
20043 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
20045 vat_main_t *vam = &vat_main;
20046 int count = ntohl (mp->count);
20047 vl_api_fib_path_t *fp;
20051 "table-id %d, label %u, ess_bit %u",
20052 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
20054 for (i = 0; i < count; i++)
20056 vl_api_mpls_fib_path_print (vam, fp);
20061 static void vl_api_mpls_fib_details_t_handler_json
20062 (vl_api_mpls_fib_details_t * mp)
20064 vat_main_t *vam = &vat_main;
20065 int count = ntohl (mp->count);
20066 vat_json_node_t *node = NULL;
20067 vl_api_fib_path_t *fp;
20070 if (VAT_JSON_ARRAY != vam->json_tree.type)
20072 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20073 vat_json_init_array (&vam->json_tree);
20075 node = vat_json_array_add (&vam->json_tree);
20077 vat_json_init_object (node);
20078 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20079 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
20080 vat_json_object_add_uint (node, "label", ntohl (mp->label));
20081 vat_json_object_add_uint (node, "path_count", count);
20083 for (i = 0; i < count; i++)
20085 vl_api_mpls_fib_path_json_print (node, fp);
20091 api_mpls_fib_dump (vat_main_t * vam)
20093 vl_api_mpls_fib_dump_t *mp;
20094 vl_api_control_ping_t *mp_ping;
20097 M (MPLS_FIB_DUMP, mp);
20100 /* Use a control ping for synchronization */
20101 MPING (CONTROL_PING, mp_ping);
20108 #define vl_api_ip_fib_details_t_endian vl_noop_handler
20109 #define vl_api_ip_fib_details_t_print vl_noop_handler
20112 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
20114 vat_main_t *vam = &vat_main;
20115 int count = ntohl (mp->count);
20116 vl_api_fib_path_t *fp;
20120 "table-id %d, prefix %U/%d stats-index %d",
20121 ntohl (mp->table_id), format_ip4_address, mp->address,
20122 mp->address_length, ntohl (mp->stats_index));
20124 for (i = 0; i < count; i++)
20126 if (fp->afi == IP46_TYPE_IP6)
20128 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20129 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20130 "next_hop_table %d",
20131 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20132 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20133 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
20134 else if (fp->afi == IP46_TYPE_IP4)
20136 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20137 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20138 "next_hop_table %d",
20139 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20140 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20141 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
20146 static void vl_api_ip_fib_details_t_handler_json
20147 (vl_api_ip_fib_details_t * mp)
20149 vat_main_t *vam = &vat_main;
20150 int count = ntohl (mp->count);
20151 vat_json_node_t *node = NULL;
20152 struct in_addr ip4;
20153 struct in6_addr ip6;
20154 vl_api_fib_path_t *fp;
20157 if (VAT_JSON_ARRAY != vam->json_tree.type)
20159 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20160 vat_json_init_array (&vam->json_tree);
20162 node = vat_json_array_add (&vam->json_tree);
20164 vat_json_init_object (node);
20165 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20166 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
20167 vat_json_object_add_ip4 (node, "prefix", ip4);
20168 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20169 vat_json_object_add_uint (node, "path_count", count);
20171 for (i = 0; i < count; i++)
20173 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20174 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20175 vat_json_object_add_uint (node, "is_local", fp->is_local);
20176 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20177 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20178 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20179 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20180 if (fp->afi == IP46_TYPE_IP4)
20182 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20183 vat_json_object_add_ip4 (node, "next_hop", ip4);
20185 else if (fp->afi == IP46_TYPE_IP6)
20187 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20188 vat_json_object_add_ip6 (node, "next_hop", ip6);
20194 api_ip_fib_dump (vat_main_t * vam)
20196 vl_api_ip_fib_dump_t *mp;
20197 vl_api_control_ping_t *mp_ping;
20200 M (IP_FIB_DUMP, mp);
20203 /* Use a control ping for synchronization */
20204 MPING (CONTROL_PING, mp_ping);
20212 api_ip_mfib_dump (vat_main_t * vam)
20214 vl_api_ip_mfib_dump_t *mp;
20215 vl_api_control_ping_t *mp_ping;
20218 M (IP_MFIB_DUMP, mp);
20221 /* Use a control ping for synchronization */
20222 MPING (CONTROL_PING, mp_ping);
20229 static void vl_api_ip_neighbor_details_t_handler
20230 (vl_api_ip_neighbor_details_t * mp)
20232 vat_main_t *vam = &vat_main;
20234 print (vam->ofp, "%c %U %U",
20235 (mp->is_static) ? 'S' : 'D',
20236 format_ethernet_address, &mp->mac_address,
20237 (mp->is_ipv6) ? format_ip6_address : format_ip4_address,
20241 static void vl_api_ip_neighbor_details_t_handler_json
20242 (vl_api_ip_neighbor_details_t * mp)
20245 vat_main_t *vam = &vat_main;
20246 vat_json_node_t *node;
20247 struct in_addr ip4;
20248 struct in6_addr ip6;
20250 if (VAT_JSON_ARRAY != vam->json_tree.type)
20252 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20253 vat_json_init_array (&vam->json_tree);
20255 node = vat_json_array_add (&vam->json_tree);
20257 vat_json_init_object (node);
20258 vat_json_object_add_string_copy (node, "flag",
20259 (mp->is_static) ? (u8 *) "static" : (u8 *)
20262 vat_json_object_add_string_copy (node, "link_layer",
20263 format (0, "%U", format_ethernet_address,
20264 &mp->mac_address));
20268 clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6));
20269 vat_json_object_add_ip6 (node, "ip_address", ip6);
20273 clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4));
20274 vat_json_object_add_ip4 (node, "ip_address", ip4);
20279 api_ip_neighbor_dump (vat_main_t * vam)
20281 unformat_input_t *i = vam->input;
20282 vl_api_ip_neighbor_dump_t *mp;
20283 vl_api_control_ping_t *mp_ping;
20285 u32 sw_if_index = ~0;
20288 /* Parse args required to build the message */
20289 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20291 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20293 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20295 else if (unformat (i, "ip6"))
20301 if (sw_if_index == ~0)
20303 errmsg ("missing interface name or sw_if_index");
20307 M (IP_NEIGHBOR_DUMP, mp);
20308 mp->is_ipv6 = (u8) is_ipv6;
20309 mp->sw_if_index = ntohl (sw_if_index);
20312 /* Use a control ping for synchronization */
20313 MPING (CONTROL_PING, mp_ping);
20320 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
20321 #define vl_api_ip6_fib_details_t_print vl_noop_handler
20324 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
20326 vat_main_t *vam = &vat_main;
20327 int count = ntohl (mp->count);
20328 vl_api_fib_path_t *fp;
20332 "table-id %d, prefix %U/%d stats-index %d",
20333 ntohl (mp->table_id), format_ip6_address, mp->address,
20334 mp->address_length, ntohl (mp->stats_index));
20336 for (i = 0; i < count; i++)
20338 if (fp->afi == IP46_TYPE_IP6)
20340 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20341 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20342 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20343 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20344 format_ip6_address, fp->next_hop);
20345 else if (fp->afi == IP46_TYPE_IP4)
20347 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20348 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20349 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20350 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20351 format_ip4_address, fp->next_hop);
20356 static void vl_api_ip6_fib_details_t_handler_json
20357 (vl_api_ip6_fib_details_t * mp)
20359 vat_main_t *vam = &vat_main;
20360 int count = ntohl (mp->count);
20361 vat_json_node_t *node = NULL;
20362 struct in_addr ip4;
20363 struct in6_addr ip6;
20364 vl_api_fib_path_t *fp;
20367 if (VAT_JSON_ARRAY != vam->json_tree.type)
20369 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20370 vat_json_init_array (&vam->json_tree);
20372 node = vat_json_array_add (&vam->json_tree);
20374 vat_json_init_object (node);
20375 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20376 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
20377 vat_json_object_add_ip6 (node, "prefix", ip6);
20378 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20379 vat_json_object_add_uint (node, "path_count", count);
20381 for (i = 0; i < count; i++)
20383 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20384 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20385 vat_json_object_add_uint (node, "is_local", fp->is_local);
20386 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20387 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20388 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20389 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20390 if (fp->afi == IP46_TYPE_IP4)
20392 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20393 vat_json_object_add_ip4 (node, "next_hop", ip4);
20395 else if (fp->afi == IP46_TYPE_IP6)
20397 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20398 vat_json_object_add_ip6 (node, "next_hop", ip6);
20404 api_ip6_fib_dump (vat_main_t * vam)
20406 vl_api_ip6_fib_dump_t *mp;
20407 vl_api_control_ping_t *mp_ping;
20410 M (IP6_FIB_DUMP, mp);
20413 /* Use a control ping for synchronization */
20414 MPING (CONTROL_PING, mp_ping);
20422 api_ip6_mfib_dump (vat_main_t * vam)
20424 vl_api_ip6_mfib_dump_t *mp;
20425 vl_api_control_ping_t *mp_ping;
20428 M (IP6_MFIB_DUMP, mp);
20431 /* Use a control ping for synchronization */
20432 MPING (CONTROL_PING, mp_ping);
20440 api_classify_table_ids (vat_main_t * vam)
20442 vl_api_classify_table_ids_t *mp;
20445 /* Construct the API message */
20446 M (CLASSIFY_TABLE_IDS, mp);
20455 api_classify_table_by_interface (vat_main_t * vam)
20457 unformat_input_t *input = vam->input;
20458 vl_api_classify_table_by_interface_t *mp;
20460 u32 sw_if_index = ~0;
20462 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20464 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20466 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20471 if (sw_if_index == ~0)
20473 errmsg ("missing interface name or sw_if_index");
20477 /* Construct the API message */
20478 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
20480 mp->sw_if_index = ntohl (sw_if_index);
20488 api_classify_table_info (vat_main_t * vam)
20490 unformat_input_t *input = vam->input;
20491 vl_api_classify_table_info_t *mp;
20495 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20497 if (unformat (input, "table_id %d", &table_id))
20502 if (table_id == ~0)
20504 errmsg ("missing table id");
20508 /* Construct the API message */
20509 M (CLASSIFY_TABLE_INFO, mp);
20511 mp->table_id = ntohl (table_id);
20519 api_classify_session_dump (vat_main_t * vam)
20521 unformat_input_t *input = vam->input;
20522 vl_api_classify_session_dump_t *mp;
20523 vl_api_control_ping_t *mp_ping;
20527 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20529 if (unformat (input, "table_id %d", &table_id))
20534 if (table_id == ~0)
20536 errmsg ("missing table id");
20540 /* Construct the API message */
20541 M (CLASSIFY_SESSION_DUMP, mp);
20543 mp->table_id = ntohl (table_id);
20546 /* Use a control ping for synchronization */
20547 MPING (CONTROL_PING, mp_ping);
20555 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
20557 vat_main_t *vam = &vat_main;
20559 print (vam->ofp, "collector_address %U, collector_port %d, "
20560 "src_address %U, vrf_id %d, path_mtu %u, "
20561 "template_interval %u, udp_checksum %d",
20562 format_ip4_address, mp->collector_address,
20563 ntohs (mp->collector_port),
20564 format_ip4_address, mp->src_address,
20565 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
20566 ntohl (mp->template_interval), mp->udp_checksum);
20569 vam->result_ready = 1;
20573 vl_api_ipfix_exporter_details_t_handler_json
20574 (vl_api_ipfix_exporter_details_t * mp)
20576 vat_main_t *vam = &vat_main;
20577 vat_json_node_t node;
20578 struct in_addr collector_address;
20579 struct in_addr src_address;
20581 vat_json_init_object (&node);
20582 clib_memcpy (&collector_address, &mp->collector_address,
20583 sizeof (collector_address));
20584 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
20585 vat_json_object_add_uint (&node, "collector_port",
20586 ntohs (mp->collector_port));
20587 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
20588 vat_json_object_add_ip4 (&node, "src_address", src_address);
20589 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
20590 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
20591 vat_json_object_add_uint (&node, "template_interval",
20592 ntohl (mp->template_interval));
20593 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
20595 vat_json_print (vam->ofp, &node);
20596 vat_json_free (&node);
20598 vam->result_ready = 1;
20602 api_ipfix_exporter_dump (vat_main_t * vam)
20604 vl_api_ipfix_exporter_dump_t *mp;
20607 /* Construct the API message */
20608 M (IPFIX_EXPORTER_DUMP, mp);
20617 api_ipfix_classify_stream_dump (vat_main_t * vam)
20619 vl_api_ipfix_classify_stream_dump_t *mp;
20622 /* Construct the API message */
20623 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
20634 vl_api_ipfix_classify_stream_details_t_handler
20635 (vl_api_ipfix_classify_stream_details_t * mp)
20637 vat_main_t *vam = &vat_main;
20638 print (vam->ofp, "domain_id %d, src_port %d",
20639 ntohl (mp->domain_id), ntohs (mp->src_port));
20641 vam->result_ready = 1;
20645 vl_api_ipfix_classify_stream_details_t_handler_json
20646 (vl_api_ipfix_classify_stream_details_t * mp)
20648 vat_main_t *vam = &vat_main;
20649 vat_json_node_t node;
20651 vat_json_init_object (&node);
20652 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
20653 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
20655 vat_json_print (vam->ofp, &node);
20656 vat_json_free (&node);
20658 vam->result_ready = 1;
20662 api_ipfix_classify_table_dump (vat_main_t * vam)
20664 vl_api_ipfix_classify_table_dump_t *mp;
20665 vl_api_control_ping_t *mp_ping;
20668 if (!vam->json_output)
20670 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
20671 "transport_protocol");
20674 /* Construct the API message */
20675 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
20680 /* Use a control ping for synchronization */
20681 MPING (CONTROL_PING, mp_ping);
20689 vl_api_ipfix_classify_table_details_t_handler
20690 (vl_api_ipfix_classify_table_details_t * mp)
20692 vat_main_t *vam = &vat_main;
20693 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
20694 mp->transport_protocol);
20698 vl_api_ipfix_classify_table_details_t_handler_json
20699 (vl_api_ipfix_classify_table_details_t * mp)
20701 vat_json_node_t *node = NULL;
20702 vat_main_t *vam = &vat_main;
20704 if (VAT_JSON_ARRAY != vam->json_tree.type)
20706 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20707 vat_json_init_array (&vam->json_tree);
20710 node = vat_json_array_add (&vam->json_tree);
20711 vat_json_init_object (node);
20713 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
20714 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
20715 vat_json_object_add_uint (node, "transport_protocol",
20716 mp->transport_protocol);
20720 api_sw_interface_span_enable_disable (vat_main_t * vam)
20722 unformat_input_t *i = vam->input;
20723 vl_api_sw_interface_span_enable_disable_t *mp;
20724 u32 src_sw_if_index = ~0;
20725 u32 dst_sw_if_index = ~0;
20730 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20733 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
20735 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
20739 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
20741 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
20743 else if (unformat (i, "disable"))
20745 else if (unformat (i, "rx"))
20747 else if (unformat (i, "tx"))
20749 else if (unformat (i, "both"))
20751 else if (unformat (i, "l2"))
20757 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
20759 mp->sw_if_index_from = htonl (src_sw_if_index);
20760 mp->sw_if_index_to = htonl (dst_sw_if_index);
20770 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
20773 vat_main_t *vam = &vat_main;
20774 u8 *sw_if_from_name = 0;
20775 u8 *sw_if_to_name = 0;
20776 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
20777 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
20778 char *states[] = { "none", "rx", "tx", "both" };
20782 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
20784 if ((u32) p->value[0] == sw_if_index_from)
20786 sw_if_from_name = (u8 *)(p->key);
20790 if ((u32) p->value[0] == sw_if_index_to)
20792 sw_if_to_name = (u8 *)(p->key);
20793 if (sw_if_from_name)
20798 print (vam->ofp, "%20s => %20s (%s) %s",
20799 sw_if_from_name, sw_if_to_name, states[mp->state],
20800 mp->is_l2 ? "l2" : "device");
20804 vl_api_sw_interface_span_details_t_handler_json
20805 (vl_api_sw_interface_span_details_t * mp)
20807 vat_main_t *vam = &vat_main;
20808 vat_json_node_t *node = NULL;
20809 u8 *sw_if_from_name = 0;
20810 u8 *sw_if_to_name = 0;
20811 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
20812 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
20816 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
20818 if ((u32) p->value[0] == sw_if_index_from)
20820 sw_if_from_name = (u8 *)(p->key);
20824 if ((u32) p->value[0] == sw_if_index_to)
20826 sw_if_to_name = (u8 *)(p->key);
20827 if (sw_if_from_name)
20833 if (VAT_JSON_ARRAY != vam->json_tree.type)
20835 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20836 vat_json_init_array (&vam->json_tree);
20838 node = vat_json_array_add (&vam->json_tree);
20840 vat_json_init_object (node);
20841 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
20842 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
20843 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
20844 if (0 != sw_if_to_name)
20846 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
20848 vat_json_object_add_uint (node, "state", mp->state);
20849 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
20853 api_sw_interface_span_dump (vat_main_t * vam)
20855 unformat_input_t *input = vam->input;
20856 vl_api_sw_interface_span_dump_t *mp;
20857 vl_api_control_ping_t *mp_ping;
20861 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20863 if (unformat (input, "l2"))
20869 M (SW_INTERFACE_SPAN_DUMP, mp);
20873 /* Use a control ping for synchronization */
20874 MPING (CONTROL_PING, mp_ping);
20882 api_pg_create_interface (vat_main_t * vam)
20884 unformat_input_t *input = vam->input;
20885 vl_api_pg_create_interface_t *mp;
20889 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20891 if (unformat (input, "if_id %d", &if_id))
20898 errmsg ("missing pg interface index");
20902 /* Construct the API message */
20903 M (PG_CREATE_INTERFACE, mp);
20905 mp->interface_id = ntohl (if_id);
20913 api_pg_capture (vat_main_t * vam)
20915 unformat_input_t *input = vam->input;
20916 vl_api_pg_capture_t *mp;
20921 u8 pcap_file_set = 0;
20924 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20926 if (unformat (input, "if_id %d", &if_id))
20928 else if (unformat (input, "pcap %s", &pcap_file))
20930 else if (unformat (input, "count %d", &count))
20932 else if (unformat (input, "disable"))
20939 errmsg ("missing pg interface index");
20942 if (pcap_file_set > 0)
20944 if (vec_len (pcap_file) > 255)
20946 errmsg ("pcap file name is too long");
20951 u32 name_len = vec_len (pcap_file);
20952 /* Construct the API message */
20953 M (PG_CAPTURE, mp);
20955 mp->interface_id = ntohl (if_id);
20956 mp->is_enabled = enable;
20957 mp->count = ntohl (count);
20958 mp->pcap_name_length = ntohl (name_len);
20959 if (pcap_file_set != 0)
20961 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
20963 vec_free (pcap_file);
20971 api_pg_enable_disable (vat_main_t * vam)
20973 unformat_input_t *input = vam->input;
20974 vl_api_pg_enable_disable_t *mp;
20977 u8 stream_name_set = 0;
20978 u8 *stream_name = 0;
20980 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20982 if (unformat (input, "stream %s", &stream_name))
20983 stream_name_set = 1;
20984 else if (unformat (input, "disable"))
20990 if (stream_name_set > 0)
20992 if (vec_len (stream_name) > 255)
20994 errmsg ("stream name too long");
20999 u32 name_len = vec_len (stream_name);
21000 /* Construct the API message */
21001 M (PG_ENABLE_DISABLE, mp);
21003 mp->is_enabled = enable;
21004 if (stream_name_set != 0)
21006 mp->stream_name_length = ntohl (name_len);
21007 clib_memcpy (mp->stream_name, stream_name, name_len);
21009 vec_free (stream_name);
21017 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
21019 unformat_input_t *input = vam->input;
21020 vl_api_ip_source_and_port_range_check_add_del_t *mp;
21022 u16 *low_ports = 0;
21023 u16 *high_ports = 0;
21026 ip4_address_t ip4_addr;
21027 ip6_address_t ip6_addr;
21036 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21038 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
21044 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
21049 else if (unformat (input, "vrf %d", &vrf_id))
21051 else if (unformat (input, "del"))
21053 else if (unformat (input, "port %d", &tmp))
21055 if (tmp == 0 || tmp > 65535)
21057 errmsg ("port %d out of range", tmp);
21061 this_hi = this_low + 1;
21062 vec_add1 (low_ports, this_low);
21063 vec_add1 (high_ports, this_hi);
21065 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
21067 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
21069 errmsg ("incorrect range parameters");
21073 /* Note: in debug CLI +1 is added to high before
21074 passing to real fn that does "the work"
21075 (ip_source_and_port_range_check_add_del).
21076 This fn is a wrapper around the binary API fn a
21077 control plane will call, which expects this increment
21078 to have occurred. Hence letting the binary API control
21079 plane fn do the increment for consistency between VAT
21080 and other control planes.
21083 vec_add1 (low_ports, this_low);
21084 vec_add1 (high_ports, this_hi);
21090 if (prefix_set == 0)
21092 errmsg ("<address>/<mask> not specified");
21098 errmsg ("VRF ID required, not specified");
21105 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21109 if (vec_len (low_ports) == 0)
21111 errmsg ("At least one port or port range required");
21115 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
21117 mp->is_add = is_add;
21122 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
21127 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
21130 mp->mask_length = length;
21131 mp->number_of_ranges = vec_len (low_ports);
21133 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
21134 vec_free (low_ports);
21136 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
21137 vec_free (high_ports);
21139 mp->vrf_id = ntohl (vrf_id);
21147 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
21149 unformat_input_t *input = vam->input;
21150 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
21151 u32 sw_if_index = ~0;
21153 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
21154 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
21158 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21160 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21162 else if (unformat (input, "sw_if_index %d", &sw_if_index))
21164 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
21166 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
21168 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
21170 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
21172 else if (unformat (input, "del"))
21178 if (sw_if_index == ~0)
21180 errmsg ("Interface required but not specified");
21186 errmsg ("VRF ID required but not specified");
21190 if (tcp_out_vrf_id == 0
21191 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
21194 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21198 /* Construct the API message */
21199 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
21201 mp->sw_if_index = ntohl (sw_if_index);
21202 mp->is_add = is_add;
21203 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
21204 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
21205 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
21206 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
21211 /* Wait for a reply... */
21217 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
21219 unformat_input_t *i = vam->input;
21220 vl_api_ipsec_gre_add_del_tunnel_t *mp;
21221 u32 local_sa_id = 0;
21222 u32 remote_sa_id = 0;
21223 ip4_address_t src_address;
21224 ip4_address_t dst_address;
21228 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21230 if (unformat (i, "local_sa %d", &local_sa_id))
21232 else if (unformat (i, "remote_sa %d", &remote_sa_id))
21234 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
21236 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
21238 else if (unformat (i, "del"))
21242 clib_warning ("parse error '%U'", format_unformat_error, i);
21247 M (IPSEC_GRE_ADD_DEL_TUNNEL, mp);
21249 mp->local_sa_id = ntohl (local_sa_id);
21250 mp->remote_sa_id = ntohl (remote_sa_id);
21251 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
21252 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
21253 mp->is_add = is_add;
21261 api_set_punt (vat_main_t * vam)
21263 unformat_input_t *i = vam->input;
21264 vl_api_set_punt_t *mp;
21271 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21273 if (unformat (i, "ip %d", &ipv))
21275 else if (unformat (i, "protocol %d", &protocol))
21277 else if (unformat (i, "port %d", &port))
21279 else if (unformat (i, "del"))
21283 clib_warning ("parse error '%U'", format_unformat_error, i);
21290 mp->is_add = (u8) is_add;
21291 mp->punt.ipv = (u8) ipv;
21292 mp->punt.l4_protocol = (u8) protocol;
21293 mp->punt.l4_port = htons ((u16) port);
21300 static void vl_api_ipsec_gre_tunnel_details_t_handler
21301 (vl_api_ipsec_gre_tunnel_details_t * mp)
21303 vat_main_t *vam = &vat_main;
21305 print (vam->ofp, "%11d%15U%15U%14d%14d",
21306 ntohl (mp->sw_if_index),
21307 format_ip4_address, &mp->src_address,
21308 format_ip4_address, &mp->dst_address,
21309 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
21312 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
21313 (vl_api_ipsec_gre_tunnel_details_t * mp)
21315 vat_main_t *vam = &vat_main;
21316 vat_json_node_t *node = NULL;
21317 struct in_addr ip4;
21319 if (VAT_JSON_ARRAY != vam->json_tree.type)
21321 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21322 vat_json_init_array (&vam->json_tree);
21324 node = vat_json_array_add (&vam->json_tree);
21326 vat_json_init_object (node);
21327 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
21328 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
21329 vat_json_object_add_ip4 (node, "src_address", ip4);
21330 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
21331 vat_json_object_add_ip4 (node, "dst_address", ip4);
21332 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
21333 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
21337 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
21339 unformat_input_t *i = vam->input;
21340 vl_api_ipsec_gre_tunnel_dump_t *mp;
21341 vl_api_control_ping_t *mp_ping;
21343 u8 sw_if_index_set = 0;
21346 /* Parse args required to build the message */
21347 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21349 if (unformat (i, "sw_if_index %d", &sw_if_index))
21350 sw_if_index_set = 1;
21355 if (sw_if_index_set == 0)
21360 if (!vam->json_output)
21362 print (vam->ofp, "%11s%15s%15s%14s%14s",
21363 "sw_if_index", "src_address", "dst_address",
21364 "local_sa_id", "remote_sa_id");
21367 /* Get list of gre-tunnel interfaces */
21368 M (IPSEC_GRE_TUNNEL_DUMP, mp);
21370 mp->sw_if_index = htonl (sw_if_index);
21374 /* Use a control ping for synchronization */
21375 MPING (CONTROL_PING, mp_ping);
21383 api_delete_subif (vat_main_t * vam)
21385 unformat_input_t *i = vam->input;
21386 vl_api_delete_subif_t *mp;
21387 u32 sw_if_index = ~0;
21390 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21392 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21394 if (unformat (i, "sw_if_index %d", &sw_if_index))
21400 if (sw_if_index == ~0)
21402 errmsg ("missing sw_if_index");
21406 /* Construct the API message */
21407 M (DELETE_SUBIF, mp);
21408 mp->sw_if_index = ntohl (sw_if_index);
21415 #define foreach_pbb_vtr_op \
21416 _("disable", L2_VTR_DISABLED) \
21417 _("pop", L2_VTR_POP_2) \
21418 _("push", L2_VTR_PUSH_2)
21421 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
21423 unformat_input_t *i = vam->input;
21424 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
21425 u32 sw_if_index = ~0, vtr_op = ~0;
21426 u16 outer_tag = ~0;
21427 u8 dmac[6], smac[6];
21428 u8 dmac_set = 0, smac_set = 0;
21434 /* Shut up coverity */
21435 clib_memset (dmac, 0, sizeof (dmac));
21436 clib_memset (smac, 0, sizeof (smac));
21438 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21440 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21442 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21444 else if (unformat (i, "vtr_op %d", &vtr_op))
21446 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
21449 else if (unformat (i, "translate_pbb_stag"))
21451 if (unformat (i, "%d", &tmp))
21453 vtr_op = L2_VTR_TRANSLATE_2_1;
21459 ("translate_pbb_stag operation requires outer tag definition");
21463 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
21465 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
21467 else if (unformat (i, "sid %d", &sid))
21469 else if (unformat (i, "vlanid %d", &tmp))
21473 clib_warning ("parse error '%U'", format_unformat_error, i);
21478 if ((sw_if_index == ~0) || (vtr_op == ~0))
21480 errmsg ("missing sw_if_index or vtr operation");
21483 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
21484 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
21487 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
21491 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
21492 mp->sw_if_index = ntohl (sw_if_index);
21493 mp->vtr_op = ntohl (vtr_op);
21494 mp->outer_tag = ntohs (outer_tag);
21495 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
21496 clib_memcpy (mp->b_smac, smac, sizeof (smac));
21497 mp->b_vlanid = ntohs (vlanid);
21498 mp->i_sid = ntohl (sid);
21506 api_flow_classify_set_interface (vat_main_t * vam)
21508 unformat_input_t *i = vam->input;
21509 vl_api_flow_classify_set_interface_t *mp;
21511 int sw_if_index_set;
21512 u32 ip4_table_index = ~0;
21513 u32 ip6_table_index = ~0;
21517 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21519 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21520 sw_if_index_set = 1;
21521 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21522 sw_if_index_set = 1;
21523 else if (unformat (i, "del"))
21525 else if (unformat (i, "ip4-table %d", &ip4_table_index))
21527 else if (unformat (i, "ip6-table %d", &ip6_table_index))
21531 clib_warning ("parse error '%U'", format_unformat_error, i);
21536 if (sw_if_index_set == 0)
21538 errmsg ("missing interface name or sw_if_index");
21542 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
21544 mp->sw_if_index = ntohl (sw_if_index);
21545 mp->ip4_table_index = ntohl (ip4_table_index);
21546 mp->ip6_table_index = ntohl (ip6_table_index);
21547 mp->is_add = is_add;
21555 api_flow_classify_dump (vat_main_t * vam)
21557 unformat_input_t *i = vam->input;
21558 vl_api_flow_classify_dump_t *mp;
21559 vl_api_control_ping_t *mp_ping;
21560 u8 type = FLOW_CLASSIFY_N_TABLES;
21563 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
21567 errmsg ("classify table type must be specified");
21571 if (!vam->json_output)
21573 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
21576 M (FLOW_CLASSIFY_DUMP, mp);
21581 /* Use a control ping for synchronization */
21582 MPING (CONTROL_PING, mp_ping);
21585 /* Wait for a reply... */
21591 api_feature_enable_disable (vat_main_t * vam)
21593 unformat_input_t *i = vam->input;
21594 vl_api_feature_enable_disable_t *mp;
21596 u8 *feature_name = 0;
21597 u32 sw_if_index = ~0;
21601 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21603 if (unformat (i, "arc_name %s", &arc_name))
21605 else if (unformat (i, "feature_name %s", &feature_name))
21608 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21610 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21612 else if (unformat (i, "disable"))
21620 errmsg ("missing arc name");
21623 if (vec_len (arc_name) > 63)
21625 errmsg ("arc name too long");
21628 if (feature_name == 0)
21630 errmsg ("missing feature name");
21633 if (vec_len (feature_name) > 63)
21635 errmsg ("feature name too long");
21638 if (sw_if_index == ~0)
21640 errmsg ("missing interface name or sw_if_index");
21644 /* Construct the API message */
21645 M (FEATURE_ENABLE_DISABLE, mp);
21646 mp->sw_if_index = ntohl (sw_if_index);
21647 mp->enable = enable;
21648 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
21649 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
21650 vec_free (arc_name);
21651 vec_free (feature_name);
21659 api_sw_interface_tag_add_del (vat_main_t * vam)
21661 unformat_input_t *i = vam->input;
21662 vl_api_sw_interface_tag_add_del_t *mp;
21663 u32 sw_if_index = ~0;
21668 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21670 if (unformat (i, "tag %s", &tag))
21672 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21674 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21676 else if (unformat (i, "del"))
21682 if (sw_if_index == ~0)
21684 errmsg ("missing interface name or sw_if_index");
21688 if (enable && (tag == 0))
21690 errmsg ("no tag specified");
21694 /* Construct the API message */
21695 M (SW_INTERFACE_TAG_ADD_DEL, mp);
21696 mp->sw_if_index = ntohl (sw_if_index);
21697 mp->is_add = enable;
21699 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
21707 static void vl_api_l2_xconnect_details_t_handler
21708 (vl_api_l2_xconnect_details_t * mp)
21710 vat_main_t *vam = &vat_main;
21712 print (vam->ofp, "%15d%15d",
21713 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
21716 static void vl_api_l2_xconnect_details_t_handler_json
21717 (vl_api_l2_xconnect_details_t * mp)
21719 vat_main_t *vam = &vat_main;
21720 vat_json_node_t *node = NULL;
21722 if (VAT_JSON_ARRAY != vam->json_tree.type)
21724 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21725 vat_json_init_array (&vam->json_tree);
21727 node = vat_json_array_add (&vam->json_tree);
21729 vat_json_init_object (node);
21730 vat_json_object_add_uint (node, "rx_sw_if_index",
21731 ntohl (mp->rx_sw_if_index));
21732 vat_json_object_add_uint (node, "tx_sw_if_index",
21733 ntohl (mp->tx_sw_if_index));
21737 api_l2_xconnect_dump (vat_main_t * vam)
21739 vl_api_l2_xconnect_dump_t *mp;
21740 vl_api_control_ping_t *mp_ping;
21743 if (!vam->json_output)
21745 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
21748 M (L2_XCONNECT_DUMP, mp);
21752 /* Use a control ping for synchronization */
21753 MPING (CONTROL_PING, mp_ping);
21761 api_hw_interface_set_mtu (vat_main_t * vam)
21763 unformat_input_t *i = vam->input;
21764 vl_api_hw_interface_set_mtu_t *mp;
21765 u32 sw_if_index = ~0;
21769 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21771 if (unformat (i, "mtu %d", &mtu))
21773 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21775 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21781 if (sw_if_index == ~0)
21783 errmsg ("missing interface name or sw_if_index");
21789 errmsg ("no mtu specified");
21793 /* Construct the API message */
21794 M (HW_INTERFACE_SET_MTU, mp);
21795 mp->sw_if_index = ntohl (sw_if_index);
21796 mp->mtu = ntohs ((u16) mtu);
21804 api_p2p_ethernet_add (vat_main_t * vam)
21806 unformat_input_t *i = vam->input;
21807 vl_api_p2p_ethernet_add_t *mp;
21808 u32 parent_if_index = ~0;
21814 clib_memset (remote_mac, 0, sizeof (remote_mac));
21815 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21817 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21819 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21823 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21825 else if (unformat (i, "sub_id %d", &sub_id))
21829 clib_warning ("parse error '%U'", format_unformat_error, i);
21834 if (parent_if_index == ~0)
21836 errmsg ("missing interface name or sw_if_index");
21841 errmsg ("missing remote mac address");
21846 errmsg ("missing sub-interface id");
21850 M (P2P_ETHERNET_ADD, mp);
21851 mp->parent_if_index = ntohl (parent_if_index);
21852 mp->subif_id = ntohl (sub_id);
21853 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21861 api_p2p_ethernet_del (vat_main_t * vam)
21863 unformat_input_t *i = vam->input;
21864 vl_api_p2p_ethernet_del_t *mp;
21865 u32 parent_if_index = ~0;
21870 clib_memset (remote_mac, 0, sizeof (remote_mac));
21871 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21873 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21875 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21879 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21883 clib_warning ("parse error '%U'", format_unformat_error, i);
21888 if (parent_if_index == ~0)
21890 errmsg ("missing interface name or sw_if_index");
21895 errmsg ("missing remote mac address");
21899 M (P2P_ETHERNET_DEL, mp);
21900 mp->parent_if_index = ntohl (parent_if_index);
21901 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21909 api_lldp_config (vat_main_t * vam)
21911 unformat_input_t *i = vam->input;
21912 vl_api_lldp_config_t *mp;
21914 int tx_interval = 0;
21915 u8 *sys_name = NULL;
21918 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21920 if (unformat (i, "system-name %s", &sys_name))
21922 else if (unformat (i, "tx-hold %d", &tx_hold))
21924 else if (unformat (i, "tx-interval %d", &tx_interval))
21928 clib_warning ("parse error '%U'", format_unformat_error, i);
21933 vec_add1 (sys_name, 0);
21935 M (LLDP_CONFIG, mp);
21936 mp->tx_hold = htonl (tx_hold);
21937 mp->tx_interval = htonl (tx_interval);
21938 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
21939 vec_free (sys_name);
21947 api_sw_interface_set_lldp (vat_main_t * vam)
21949 unformat_input_t *i = vam->input;
21950 vl_api_sw_interface_set_lldp_t *mp;
21951 u32 sw_if_index = ~0;
21953 u8 *port_desc = NULL, *mgmt_oid = NULL;
21954 ip4_address_t ip4_addr;
21955 ip6_address_t ip6_addr;
21958 clib_memset (&ip4_addr, 0, sizeof (ip4_addr));
21959 clib_memset (&ip6_addr, 0, sizeof (ip6_addr));
21961 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21963 if (unformat (i, "disable"))
21966 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21968 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21970 else if (unformat (i, "port-desc %s", &port_desc))
21972 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
21974 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
21976 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
21982 if (sw_if_index == ~0)
21984 errmsg ("missing interface name or sw_if_index");
21988 /* Construct the API message */
21989 vec_add1 (port_desc, 0);
21990 vec_add1 (mgmt_oid, 0);
21991 M (SW_INTERFACE_SET_LLDP, mp);
21992 mp->sw_if_index = ntohl (sw_if_index);
21993 mp->enable = enable;
21994 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
21995 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
21996 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
21997 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
21998 vec_free (port_desc);
21999 vec_free (mgmt_oid);
22007 api_tcp_configure_src_addresses (vat_main_t * vam)
22009 vl_api_tcp_configure_src_addresses_t *mp;
22010 unformat_input_t *i = vam->input;
22011 ip4_address_t v4first, v4last;
22012 ip6_address_t v6first, v6last;
22017 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22019 if (unformat (i, "%U - %U",
22020 unformat_ip4_address, &v4first,
22021 unformat_ip4_address, &v4last))
22025 errmsg ("one range per message (range already set)");
22030 else if (unformat (i, "%U - %U",
22031 unformat_ip6_address, &v6first,
22032 unformat_ip6_address, &v6last))
22036 errmsg ("one range per message (range already set)");
22041 else if (unformat (i, "vrf %d", &vrf_id))
22047 if (range_set == 0)
22049 errmsg ("address range not set");
22053 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
22054 mp->vrf_id = ntohl (vrf_id);
22056 if (range_set == 2)
22059 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
22060 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
22065 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
22066 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
22073 static void vl_api_app_namespace_add_del_reply_t_handler
22074 (vl_api_app_namespace_add_del_reply_t * mp)
22076 vat_main_t *vam = &vat_main;
22077 i32 retval = ntohl (mp->retval);
22078 if (vam->async_mode)
22080 vam->async_errors += (retval < 0);
22084 vam->retval = retval;
22086 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
22087 vam->result_ready = 1;
22091 static void vl_api_app_namespace_add_del_reply_t_handler_json
22092 (vl_api_app_namespace_add_del_reply_t * mp)
22094 vat_main_t *vam = &vat_main;
22095 vat_json_node_t node;
22097 vat_json_init_object (&node);
22098 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
22099 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
22101 vat_json_print (vam->ofp, &node);
22102 vat_json_free (&node);
22104 vam->retval = ntohl (mp->retval);
22105 vam->result_ready = 1;
22109 api_app_namespace_add_del (vat_main_t * vam)
22111 vl_api_app_namespace_add_del_t *mp;
22112 unformat_input_t *i = vam->input;
22113 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
22114 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
22118 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22120 if (unformat (i, "id %_%v%_", &ns_id))
22122 else if (unformat (i, "secret %lu", &secret))
22124 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22125 sw_if_index_set = 1;
22126 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
22128 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
22133 if (!ns_id || !secret_set || !sw_if_index_set)
22135 errmsg ("namespace id, secret and sw_if_index must be set");
22138 if (vec_len (ns_id) > 64)
22140 errmsg ("namespace id too long");
22143 M (APP_NAMESPACE_ADD_DEL, mp);
22145 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
22146 mp->namespace_id_len = vec_len (ns_id);
22147 mp->secret = clib_host_to_net_u64 (secret);
22148 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22149 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
22150 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
22158 api_sock_init_shm (vat_main_t * vam)
22160 #if VPP_API_TEST_BUILTIN == 0
22161 unformat_input_t *i = vam->input;
22162 vl_api_shm_elem_config_t *config = 0;
22163 u64 size = 64 << 20;
22166 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22168 if (unformat (i, "size %U", unformat_memory_size, &size))
22175 * Canned custom ring allocator config.
22176 * Should probably parse all of this
22178 vec_validate (config, 6);
22179 config[0].type = VL_API_VLIB_RING;
22180 config[0].size = 256;
22181 config[0].count = 32;
22183 config[1].type = VL_API_VLIB_RING;
22184 config[1].size = 1024;
22185 config[1].count = 16;
22187 config[2].type = VL_API_VLIB_RING;
22188 config[2].size = 4096;
22189 config[2].count = 2;
22191 config[3].type = VL_API_CLIENT_RING;
22192 config[3].size = 256;
22193 config[3].count = 32;
22195 config[4].type = VL_API_CLIENT_RING;
22196 config[4].size = 1024;
22197 config[4].count = 16;
22199 config[5].type = VL_API_CLIENT_RING;
22200 config[5].size = 4096;
22201 config[5].count = 2;
22203 config[6].type = VL_API_QUEUE;
22204 config[6].count = 128;
22205 config[6].size = sizeof (uword);
22207 rv = vl_socket_client_init_shm (config);
22209 vam->client_index_invalid = 1;
22217 api_dns_enable_disable (vat_main_t * vam)
22219 unformat_input_t *line_input = vam->input;
22220 vl_api_dns_enable_disable_t *mp;
22221 u8 enable_disable = 1;
22224 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22226 if (unformat (line_input, "disable"))
22227 enable_disable = 0;
22228 if (unformat (line_input, "enable"))
22229 enable_disable = 1;
22234 /* Construct the API message */
22235 M (DNS_ENABLE_DISABLE, mp);
22236 mp->enable = enable_disable;
22240 /* Wait for the reply */
22246 api_dns_resolve_name (vat_main_t * vam)
22248 unformat_input_t *line_input = vam->input;
22249 vl_api_dns_resolve_name_t *mp;
22253 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22255 if (unformat (line_input, "%s", &name))
22261 if (vec_len (name) > 127)
22263 errmsg ("name too long");
22267 /* Construct the API message */
22268 M (DNS_RESOLVE_NAME, mp);
22269 memcpy (mp->name, name, vec_len (name));
22274 /* Wait for the reply */
22280 api_dns_resolve_ip (vat_main_t * vam)
22282 unformat_input_t *line_input = vam->input;
22283 vl_api_dns_resolve_ip_t *mp;
22285 ip4_address_t addr4;
22286 ip6_address_t addr6;
22289 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22291 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
22293 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
22301 errmsg ("missing address");
22305 /* Construct the API message */
22306 M (DNS_RESOLVE_IP, mp);
22307 mp->is_ip6 = is_ip6;
22309 memcpy (mp->address, &addr6, sizeof (addr6));
22311 memcpy (mp->address, &addr4, sizeof (addr4));
22315 /* Wait for the reply */
22321 api_dns_name_server_add_del (vat_main_t * vam)
22323 unformat_input_t *i = vam->input;
22324 vl_api_dns_name_server_add_del_t *mp;
22326 ip6_address_t ip6_server;
22327 ip4_address_t ip4_server;
22332 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22334 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
22336 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
22338 else if (unformat (i, "del"))
22342 clib_warning ("parse error '%U'", format_unformat_error, i);
22347 if (ip4_set && ip6_set)
22349 errmsg ("Only one server address allowed per message");
22352 if ((ip4_set + ip6_set) == 0)
22354 errmsg ("Server address required");
22358 /* Construct the API message */
22359 M (DNS_NAME_SERVER_ADD_DEL, mp);
22363 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
22368 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
22372 mp->is_add = is_add;
22377 /* Wait for a reply, return good/bad news */
22383 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
22385 vat_main_t *vam = &vat_main;
22390 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22391 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22392 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
22393 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
22394 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22395 clib_net_to_host_u32 (mp->action_index), mp->tag);
22400 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22401 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22402 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
22403 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
22404 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22405 clib_net_to_host_u32 (mp->action_index), mp->tag);
22410 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
22413 vat_main_t *vam = &vat_main;
22414 vat_json_node_t *node = NULL;
22415 struct in6_addr ip6;
22416 struct in_addr ip4;
22418 if (VAT_JSON_ARRAY != vam->json_tree.type)
22420 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
22421 vat_json_init_array (&vam->json_tree);
22423 node = vat_json_array_add (&vam->json_tree);
22424 vat_json_init_object (node);
22426 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
22427 vat_json_object_add_uint (node, "appns_index",
22428 clib_net_to_host_u32 (mp->appns_index));
22429 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
22430 vat_json_object_add_uint (node, "scope", mp->scope);
22431 vat_json_object_add_uint (node, "action_index",
22432 clib_net_to_host_u32 (mp->action_index));
22433 vat_json_object_add_uint (node, "lcl_port",
22434 clib_net_to_host_u16 (mp->lcl_port));
22435 vat_json_object_add_uint (node, "rmt_port",
22436 clib_net_to_host_u16 (mp->rmt_port));
22437 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
22438 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
22439 vat_json_object_add_string_copy (node, "tag", mp->tag);
22442 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
22443 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
22444 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
22445 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
22449 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
22450 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
22451 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
22452 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
22457 api_session_rule_add_del (vat_main_t * vam)
22459 vl_api_session_rule_add_del_t *mp;
22460 unformat_input_t *i = vam->input;
22461 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
22462 u32 appns_index = 0, scope = 0;
22463 ip4_address_t lcl_ip4, rmt_ip4;
22464 ip6_address_t lcl_ip6, rmt_ip6;
22465 u8 is_ip4 = 1, conn_set = 0;
22466 u8 is_add = 1, *tag = 0;
22469 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22471 if (unformat (i, "del"))
22473 else if (unformat (i, "add"))
22475 else if (unformat (i, "proto tcp"))
22477 else if (unformat (i, "proto udp"))
22479 else if (unformat (i, "appns %d", &appns_index))
22481 else if (unformat (i, "scope %d", &scope))
22483 else if (unformat (i, "tag %_%v%_", &tag))
22487 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
22488 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
22496 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
22497 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
22503 else if (unformat (i, "action %d", &action))
22508 if (proto == ~0 || !conn_set || action == ~0)
22510 errmsg ("transport proto, connection and action must be set");
22516 errmsg ("scope should be 0-3");
22520 M (SESSION_RULE_ADD_DEL, mp);
22522 mp->is_ip4 = is_ip4;
22523 mp->transport_proto = proto;
22524 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
22525 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
22526 mp->lcl_plen = lcl_plen;
22527 mp->rmt_plen = rmt_plen;
22528 mp->action_index = clib_host_to_net_u32 (action);
22529 mp->appns_index = clib_host_to_net_u32 (appns_index);
22531 mp->is_add = is_add;
22534 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
22535 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
22539 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
22540 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
22544 clib_memcpy (mp->tag, tag, vec_len (tag));
22554 api_session_rules_dump (vat_main_t * vam)
22556 vl_api_session_rules_dump_t *mp;
22557 vl_api_control_ping_t *mp_ping;
22560 if (!vam->json_output)
22562 print (vam->ofp, "%=20s", "Session Rules");
22565 M (SESSION_RULES_DUMP, mp);
22569 /* Use a control ping for synchronization */
22570 MPING (CONTROL_PING, mp_ping);
22573 /* Wait for a reply... */
22579 api_ip_container_proxy_add_del (vat_main_t * vam)
22581 vl_api_ip_container_proxy_add_del_t *mp;
22582 unformat_input_t *i = vam->input;
22583 u32 plen = ~0, sw_if_index = ~0;
22590 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22592 if (unformat (i, "del"))
22594 else if (unformat (i, "add"))
22596 if (unformat (i, "%U", unformat_ip4_address, &ip4))
22601 else if (unformat (i, "%U", unformat_ip6_address, &ip6))
22606 else if (unformat (i, "sw_if_index %u", &sw_if_index))
22611 if (sw_if_index == ~0 || plen == ~0)
22613 errmsg ("address and sw_if_index must be set");
22617 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
22619 mp->is_ip4 = is_ip4;
22620 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22622 mp->is_add = is_add;
22624 clib_memcpy (mp->ip, &ip4, sizeof (ip4));
22626 clib_memcpy (mp->ip, &ip6, sizeof (ip6));
22634 api_qos_record_enable_disable (vat_main_t * vam)
22636 unformat_input_t *i = vam->input;
22637 vl_api_qos_record_enable_disable_t *mp;
22638 u32 sw_if_index, qs = 0xff;
22639 u8 sw_if_index_set = 0;
22643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22645 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22646 sw_if_index_set = 1;
22647 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22648 sw_if_index_set = 1;
22649 else if (unformat (i, "%U", unformat_qos_source, &qs))
22651 else if (unformat (i, "disable"))
22655 clib_warning ("parse error '%U'", format_unformat_error, i);
22660 if (sw_if_index_set == 0)
22662 errmsg ("missing interface name or sw_if_index");
22667 errmsg ("input location must be specified");
22671 M (QOS_RECORD_ENABLE_DISABLE, mp);
22673 mp->sw_if_index = ntohl (sw_if_index);
22674 mp->input_source = qs;
22675 mp->enable = enable;
22684 q_or_quit (vat_main_t * vam)
22686 #if VPP_API_TEST_BUILTIN == 0
22687 longjmp (vam->jump_buf, 1);
22689 return 0; /* not so much */
22693 q (vat_main_t * vam)
22695 return q_or_quit (vam);
22699 quit (vat_main_t * vam)
22701 return q_or_quit (vam);
22705 comment (vat_main_t * vam)
22711 statseg (vat_main_t * vam)
22713 ssvm_private_t *ssvmp = &vam->stat_segment;
22714 ssvm_shared_header_t *shared_header = ssvmp->sh;
22715 vlib_counter_t **counters;
22716 u64 thread0_index1_packets;
22717 u64 thread0_index1_bytes;
22718 f64 vector_rate, input_rate;
22721 uword *counter_vector_by_name;
22722 if (vam->stat_segment_lockp == 0)
22724 errmsg ("Stat segment not mapped...");
22728 /* look up "/if/rx for sw_if_index 1 as a test */
22730 clib_spinlock_lock (vam->stat_segment_lockp);
22732 counter_vector_by_name = (uword *) shared_header->opaque[1];
22734 p = hash_get_mem (counter_vector_by_name, "/if/rx");
22737 clib_spinlock_unlock (vam->stat_segment_lockp);
22738 errmsg ("/if/tx not found?");
22742 /* Fish per-thread vector of combined counters from shared memory */
22743 counters = (vlib_counter_t **) p[0];
22745 if (vec_len (counters[0]) < 2)
22747 clib_spinlock_unlock (vam->stat_segment_lockp);
22748 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
22752 /* Read thread 0 sw_if_index 1 counter */
22753 thread0_index1_packets = counters[0][1].packets;
22754 thread0_index1_bytes = counters[0][1].bytes;
22756 p = hash_get_mem (counter_vector_by_name, "vector_rate");
22759 clib_spinlock_unlock (vam->stat_segment_lockp);
22760 errmsg ("vector_rate not found?");
22764 vector_rate = *(f64 *) (p[0]);
22765 p = hash_get_mem (counter_vector_by_name, "input_rate");
22768 clib_spinlock_unlock (vam->stat_segment_lockp);
22769 errmsg ("input_rate not found?");
22772 input_rate = *(f64 *) (p[0]);
22774 clib_spinlock_unlock (vam->stat_segment_lockp);
22776 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
22777 vector_rate, input_rate);
22778 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
22779 thread0_index1_packets, thread0_index1_bytes);
22785 cmd_cmp (void *a1, void *a2)
22790 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
22794 help (vat_main_t * vam)
22799 unformat_input_t *i = vam->input;
22802 if (unformat (i, "%s", &name))
22806 vec_add1 (name, 0);
22808 hs = hash_get_mem (vam->help_by_name, name);
22810 print (vam->ofp, "usage: %s %s", name, hs[0]);
22812 print (vam->ofp, "No such msg / command '%s'", name);
22817 print (vam->ofp, "Help is available for the following:");
22820 hash_foreach_pair (p, vam->function_by_name,
22822 vec_add1 (cmds, (u8 *)(p->key));
22826 vec_sort_with_function (cmds, cmd_cmp);
22828 for (j = 0; j < vec_len (cmds); j++)
22829 print (vam->ofp, "%s", cmds[j]);
22836 set (vat_main_t * vam)
22838 u8 *name = 0, *value = 0;
22839 unformat_input_t *i = vam->input;
22841 if (unformat (i, "%s", &name))
22843 /* The input buffer is a vector, not a string. */
22844 value = vec_dup (i->buffer);
22845 vec_delete (value, i->index, 0);
22846 /* Almost certainly has a trailing newline */
22847 if (value[vec_len (value) - 1] == '\n')
22848 value[vec_len (value) - 1] = 0;
22849 /* Make sure it's a proper string, one way or the other */
22850 vec_add1 (value, 0);
22851 (void) clib_macro_set_value (&vam->macro_main,
22852 (char *) name, (char *) value);
22855 errmsg ("usage: set <name> <value>");
22863 unset (vat_main_t * vam)
22867 if (unformat (vam->input, "%s", &name))
22868 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
22869 errmsg ("unset: %s wasn't set", name);
22882 macro_sort_cmp (void *a1, void *a2)
22884 macro_sort_t *s1 = a1;
22885 macro_sort_t *s2 = a2;
22887 return strcmp ((char *) (s1->name), (char *) (s2->name));
22891 dump_macro_table (vat_main_t * vam)
22893 macro_sort_t *sort_me = 0, *sm;
22898 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
22900 vec_add2 (sort_me, sm, 1);
22901 sm->name = (u8 *)(p->key);
22902 sm->value = (u8 *) (p->value[0]);
22906 vec_sort_with_function (sort_me, macro_sort_cmp);
22908 if (vec_len (sort_me))
22909 print (vam->ofp, "%-15s%s", "Name", "Value");
22911 print (vam->ofp, "The macro table is empty...");
22913 for (i = 0; i < vec_len (sort_me); i++)
22914 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
22919 dump_node_table (vat_main_t * vam)
22922 vlib_node_t *node, *next_node;
22924 if (vec_len (vam->graph_nodes) == 0)
22926 print (vam->ofp, "Node table empty, issue get_node_graph...");
22930 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
22932 node = vam->graph_nodes[0][i];
22933 print (vam->ofp, "[%d] %s", i, node->name);
22934 for (j = 0; j < vec_len (node->next_nodes); j++)
22936 if (node->next_nodes[j] != ~0)
22938 next_node = vam->graph_nodes[0][node->next_nodes[j]];
22939 print (vam->ofp, " [%d] %s", j, next_node->name);
22947 value_sort_cmp (void *a1, void *a2)
22949 name_sort_t *n1 = a1;
22950 name_sort_t *n2 = a2;
22952 if (n1->value < n2->value)
22954 if (n1->value > n2->value)
22961 dump_msg_api_table (vat_main_t * vam)
22963 api_main_t *am = &api_main;
22964 name_sort_t *nses = 0, *ns;
22969 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
22971 vec_add2 (nses, ns, 1);
22972 ns->name = (u8 *)(hp->key);
22973 ns->value = (u32) hp->value[0];
22977 vec_sort_with_function (nses, value_sort_cmp);
22979 for (i = 0; i < vec_len (nses); i++)
22980 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
22986 get_msg_id (vat_main_t * vam)
22991 if (unformat (vam->input, "%s", &name_and_crc))
22993 message_index = vl_msg_api_get_msg_index (name_and_crc);
22994 if (message_index == ~0)
22996 print (vam->ofp, " '%s' not found", name_and_crc);
22999 print (vam->ofp, " '%s' has message index %d",
23000 name_and_crc, message_index);
23003 errmsg ("name_and_crc required...");
23008 search_node_table (vat_main_t * vam)
23010 unformat_input_t *line_input = vam->input;
23013 vlib_node_t *node, *next_node;
23016 if (vam->graph_node_index_by_name == 0)
23018 print (vam->ofp, "Node table empty, issue get_node_graph...");
23022 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
23024 if (unformat (line_input, "%s", &node_to_find))
23026 vec_add1 (node_to_find, 0);
23027 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
23030 print (vam->ofp, "%s not found...", node_to_find);
23033 node = vam->graph_nodes[0][p[0]];
23034 print (vam->ofp, "[%d] %s", p[0], node->name);
23035 for (j = 0; j < vec_len (node->next_nodes); j++)
23037 if (node->next_nodes[j] != ~0)
23039 next_node = vam->graph_nodes[0][node->next_nodes[j]];
23040 print (vam->ofp, " [%d] %s", j, next_node->name);
23047 clib_warning ("parse error '%U'", format_unformat_error,
23053 vec_free (node_to_find);
23062 script (vat_main_t * vam)
23064 #if (VPP_API_TEST_BUILTIN==0)
23066 char *save_current_file;
23067 unformat_input_t save_input;
23068 jmp_buf save_jump_buf;
23069 u32 save_line_number;
23071 FILE *new_fp, *save_ifp;
23073 if (unformat (vam->input, "%s", &s))
23075 new_fp = fopen ((char *) s, "r");
23078 errmsg ("Couldn't open script file %s", s);
23085 errmsg ("Missing script name");
23089 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
23090 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
23091 save_ifp = vam->ifp;
23092 save_line_number = vam->input_line_number;
23093 save_current_file = (char *) vam->current_file;
23095 vam->input_line_number = 0;
23097 vam->current_file = s;
23100 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
23101 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
23102 vam->ifp = save_ifp;
23103 vam->input_line_number = save_line_number;
23104 vam->current_file = (u8 *) save_current_file;
23109 clib_warning ("use the exec command...");
23115 echo (vat_main_t * vam)
23117 print (vam->ofp, "%v", vam->input->buffer);
23121 /* List of API message constructors, CLI names map to api_xxx */
23122 #define foreach_vpe_api_msg \
23123 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
23124 _(sw_interface_dump,"") \
23125 _(sw_interface_set_flags, \
23126 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
23127 _(sw_interface_add_del_address, \
23128 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
23129 _(sw_interface_set_rx_mode, \
23130 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
23131 _(sw_interface_set_rx_placement, \
23132 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
23133 _(sw_interface_rx_placement_dump, \
23134 "[<intfc> | sw_if_index <id>]") \
23135 _(sw_interface_set_table, \
23136 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
23137 _(sw_interface_set_mpls_enable, \
23138 "<intfc> | sw_if_index [disable | dis]") \
23139 _(sw_interface_set_vpath, \
23140 "<intfc> | sw_if_index <id> enable | disable") \
23141 _(sw_interface_set_vxlan_bypass, \
23142 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23143 _(sw_interface_set_geneve_bypass, \
23144 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23145 _(sw_interface_set_l2_xconnect, \
23146 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23147 "enable | disable") \
23148 _(sw_interface_set_l2_bridge, \
23149 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
23150 "[shg <split-horizon-group>] [bvi]\n" \
23151 "enable | disable") \
23152 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
23153 _(bridge_domain_add_del, \
23154 "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") \
23155 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
23157 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
23158 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
23159 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
23161 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23163 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23165 "tapname <name> mac <mac-addr> | random-mac [tag <string>]") \
23167 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
23169 "<vpp-if-name> | sw_if_index <id>") \
23170 _(sw_interface_tap_dump, "") \
23172 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
23174 "<vpp-if-name> | sw_if_index <id>") \
23175 _(sw_interface_tap_v2_dump, "") \
23177 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
23178 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]}") \
23180 "<vpp-if-name> | sw_if_index <id>") \
23182 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
23183 _(bond_detach_slave, \
23184 "sw_if_index <n>") \
23185 _(sw_interface_bond_dump, "") \
23186 _(sw_interface_slave_dump, \
23187 "<vpp-if-name> | sw_if_index <id>") \
23188 _(ip_table_add_del, \
23189 "table <n> [ipv6] [add | del]\n") \
23190 _(ip_add_del_route, \
23191 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
23192 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
23193 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
23194 "[multipath] [count <n>] [del]") \
23195 _(ip_mroute_add_del, \
23196 "<src> <grp>/<mask> [table-id <n>]\n" \
23197 "[<intfc> | sw_if_index <id>] [local] [del]") \
23198 _(mpls_table_add_del, \
23199 "table <n> [add | del]\n") \
23200 _(mpls_route_add_del, \
23201 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
23202 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
23203 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
23204 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
23205 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
23206 "[count <n>] [del]") \
23207 _(mpls_ip_bind_unbind, \
23208 "<label> <addr/len>") \
23209 _(mpls_tunnel_add_del, \
23210 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
23211 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
23212 "[l2-only] [out-label <n>]") \
23213 _(sr_mpls_policy_add, \
23214 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
23215 _(sr_mpls_policy_del, \
23217 _(bier_table_add_del, \
23218 "<label> <sub-domain> <set> <bsl> [del]") \
23219 _(bier_route_add_del, \
23220 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
23221 "[<intfc> | sw_if_index <id>]" \
23222 "[weight <n>] [del] [multipath]") \
23223 _(proxy_arp_add_del, \
23224 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
23225 _(proxy_arp_intfc_enable_disable, \
23226 "<intfc> | sw_if_index <id> enable | disable") \
23227 _(sw_interface_set_unnumbered, \
23228 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
23229 _(ip_neighbor_add_del, \
23230 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
23231 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
23232 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
23233 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
23234 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
23235 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
23236 "[outer_vlan_id_any][inner_vlan_id_any]") \
23237 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
23238 _(reset_fib, "vrf <n> [ipv6]") \
23239 _(dhcp_proxy_config, \
23240 "svr <v46-address> src <v46-address>\n" \
23241 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
23242 _(dhcp_proxy_set_vss, \
23243 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
23244 _(dhcp_proxy_dump, "ip6") \
23245 _(dhcp_client_config, \
23246 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
23247 _(set_ip_flow_hash, \
23248 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
23249 _(sw_interface_ip6_enable_disable, \
23250 "<intfc> | sw_if_index <id> enable | disable") \
23251 _(ip6nd_proxy_add_del, \
23252 "<intfc> | sw_if_index <id> <ip6-address>") \
23253 _(ip6nd_proxy_dump, "") \
23254 _(sw_interface_ip6nd_ra_prefix, \
23255 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
23256 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
23257 "[nolink] [isno]") \
23258 _(sw_interface_ip6nd_ra_config, \
23259 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
23260 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
23261 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
23262 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
23263 _(l2_patch_add_del, \
23264 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23265 "enable | disable") \
23266 _(sr_localsid_add_del, \
23267 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
23268 "fib-table <num> (end.psp) sw_if_index <num>") \
23269 _(classify_add_del_table, \
23270 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
23271 " [del] [del-chain] mask <mask-value>\n" \
23272 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
23273 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
23274 _(classify_add_del_session, \
23275 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
23276 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
23277 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
23278 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
23279 _(classify_set_interface_ip_table, \
23280 "<intfc> | sw_if_index <nn> table <nn>") \
23281 _(classify_set_interface_l2_tables, \
23282 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23283 " [other-table <nn>]") \
23284 _(get_node_index, "node <node-name") \
23285 _(add_node_next, "node <node-name> next <next-node-name>") \
23286 _(l2tpv3_create_tunnel, \
23287 "client_address <ip6-addr> our_address <ip6-addr>\n" \
23288 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
23289 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
23290 _(l2tpv3_set_tunnel_cookies, \
23291 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
23292 "[new_remote_cookie <nn>]\n") \
23293 _(l2tpv3_interface_enable_disable, \
23294 "<intfc> | sw_if_index <nn> enable | disable") \
23295 _(l2tpv3_set_lookup_key, \
23296 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
23297 _(sw_if_l2tpv3_tunnel_dump, "") \
23298 _(vxlan_offload_rx, \
23299 "hw { <interface name> | hw_if_index <nn>} " \
23300 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
23301 _(vxlan_add_del_tunnel, \
23302 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23303 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
23304 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23305 _(geneve_add_del_tunnel, \
23306 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23307 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23308 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23309 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23310 _(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23311 _(gre_add_del_tunnel, \
23312 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
23313 "[teb | erspan <session-id>] [del]") \
23314 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23315 _(l2_fib_clear_table, "") \
23316 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
23317 _(l2_interface_vlan_tag_rewrite, \
23318 "<intfc> | sw_if_index <nn> \n" \
23319 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
23320 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
23321 _(create_vhost_user_if, \
23322 "socket <filename> [server] [renumber <dev_instance>] " \
23323 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
23324 "[mac <mac_address>]") \
23325 _(modify_vhost_user_if, \
23326 "<intfc> | sw_if_index <nn> socket <filename>\n" \
23327 "[server] [renumber <dev_instance>]") \
23328 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
23329 _(sw_interface_vhost_user_dump, "") \
23330 _(show_version, "") \
23331 _(show_threads, "") \
23332 _(vxlan_gpe_add_del_tunnel, \
23333 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
23334 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23335 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
23336 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
23337 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23338 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
23339 _(interface_name_renumber, \
23340 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
23341 _(input_acl_set_interface, \
23342 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23343 " [l2-table <nn>] [del]") \
23344 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
23345 _(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
23346 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
23347 _(want_ip4_arp_events, "address <ip4-address> [del]") \
23348 _(want_ip6_nd_events, "address <ip6-address> [del]") \
23349 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
23350 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
23351 _(ip_dump, "ipv4 | ipv6") \
23352 _(ipsec_spd_add_del, "spd_id <n> [del]") \
23353 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
23355 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
23356 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
23357 " integ_alg <alg> integ_key <hex>") \
23358 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
23359 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
23360 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
23361 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
23362 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
23363 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
23364 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
23365 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
23366 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
23367 " [instance <n>]") \
23368 _(ipsec_sa_dump, "[sa_id <n>]") \
23369 _(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
23370 " <alg> <hex>\n") \
23371 _(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
23372 _(ikev2_profile_add_del, "name <profile_name> [del]") \
23373 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
23374 "(auth_data 0x<data> | auth_data <data>)") \
23375 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
23376 "(id_data 0x<data> | id_data <data>) (local|remote)") \
23377 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
23378 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
23379 "(local|remote)") \
23380 _(ikev2_set_local_key, "file <absolute_file_path>") \
23381 _(ikev2_set_responder, "<profile_name> interface <interface> address <addr>") \
23382 _(ikev2_set_ike_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23383 _(ikev2_set_esp_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23384 _(ikev2_set_sa_lifetime, "<profile_name> <seconds> <jitter> <handover> <max bytes>") \
23385 _(ikev2_initiate_sa_init, "<profile_name>") \
23386 _(ikev2_initiate_del_ike_sa, "<ispi>") \
23387 _(ikev2_initiate_del_child_sa, "<ispi>") \
23388 _(ikev2_initiate_rekey_child_sa, "<ispi>") \
23389 _(delete_loopback,"sw_if_index <nn>") \
23390 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
23391 _(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
23392 _(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
23393 _(want_interface_events, "enable|disable") \
23394 _(get_first_msg_id, "client <name>") \
23395 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
23396 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
23397 "fib-id <nn> [ip4][ip6][default]") \
23398 _(get_node_graph, " ") \
23399 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
23400 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
23401 _(ioam_disable, "") \
23402 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
23403 " sw_if_index <sw_if_index> p <priority> " \
23404 "w <weight>] [del]") \
23405 _(one_add_del_locator, "locator-set <locator_name> " \
23406 "iface <intf> | sw_if_index <sw_if_index> " \
23407 "p <priority> w <weight> [del]") \
23408 _(one_add_del_local_eid,"vni <vni> eid " \
23409 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23410 "locator-set <locator_name> [del]" \
23411 "[key-id sha1|sha256 secret-key <secret-key>]")\
23412 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
23413 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
23414 _(one_enable_disable, "enable|disable") \
23415 _(one_map_register_enable_disable, "enable|disable") \
23416 _(one_map_register_fallback_threshold, "<value>") \
23417 _(one_rloc_probe_enable_disable, "enable|disable") \
23418 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23420 "rloc <locator> p <prio> " \
23421 "w <weight> [rloc <loc> ... ] " \
23422 "action <action> [del-all]") \
23423 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23425 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23426 _(one_use_petr, "ip-address> | disable") \
23427 _(one_map_request_mode, "src-dst|dst-only") \
23428 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23429 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23430 _(one_locator_set_dump, "[local | remote]") \
23431 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
23432 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23433 "[local] | [remote]") \
23434 _(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
23435 _(one_ndp_bd_get, "") \
23436 _(one_ndp_entries_get, "bd <bridge-domain>") \
23437 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
23438 _(one_l2_arp_bd_get, "") \
23439 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
23440 _(one_stats_enable_disable, "enable|disable") \
23441 _(show_one_stats_enable_disable, "") \
23442 _(one_eid_table_vni_dump, "") \
23443 _(one_eid_table_map_dump, "l2|l3") \
23444 _(one_map_resolver_dump, "") \
23445 _(one_map_server_dump, "") \
23446 _(one_adjacencies_get, "vni <vni>") \
23447 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
23448 _(show_one_rloc_probe_state, "") \
23449 _(show_one_map_register_state, "") \
23450 _(show_one_status, "") \
23451 _(one_stats_dump, "") \
23452 _(one_stats_flush, "") \
23453 _(one_get_map_request_itr_rlocs, "") \
23454 _(one_map_register_set_ttl, "<ttl>") \
23455 _(one_set_transport_protocol, "udp|api") \
23456 _(one_get_transport_protocol, "") \
23457 _(one_enable_disable_xtr_mode, "enable|disable") \
23458 _(one_show_xtr_mode, "") \
23459 _(one_enable_disable_pitr_mode, "enable|disable") \
23460 _(one_show_pitr_mode, "") \
23461 _(one_enable_disable_petr_mode, "enable|disable") \
23462 _(one_show_petr_mode, "") \
23463 _(show_one_nsh_mapping, "") \
23464 _(show_one_pitr, "") \
23465 _(show_one_use_petr, "") \
23466 _(show_one_map_request_mode, "") \
23467 _(show_one_map_register_ttl, "") \
23468 _(show_one_map_register_fallback_threshold, "") \
23469 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
23470 " sw_if_index <sw_if_index> p <priority> " \
23471 "w <weight>] [del]") \
23472 _(lisp_add_del_locator, "locator-set <locator_name> " \
23473 "iface <intf> | sw_if_index <sw_if_index> " \
23474 "p <priority> w <weight> [del]") \
23475 _(lisp_add_del_local_eid,"vni <vni> eid " \
23476 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23477 "locator-set <locator_name> [del]" \
23478 "[key-id sha1|sha256 secret-key <secret-key>]") \
23479 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
23480 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
23481 _(lisp_enable_disable, "enable|disable") \
23482 _(lisp_map_register_enable_disable, "enable|disable") \
23483 _(lisp_rloc_probe_enable_disable, "enable|disable") \
23484 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23486 "rloc <locator> p <prio> " \
23487 "w <weight> [rloc <loc> ... ] " \
23488 "action <action> [del-all]") \
23489 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23491 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23492 _(lisp_use_petr, "<ip-address> | disable") \
23493 _(lisp_map_request_mode, "src-dst|dst-only") \
23494 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23495 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23496 _(lisp_locator_set_dump, "[local | remote]") \
23497 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
23498 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23499 "[local] | [remote]") \
23500 _(lisp_eid_table_vni_dump, "") \
23501 _(lisp_eid_table_map_dump, "l2|l3") \
23502 _(lisp_map_resolver_dump, "") \
23503 _(lisp_map_server_dump, "") \
23504 _(lisp_adjacencies_get, "vni <vni>") \
23505 _(gpe_fwd_entry_vnis_get, "") \
23506 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
23507 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
23508 "[table <table-id>]") \
23509 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
23510 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
23511 _(gpe_set_encap_mode, "lisp|vxlan") \
23512 _(gpe_get_encap_mode, "") \
23513 _(lisp_gpe_add_del_iface, "up|down") \
23514 _(lisp_gpe_enable_disable, "enable|disable") \
23515 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
23516 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
23517 _(show_lisp_rloc_probe_state, "") \
23518 _(show_lisp_map_register_state, "") \
23519 _(show_lisp_status, "") \
23520 _(lisp_get_map_request_itr_rlocs, "") \
23521 _(show_lisp_pitr, "") \
23522 _(show_lisp_use_petr, "") \
23523 _(show_lisp_map_request_mode, "") \
23524 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
23525 _(af_packet_delete, "name <host interface name>") \
23526 _(af_packet_dump, "") \
23527 _(policer_add_del, "name <policer name> <params> [del]") \
23528 _(policer_dump, "[name <policer name>]") \
23529 _(policer_classify_set_interface, \
23530 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23531 " [l2-table <nn>] [del]") \
23532 _(policer_classify_dump, "type [ip4|ip6|l2]") \
23533 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
23534 "[master|slave]") \
23535 _(netmap_delete, "name <interface name>") \
23536 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
23537 _(mpls_fib_dump, "") \
23538 _(classify_table_ids, "") \
23539 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
23540 _(classify_table_info, "table_id <nn>") \
23541 _(classify_session_dump, "table_id <nn>") \
23542 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
23543 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
23544 "[template_interval <nn>] [udp_checksum]") \
23545 _(ipfix_exporter_dump, "") \
23546 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
23547 _(ipfix_classify_stream_dump, "") \
23548 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
23549 _(ipfix_classify_table_dump, "") \
23550 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
23551 _(sw_interface_span_dump, "[l2]") \
23552 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
23553 _(pg_create_interface, "if_id <nn>") \
23554 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
23555 _(pg_enable_disable, "[stream <id>] disable") \
23556 _(ip_source_and_port_range_check_add_del, \
23557 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
23558 _(ip_source_and_port_range_check_interface_add_del, \
23559 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
23560 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
23561 _(ipsec_gre_add_del_tunnel, \
23562 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
23563 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
23564 _(delete_subif,"<intfc> | sw_if_index <nn>") \
23565 _(l2_interface_pbb_tag_rewrite, \
23566 "<intfc> | sw_if_index <nn> \n" \
23567 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
23568 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
23569 _(set_punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
23570 _(flow_classify_set_interface, \
23571 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
23572 _(flow_classify_dump, "type [ip4|ip6]") \
23573 _(ip_fib_dump, "") \
23574 _(ip_mfib_dump, "") \
23575 _(ip6_fib_dump, "") \
23576 _(ip6_mfib_dump, "") \
23577 _(feature_enable_disable, "arc_name <arc_name> " \
23578 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
23579 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
23581 _(l2_xconnect_dump, "") \
23582 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
23583 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
23584 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
23585 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
23586 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
23587 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
23588 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
23589 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
23590 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
23591 _(sock_init_shm, "size <nnn>") \
23592 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
23593 _(dns_enable_disable, "[enable][disable]") \
23594 _(dns_name_server_add_del, "<ip-address> [del]") \
23595 _(dns_resolve_name, "<hostname>") \
23596 _(dns_resolve_ip, "<ip4|ip6>") \
23597 _(dns_name_server_add_del, "<ip-address> [del]") \
23598 _(dns_resolve_name, "<hostname>") \
23599 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
23600 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
23601 _(session_rules_dump, "") \
23602 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
23603 _(output_acl_set_interface, \
23604 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23605 " [l2-table <nn>] [del]") \
23606 _(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
23608 /* List of command functions, CLI names map directly to functions */
23609 #define foreach_cli_function \
23610 _(comment, "usage: comment <ignore-rest-of-line>") \
23611 _(dump_interface_table, "usage: dump_interface_table") \
23612 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
23613 _(dump_ipv4_table, "usage: dump_ipv4_table") \
23614 _(dump_ipv6_table, "usage: dump_ipv6_table") \
23615 _(dump_macro_table, "usage: dump_macro_table ") \
23616 _(dump_node_table, "usage: dump_node_table") \
23617 _(dump_msg_api_table, "usage: dump_msg_api_table") \
23618 _(get_msg_id, "usage: get_msg_id name_and_crc") \
23619 _(echo, "usage: echo <message>") \
23620 _(exec, "usage: exec <vpe-debug-CLI-command>") \
23621 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
23622 _(help, "usage: help") \
23623 _(q, "usage: quit") \
23624 _(quit, "usage: quit") \
23625 _(search_node_table, "usage: search_node_table <name>...") \
23626 _(set, "usage: set <variable-name> <value>") \
23627 _(script, "usage: script <file-name>") \
23628 _(statseg, "usage: statseg"); \
23629 _(unset, "usage: unset <variable-name>")
23632 static void vl_api_##n##_t_handler_uni \
23633 (vl_api_##n##_t * mp) \
23635 vat_main_t * vam = &vat_main; \
23636 if (vam->json_output) { \
23637 vl_api_##n##_t_handler_json(mp); \
23639 vl_api_##n##_t_handler(mp); \
23642 foreach_vpe_api_reply_msg;
23643 #if VPP_API_TEST_BUILTIN == 0
23644 foreach_standalone_reply_msg;
23649 vat_api_hookup (vat_main_t * vam)
23652 vl_msg_api_set_handlers(VL_API_##N, #n, \
23653 vl_api_##n##_t_handler_uni, \
23655 vl_api_##n##_t_endian, \
23656 vl_api_##n##_t_print, \
23657 sizeof(vl_api_##n##_t), 1);
23658 foreach_vpe_api_reply_msg;
23659 #if VPP_API_TEST_BUILTIN == 0
23660 foreach_standalone_reply_msg;
23664 #if (VPP_API_TEST_BUILTIN==0)
23665 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
23667 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
23669 vam->function_by_name = hash_create_string (0, sizeof (uword));
23671 vam->help_by_name = hash_create_string (0, sizeof (uword));
23674 /* API messages we can send */
23675 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
23676 foreach_vpe_api_msg;
23680 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
23681 foreach_vpe_api_msg;
23684 /* CLI functions */
23685 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
23686 foreach_cli_function;
23690 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
23691 foreach_cli_function;
23695 #if VPP_API_TEST_BUILTIN
23696 static clib_error_t *
23697 vat_api_hookup_shim (vlib_main_t * vm)
23699 vat_api_hookup (&vat_main);
23703 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
23707 * fd.io coding-style-patch-verification: ON
23710 * eval: (c-set-style "gnu")