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 _(want_interface_events_reply) \
5263 _(cop_interface_enable_disable_reply) \
5264 _(cop_whitelist_enable_disable_reply) \
5265 _(sw_interface_clear_stats_reply) \
5266 _(ioam_enable_reply) \
5267 _(ioam_disable_reply) \
5268 _(one_add_del_locator_reply) \
5269 _(one_add_del_local_eid_reply) \
5270 _(one_add_del_remote_mapping_reply) \
5271 _(one_add_del_adjacency_reply) \
5272 _(one_add_del_map_resolver_reply) \
5273 _(one_add_del_map_server_reply) \
5274 _(one_enable_disable_reply) \
5275 _(one_rloc_probe_enable_disable_reply) \
5276 _(one_map_register_enable_disable_reply) \
5277 _(one_map_register_set_ttl_reply) \
5278 _(one_set_transport_protocol_reply) \
5279 _(one_map_register_fallback_threshold_reply) \
5280 _(one_pitr_set_locator_set_reply) \
5281 _(one_map_request_mode_reply) \
5282 _(one_add_del_map_request_itr_rlocs_reply) \
5283 _(one_eid_table_add_del_map_reply) \
5284 _(one_use_petr_reply) \
5285 _(one_stats_enable_disable_reply) \
5286 _(one_add_del_l2_arp_entry_reply) \
5287 _(one_add_del_ndp_entry_reply) \
5288 _(one_stats_flush_reply) \
5289 _(one_enable_disable_xtr_mode_reply) \
5290 _(one_enable_disable_pitr_mode_reply) \
5291 _(one_enable_disable_petr_mode_reply) \
5292 _(gpe_enable_disable_reply) \
5293 _(gpe_set_encap_mode_reply) \
5294 _(gpe_add_del_iface_reply) \
5295 _(gpe_add_del_native_fwd_rpath_reply) \
5296 _(af_packet_delete_reply) \
5297 _(policer_classify_set_interface_reply) \
5298 _(netmap_create_reply) \
5299 _(netmap_delete_reply) \
5300 _(set_ipfix_exporter_reply) \
5301 _(set_ipfix_classify_stream_reply) \
5302 _(ipfix_classify_table_add_del_reply) \
5303 _(flow_classify_set_interface_reply) \
5304 _(sw_interface_span_enable_disable_reply) \
5305 _(pg_capture_reply) \
5306 _(pg_enable_disable_reply) \
5307 _(ip_source_and_port_range_check_add_del_reply) \
5308 _(ip_source_and_port_range_check_interface_add_del_reply)\
5309 _(delete_subif_reply) \
5310 _(l2_interface_pbb_tag_rewrite_reply) \
5312 _(feature_enable_disable_reply) \
5313 _(sw_interface_tag_add_del_reply) \
5314 _(hw_interface_set_mtu_reply) \
5315 _(p2p_ethernet_add_reply) \
5316 _(p2p_ethernet_del_reply) \
5317 _(lldp_config_reply) \
5318 _(sw_interface_set_lldp_reply) \
5319 _(tcp_configure_src_addresses_reply) \
5320 _(dns_enable_disable_reply) \
5321 _(dns_name_server_add_del_reply) \
5322 _(session_rule_add_del_reply) \
5323 _(ip_container_proxy_add_del_reply) \
5324 _(output_acl_set_interface_reply) \
5325 _(qos_record_enable_disable_reply)
5328 static void vl_api_##n##_t_handler \
5329 (vl_api_##n##_t * mp) \
5331 vat_main_t * vam = &vat_main; \
5332 i32 retval = ntohl(mp->retval); \
5333 if (vam->async_mode) { \
5334 vam->async_errors += (retval < 0); \
5336 vam->retval = retval; \
5337 vam->result_ready = 1; \
5340 foreach_standard_reply_retval_handler;
5344 static void vl_api_##n##_t_handler_json \
5345 (vl_api_##n##_t * mp) \
5347 vat_main_t * vam = &vat_main; \
5348 vat_json_node_t node; \
5349 vat_json_init_object(&node); \
5350 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5351 vat_json_print(vam->ofp, &node); \
5352 vam->retval = ntohl(mp->retval); \
5353 vam->result_ready = 1; \
5355 foreach_standard_reply_retval_handler;
5359 * Table of message reply handlers, must include boilerplate handlers
5363 #define foreach_vpe_api_reply_msg \
5364 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
5365 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
5366 _(SW_INTERFACE_DETAILS, sw_interface_details) \
5367 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5368 _(CONTROL_PING_REPLY, control_ping_reply) \
5369 _(CLI_REPLY, cli_reply) \
5370 _(CLI_INBAND_REPLY, cli_inband_reply) \
5371 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5372 sw_interface_add_del_address_reply) \
5373 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
5374 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
5375 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
5376 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5377 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5378 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5379 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
5380 _(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
5381 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
5382 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5383 sw_interface_set_l2_xconnect_reply) \
5384 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5385 sw_interface_set_l2_bridge_reply) \
5386 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5387 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
5388 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
5389 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
5390 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5391 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
5392 _(L2_FLAGS_REPLY, l2_flags_reply) \
5393 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
5394 _(TAP_CONNECT_REPLY, tap_connect_reply) \
5395 _(TAP_MODIFY_REPLY, tap_modify_reply) \
5396 _(TAP_DELETE_REPLY, tap_delete_reply) \
5397 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
5398 _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5399 _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5400 _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
5401 _(BOND_CREATE_REPLY, bond_create_reply) \
5402 _(BOND_DELETE_REPLY, bond_delete_reply) \
5403 _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5404 _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5405 _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5406 _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
5407 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
5408 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
5409 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
5410 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
5411 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5412 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
5413 _(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5414 _(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
5415 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5416 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5417 proxy_arp_intfc_enable_disable_reply) \
5418 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5419 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5420 sw_interface_set_unnumbered_reply) \
5421 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
5422 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5423 _(CREATE_SUBIF_REPLY, create_subif_reply) \
5424 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
5425 _(RESET_FIB_REPLY, reset_fib_reply) \
5426 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
5427 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
5428 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
5429 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5430 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5431 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5432 sw_interface_ip6_enable_disable_reply) \
5433 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5434 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
5435 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5436 sw_interface_ip6nd_ra_prefix_reply) \
5437 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5438 sw_interface_ip6nd_ra_config_reply) \
5439 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5440 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
5441 _(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5442 _(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5443 _(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
5444 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5445 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5446 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5447 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5448 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
5449 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5450 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5451 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5452 classify_set_interface_ip_table_reply) \
5453 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5454 classify_set_interface_l2_tables_reply) \
5455 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5456 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5457 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5458 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5459 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5460 l2tpv3_interface_enable_disable_reply) \
5461 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5462 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5463 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
5464 _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
5465 _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
5466 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
5467 _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
5468 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
5469 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5470 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5471 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5472 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5473 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5474 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5475 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5476 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5477 _(SHOW_VERSION_REPLY, show_version_reply) \
5478 _(SHOW_THREADS_REPLY, show_threads_reply) \
5479 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
5480 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
5481 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5482 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
5483 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
5484 _(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
5485 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5486 _(IP4_ARP_EVENT, ip4_arp_event) \
5487 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5488 _(IP6_ND_EVENT, ip6_nd_event) \
5489 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5490 _(L2_MACS_EVENT, l2_macs_event) \
5491 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5492 _(IP_ADDRESS_DETAILS, ip_address_details) \
5493 _(IP_DETAILS, ip_details) \
5494 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5495 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
5496 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
5497 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
5498 _(IPSEC_SA_DETAILS, ipsec_sa_details) \
5499 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
5500 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
5501 _(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \
5502 _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
5503 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
5504 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
5505 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
5506 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
5507 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
5508 _(IKEV2_SET_RESPONDER_REPLY, ikev2_set_responder_reply) \
5509 _(IKEV2_SET_IKE_TRANSFORMS_REPLY, ikev2_set_ike_transforms_reply) \
5510 _(IKEV2_SET_ESP_TRANSFORMS_REPLY, ikev2_set_esp_transforms_reply) \
5511 _(IKEV2_SET_SA_LIFETIME_REPLY, ikev2_set_sa_lifetime_reply) \
5512 _(IKEV2_INITIATE_SA_INIT_REPLY, ikev2_initiate_sa_init_reply) \
5513 _(IKEV2_INITIATE_DEL_IKE_SA_REPLY, ikev2_initiate_del_ike_sa_reply) \
5514 _(IKEV2_INITIATE_DEL_CHILD_SA_REPLY, ikev2_initiate_del_child_sa_reply) \
5515 _(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \
5516 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5517 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
5518 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
5519 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
5520 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
5521 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5522 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5523 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5524 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5525 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5526 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5527 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
5528 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5529 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5530 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5531 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5532 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5533 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5534 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5535 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5536 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5537 one_map_register_enable_disable_reply) \
5538 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
5539 _(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5540 _(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
5541 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5542 one_map_register_fallback_threshold_reply) \
5543 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5544 one_rloc_probe_enable_disable_reply) \
5545 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
5546 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
5547 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5548 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5549 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5550 _(ONE_LOCATOR_DETAILS, one_locator_details) \
5551 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5552 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5553 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5554 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5555 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5556 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
5557 _(ONE_STATS_DETAILS, one_stats_details) \
5558 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
5559 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5560 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5561 show_one_stats_enable_disable_reply) \
5562 _(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5563 _(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5564 _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
5565 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5566 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5567 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
5568 _(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5569 _(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5570 one_enable_disable_pitr_mode_reply) \
5571 _(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5572 one_enable_disable_petr_mode_reply) \
5573 _(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5574 _(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5575 _(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
5576 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5577 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
5578 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
5579 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5580 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
5581 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
5582 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
5583 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5584 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5585 gpe_add_del_native_fwd_rpath_reply) \
5586 _(GPE_FWD_ENTRY_PATH_DETAILS, \
5587 gpe_fwd_entry_path_details) \
5588 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5589 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5590 one_add_del_map_request_itr_rlocs_reply) \
5591 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5592 one_get_map_request_itr_rlocs_reply) \
5593 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
5594 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
5595 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
5596 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5597 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5598 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5599 show_one_map_register_state_reply) \
5600 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
5601 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5602 show_one_map_register_fallback_threshold_reply) \
5603 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5604 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
5605 _(AF_PACKET_DETAILS, af_packet_details) \
5606 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5607 _(POLICER_DETAILS, policer_details) \
5608 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5609 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5610 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
5611 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5612 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5613 _(MPLS_FIB_DETAILS, mpls_fib_details) \
5614 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5615 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5616 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5617 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5618 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5619 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5620 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5621 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5622 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5623 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5624 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5625 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5626 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5627 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5628 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5629 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5630 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5631 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5632 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5633 ip_source_and_port_range_check_add_del_reply) \
5634 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5635 ip_source_and_port_range_check_interface_add_del_reply) \
5636 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
5637 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5638 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5639 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5640 _(SET_PUNT_REPLY, set_punt_reply) \
5641 _(IP_FIB_DETAILS, ip_fib_details) \
5642 _(IP6_FIB_DETAILS, ip6_fib_details) \
5643 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5644 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5645 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5646 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
5647 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5648 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5649 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5650 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5651 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5652 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
5653 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
5654 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5655 _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5656 _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
5657 _(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
5658 _(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
5659 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
5660 _(SESSION_RULES_DETAILS, session_rules_details) \
5661 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
5662 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
5663 _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
5665 #define foreach_standalone_reply_msg \
5666 _(SW_INTERFACE_EVENT, sw_interface_event)
5674 #define STR_VTR_OP_CASE(op) \
5675 case L2_VTR_ ## op: \
5679 str_vtr_op (u32 vtr_op)
5683 STR_VTR_OP_CASE (DISABLED);
5684 STR_VTR_OP_CASE (PUSH_1);
5685 STR_VTR_OP_CASE (PUSH_2);
5686 STR_VTR_OP_CASE (POP_1);
5687 STR_VTR_OP_CASE (POP_2);
5688 STR_VTR_OP_CASE (TRANSLATE_1_1);
5689 STR_VTR_OP_CASE (TRANSLATE_1_2);
5690 STR_VTR_OP_CASE (TRANSLATE_2_1);
5691 STR_VTR_OP_CASE (TRANSLATE_2_2);
5698 dump_sub_interface_table (vat_main_t * vam)
5700 const sw_interface_subif_t *sub = NULL;
5702 if (vam->json_output)
5705 ("JSON output supported only for VPE API calls and dump_stats_table");
5710 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5711 "Interface", "sw_if_index",
5712 "sub id", "dot1ad", "tags", "outer id",
5713 "inner id", "exact", "default", "outer any", "inner any");
5715 vec_foreach (sub, vam->sw_if_subif_table)
5718 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5719 sub->interface_name,
5721 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5722 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5723 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5724 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5725 if (sub->vtr_op != L2_VTR_DISABLED)
5728 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5729 "tag1: %d tag2: %d ]",
5730 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5731 sub->vtr_tag1, sub->vtr_tag2);
5739 name_sort_cmp (void *a1, void *a2)
5741 name_sort_t *n1 = a1;
5742 name_sort_t *n2 = a2;
5744 return strcmp ((char *) n1->name, (char *) n2->name);
5748 dump_interface_table (vat_main_t * vam)
5751 name_sort_t *nses = 0, *ns;
5753 if (vam->json_output)
5756 ("JSON output supported only for VPE API calls and dump_stats_table");
5761 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5763 vec_add2 (nses, ns, 1);
5764 ns->name = (u8 *)(p->key);
5765 ns->value = (u32) p->value[0];
5769 vec_sort_with_function (nses, name_sort_cmp);
5771 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5772 vec_foreach (ns, nses)
5774 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5781 dump_ip_table (vat_main_t * vam, int is_ipv6)
5783 const ip_details_t *det = NULL;
5784 const ip_address_details_t *address = NULL;
5787 print (vam->ofp, "%-12s", "sw_if_index");
5789 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5796 print (vam->ofp, "%-12d", i);
5797 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5802 vec_foreach (address, det->addr)
5806 is_ipv6 ? format_ip6_address : format_ip4_address,
5807 address->ip, address->prefix_length);
5815 dump_ipv4_table (vat_main_t * vam)
5817 if (vam->json_output)
5820 ("JSON output supported only for VPE API calls and dump_stats_table");
5824 return dump_ip_table (vam, 0);
5828 dump_ipv6_table (vat_main_t * vam)
5830 if (vam->json_output)
5833 ("JSON output supported only for VPE API calls and dump_stats_table");
5837 return dump_ip_table (vam, 1);
5841 * Pass CLI buffers directly in the CLI_INBAND API message,
5842 * instead of an additional shared memory area.
5845 exec_inband (vat_main_t * vam)
5847 vl_api_cli_inband_t *mp;
5848 unformat_input_t *i = vam->input;
5851 if (vec_len (i->buffer) == 0)
5854 if (vam->exec_mode == 0 && unformat (i, "mode"))
5859 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5866 * In order for the CLI command to work, it
5867 * must be a vector ending in \n, not a C-string ending
5870 u32 len = vec_len (vam->input->buffer);
5871 M2 (CLI_INBAND, mp, len);
5872 vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
5876 /* json responses may or may not include a useful reply... */
5877 if (vec_len (vam->cmd_reply))
5878 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
5883 exec (vat_main_t * vam)
5885 return exec_inband (vam);
5889 api_create_loopback (vat_main_t * vam)
5891 unformat_input_t *i = vam->input;
5892 vl_api_create_loopback_t *mp;
5893 vl_api_create_loopback_instance_t *mp_lbi;
5896 u8 is_specified = 0;
5897 u32 user_instance = 0;
5900 clib_memset (mac_address, 0, sizeof (mac_address));
5902 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5904 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5906 if (unformat (i, "instance %d", &user_instance))
5914 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5915 mp_lbi->is_specified = is_specified;
5917 mp_lbi->user_instance = htonl (user_instance);
5919 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5924 /* Construct the API message */
5925 M (CREATE_LOOPBACK, mp);
5927 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5936 api_delete_loopback (vat_main_t * vam)
5938 unformat_input_t *i = vam->input;
5939 vl_api_delete_loopback_t *mp;
5940 u32 sw_if_index = ~0;
5943 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5945 if (unformat (i, "sw_if_index %d", &sw_if_index))
5951 if (sw_if_index == ~0)
5953 errmsg ("missing sw_if_index");
5957 /* Construct the API message */
5958 M (DELETE_LOOPBACK, mp);
5959 mp->sw_if_index = ntohl (sw_if_index);
5967 api_want_interface_events (vat_main_t * vam)
5969 unformat_input_t *i = vam->input;
5970 vl_api_want_interface_events_t *mp;
5974 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5976 if (unformat (i, "enable"))
5978 else if (unformat (i, "disable"))
5986 errmsg ("missing enable|disable");
5990 M (WANT_INTERFACE_EVENTS, mp);
5991 mp->enable_disable = enable;
5993 vam->interface_event_display = enable;
6001 /* Note: non-static, called once to set up the initial intfc table */
6003 api_sw_interface_dump (vat_main_t * vam)
6005 vl_api_sw_interface_dump_t *mp;
6006 vl_api_control_ping_t *mp_ping;
6008 name_sort_t *nses = 0, *ns;
6009 sw_interface_subif_t *sub = NULL;
6012 /* Toss the old name table */
6014 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
6016 vec_add2 (nses, ns, 1);
6017 ns->name = (u8 *)(p->key);
6018 ns->value = (u32) p->value[0];
6022 hash_free (vam->sw_if_index_by_interface_name);
6024 vec_foreach (ns, nses) vec_free (ns->name);
6028 vec_foreach (sub, vam->sw_if_subif_table)
6030 vec_free (sub->interface_name);
6032 vec_free (vam->sw_if_subif_table);
6034 /* recreate the interface name hash table */
6035 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
6038 * Ask for all interface names. Otherwise, the epic catalog of
6039 * name filters becomes ridiculously long, and vat ends up needing
6040 * to be taught about new interface types.
6042 M (SW_INTERFACE_DUMP, mp);
6045 /* Use a control ping for synchronization */
6046 MPING (CONTROL_PING, mp_ping);
6054 api_sw_interface_set_flags (vat_main_t * vam)
6056 unformat_input_t *i = vam->input;
6057 vl_api_sw_interface_set_flags_t *mp;
6059 u8 sw_if_index_set = 0;
6063 /* Parse args required to build the message */
6064 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6066 if (unformat (i, "admin-up"))
6068 else if (unformat (i, "admin-down"))
6071 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6072 sw_if_index_set = 1;
6073 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6074 sw_if_index_set = 1;
6079 if (sw_if_index_set == 0)
6081 errmsg ("missing interface name or sw_if_index");
6085 /* Construct the API message */
6086 M (SW_INTERFACE_SET_FLAGS, mp);
6087 mp->sw_if_index = ntohl (sw_if_index);
6088 mp->admin_up_down = admin_up;
6093 /* Wait for a reply, return the good/bad news... */
6099 api_sw_interface_set_rx_mode (vat_main_t * vam)
6101 unformat_input_t *i = vam->input;
6102 vl_api_sw_interface_set_rx_mode_t *mp;
6104 u8 sw_if_index_set = 0;
6106 u8 queue_id_valid = 0;
6108 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6110 /* Parse args required to build the message */
6111 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6113 if (unformat (i, "queue %d", &queue_id))
6115 else if (unformat (i, "polling"))
6116 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6117 else if (unformat (i, "interrupt"))
6118 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6119 else if (unformat (i, "adaptive"))
6120 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6122 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6123 sw_if_index_set = 1;
6124 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6125 sw_if_index_set = 1;
6130 if (sw_if_index_set == 0)
6132 errmsg ("missing interface name or sw_if_index");
6135 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6137 errmsg ("missing rx-mode");
6141 /* Construct the API message */
6142 M (SW_INTERFACE_SET_RX_MODE, mp);
6143 mp->sw_if_index = ntohl (sw_if_index);
6145 mp->queue_id_valid = queue_id_valid;
6146 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6151 /* Wait for a reply, return the good/bad news... */
6157 api_sw_interface_set_rx_placement (vat_main_t * vam)
6159 unformat_input_t *i = vam->input;
6160 vl_api_sw_interface_set_rx_placement_t *mp;
6162 u8 sw_if_index_set = 0;
6165 u32 queue_id, thread_index;
6167 /* Parse args required to build the message */
6168 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6170 if (unformat (i, "queue %d", &queue_id))
6172 else if (unformat (i, "main"))
6174 else if (unformat (i, "worker %d", &thread_index))
6177 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6178 sw_if_index_set = 1;
6179 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6180 sw_if_index_set = 1;
6185 if (sw_if_index_set == 0)
6187 errmsg ("missing interface name or sw_if_index");
6193 /* Construct the API message */
6194 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6195 mp->sw_if_index = ntohl (sw_if_index);
6196 mp->worker_id = ntohl (thread_index);
6197 mp->queue_id = ntohl (queue_id);
6198 mp->is_main = is_main;
6202 /* Wait for a reply, return the good/bad news... */
6207 static void vl_api_sw_interface_rx_placement_details_t_handler
6208 (vl_api_sw_interface_rx_placement_details_t * mp)
6210 vat_main_t *vam = &vat_main;
6211 u32 worker_id = ntohl (mp->worker_id);
6214 "\n%-11d %-11s %-6d %-5d %-9s",
6215 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
6216 worker_id, ntohl (mp->queue_id),
6218 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
6221 static void vl_api_sw_interface_rx_placement_details_t_handler_json
6222 (vl_api_sw_interface_rx_placement_details_t * mp)
6224 vat_main_t *vam = &vat_main;
6225 vat_json_node_t *node = NULL;
6227 if (VAT_JSON_ARRAY != vam->json_tree.type)
6229 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6230 vat_json_init_array (&vam->json_tree);
6232 node = vat_json_array_add (&vam->json_tree);
6234 vat_json_init_object (node);
6235 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6236 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
6237 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
6238 vat_json_object_add_uint (node, "mode", mp->mode);
6242 api_sw_interface_rx_placement_dump (vat_main_t * vam)
6244 unformat_input_t *i = vam->input;
6245 vl_api_sw_interface_rx_placement_dump_t *mp;
6246 vl_api_control_ping_t *mp_ping;
6249 u8 sw_if_index_set = 0;
6251 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6253 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6255 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6262 "\n%-11s %-11s %-6s %-5s %-4s",
6263 "sw_if_index", "main/worker", "thread", "queue", "mode");
6265 /* Dump Interface rx placement */
6266 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
6268 if (sw_if_index_set)
6269 mp->sw_if_index = htonl (sw_if_index);
6271 mp->sw_if_index = ~0;
6275 /* Use a control ping for synchronization */
6276 MPING (CONTROL_PING, mp_ping);
6284 api_sw_interface_clear_stats (vat_main_t * vam)
6286 unformat_input_t *i = vam->input;
6287 vl_api_sw_interface_clear_stats_t *mp;
6289 u8 sw_if_index_set = 0;
6292 /* Parse args required to build the message */
6293 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6295 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6296 sw_if_index_set = 1;
6297 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6298 sw_if_index_set = 1;
6303 /* Construct the API message */
6304 M (SW_INTERFACE_CLEAR_STATS, mp);
6306 if (sw_if_index_set == 1)
6307 mp->sw_if_index = ntohl (sw_if_index);
6309 mp->sw_if_index = ~0;
6314 /* Wait for a reply, return the good/bad news... */
6320 api_sw_interface_add_del_address (vat_main_t * vam)
6322 unformat_input_t *i = vam->input;
6323 vl_api_sw_interface_add_del_address_t *mp;
6325 u8 sw_if_index_set = 0;
6326 u8 is_add = 1, del_all = 0;
6327 u32 address_length = 0;
6328 u8 v4_address_set = 0;
6329 u8 v6_address_set = 0;
6330 ip4_address_t v4address;
6331 ip6_address_t v6address;
6334 /* Parse args required to build the message */
6335 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6337 if (unformat (i, "del-all"))
6339 else if (unformat (i, "del"))
6342 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6343 sw_if_index_set = 1;
6344 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6345 sw_if_index_set = 1;
6346 else if (unformat (i, "%U/%d",
6347 unformat_ip4_address, &v4address, &address_length))
6349 else if (unformat (i, "%U/%d",
6350 unformat_ip6_address, &v6address, &address_length))
6356 if (sw_if_index_set == 0)
6358 errmsg ("missing interface name or sw_if_index");
6361 if (v4_address_set && v6_address_set)
6363 errmsg ("both v4 and v6 addresses set");
6366 if (!v4_address_set && !v6_address_set && !del_all)
6368 errmsg ("no addresses set");
6372 /* Construct the API message */
6373 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
6375 mp->sw_if_index = ntohl (sw_if_index);
6376 mp->is_add = is_add;
6377 mp->del_all = del_all;
6381 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6385 clib_memcpy (mp->address, &v4address, sizeof (v4address));
6387 mp->address_length = address_length;
6392 /* Wait for a reply, return good/bad news */
6398 api_sw_interface_set_mpls_enable (vat_main_t * vam)
6400 unformat_input_t *i = vam->input;
6401 vl_api_sw_interface_set_mpls_enable_t *mp;
6403 u8 sw_if_index_set = 0;
6407 /* Parse args required to build the message */
6408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6410 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6411 sw_if_index_set = 1;
6412 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6413 sw_if_index_set = 1;
6414 else if (unformat (i, "disable"))
6416 else if (unformat (i, "dis"))
6422 if (sw_if_index_set == 0)
6424 errmsg ("missing interface name or sw_if_index");
6428 /* Construct the API message */
6429 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
6431 mp->sw_if_index = ntohl (sw_if_index);
6432 mp->enable = enable;
6437 /* Wait for a reply... */
6443 api_sw_interface_set_table (vat_main_t * vam)
6445 unformat_input_t *i = vam->input;
6446 vl_api_sw_interface_set_table_t *mp;
6447 u32 sw_if_index, vrf_id = 0;
6448 u8 sw_if_index_set = 0;
6452 /* Parse args required to build the message */
6453 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6455 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6456 sw_if_index_set = 1;
6457 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6458 sw_if_index_set = 1;
6459 else if (unformat (i, "vrf %d", &vrf_id))
6461 else if (unformat (i, "ipv6"))
6467 if (sw_if_index_set == 0)
6469 errmsg ("missing interface name or sw_if_index");
6473 /* Construct the API message */
6474 M (SW_INTERFACE_SET_TABLE, mp);
6476 mp->sw_if_index = ntohl (sw_if_index);
6477 mp->is_ipv6 = is_ipv6;
6478 mp->vrf_id = ntohl (vrf_id);
6483 /* Wait for a reply... */
6488 static void vl_api_sw_interface_get_table_reply_t_handler
6489 (vl_api_sw_interface_get_table_reply_t * mp)
6491 vat_main_t *vam = &vat_main;
6493 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6495 vam->retval = ntohl (mp->retval);
6496 vam->result_ready = 1;
6500 static void vl_api_sw_interface_get_table_reply_t_handler_json
6501 (vl_api_sw_interface_get_table_reply_t * mp)
6503 vat_main_t *vam = &vat_main;
6504 vat_json_node_t node;
6506 vat_json_init_object (&node);
6507 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6508 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6510 vat_json_print (vam->ofp, &node);
6511 vat_json_free (&node);
6513 vam->retval = ntohl (mp->retval);
6514 vam->result_ready = 1;
6518 api_sw_interface_get_table (vat_main_t * vam)
6520 unformat_input_t *i = vam->input;
6521 vl_api_sw_interface_get_table_t *mp;
6523 u8 sw_if_index_set = 0;
6527 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6529 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6530 sw_if_index_set = 1;
6531 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6532 sw_if_index_set = 1;
6533 else if (unformat (i, "ipv6"))
6539 if (sw_if_index_set == 0)
6541 errmsg ("missing interface name or sw_if_index");
6545 M (SW_INTERFACE_GET_TABLE, mp);
6546 mp->sw_if_index = htonl (sw_if_index);
6547 mp->is_ipv6 = is_ipv6;
6555 api_sw_interface_set_vpath (vat_main_t * vam)
6557 unformat_input_t *i = vam->input;
6558 vl_api_sw_interface_set_vpath_t *mp;
6559 u32 sw_if_index = 0;
6560 u8 sw_if_index_set = 0;
6564 /* Parse args required to build the message */
6565 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6567 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6568 sw_if_index_set = 1;
6569 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6570 sw_if_index_set = 1;
6571 else if (unformat (i, "enable"))
6573 else if (unformat (i, "disable"))
6579 if (sw_if_index_set == 0)
6581 errmsg ("missing interface name or sw_if_index");
6585 /* Construct the API message */
6586 M (SW_INTERFACE_SET_VPATH, mp);
6588 mp->sw_if_index = ntohl (sw_if_index);
6589 mp->enable = is_enable;
6594 /* Wait for a reply... */
6600 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6602 unformat_input_t *i = vam->input;
6603 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6604 u32 sw_if_index = 0;
6605 u8 sw_if_index_set = 0;
6610 /* Parse args required to build the message */
6611 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6613 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6614 sw_if_index_set = 1;
6615 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6616 sw_if_index_set = 1;
6617 else if (unformat (i, "enable"))
6619 else if (unformat (i, "disable"))
6621 else if (unformat (i, "ip4"))
6623 else if (unformat (i, "ip6"))
6629 if (sw_if_index_set == 0)
6631 errmsg ("missing interface name or sw_if_index");
6635 /* Construct the API message */
6636 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6638 mp->sw_if_index = ntohl (sw_if_index);
6639 mp->enable = is_enable;
6640 mp->is_ipv6 = is_ipv6;
6645 /* Wait for a reply... */
6651 api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6653 unformat_input_t *i = vam->input;
6654 vl_api_sw_interface_set_geneve_bypass_t *mp;
6655 u32 sw_if_index = 0;
6656 u8 sw_if_index_set = 0;
6661 /* Parse args required to build the message */
6662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6664 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6665 sw_if_index_set = 1;
6666 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6667 sw_if_index_set = 1;
6668 else if (unformat (i, "enable"))
6670 else if (unformat (i, "disable"))
6672 else if (unformat (i, "ip4"))
6674 else if (unformat (i, "ip6"))
6680 if (sw_if_index_set == 0)
6682 errmsg ("missing interface name or sw_if_index");
6686 /* Construct the API message */
6687 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
6689 mp->sw_if_index = ntohl (sw_if_index);
6690 mp->enable = is_enable;
6691 mp->is_ipv6 = is_ipv6;
6696 /* Wait for a reply... */
6702 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6704 unformat_input_t *i = vam->input;
6705 vl_api_sw_interface_set_l2_xconnect_t *mp;
6707 u8 rx_sw_if_index_set = 0;
6709 u8 tx_sw_if_index_set = 0;
6713 /* Parse args required to build the message */
6714 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6716 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6717 rx_sw_if_index_set = 1;
6718 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6719 tx_sw_if_index_set = 1;
6720 else if (unformat (i, "rx"))
6722 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6724 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6726 rx_sw_if_index_set = 1;
6731 else if (unformat (i, "tx"))
6733 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6735 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6737 tx_sw_if_index_set = 1;
6742 else if (unformat (i, "enable"))
6744 else if (unformat (i, "disable"))
6750 if (rx_sw_if_index_set == 0)
6752 errmsg ("missing rx interface name or rx_sw_if_index");
6756 if (enable && (tx_sw_if_index_set == 0))
6758 errmsg ("missing tx interface name or tx_sw_if_index");
6762 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
6764 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6765 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6766 mp->enable = enable;
6774 api_sw_interface_set_l2_bridge (vat_main_t * vam)
6776 unformat_input_t *i = vam->input;
6777 vl_api_sw_interface_set_l2_bridge_t *mp;
6778 vl_api_l2_port_type_t port_type;
6780 u8 rx_sw_if_index_set = 0;
6787 port_type = L2_API_PORT_TYPE_NORMAL;
6789 /* Parse args required to build the message */
6790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6792 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6793 rx_sw_if_index_set = 1;
6794 else if (unformat (i, "bd_id %d", &bd_id))
6798 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6799 rx_sw_if_index_set = 1;
6800 else if (unformat (i, "shg %d", &shg))
6802 else if (unformat (i, "bvi"))
6803 port_type = L2_API_PORT_TYPE_BVI;
6804 else if (unformat (i, "uu-fwd"))
6805 port_type = L2_API_PORT_TYPE_UU_FWD;
6806 else if (unformat (i, "enable"))
6808 else if (unformat (i, "disable"))
6814 if (rx_sw_if_index_set == 0)
6816 errmsg ("missing rx interface name or sw_if_index");
6820 if (enable && (bd_id_set == 0))
6822 errmsg ("missing bridge domain");
6826 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
6828 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6829 mp->bd_id = ntohl (bd_id);
6831 mp->port_type = ntohl (port_type);
6832 mp->enable = enable;
6840 api_bridge_domain_dump (vat_main_t * vam)
6842 unformat_input_t *i = vam->input;
6843 vl_api_bridge_domain_dump_t *mp;
6844 vl_api_control_ping_t *mp_ping;
6848 /* Parse args required to build the message */
6849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6851 if (unformat (i, "bd_id %d", &bd_id))
6857 M (BRIDGE_DOMAIN_DUMP, mp);
6858 mp->bd_id = ntohl (bd_id);
6861 /* Use a control ping for synchronization */
6862 MPING (CONTROL_PING, mp_ping);
6870 api_bridge_domain_add_del (vat_main_t * vam)
6872 unformat_input_t *i = vam->input;
6873 vl_api_bridge_domain_add_del_t *mp;
6876 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
6881 /* Parse args required to build the message */
6882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6884 if (unformat (i, "bd_id %d", &bd_id))
6886 else if (unformat (i, "flood %d", &flood))
6888 else if (unformat (i, "uu-flood %d", &uu_flood))
6890 else if (unformat (i, "forward %d", &forward))
6892 else if (unformat (i, "learn %d", &learn))
6894 else if (unformat (i, "arp-term %d", &arp_term))
6896 else if (unformat (i, "mac-age %d", &mac_age))
6898 else if (unformat (i, "bd-tag %s", &bd_tag))
6900 else if (unformat (i, "del"))
6903 flood = uu_flood = forward = learn = 0;
6911 errmsg ("missing bridge domain");
6918 errmsg ("mac age must be less than 256 ");
6923 if ((bd_tag) && (vec_len (bd_tag) > 63))
6925 errmsg ("bd-tag cannot be longer than 63");
6930 M (BRIDGE_DOMAIN_ADD_DEL, mp);
6932 mp->bd_id = ntohl (bd_id);
6934 mp->uu_flood = uu_flood;
6935 mp->forward = forward;
6937 mp->arp_term = arp_term;
6938 mp->is_add = is_add;
6939 mp->mac_age = (u8) mac_age;
6942 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
6943 mp->bd_tag[vec_len (bd_tag)] = 0;
6954 api_l2fib_flush_bd (vat_main_t * vam)
6956 unformat_input_t *i = vam->input;
6957 vl_api_l2fib_flush_bd_t *mp;
6961 /* Parse args required to build the message */
6962 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6964 if (unformat (i, "bd_id %d", &bd_id));
6971 errmsg ("missing bridge domain");
6975 M (L2FIB_FLUSH_BD, mp);
6977 mp->bd_id = htonl (bd_id);
6985 api_l2fib_flush_int (vat_main_t * vam)
6987 unformat_input_t *i = vam->input;
6988 vl_api_l2fib_flush_int_t *mp;
6989 u32 sw_if_index = ~0;
6992 /* Parse args required to build the message */
6993 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6995 if (unformat (i, "sw_if_index %d", &sw_if_index));
6997 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
7002 if (sw_if_index == ~0)
7004 errmsg ("missing interface name or sw_if_index");
7008 M (L2FIB_FLUSH_INT, mp);
7010 mp->sw_if_index = ntohl (sw_if_index);
7018 api_l2fib_add_del (vat_main_t * vam)
7020 unformat_input_t *i = vam->input;
7021 vl_api_l2fib_add_del_t *mp;
7027 u32 sw_if_index = 0;
7028 u8 sw_if_index_set = 0;
7037 /* Parse args required to build the message */
7038 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7040 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
7042 else if (unformat (i, "bd_id %d", &bd_id))
7044 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7045 sw_if_index_set = 1;
7046 else if (unformat (i, "sw_if"))
7048 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7051 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7052 sw_if_index_set = 1;
7057 else if (unformat (i, "static"))
7059 else if (unformat (i, "filter"))
7064 else if (unformat (i, "bvi"))
7069 else if (unformat (i, "del"))
7071 else if (unformat (i, "count %d", &count))
7079 errmsg ("missing mac address");
7085 errmsg ("missing bridge domain");
7089 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7091 errmsg ("missing interface name or sw_if_index");
7097 /* Turn on async mode */
7098 vam->async_mode = 1;
7099 vam->async_errors = 0;
7100 before = vat_time_now (vam);
7103 for (j = 0; j < count; j++)
7105 M (L2FIB_ADD_DEL, mp);
7107 clib_memcpy (mp->mac, mac, 6);
7108 mp->bd_id = ntohl (bd_id);
7109 mp->is_add = is_add;
7110 mp->sw_if_index = ntohl (sw_if_index);
7114 mp->static_mac = static_mac;
7115 mp->filter_mac = filter_mac;
7116 mp->bvi_mac = bvi_mac;
7118 increment_mac_address (mac);
7125 vl_api_control_ping_t *mp_ping;
7128 /* Shut off async mode */
7129 vam->async_mode = 0;
7131 MPING (CONTROL_PING, mp_ping);
7134 timeout = vat_time_now (vam) + 1.0;
7135 while (vat_time_now (vam) < timeout)
7136 if (vam->result_ready == 1)
7141 if (vam->retval == -99)
7144 if (vam->async_errors > 0)
7146 errmsg ("%d asynchronous errors", vam->async_errors);
7149 vam->async_errors = 0;
7150 after = vat_time_now (vam);
7152 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7153 count, after - before, count / (after - before));
7159 /* Wait for a reply... */
7163 /* Return the good/bad news */
7164 return (vam->retval);
7168 api_bridge_domain_set_mac_age (vat_main_t * vam)
7170 unformat_input_t *i = vam->input;
7171 vl_api_bridge_domain_set_mac_age_t *mp;
7176 /* Parse args required to build the message */
7177 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7179 if (unformat (i, "bd_id %d", &bd_id));
7180 else if (unformat (i, "mac-age %d", &mac_age));
7187 errmsg ("missing bridge domain");
7193 errmsg ("mac age must be less than 256 ");
7197 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7199 mp->bd_id = htonl (bd_id);
7200 mp->mac_age = (u8) mac_age;
7208 api_l2_flags (vat_main_t * vam)
7210 unformat_input_t *i = vam->input;
7211 vl_api_l2_flags_t *mp;
7214 u8 sw_if_index_set = 0;
7218 /* Parse args required to build the message */
7219 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7221 if (unformat (i, "sw_if_index %d", &sw_if_index))
7222 sw_if_index_set = 1;
7223 else if (unformat (i, "sw_if"))
7225 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7228 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7229 sw_if_index_set = 1;
7234 else if (unformat (i, "learn"))
7236 else if (unformat (i, "forward"))
7238 else if (unformat (i, "flood"))
7240 else if (unformat (i, "uu-flood"))
7241 flags |= L2_UU_FLOOD;
7242 else if (unformat (i, "arp-term"))
7243 flags |= L2_ARP_TERM;
7244 else if (unformat (i, "off"))
7246 else if (unformat (i, "disable"))
7252 if (sw_if_index_set == 0)
7254 errmsg ("missing interface name or sw_if_index");
7260 mp->sw_if_index = ntohl (sw_if_index);
7261 mp->feature_bitmap = ntohl (flags);
7262 mp->is_set = is_set;
7270 api_bridge_flags (vat_main_t * vam)
7272 unformat_input_t *i = vam->input;
7273 vl_api_bridge_flags_t *mp;
7277 bd_flags_t flags = 0;
7280 /* Parse args required to build the message */
7281 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7283 if (unformat (i, "bd_id %d", &bd_id))
7285 else if (unformat (i, "learn"))
7286 flags |= BRIDGE_API_FLAG_LEARN;
7287 else if (unformat (i, "forward"))
7288 flags |= BRIDGE_API_FLAG_FWD;
7289 else if (unformat (i, "flood"))
7290 flags |= BRIDGE_API_FLAG_FLOOD;
7291 else if (unformat (i, "uu-flood"))
7292 flags |= BRIDGE_API_FLAG_UU_FLOOD;
7293 else if (unformat (i, "arp-term"))
7294 flags |= BRIDGE_API_FLAG_ARP_TERM;
7295 else if (unformat (i, "off"))
7297 else if (unformat (i, "disable"))
7305 errmsg ("missing bridge domain");
7309 M (BRIDGE_FLAGS, mp);
7311 mp->bd_id = ntohl (bd_id);
7312 mp->flags = ntohl (flags);
7313 mp->is_set = is_set;
7321 api_bd_ip_mac_add_del (vat_main_t * vam)
7323 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
7324 vl_api_mac_address_t mac = { 0 };
7325 unformat_input_t *i = vam->input;
7326 vl_api_bd_ip_mac_add_del_t *mp;
7338 /* Parse args required to build the message */
7339 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7341 if (unformat (i, "bd_id %d", &bd_id))
7345 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
7349 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
7353 else if (unformat (i, "del"))
7361 errmsg ("missing bridge domain");
7364 else if (ip_set == 0)
7366 errmsg ("missing IP address");
7369 else if (mac_set == 0)
7371 errmsg ("missing MAC address");
7375 M (BD_IP_MAC_ADD_DEL, mp);
7377 mp->bd_id = ntohl (bd_id);
7378 mp->is_add = is_add;
7380 clib_memcpy (&mp->ip, &ip, sizeof (ip));
7381 clib_memcpy (&mp->mac, &mac, sizeof (mac));
7388 static void vl_api_bd_ip_mac_details_t_handler
7389 (vl_api_bd_ip_mac_details_t * mp)
7391 vat_main_t *vam = &vat_main;
7396 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7399 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7402 "\n%-5d %-7s %-20U %-30s",
7403 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7404 format_ethernet_address, mp->mac_address, ip);
7409 static void vl_api_bd_ip_mac_details_t_handler_json
7410 (vl_api_bd_ip_mac_details_t * mp)
7412 vat_main_t *vam = &vat_main;
7413 vat_json_node_t *node = NULL;
7415 if (VAT_JSON_ARRAY != vam->json_tree.type)
7417 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7418 vat_json_init_array (&vam->json_tree);
7420 node = vat_json_array_add (&vam->json_tree);
7422 vat_json_init_object (node);
7423 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7424 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
7425 vat_json_object_add_string_copy (node, "mac_address",
7426 format (0, "%U", format_ethernet_address,
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);
7436 vat_json_object_add_string_copy (node, "ip_address", ip);
7441 api_bd_ip_mac_dump (vat_main_t * vam)
7443 unformat_input_t *i = vam->input;
7444 vl_api_bd_ip_mac_dump_t *mp;
7445 vl_api_control_ping_t *mp_ping;
7450 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7452 if (unformat (i, "bd_id %d", &bd_id))
7461 "\n%-5s %-7s %-20s %-30s",
7462 "bd_id", "is_ipv6", "mac_address", "ip_address");
7464 /* Dump Bridge Domain Ip to Mac entries */
7465 M (BD_IP_MAC_DUMP, mp);
7468 mp->bd_id = htonl (bd_id);
7474 /* Use a control ping for synchronization */
7475 MPING (CONTROL_PING, mp_ping);
7483 api_tap_connect (vat_main_t * vam)
7485 unformat_input_t *i = vam->input;
7486 vl_api_tap_connect_t *mp;
7492 ip4_address_t ip4_address;
7494 int ip4_address_set = 0;
7495 ip6_address_t ip6_address;
7497 int ip6_address_set = 0;
7500 clib_memset (mac_address, 0, sizeof (mac_address));
7502 /* Parse args required to build the message */
7503 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7505 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7509 else if (unformat (i, "random-mac"))
7511 else if (unformat (i, "tapname %s", &tap_name))
7513 else if (unformat (i, "tag %s", &tag))
7515 else if (unformat (i, "address %U/%d",
7516 unformat_ip4_address, &ip4_address, &ip4_mask_width))
7517 ip4_address_set = 1;
7518 else if (unformat (i, "address %U/%d",
7519 unformat_ip6_address, &ip6_address, &ip6_mask_width))
7520 ip6_address_set = 1;
7527 errmsg ("missing tap name");
7530 if (vec_len (tap_name) > 63)
7532 errmsg ("tap name too long");
7535 vec_add1 (tap_name, 0);
7537 if (vec_len (tag) > 63)
7539 errmsg ("tag too long");
7543 /* Construct the API message */
7544 M (TAP_CONNECT, mp);
7546 mp->use_random_mac = random_mac;
7547 clib_memcpy (mp->mac_address, mac_address, 6);
7548 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7550 clib_memcpy (mp->tag, tag, vec_len (tag));
7552 if (ip4_address_set)
7554 mp->ip4_address_set = 1;
7555 clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address));
7556 mp->ip4_mask_width = ip4_mask_width;
7558 if (ip6_address_set)
7560 mp->ip6_address_set = 1;
7561 clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address));
7562 mp->ip6_mask_width = ip6_mask_width;
7565 vec_free (tap_name);
7571 /* Wait for a reply... */
7577 api_tap_modify (vat_main_t * vam)
7579 unformat_input_t *i = vam->input;
7580 vl_api_tap_modify_t *mp;
7585 u32 sw_if_index = ~0;
7586 u8 sw_if_index_set = 0;
7589 clib_memset (mac_address, 0, sizeof (mac_address));
7591 /* Parse args required to build the message */
7592 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7594 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7595 sw_if_index_set = 1;
7596 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7597 sw_if_index_set = 1;
7598 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
7602 else if (unformat (i, "random-mac"))
7604 else if (unformat (i, "tapname %s", &tap_name))
7610 if (sw_if_index_set == 0)
7612 errmsg ("missing vpp interface name");
7617 errmsg ("missing tap name");
7620 if (vec_len (tap_name) > 63)
7622 errmsg ("tap name too long");
7624 vec_add1 (tap_name, 0);
7626 /* Construct the API message */
7629 mp->use_random_mac = random_mac;
7630 mp->sw_if_index = ntohl (sw_if_index);
7631 clib_memcpy (mp->mac_address, mac_address, 6);
7632 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
7633 vec_free (tap_name);
7638 /* Wait for a reply... */
7644 api_tap_delete (vat_main_t * vam)
7646 unformat_input_t *i = vam->input;
7647 vl_api_tap_delete_t *mp;
7648 u32 sw_if_index = ~0;
7649 u8 sw_if_index_set = 0;
7652 /* Parse args required to build the message */
7653 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7655 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7656 sw_if_index_set = 1;
7657 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7658 sw_if_index_set = 1;
7663 if (sw_if_index_set == 0)
7665 errmsg ("missing vpp interface name");
7669 /* Construct the API message */
7672 mp->sw_if_index = ntohl (sw_if_index);
7677 /* Wait for a reply... */
7683 api_tap_create_v2 (vat_main_t * vam)
7685 unformat_input_t *i = vam->input;
7686 vl_api_tap_create_v2_t *mp;
7690 u8 *host_if_name = 0;
7692 u8 host_mac_addr[6];
7693 u8 host_mac_addr_set = 0;
7694 u8 *host_bridge = 0;
7695 ip4_address_t host_ip4_addr;
7696 ip4_address_t host_ip4_gw;
7697 u8 host_ip4_gw_set = 0;
7698 u32 host_ip4_prefix_len = 0;
7699 ip6_address_t host_ip6_addr;
7700 ip6_address_t host_ip6_gw;
7701 u8 host_ip6_gw_set = 0;
7702 u32 host_ip6_prefix_len = 0;
7704 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7706 clib_memset (mac_address, 0, sizeof (mac_address));
7708 /* Parse args required to build the message */
7709 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7711 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7715 else if (unformat (i, "id %u", &id))
7717 else if (unformat (i, "host-if-name %s", &host_if_name))
7719 else if (unformat (i, "host-ns %s", &host_ns))
7721 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
7723 host_mac_addr_set = 1;
7724 else if (unformat (i, "host-bridge %s", &host_bridge))
7726 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
7727 &host_ip4_addr, &host_ip4_prefix_len))
7729 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
7730 &host_ip6_addr, &host_ip6_prefix_len))
7732 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
7734 host_ip4_gw_set = 1;
7735 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
7737 host_ip6_gw_set = 1;
7738 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
7740 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
7746 if (vec_len (host_if_name) > 63)
7748 errmsg ("tap name too long. ");
7751 if (vec_len (host_ns) > 63)
7753 errmsg ("host name space too long. ");
7756 if (vec_len (host_bridge) > 63)
7758 errmsg ("host bridge name too long. ");
7761 if (host_ip4_prefix_len > 32)
7763 errmsg ("host ip4 prefix length not valid. ");
7766 if (host_ip6_prefix_len > 128)
7768 errmsg ("host ip6 prefix length not valid. ");
7771 if (!is_pow2 (rx_ring_sz))
7773 errmsg ("rx ring size must be power of 2. ");
7776 if (rx_ring_sz > 32768)
7778 errmsg ("rx ring size must be 32768 or lower. ");
7781 if (!is_pow2 (tx_ring_sz))
7783 errmsg ("tx ring size must be power of 2. ");
7786 if (tx_ring_sz > 32768)
7788 errmsg ("tx ring size must be 32768 or lower. ");
7792 /* Construct the API message */
7793 M (TAP_CREATE_V2, mp);
7795 mp->use_random_mac = random_mac;
7797 mp->id = ntohl (id);
7798 mp->host_namespace_set = host_ns != 0;
7799 mp->host_bridge_set = host_bridge != 0;
7800 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
7801 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
7802 mp->rx_ring_sz = ntohs (rx_ring_sz);
7803 mp->tx_ring_sz = ntohs (tx_ring_sz);
7805 if (random_mac == 0)
7806 clib_memcpy (mp->mac_address, mac_address, 6);
7807 if (host_mac_addr_set)
7808 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
7810 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
7812 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
7814 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
7815 if (host_ip4_prefix_len)
7816 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
7817 if (host_ip6_prefix_len)
7818 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
7819 if (host_ip4_gw_set)
7820 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
7821 if (host_ip6_gw_set)
7822 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
7825 vec_free (host_if_name);
7826 vec_free (host_bridge);
7831 /* Wait for a reply... */
7837 api_tap_delete_v2 (vat_main_t * vam)
7839 unformat_input_t *i = vam->input;
7840 vl_api_tap_delete_v2_t *mp;
7841 u32 sw_if_index = ~0;
7842 u8 sw_if_index_set = 0;
7845 /* Parse args required to build the message */
7846 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7848 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7849 sw_if_index_set = 1;
7850 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7851 sw_if_index_set = 1;
7856 if (sw_if_index_set == 0)
7858 errmsg ("missing vpp interface name. ");
7862 /* Construct the API message */
7863 M (TAP_DELETE_V2, mp);
7865 mp->sw_if_index = ntohl (sw_if_index);
7870 /* Wait for a reply... */
7876 api_bond_create (vat_main_t * vam)
7878 unformat_input_t *i = vam->input;
7879 vl_api_bond_create_t *mp;
7887 clib_memset (mac_address, 0, sizeof (mac_address));
7890 /* Parse args required to build the message */
7891 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7893 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
7895 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
7896 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
7898 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
7905 if (mode_is_set == 0)
7907 errmsg ("Missing bond mode. ");
7911 /* Construct the API message */
7912 M (BOND_CREATE, mp);
7914 mp->use_custom_mac = custom_mac;
7920 clib_memcpy (mp->mac_address, mac_address, 6);
7925 /* Wait for a reply... */
7931 api_bond_delete (vat_main_t * vam)
7933 unformat_input_t *i = vam->input;
7934 vl_api_bond_delete_t *mp;
7935 u32 sw_if_index = ~0;
7936 u8 sw_if_index_set = 0;
7939 /* Parse args required to build the message */
7940 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7942 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7943 sw_if_index_set = 1;
7944 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7945 sw_if_index_set = 1;
7950 if (sw_if_index_set == 0)
7952 errmsg ("missing vpp interface name. ");
7956 /* Construct the API message */
7957 M (BOND_DELETE, mp);
7959 mp->sw_if_index = ntohl (sw_if_index);
7964 /* Wait for a reply... */
7970 api_bond_enslave (vat_main_t * vam)
7972 unformat_input_t *i = vam->input;
7973 vl_api_bond_enslave_t *mp;
7974 u32 bond_sw_if_index;
7978 u32 bond_sw_if_index_is_set = 0;
7980 u8 sw_if_index_is_set = 0;
7982 /* Parse args required to build the message */
7983 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7985 if (unformat (i, "sw_if_index %d", &sw_if_index))
7986 sw_if_index_is_set = 1;
7987 else if (unformat (i, "bond %u", &bond_sw_if_index))
7988 bond_sw_if_index_is_set = 1;
7989 else if (unformat (i, "passive %d", &is_passive))
7991 else if (unformat (i, "long-timeout %d", &is_long_timeout))
7997 if (bond_sw_if_index_is_set == 0)
7999 errmsg ("Missing bond sw_if_index. ");
8002 if (sw_if_index_is_set == 0)
8004 errmsg ("Missing slave sw_if_index. ");
8008 /* Construct the API message */
8009 M (BOND_ENSLAVE, mp);
8011 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
8012 mp->sw_if_index = ntohl (sw_if_index);
8013 mp->is_long_timeout = is_long_timeout;
8014 mp->is_passive = is_passive;
8019 /* Wait for a reply... */
8025 api_bond_detach_slave (vat_main_t * vam)
8027 unformat_input_t *i = vam->input;
8028 vl_api_bond_detach_slave_t *mp;
8029 u32 sw_if_index = ~0;
8030 u8 sw_if_index_set = 0;
8033 /* Parse args required to build the message */
8034 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8036 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8037 sw_if_index_set = 1;
8038 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8039 sw_if_index_set = 1;
8044 if (sw_if_index_set == 0)
8046 errmsg ("missing vpp interface name. ");
8050 /* Construct the API message */
8051 M (BOND_DETACH_SLAVE, mp);
8053 mp->sw_if_index = ntohl (sw_if_index);
8058 /* Wait for a reply... */
8064 api_ip_table_add_del (vat_main_t * vam)
8066 unformat_input_t *i = vam->input;
8067 vl_api_ip_table_add_del_t *mp;
8073 /* Parse args required to build the message */
8074 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8076 if (unformat (i, "ipv6"))
8078 else if (unformat (i, "del"))
8080 else if (unformat (i, "add"))
8082 else if (unformat (i, "table %d", &table_id))
8086 clib_warning ("parse error '%U'", format_unformat_error, i);
8093 errmsg ("missing table-ID");
8097 /* Construct the API message */
8098 M (IP_TABLE_ADD_DEL, mp);
8100 mp->table_id = ntohl (table_id);
8101 mp->is_ipv6 = is_ipv6;
8102 mp->is_add = is_add;
8107 /* Wait for a reply... */
8114 api_ip_add_del_route (vat_main_t * vam)
8116 unformat_input_t *i = vam->input;
8117 vl_api_ip_add_del_route_t *mp;
8118 u32 sw_if_index = ~0, vrf_id = 0;
8120 u8 is_local = 0, is_drop = 0;
8121 u8 is_unreach = 0, is_prohibit = 0;
8123 u32 next_hop_weight = 1;
8124 u8 is_multipath = 0;
8126 u8 address_length_set = 0;
8127 u32 next_hop_table_id = 0;
8128 u32 resolve_attempts = 0;
8129 u32 dst_address_length = 0;
8130 u8 next_hop_set = 0;
8131 ip4_address_t v4_dst_address, v4_next_hop_address;
8132 ip6_address_t v6_dst_address, v6_next_hop_address;
8136 u32 random_add_del = 0;
8137 u32 *random_vector = 0;
8139 u32 random_seed = 0xdeaddabe;
8140 u32 classify_table_index = ~0;
8142 u8 resolve_host = 0, resolve_attached = 0;
8143 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8144 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8145 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8147 clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8148 clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
8149 /* Parse args required to build the message */
8150 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8152 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8154 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8156 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8161 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8166 else if (unformat (i, "/%d", &dst_address_length))
8168 address_length_set = 1;
8171 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8172 &v4_next_hop_address))
8176 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8177 &v6_next_hop_address))
8183 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8187 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8191 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8193 else if (unformat (i, "weight %d", &next_hop_weight))
8195 else if (unformat (i, "drop"))
8199 else if (unformat (i, "null-send-unreach"))
8203 else if (unformat (i, "null-send-prohibit"))
8207 else if (unformat (i, "local"))
8211 else if (unformat (i, "classify %d", &classify_table_index))
8215 else if (unformat (i, "del"))
8217 else if (unformat (i, "add"))
8219 else if (unformat (i, "resolve-via-host"))
8221 else if (unformat (i, "resolve-via-attached"))
8222 resolve_attached = 1;
8223 else if (unformat (i, "multipath"))
8225 else if (unformat (i, "vrf %d", &vrf_id))
8227 else if (unformat (i, "count %d", &count))
8229 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8231 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8233 else if (unformat (i, "out-label %d", &next_hop_out_label))
8235 vl_api_fib_mpls_label_t fib_label = {
8236 .label = ntohl (next_hop_out_label),
8240 vec_add1 (next_hop_out_label_stack, fib_label);
8242 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8244 else if (unformat (i, "random"))
8246 else if (unformat (i, "seed %d", &random_seed))
8250 clib_warning ("parse error '%U'", format_unformat_error, i);
8255 if (!next_hop_set && !is_drop && !is_local &&
8256 !is_classify && !is_unreach && !is_prohibit &&
8257 MPLS_LABEL_INVALID == next_hop_via_label)
8260 ("next hop / local / drop / unreach / prohibit / classify not set");
8264 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8266 errmsg ("next hop and next-hop via label set");
8269 if (address_set == 0)
8271 errmsg ("missing addresses");
8275 if (address_length_set == 0)
8277 errmsg ("missing address length");
8281 /* Generate a pile of unique, random routes */
8284 u32 this_random_address;
8285 random_hash = hash_create (count, sizeof (uword));
8287 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8288 for (j = 0; j <= count; j++)
8292 this_random_address = random_u32 (&random_seed);
8293 this_random_address =
8294 clib_host_to_net_u32 (this_random_address);
8296 while (hash_get (random_hash, this_random_address));
8297 vec_add1 (random_vector, this_random_address);
8298 hash_set (random_hash, this_random_address, 1);
8300 hash_free (random_hash);
8301 v4_dst_address.as_u32 = random_vector[0];
8306 /* Turn on async mode */
8307 vam->async_mode = 1;
8308 vam->async_errors = 0;
8309 before = vat_time_now (vam);
8312 for (j = 0; j < count; j++)
8314 /* Construct the API message */
8315 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8316 vec_len (next_hop_out_label_stack));
8318 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8319 mp->table_id = ntohl (vrf_id);
8321 mp->is_add = is_add;
8322 mp->is_drop = is_drop;
8323 mp->is_unreach = is_unreach;
8324 mp->is_prohibit = is_prohibit;
8325 mp->is_ipv6 = is_ipv6;
8326 mp->is_local = is_local;
8327 mp->is_classify = is_classify;
8328 mp->is_multipath = is_multipath;
8329 mp->is_resolve_host = resolve_host;
8330 mp->is_resolve_attached = resolve_attached;
8331 mp->next_hop_weight = next_hop_weight;
8332 mp->next_hop_preference = 0;
8333 mp->dst_address_length = dst_address_length;
8334 mp->next_hop_table_id = ntohl (next_hop_table_id);
8335 mp->classify_table_index = ntohl (classify_table_index);
8336 mp->next_hop_via_label = ntohl (next_hop_via_label);
8337 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8338 if (0 != mp->next_hop_n_out_labels)
8340 memcpy (mp->next_hop_out_label_stack,
8341 next_hop_out_label_stack,
8342 (vec_len (next_hop_out_label_stack) *
8343 sizeof (vl_api_fib_mpls_label_t)));
8344 vec_free (next_hop_out_label_stack);
8349 clib_memcpy (mp->dst_address, &v6_dst_address,
8350 sizeof (v6_dst_address));
8352 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8353 sizeof (v6_next_hop_address));
8354 increment_v6_address (&v6_dst_address);
8358 clib_memcpy (mp->dst_address, &v4_dst_address,
8359 sizeof (v4_dst_address));
8361 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8362 sizeof (v4_next_hop_address));
8364 v4_dst_address.as_u32 = random_vector[j + 1];
8366 increment_v4_address (&v4_dst_address);
8370 /* If we receive SIGTERM, stop now... */
8375 /* When testing multiple add/del ops, use a control-ping to sync */
8378 vl_api_control_ping_t *mp_ping;
8382 /* Shut off async mode */
8383 vam->async_mode = 0;
8385 MPING (CONTROL_PING, mp_ping);
8388 timeout = vat_time_now (vam) + 1.0;
8389 while (vat_time_now (vam) < timeout)
8390 if (vam->result_ready == 1)
8395 if (vam->retval == -99)
8398 if (vam->async_errors > 0)
8400 errmsg ("%d asynchronous errors", vam->async_errors);
8403 vam->async_errors = 0;
8404 after = vat_time_now (vam);
8406 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8410 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8411 count, after - before, count / (after - before));
8417 /* Wait for a reply... */
8422 /* Return the good/bad news */
8423 return (vam->retval);
8427 api_ip_mroute_add_del (vat_main_t * vam)
8429 unformat_input_t *i = vam->input;
8430 vl_api_ip_mroute_add_del_t *mp;
8431 u32 sw_if_index = ~0, vrf_id = 0;
8436 u32 grp_address_length = 0;
8437 ip4_address_t v4_grp_address, v4_src_address;
8438 ip6_address_t v6_grp_address, v6_src_address;
8439 mfib_itf_flags_t iflags = 0;
8440 mfib_entry_flags_t eflags = 0;
8443 /* Parse args required to build the message */
8444 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8446 if (unformat (i, "sw_if_index %d", &sw_if_index))
8448 else if (unformat (i, "%U %U",
8449 unformat_ip4_address, &v4_src_address,
8450 unformat_ip4_address, &v4_grp_address))
8452 grp_address_length = 64;
8456 else if (unformat (i, "%U %U",
8457 unformat_ip6_address, &v6_src_address,
8458 unformat_ip6_address, &v6_grp_address))
8460 grp_address_length = 256;
8464 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8466 clib_memset (&v4_src_address, 0, sizeof (v4_src_address));
8467 grp_address_length = 32;
8471 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8473 clib_memset (&v6_src_address, 0, sizeof (v6_src_address));
8474 grp_address_length = 128;
8478 else if (unformat (i, "/%d", &grp_address_length))
8480 else if (unformat (i, "local"))
8484 else if (unformat (i, "del"))
8486 else if (unformat (i, "add"))
8488 else if (unformat (i, "vrf %d", &vrf_id))
8490 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8492 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8496 clib_warning ("parse error '%U'", format_unformat_error, i);
8501 if (address_set == 0)
8503 errmsg ("missing addresses\n");
8507 /* Construct the API message */
8508 M (IP_MROUTE_ADD_DEL, mp);
8510 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8511 mp->table_id = ntohl (vrf_id);
8513 mp->is_add = is_add;
8514 mp->is_ipv6 = is_ipv6;
8515 mp->is_local = is_local;
8516 mp->itf_flags = ntohl (iflags);
8517 mp->entry_flags = ntohl (eflags);
8518 mp->grp_address_length = grp_address_length;
8519 mp->grp_address_length = ntohs (mp->grp_address_length);
8523 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8524 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8528 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8529 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8535 /* Wait for a reply... */
8541 api_mpls_table_add_del (vat_main_t * vam)
8543 unformat_input_t *i = vam->input;
8544 vl_api_mpls_table_add_del_t *mp;
8549 /* Parse args required to build the message */
8550 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8552 if (unformat (i, "table %d", &table_id))
8554 else if (unformat (i, "del"))
8556 else if (unformat (i, "add"))
8560 clib_warning ("parse error '%U'", format_unformat_error, i);
8567 errmsg ("missing table-ID");
8571 /* Construct the API message */
8572 M (MPLS_TABLE_ADD_DEL, mp);
8574 mp->mt_table_id = ntohl (table_id);
8575 mp->mt_is_add = is_add;
8580 /* Wait for a reply... */
8587 api_mpls_route_add_del (vat_main_t * vam)
8589 unformat_input_t *i = vam->input;
8590 vl_api_mpls_route_add_del_t *mp;
8591 u32 sw_if_index = ~0, table_id = 0;
8593 u32 next_hop_weight = 1;
8594 u8 is_multipath = 0;
8595 u32 next_hop_table_id = 0;
8596 u8 next_hop_set = 0;
8597 ip4_address_t v4_next_hop_address = {
8600 ip6_address_t v6_next_hop_address = { {0} };
8604 u32 classify_table_index = ~0;
8606 u8 resolve_host = 0, resolve_attached = 0;
8607 u8 is_interface_rx = 0;
8608 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8609 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8610 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8611 mpls_label_t local_label = MPLS_LABEL_INVALID;
8613 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
8615 /* Parse args required to build the message */
8616 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8618 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8620 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8622 else if (unformat (i, "%d", &local_label))
8624 else if (unformat (i, "eos"))
8626 else if (unformat (i, "non-eos"))
8628 else if (unformat (i, "via %U", unformat_ip4_address,
8629 &v4_next_hop_address))
8632 next_hop_proto = DPO_PROTO_IP4;
8634 else if (unformat (i, "via %U", unformat_ip6_address,
8635 &v6_next_hop_address))
8638 next_hop_proto = DPO_PROTO_IP6;
8640 else if (unformat (i, "weight %d", &next_hop_weight))
8642 else if (unformat (i, "classify %d", &classify_table_index))
8646 else if (unformat (i, "del"))
8648 else if (unformat (i, "add"))
8650 else if (unformat (i, "resolve-via-host"))
8652 else if (unformat (i, "resolve-via-attached"))
8653 resolve_attached = 1;
8654 else if (unformat (i, "multipath"))
8656 else if (unformat (i, "count %d", &count))
8658 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
8661 next_hop_proto = DPO_PROTO_IP4;
8663 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
8666 next_hop_proto = DPO_PROTO_IP6;
8670 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
8674 next_hop_proto = DPO_PROTO_ETHERNET;
8675 is_interface_rx = 1;
8677 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
8680 next_hop_proto = DPO_PROTO_ETHERNET;
8681 is_interface_rx = 1;
8683 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
8685 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8687 else if (unformat (i, "out-label %d", &next_hop_out_label))
8689 vl_api_fib_mpls_label_t fib_label = {
8690 .label = ntohl (next_hop_out_label),
8694 vec_add1 (next_hop_out_label_stack, fib_label);
8698 clib_warning ("parse error '%U'", format_unformat_error, i);
8703 if (!next_hop_set && !is_classify)
8705 errmsg ("next hop / classify not set");
8709 if (MPLS_LABEL_INVALID == local_label)
8711 errmsg ("missing label");
8717 /* Turn on async mode */
8718 vam->async_mode = 1;
8719 vam->async_errors = 0;
8720 before = vat_time_now (vam);
8723 for (j = 0; j < count; j++)
8725 /* Construct the API message */
8726 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
8727 vec_len (next_hop_out_label_stack));
8729 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
8730 mp->mr_table_id = ntohl (table_id);
8732 mp->mr_is_add = is_add;
8733 mp->mr_next_hop_proto = next_hop_proto;
8734 mp->mr_is_classify = is_classify;
8735 mp->mr_is_multipath = is_multipath;
8736 mp->mr_is_resolve_host = resolve_host;
8737 mp->mr_is_resolve_attached = resolve_attached;
8738 mp->mr_is_interface_rx = is_interface_rx;
8739 mp->mr_next_hop_weight = next_hop_weight;
8740 mp->mr_next_hop_preference = 0;
8741 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
8742 mp->mr_classify_table_index = ntohl (classify_table_index);
8743 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
8744 mp->mr_label = ntohl (local_label);
8745 mp->mr_eos = is_eos;
8747 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8748 if (0 != mp->mr_next_hop_n_out_labels)
8750 memcpy (mp->mr_next_hop_out_label_stack,
8751 next_hop_out_label_stack,
8752 vec_len (next_hop_out_label_stack) *
8753 sizeof (vl_api_fib_mpls_label_t));
8754 vec_free (next_hop_out_label_stack);
8759 if (DPO_PROTO_IP4 == next_hop_proto)
8761 clib_memcpy (mp->mr_next_hop,
8762 &v4_next_hop_address,
8763 sizeof (v4_next_hop_address));
8765 else if (DPO_PROTO_IP6 == next_hop_proto)
8768 clib_memcpy (mp->mr_next_hop,
8769 &v6_next_hop_address,
8770 sizeof (v6_next_hop_address));
8777 /* If we receive SIGTERM, stop now... */
8782 /* When testing multiple add/del ops, use a control-ping to sync */
8785 vl_api_control_ping_t *mp_ping;
8789 /* Shut off async mode */
8790 vam->async_mode = 0;
8792 MPING (CONTROL_PING, mp_ping);
8795 timeout = vat_time_now (vam) + 1.0;
8796 while (vat_time_now (vam) < timeout)
8797 if (vam->result_ready == 1)
8802 if (vam->retval == -99)
8805 if (vam->async_errors > 0)
8807 errmsg ("%d asynchronous errors", vam->async_errors);
8810 vam->async_errors = 0;
8811 after = vat_time_now (vam);
8813 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8817 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8818 count, after - before, count / (after - before));
8824 /* Wait for a reply... */
8829 /* Return the good/bad news */
8830 return (vam->retval);
8834 api_mpls_ip_bind_unbind (vat_main_t * vam)
8836 unformat_input_t *i = vam->input;
8837 vl_api_mpls_ip_bind_unbind_t *mp;
8838 u32 ip_table_id = 0;
8841 ip4_address_t v4_address;
8842 ip6_address_t v6_address;
8845 mpls_label_t local_label = MPLS_LABEL_INVALID;
8848 /* Parse args required to build the message */
8849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8851 if (unformat (i, "%U/%d", unformat_ip4_address,
8852 &v4_address, &address_length))
8857 else if (unformat (i, "%U/%d", unformat_ip6_address,
8858 &v6_address, &address_length))
8863 else if (unformat (i, "%d", &local_label))
8865 else if (unformat (i, "table-id %d", &ip_table_id))
8867 else if (unformat (i, "unbind"))
8869 else if (unformat (i, "bind"))
8873 clib_warning ("parse error '%U'", format_unformat_error, i);
8880 errmsg ("IP address not set");
8884 if (MPLS_LABEL_INVALID == local_label)
8886 errmsg ("missing label");
8890 /* Construct the API message */
8891 M (MPLS_IP_BIND_UNBIND, mp);
8893 mp->mb_is_bind = is_bind;
8894 mp->mb_is_ip4 = is_ip4;
8895 mp->mb_ip_table_id = ntohl (ip_table_id);
8896 mp->mb_mpls_table_id = 0;
8897 mp->mb_label = ntohl (local_label);
8898 mp->mb_address_length = address_length;
8901 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
8903 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
8908 /* Wait for a reply... */
8914 api_sr_mpls_policy_add (vat_main_t * vam)
8916 unformat_input_t *i = vam->input;
8917 vl_api_sr_mpls_policy_add_t *mp;
8923 u32 *segments = NULL;
8926 /* Parse args required to build the message */
8927 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8929 if (unformat (i, "bsid %d", &bsid))
8931 else if (unformat (i, "weight %d", &weight))
8933 else if (unformat (i, "spray"))
8935 else if (unformat (i, "next %d", &sid))
8938 vec_add1 (segments, htonl (sid));
8942 clib_warning ("parse error '%U'", format_unformat_error, i);
8949 errmsg ("bsid not set");
8953 if (n_segments == 0)
8955 errmsg ("no sid in segment stack");
8959 /* Construct the API message */
8960 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
8962 mp->bsid = htonl (bsid);
8963 mp->weight = htonl (weight);
8965 mp->n_segments = n_segments;
8966 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
8967 vec_free (segments);
8972 /* Wait for a reply... */
8978 api_sr_mpls_policy_del (vat_main_t * vam)
8980 unformat_input_t *i = vam->input;
8981 vl_api_sr_mpls_policy_del_t *mp;
8985 /* Parse args required to build the message */
8986 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8988 if (unformat (i, "bsid %d", &bsid))
8992 clib_warning ("parse error '%U'", format_unformat_error, i);
8999 errmsg ("bsid not set");
9003 /* Construct the API message */
9004 M (SR_MPLS_POLICY_DEL, mp);
9006 mp->bsid = htonl (bsid);
9011 /* Wait for a reply... */
9017 api_bier_table_add_del (vat_main_t * vam)
9019 unformat_input_t *i = vam->input;
9020 vl_api_bier_table_add_del_t *mp;
9022 u32 set = 0, sub_domain = 0, hdr_len = 3;
9023 mpls_label_t local_label = MPLS_LABEL_INVALID;
9026 /* Parse args required to build the message */
9027 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9029 if (unformat (i, "sub-domain %d", &sub_domain))
9031 else if (unformat (i, "set %d", &set))
9033 else if (unformat (i, "label %d", &local_label))
9035 else if (unformat (i, "hdr-len %d", &hdr_len))
9037 else if (unformat (i, "add"))
9039 else if (unformat (i, "del"))
9043 clib_warning ("parse error '%U'", format_unformat_error, i);
9048 if (MPLS_LABEL_INVALID == local_label)
9050 errmsg ("missing label\n");
9054 /* Construct the API message */
9055 M (BIER_TABLE_ADD_DEL, mp);
9057 mp->bt_is_add = is_add;
9058 mp->bt_label = ntohl (local_label);
9059 mp->bt_tbl_id.bt_set = set;
9060 mp->bt_tbl_id.bt_sub_domain = sub_domain;
9061 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
9066 /* Wait for a reply... */
9073 api_bier_route_add_del (vat_main_t * vam)
9075 unformat_input_t *i = vam->input;
9076 vl_api_bier_route_add_del_t *mp;
9078 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
9079 ip4_address_t v4_next_hop_address;
9080 ip6_address_t v6_next_hop_address;
9081 u8 next_hop_set = 0;
9082 u8 next_hop_proto_is_ip4 = 1;
9083 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9086 /* Parse args required to build the message */
9087 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9089 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
9091 next_hop_proto_is_ip4 = 1;
9094 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
9096 next_hop_proto_is_ip4 = 0;
9099 if (unformat (i, "sub-domain %d", &sub_domain))
9101 else if (unformat (i, "set %d", &set))
9103 else if (unformat (i, "hdr-len %d", &hdr_len))
9105 else if (unformat (i, "bp %d", &bp))
9107 else if (unformat (i, "add"))
9109 else if (unformat (i, "del"))
9111 else if (unformat (i, "out-label %d", &next_hop_out_label))
9115 clib_warning ("parse error '%U'", format_unformat_error, i);
9120 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9122 errmsg ("next hop / label set\n");
9127 errmsg ("bit=position not set\n");
9131 /* Construct the API message */
9132 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
9134 mp->br_is_add = is_add;
9135 mp->br_tbl_id.bt_set = set;
9136 mp->br_tbl_id.bt_sub_domain = sub_domain;
9137 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9138 mp->br_bp = ntohs (bp);
9140 mp->br_paths[0].n_labels = 1;
9141 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
9142 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9144 if (next_hop_proto_is_ip4)
9146 clib_memcpy (mp->br_paths[0].next_hop,
9147 &v4_next_hop_address, sizeof (v4_next_hop_address));
9151 clib_memcpy (mp->br_paths[0].next_hop,
9152 &v6_next_hop_address, sizeof (v6_next_hop_address));
9158 /* Wait for a reply... */
9165 api_proxy_arp_add_del (vat_main_t * vam)
9167 unformat_input_t *i = vam->input;
9168 vl_api_proxy_arp_add_del_t *mp;
9171 ip4_address_t lo, hi;
9175 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9177 if (unformat (i, "vrf %d", &vrf_id))
9179 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
9180 unformat_ip4_address, &hi))
9182 else if (unformat (i, "del"))
9186 clib_warning ("parse error '%U'", format_unformat_error, i);
9193 errmsg ("address range not set");
9197 M (PROXY_ARP_ADD_DEL, mp);
9199 mp->proxy.vrf_id = ntohl (vrf_id);
9200 mp->is_add = is_add;
9201 clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address));
9202 clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address));
9210 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9212 unformat_input_t *i = vam->input;
9213 vl_api_proxy_arp_intfc_enable_disable_t *mp;
9216 u8 sw_if_index_set = 0;
9219 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9221 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9222 sw_if_index_set = 1;
9223 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9224 sw_if_index_set = 1;
9225 else if (unformat (i, "enable"))
9227 else if (unformat (i, "disable"))
9231 clib_warning ("parse error '%U'", format_unformat_error, i);
9236 if (sw_if_index_set == 0)
9238 errmsg ("missing interface name or sw_if_index");
9242 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
9244 mp->sw_if_index = ntohl (sw_if_index);
9245 mp->enable_disable = enable;
9253 api_mpls_tunnel_add_del (vat_main_t * vam)
9255 unformat_input_t *i = vam->input;
9256 vl_api_mpls_tunnel_add_del_t *mp;
9260 u32 sw_if_index = ~0;
9261 u32 next_hop_sw_if_index = ~0;
9262 u32 next_hop_proto_is_ip4 = 1;
9264 u32 next_hop_table_id = 0;
9265 ip4_address_t v4_next_hop_address = {
9268 ip6_address_t v6_next_hop_address = { {0} };
9269 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
9270 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
9271 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9274 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9276 if (unformat (i, "add"))
9280 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
9282 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9284 else if (unformat (i, "via %U",
9285 unformat_ip4_address, &v4_next_hop_address))
9287 next_hop_proto_is_ip4 = 1;
9289 else if (unformat (i, "via %U",
9290 unformat_ip6_address, &v6_next_hop_address))
9292 next_hop_proto_is_ip4 = 0;
9294 else if (unformat (i, "via-label %d", &next_hop_via_label))
9298 (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index))
9300 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9302 else if (unformat (i, "l2-only"))
9304 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9306 else if (unformat (i, "out-label %d", &next_hop_out_label))
9308 vl_api_fib_mpls_label_t fib_label = {
9309 .label = ntohl (next_hop_out_label),
9313 vec_add1 (next_hop_out_label_stack, fib_label);
9317 clib_warning ("parse error '%U'", format_unformat_error, i);
9322 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9323 vec_len (next_hop_out_label_stack));
9325 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9326 mp->mt_sw_if_index = ntohl (sw_if_index);
9327 mp->mt_is_add = is_add;
9328 mp->mt_l2_only = l2_only;
9329 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9330 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
9331 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
9332 mp->mt_next_hop_weight = 1;
9333 mp->mt_next_hop_preference = 0;
9335 mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
9337 if (0 != mp->mt_next_hop_n_out_labels)
9339 clib_memcpy (mp->mt_next_hop_out_label_stack,
9340 next_hop_out_label_stack,
9341 (vec_len (next_hop_out_label_stack) *
9342 sizeof (vl_api_fib_mpls_label_t)));
9343 vec_free (next_hop_out_label_stack);
9346 if (next_hop_proto_is_ip4)
9348 clib_memcpy (mp->mt_next_hop,
9349 &v4_next_hop_address, sizeof (v4_next_hop_address));
9353 clib_memcpy (mp->mt_next_hop,
9354 &v6_next_hop_address, sizeof (v6_next_hop_address));
9363 api_sw_interface_set_unnumbered (vat_main_t * vam)
9365 unformat_input_t *i = vam->input;
9366 vl_api_sw_interface_set_unnumbered_t *mp;
9368 u32 unnum_sw_index = ~0;
9370 u8 sw_if_index_set = 0;
9373 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9375 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9376 sw_if_index_set = 1;
9377 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9378 sw_if_index_set = 1;
9379 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9381 else if (unformat (i, "del"))
9385 clib_warning ("parse error '%U'", format_unformat_error, i);
9390 if (sw_if_index_set == 0)
9392 errmsg ("missing interface name or sw_if_index");
9396 M (SW_INTERFACE_SET_UNNUMBERED, mp);
9398 mp->sw_if_index = ntohl (sw_if_index);
9399 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9400 mp->is_add = is_add;
9408 api_ip_neighbor_add_del (vat_main_t * vam)
9410 unformat_input_t *i = vam->input;
9411 vl_api_ip_neighbor_add_del_t *mp;
9413 u8 sw_if_index_set = 0;
9416 u8 is_no_fib_entry = 0;
9419 u8 v4_address_set = 0;
9420 u8 v6_address_set = 0;
9421 ip4_address_t v4address;
9422 ip6_address_t v6address;
9425 clib_memset (mac_address, 0, sizeof (mac_address));
9427 /* Parse args required to build the message */
9428 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9430 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
9434 else if (unformat (i, "del"))
9437 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9438 sw_if_index_set = 1;
9439 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9440 sw_if_index_set = 1;
9441 else if (unformat (i, "is_static"))
9443 else if (unformat (i, "no-fib-entry"))
9444 is_no_fib_entry = 1;
9445 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
9447 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
9451 clib_warning ("parse error '%U'", format_unformat_error, i);
9456 if (sw_if_index_set == 0)
9458 errmsg ("missing interface name or sw_if_index");
9461 if (v4_address_set && v6_address_set)
9463 errmsg ("both v4 and v6 addresses set");
9466 if (!v4_address_set && !v6_address_set)
9468 errmsg ("no address set");
9472 /* Construct the API message */
9473 M (IP_NEIGHBOR_ADD_DEL, mp);
9475 mp->sw_if_index = ntohl (sw_if_index);
9476 mp->is_add = is_add;
9477 mp->is_static = is_static;
9478 mp->is_no_adj_fib = is_no_fib_entry;
9480 clib_memcpy (mp->mac_address, mac_address, 6);
9484 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
9488 /* mp->is_ipv6 = 0; via clib_memset in M macro above */
9489 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
9495 /* Wait for a reply, return good/bad news */
9501 api_create_vlan_subif (vat_main_t * vam)
9503 unformat_input_t *i = vam->input;
9504 vl_api_create_vlan_subif_t *mp;
9506 u8 sw_if_index_set = 0;
9511 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9513 if (unformat (i, "sw_if_index %d", &sw_if_index))
9514 sw_if_index_set = 1;
9516 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9517 sw_if_index_set = 1;
9518 else if (unformat (i, "vlan %d", &vlan_id))
9522 clib_warning ("parse error '%U'", format_unformat_error, i);
9527 if (sw_if_index_set == 0)
9529 errmsg ("missing interface name or sw_if_index");
9533 if (vlan_id_set == 0)
9535 errmsg ("missing vlan_id");
9538 M (CREATE_VLAN_SUBIF, mp);
9540 mp->sw_if_index = ntohl (sw_if_index);
9541 mp->vlan_id = ntohl (vlan_id);
9548 #define foreach_create_subif_bit \
9555 _(outer_vlan_id_any) \
9556 _(inner_vlan_id_any)
9559 api_create_subif (vat_main_t * vam)
9561 unformat_input_t *i = vam->input;
9562 vl_api_create_subif_t *mp;
9564 u8 sw_if_index_set = 0;
9571 u32 exact_match = 0;
9572 u32 default_sub = 0;
9573 u32 outer_vlan_id_any = 0;
9574 u32 inner_vlan_id_any = 0;
9576 u16 outer_vlan_id = 0;
9577 u16 inner_vlan_id = 0;
9580 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9582 if (unformat (i, "sw_if_index %d", &sw_if_index))
9583 sw_if_index_set = 1;
9585 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9586 sw_if_index_set = 1;
9587 else if (unformat (i, "sub_id %d", &sub_id))
9589 else if (unformat (i, "outer_vlan_id %d", &tmp))
9590 outer_vlan_id = tmp;
9591 else if (unformat (i, "inner_vlan_id %d", &tmp))
9592 inner_vlan_id = tmp;
9594 #define _(a) else if (unformat (i, #a)) a = 1 ;
9595 foreach_create_subif_bit
9599 clib_warning ("parse error '%U'", format_unformat_error, i);
9604 if (sw_if_index_set == 0)
9606 errmsg ("missing interface name or sw_if_index");
9610 if (sub_id_set == 0)
9612 errmsg ("missing sub_id");
9615 M (CREATE_SUBIF, mp);
9617 mp->sw_if_index = ntohl (sw_if_index);
9618 mp->sub_id = ntohl (sub_id);
9620 #define _(a) mp->a = a;
9621 foreach_create_subif_bit;
9624 mp->outer_vlan_id = ntohs (outer_vlan_id);
9625 mp->inner_vlan_id = ntohs (inner_vlan_id);
9633 api_oam_add_del (vat_main_t * vam)
9635 unformat_input_t *i = vam->input;
9636 vl_api_oam_add_del_t *mp;
9639 ip4_address_t src, dst;
9644 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9646 if (unformat (i, "vrf %d", &vrf_id))
9648 else if (unformat (i, "src %U", unformat_ip4_address, &src))
9650 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
9652 else if (unformat (i, "del"))
9656 clib_warning ("parse error '%U'", format_unformat_error, i);
9663 errmsg ("missing src addr");
9669 errmsg ("missing dst addr");
9673 M (OAM_ADD_DEL, mp);
9675 mp->vrf_id = ntohl (vrf_id);
9676 mp->is_add = is_add;
9677 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
9678 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
9686 api_reset_fib (vat_main_t * vam)
9688 unformat_input_t *i = vam->input;
9689 vl_api_reset_fib_t *mp;
9695 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9697 if (unformat (i, "vrf %d", &vrf_id))
9699 else if (unformat (i, "ipv6"))
9703 clib_warning ("parse error '%U'", format_unformat_error, i);
9708 if (vrf_id_set == 0)
9710 errmsg ("missing vrf id");
9716 mp->vrf_id = ntohl (vrf_id);
9717 mp->is_ipv6 = is_ipv6;
9725 api_dhcp_proxy_config (vat_main_t * vam)
9727 unformat_input_t *i = vam->input;
9728 vl_api_dhcp_proxy_config_t *mp;
9730 u32 server_vrf_id = 0;
9732 u8 v4_address_set = 0;
9733 u8 v6_address_set = 0;
9734 ip4_address_t v4address;
9735 ip6_address_t v6address;
9736 u8 v4_src_address_set = 0;
9737 u8 v6_src_address_set = 0;
9738 ip4_address_t v4srcaddress;
9739 ip6_address_t v6srcaddress;
9742 /* Parse args required to build the message */
9743 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9745 if (unformat (i, "del"))
9747 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
9749 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
9751 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
9753 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
9755 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
9756 v4_src_address_set = 1;
9757 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
9758 v6_src_address_set = 1;
9763 if (v4_address_set && v6_address_set)
9765 errmsg ("both v4 and v6 server addresses set");
9768 if (!v4_address_set && !v6_address_set)
9770 errmsg ("no server addresses set");
9774 if (v4_src_address_set && v6_src_address_set)
9776 errmsg ("both v4 and v6 src addresses set");
9779 if (!v4_src_address_set && !v6_src_address_set)
9781 errmsg ("no src addresses set");
9785 if (!(v4_src_address_set && v4_address_set) &&
9786 !(v6_src_address_set && v6_address_set))
9788 errmsg ("no matching server and src addresses set");
9792 /* Construct the API message */
9793 M (DHCP_PROXY_CONFIG, mp);
9795 mp->is_add = is_add;
9796 mp->rx_vrf_id = ntohl (rx_vrf_id);
9797 mp->server_vrf_id = ntohl (server_vrf_id);
9801 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
9802 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
9806 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
9807 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
9813 /* Wait for a reply, return good/bad news */
9818 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
9819 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
9822 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
9824 vat_main_t *vam = &vat_main;
9825 u32 i, count = mp->count;
9826 vl_api_dhcp_server_t *s;
9830 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9831 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9832 ntohl (mp->rx_vrf_id),
9833 format_ip6_address, mp->dhcp_src_address,
9834 mp->vss_type, mp->vss_vpn_ascii_id,
9835 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9838 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9839 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9840 ntohl (mp->rx_vrf_id),
9841 format_ip4_address, mp->dhcp_src_address,
9842 mp->vss_type, mp->vss_vpn_ascii_id,
9843 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9845 for (i = 0; i < count; i++)
9847 s = &mp->servers[i];
9851 " Server Table-ID %d, Server Address %U",
9852 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
9855 " Server Table-ID %d, Server Address %U",
9856 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
9860 static void vl_api_dhcp_proxy_details_t_handler_json
9861 (vl_api_dhcp_proxy_details_t * mp)
9863 vat_main_t *vam = &vat_main;
9864 vat_json_node_t *node = NULL;
9865 u32 i, count = mp->count;
9867 struct in6_addr ip6;
9868 vl_api_dhcp_server_t *s;
9870 if (VAT_JSON_ARRAY != vam->json_tree.type)
9872 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9873 vat_json_init_array (&vam->json_tree);
9875 node = vat_json_array_add (&vam->json_tree);
9877 vat_json_init_object (node);
9878 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
9879 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
9880 sizeof (mp->vss_type));
9881 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
9882 mp->vss_vpn_ascii_id);
9883 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
9884 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
9888 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
9889 vat_json_object_add_ip6 (node, "src_address", ip6);
9893 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
9894 vat_json_object_add_ip4 (node, "src_address", ip4);
9897 for (i = 0; i < count; i++)
9899 s = &mp->servers[i];
9901 vat_json_object_add_uint (node, "server-table-id",
9902 ntohl (s->server_vrf_id));
9906 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
9907 vat_json_object_add_ip4 (node, "src_address", ip4);
9911 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
9912 vat_json_object_add_ip6 (node, "server_address", ip6);
9918 api_dhcp_proxy_dump (vat_main_t * vam)
9920 unformat_input_t *i = vam->input;
9921 vl_api_control_ping_t *mp_ping;
9922 vl_api_dhcp_proxy_dump_t *mp;
9926 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9928 if (unformat (i, "ipv6"))
9932 clib_warning ("parse error '%U'", format_unformat_error, i);
9937 M (DHCP_PROXY_DUMP, mp);
9939 mp->is_ip6 = is_ipv6;
9942 /* Use a control ping for synchronization */
9943 MPING (CONTROL_PING, mp_ping);
9951 api_dhcp_proxy_set_vss (vat_main_t * vam)
9953 unformat_input_t *i = vam->input;
9954 vl_api_dhcp_proxy_set_vss_t *mp;
9958 u8 vss_type = VSS_TYPE_DEFAULT;
9959 u8 *vpn_ascii_id = 0;
9964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9966 if (unformat (i, "tbl_id %d", &tbl_id))
9968 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
9969 vss_type = VSS_TYPE_ASCII;
9970 else if (unformat (i, "fib_id %d", &fib_id))
9971 vss_type = VSS_TYPE_VPN_ID;
9972 else if (unformat (i, "oui %d", &oui))
9973 vss_type = VSS_TYPE_VPN_ID;
9974 else if (unformat (i, "ipv6"))
9976 else if (unformat (i, "del"))
9984 errmsg ("missing tbl_id ");
9985 vec_free (vpn_ascii_id);
9989 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
9991 errmsg ("vpn_ascii_id cannot be longer than 128 ");
9992 vec_free (vpn_ascii_id);
9996 M (DHCP_PROXY_SET_VSS, mp);
9997 mp->tbl_id = ntohl (tbl_id);
9998 mp->vss_type = vss_type;
10001 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
10002 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
10004 mp->vpn_index = ntohl (fib_id);
10005 mp->oui = ntohl (oui);
10006 mp->is_ipv6 = is_ipv6;
10007 mp->is_add = is_add;
10012 vec_free (vpn_ascii_id);
10017 api_dhcp_client_config (vat_main_t * vam)
10019 unformat_input_t *i = vam->input;
10020 vl_api_dhcp_client_config_t *mp;
10022 u8 sw_if_index_set = 0;
10025 u8 disable_event = 0;
10028 /* Parse args required to build the message */
10029 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10031 if (unformat (i, "del"))
10034 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10035 sw_if_index_set = 1;
10036 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10037 sw_if_index_set = 1;
10038 else if (unformat (i, "hostname %s", &hostname))
10040 else if (unformat (i, "disable_event"))
10046 if (sw_if_index_set == 0)
10048 errmsg ("missing interface name or sw_if_index");
10052 if (vec_len (hostname) > 63)
10054 errmsg ("hostname too long");
10056 vec_add1 (hostname, 0);
10058 /* Construct the API message */
10059 M (DHCP_CLIENT_CONFIG, mp);
10061 mp->is_add = is_add;
10062 mp->client.sw_if_index = htonl (sw_if_index);
10063 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
10064 vec_free (hostname);
10065 mp->client.want_dhcp_event = disable_event ? 0 : 1;
10066 mp->client.pid = htonl (getpid ());
10071 /* Wait for a reply, return good/bad news */
10077 api_set_ip_flow_hash (vat_main_t * vam)
10079 unformat_input_t *i = vam->input;
10080 vl_api_set_ip_flow_hash_t *mp;
10092 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10094 if (unformat (i, "vrf %d", &vrf_id))
10096 else if (unformat (i, "ipv6"))
10098 else if (unformat (i, "src"))
10100 else if (unformat (i, "dst"))
10102 else if (unformat (i, "sport"))
10104 else if (unformat (i, "dport"))
10106 else if (unformat (i, "proto"))
10108 else if (unformat (i, "reverse"))
10113 clib_warning ("parse error '%U'", format_unformat_error, i);
10118 if (vrf_id_set == 0)
10120 errmsg ("missing vrf id");
10124 M (SET_IP_FLOW_HASH, mp);
10130 mp->reverse = reverse;
10131 mp->vrf_id = ntohl (vrf_id);
10132 mp->is_ipv6 = is_ipv6;
10140 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
10142 unformat_input_t *i = vam->input;
10143 vl_api_sw_interface_ip6_enable_disable_t *mp;
10145 u8 sw_if_index_set = 0;
10149 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10151 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10152 sw_if_index_set = 1;
10153 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10154 sw_if_index_set = 1;
10155 else if (unformat (i, "enable"))
10157 else if (unformat (i, "disable"))
10161 clib_warning ("parse error '%U'", format_unformat_error, i);
10166 if (sw_if_index_set == 0)
10168 errmsg ("missing interface name or sw_if_index");
10172 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
10174 mp->sw_if_index = ntohl (sw_if_index);
10175 mp->enable = enable;
10183 api_ip6nd_proxy_add_del (vat_main_t * vam)
10185 unformat_input_t *i = vam->input;
10186 vl_api_ip6nd_proxy_add_del_t *mp;
10187 u32 sw_if_index = ~0;
10188 u8 v6_address_set = 0;
10189 ip6_address_t v6address;
10193 /* Parse args required to build the message */
10194 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10196 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10198 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10200 else if (unformat (i, "%U", unformat_ip6_address, &v6address))
10201 v6_address_set = 1;
10202 if (unformat (i, "del"))
10206 clib_warning ("parse error '%U'", format_unformat_error, i);
10211 if (sw_if_index == ~0)
10213 errmsg ("missing interface name or sw_if_index");
10216 if (!v6_address_set)
10218 errmsg ("no address set");
10222 /* Construct the API message */
10223 M (IP6ND_PROXY_ADD_DEL, mp);
10225 mp->is_del = is_del;
10226 mp->sw_if_index = ntohl (sw_if_index);
10227 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10232 /* Wait for a reply, return good/bad news */
10238 api_ip6nd_proxy_dump (vat_main_t * vam)
10240 vl_api_ip6nd_proxy_dump_t *mp;
10241 vl_api_control_ping_t *mp_ping;
10244 M (IP6ND_PROXY_DUMP, mp);
10248 /* Use a control ping for synchronization */
10249 MPING (CONTROL_PING, mp_ping);
10256 static void vl_api_ip6nd_proxy_details_t_handler
10257 (vl_api_ip6nd_proxy_details_t * mp)
10259 vat_main_t *vam = &vat_main;
10261 print (vam->ofp, "host %U sw_if_index %d",
10262 format_ip6_address, mp->address, ntohl (mp->sw_if_index));
10265 static void vl_api_ip6nd_proxy_details_t_handler_json
10266 (vl_api_ip6nd_proxy_details_t * mp)
10268 vat_main_t *vam = &vat_main;
10269 struct in6_addr ip6;
10270 vat_json_node_t *node = NULL;
10272 if (VAT_JSON_ARRAY != vam->json_tree.type)
10274 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10275 vat_json_init_array (&vam->json_tree);
10277 node = vat_json_array_add (&vam->json_tree);
10279 vat_json_init_object (node);
10280 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10282 clib_memcpy (&ip6, mp->address, sizeof (ip6));
10283 vat_json_object_add_ip6 (node, "host", ip6);
10287 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10289 unformat_input_t *i = vam->input;
10290 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
10292 u8 sw_if_index_set = 0;
10293 u32 address_length = 0;
10294 u8 v6_address_set = 0;
10295 ip6_address_t v6address;
10296 u8 use_default = 0;
10297 u8 no_advertise = 0;
10299 u8 no_autoconfig = 0;
10302 u32 val_lifetime = 0;
10303 u32 pref_lifetime = 0;
10306 /* Parse args required to build the message */
10307 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10309 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10310 sw_if_index_set = 1;
10311 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10312 sw_if_index_set = 1;
10313 else if (unformat (i, "%U/%d",
10314 unformat_ip6_address, &v6address, &address_length))
10315 v6_address_set = 1;
10316 else if (unformat (i, "val_life %d", &val_lifetime))
10318 else if (unformat (i, "pref_life %d", &pref_lifetime))
10320 else if (unformat (i, "def"))
10322 else if (unformat (i, "noadv"))
10324 else if (unformat (i, "offl"))
10326 else if (unformat (i, "noauto"))
10328 else if (unformat (i, "nolink"))
10330 else if (unformat (i, "isno"))
10334 clib_warning ("parse error '%U'", format_unformat_error, i);
10339 if (sw_if_index_set == 0)
10341 errmsg ("missing interface name or sw_if_index");
10344 if (!v6_address_set)
10346 errmsg ("no address set");
10350 /* Construct the API message */
10351 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
10353 mp->sw_if_index = ntohl (sw_if_index);
10354 clib_memcpy (mp->address, &v6address, sizeof (v6address));
10355 mp->address_length = address_length;
10356 mp->use_default = use_default;
10357 mp->no_advertise = no_advertise;
10358 mp->off_link = off_link;
10359 mp->no_autoconfig = no_autoconfig;
10360 mp->no_onlink = no_onlink;
10362 mp->val_lifetime = ntohl (val_lifetime);
10363 mp->pref_lifetime = ntohl (pref_lifetime);
10368 /* Wait for a reply, return good/bad news */
10374 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10376 unformat_input_t *i = vam->input;
10377 vl_api_sw_interface_ip6nd_ra_config_t *mp;
10379 u8 sw_if_index_set = 0;
10384 u8 send_unicast = 0;
10387 u8 default_router = 0;
10388 u32 max_interval = 0;
10389 u32 min_interval = 0;
10391 u32 initial_count = 0;
10392 u32 initial_interval = 0;
10396 /* Parse args required to build the message */
10397 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10399 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10400 sw_if_index_set = 1;
10401 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10402 sw_if_index_set = 1;
10403 else if (unformat (i, "maxint %d", &max_interval))
10405 else if (unformat (i, "minint %d", &min_interval))
10407 else if (unformat (i, "life %d", &lifetime))
10409 else if (unformat (i, "count %d", &initial_count))
10411 else if (unformat (i, "interval %d", &initial_interval))
10413 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10415 else if (unformat (i, "managed"))
10417 else if (unformat (i, "other"))
10419 else if (unformat (i, "ll"))
10421 else if (unformat (i, "send"))
10423 else if (unformat (i, "cease"))
10425 else if (unformat (i, "isno"))
10427 else if (unformat (i, "def"))
10428 default_router = 1;
10431 clib_warning ("parse error '%U'", format_unformat_error, i);
10436 if (sw_if_index_set == 0)
10438 errmsg ("missing interface name or sw_if_index");
10442 /* Construct the API message */
10443 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
10445 mp->sw_if_index = ntohl (sw_if_index);
10446 mp->max_interval = ntohl (max_interval);
10447 mp->min_interval = ntohl (min_interval);
10448 mp->lifetime = ntohl (lifetime);
10449 mp->initial_count = ntohl (initial_count);
10450 mp->initial_interval = ntohl (initial_interval);
10451 mp->suppress = suppress;
10452 mp->managed = managed;
10454 mp->ll_option = ll_option;
10455 mp->send_unicast = send_unicast;
10458 mp->default_router = default_router;
10463 /* Wait for a reply, return good/bad news */
10469 api_set_arp_neighbor_limit (vat_main_t * vam)
10471 unformat_input_t *i = vam->input;
10472 vl_api_set_arp_neighbor_limit_t *mp;
10478 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10480 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10482 else if (unformat (i, "ipv6"))
10486 clib_warning ("parse error '%U'", format_unformat_error, i);
10491 if (limit_set == 0)
10493 errmsg ("missing limit value");
10497 M (SET_ARP_NEIGHBOR_LIMIT, mp);
10499 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10500 mp->is_ipv6 = is_ipv6;
10508 api_l2_patch_add_del (vat_main_t * vam)
10510 unformat_input_t *i = vam->input;
10511 vl_api_l2_patch_add_del_t *mp;
10512 u32 rx_sw_if_index;
10513 u8 rx_sw_if_index_set = 0;
10514 u32 tx_sw_if_index;
10515 u8 tx_sw_if_index_set = 0;
10519 /* Parse args required to build the message */
10520 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10522 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10523 rx_sw_if_index_set = 1;
10524 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10525 tx_sw_if_index_set = 1;
10526 else if (unformat (i, "rx"))
10528 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10530 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10532 rx_sw_if_index_set = 1;
10537 else if (unformat (i, "tx"))
10539 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10541 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10543 tx_sw_if_index_set = 1;
10548 else if (unformat (i, "del"))
10554 if (rx_sw_if_index_set == 0)
10556 errmsg ("missing rx interface name or rx_sw_if_index");
10560 if (tx_sw_if_index_set == 0)
10562 errmsg ("missing tx interface name or tx_sw_if_index");
10566 M (L2_PATCH_ADD_DEL, mp);
10568 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10569 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10570 mp->is_add = is_add;
10578 u8 localsid_addr[16];
10587 api_sr_localsid_add_del (vat_main_t * vam)
10589 unformat_input_t *i = vam->input;
10590 vl_api_sr_localsid_add_del_t *mp;
10593 ip6_address_t localsid;
10597 u32 fib_table = ~(u32) 0;
10598 ip6_address_t nh_addr6;
10599 ip4_address_t nh_addr4;
10600 clib_memset (&nh_addr6, 0, sizeof (ip6_address_t));
10601 clib_memset (&nh_addr4, 0, sizeof (ip4_address_t));
10603 bool nexthop_set = 0;
10607 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10609 if (unformat (i, "del"))
10611 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
10612 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10614 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
10616 else if (unformat (i, "behavior %u", &behavior));
10617 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10618 else if (unformat (i, "fib-table %u", &fib_table));
10619 else if (unformat (i, "end.psp %u", &behavior));
10624 M (SR_LOCALSID_ADD_DEL, mp);
10626 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
10629 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
10630 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
10632 mp->behavior = behavior;
10633 mp->sw_if_index = ntohl (sw_if_index);
10634 mp->fib_table = ntohl (fib_table);
10635 mp->end_psp = end_psp;
10636 mp->is_del = is_del;
10644 api_ioam_enable (vat_main_t * vam)
10646 unformat_input_t *input = vam->input;
10647 vl_api_ioam_enable_t *mp;
10649 int has_trace_option = 0;
10650 int has_pot_option = 0;
10651 int has_seqno_option = 0;
10652 int has_analyse_option = 0;
10655 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10657 if (unformat (input, "trace"))
10658 has_trace_option = 1;
10659 else if (unformat (input, "pot"))
10660 has_pot_option = 1;
10661 else if (unformat (input, "seqno"))
10662 has_seqno_option = 1;
10663 else if (unformat (input, "analyse"))
10664 has_analyse_option = 1;
10668 M (IOAM_ENABLE, mp);
10669 mp->id = htons (id);
10670 mp->seqno = has_seqno_option;
10671 mp->analyse = has_analyse_option;
10672 mp->pot_enable = has_pot_option;
10673 mp->trace_enable = has_trace_option;
10682 api_ioam_disable (vat_main_t * vam)
10684 vl_api_ioam_disable_t *mp;
10687 M (IOAM_DISABLE, mp);
10693 #define foreach_tcp_proto_field \
10697 #define foreach_udp_proto_field \
10701 #define foreach_ip4_proto_field \
10713 u16 src_port, dst_port;
10716 #if VPP_API_TEST_BUILTIN == 0
10718 unformat_tcp_mask (unformat_input_t * input, va_list * args)
10720 u8 **maskp = va_arg (*args, u8 **);
10722 u8 found_something = 0;
10725 #define _(a) u8 a=0;
10726 foreach_tcp_proto_field;
10729 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10732 #define _(a) else if (unformat (input, #a)) a=1;
10733 foreach_tcp_proto_field
10739 #define _(a) found_something += a;
10740 foreach_tcp_proto_field;
10743 if (found_something == 0)
10746 vec_validate (mask, sizeof (*tcp) - 1);
10748 tcp = (tcp_header_t *) mask;
10750 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
10751 foreach_tcp_proto_field;
10759 unformat_udp_mask (unformat_input_t * input, va_list * args)
10761 u8 **maskp = va_arg (*args, u8 **);
10763 u8 found_something = 0;
10766 #define _(a) u8 a=0;
10767 foreach_udp_proto_field;
10770 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10773 #define _(a) else if (unformat (input, #a)) a=1;
10774 foreach_udp_proto_field
10780 #define _(a) found_something += a;
10781 foreach_udp_proto_field;
10784 if (found_something == 0)
10787 vec_validate (mask, sizeof (*udp) - 1);
10789 udp = (udp_header_t *) mask;
10791 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
10792 foreach_udp_proto_field;
10800 unformat_l4_mask (unformat_input_t * input, va_list * args)
10802 u8 **maskp = va_arg (*args, u8 **);
10803 u16 src_port = 0, dst_port = 0;
10804 tcpudp_header_t *tcpudp;
10806 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10808 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
10810 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
10812 else if (unformat (input, "src_port"))
10814 else if (unformat (input, "dst_port"))
10820 if (!src_port && !dst_port)
10824 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
10826 tcpudp = (tcpudp_header_t *) mask;
10827 tcpudp->src_port = src_port;
10828 tcpudp->dst_port = dst_port;
10836 unformat_ip4_mask (unformat_input_t * input, va_list * args)
10838 u8 **maskp = va_arg (*args, u8 **);
10840 u8 found_something = 0;
10843 #define _(a) u8 a=0;
10844 foreach_ip4_proto_field;
10850 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10852 if (unformat (input, "version"))
10854 else if (unformat (input, "hdr_length"))
10856 else if (unformat (input, "src"))
10858 else if (unformat (input, "dst"))
10860 else if (unformat (input, "proto"))
10863 #define _(a) else if (unformat (input, #a)) a=1;
10864 foreach_ip4_proto_field
10870 #define _(a) found_something += a;
10871 foreach_ip4_proto_field;
10874 if (found_something == 0)
10877 vec_validate (mask, sizeof (*ip) - 1);
10879 ip = (ip4_header_t *) mask;
10881 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10882 foreach_ip4_proto_field;
10885 ip->ip_version_and_header_length = 0;
10888 ip->ip_version_and_header_length |= 0xF0;
10891 ip->ip_version_and_header_length |= 0x0F;
10897 #define foreach_ip6_proto_field \
10900 _(payload_length) \
10905 unformat_ip6_mask (unformat_input_t * input, va_list * args)
10907 u8 **maskp = va_arg (*args, u8 **);
10909 u8 found_something = 0;
10911 u32 ip_version_traffic_class_and_flow_label;
10913 #define _(a) u8 a=0;
10914 foreach_ip6_proto_field;
10917 u8 traffic_class = 0;
10920 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10922 if (unformat (input, "version"))
10924 else if (unformat (input, "traffic-class"))
10926 else if (unformat (input, "flow-label"))
10928 else if (unformat (input, "src"))
10930 else if (unformat (input, "dst"))
10932 else if (unformat (input, "proto"))
10935 #define _(a) else if (unformat (input, #a)) a=1;
10936 foreach_ip6_proto_field
10942 #define _(a) found_something += a;
10943 foreach_ip6_proto_field;
10946 if (found_something == 0)
10949 vec_validate (mask, sizeof (*ip) - 1);
10951 ip = (ip6_header_t *) mask;
10953 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10954 foreach_ip6_proto_field;
10957 ip_version_traffic_class_and_flow_label = 0;
10960 ip_version_traffic_class_and_flow_label |= 0xF0000000;
10963 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
10966 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
10968 ip->ip_version_traffic_class_and_flow_label =
10969 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
10976 unformat_l3_mask (unformat_input_t * input, va_list * args)
10978 u8 **maskp = va_arg (*args, u8 **);
10980 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10982 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
10984 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
10993 unformat_l2_mask (unformat_input_t * input, va_list * args)
10995 u8 **maskp = va_arg (*args, u8 **);
11002 u8 ignore_tag1 = 0;
11003 u8 ignore_tag2 = 0;
11010 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11012 if (unformat (input, "src"))
11014 else if (unformat (input, "dst"))
11016 else if (unformat (input, "proto"))
11018 else if (unformat (input, "tag1"))
11020 else if (unformat (input, "tag2"))
11022 else if (unformat (input, "ignore-tag1"))
11024 else if (unformat (input, "ignore-tag2"))
11026 else if (unformat (input, "cos1"))
11028 else if (unformat (input, "cos2"))
11030 else if (unformat (input, "dot1q"))
11032 else if (unformat (input, "dot1ad"))
11037 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
11038 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11041 if (tag1 || ignore_tag1 || cos1 || dot1q)
11043 if (tag2 || ignore_tag2 || cos2 || dot1ad)
11046 vec_validate (mask, len - 1);
11049 clib_memset (mask, 0xff, 6);
11052 clib_memset (mask + 6, 0xff, 6);
11054 if (tag2 || dot1ad)
11056 /* inner vlan tag */
11065 mask[21] = mask[20] = 0xff;
11086 mask[16] = mask[17] = 0xff;
11096 mask[12] = mask[13] = 0xff;
11103 unformat_classify_mask (unformat_input_t * input, va_list * args)
11105 u8 **maskp = va_arg (*args, u8 **);
11106 u32 *skipp = va_arg (*args, u32 *);
11107 u32 *matchp = va_arg (*args, u32 *);
11115 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11117 if (unformat (input, "hex %U", unformat_hex_string, &mask))
11119 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
11121 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
11123 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
11137 if (mask || l2 || l3 || l4)
11139 if (l2 || l3 || l4)
11141 /* "With a free Ethernet header in every package" */
11143 vec_validate (l2, 13);
11147 vec_append (mask, l3);
11152 vec_append (mask, l4);
11157 /* Scan forward looking for the first significant mask octet */
11158 for (i = 0; i < vec_len (mask); i++)
11162 /* compute (skip, match) params */
11163 *skipp = i / sizeof (u32x4);
11164 vec_delete (mask, *skipp * sizeof (u32x4), 0);
11166 /* Pad mask to an even multiple of the vector size */
11167 while (vec_len (mask) % sizeof (u32x4))
11168 vec_add1 (mask, 0);
11170 match = vec_len (mask) / sizeof (u32x4);
11172 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
11174 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11175 if (*tmp || *(tmp + 1))
11180 clib_warning ("BUG: match 0");
11182 _vec_len (mask) = match * sizeof (u32x4);
11192 #endif /* VPP_API_TEST_BUILTIN */
11194 #define foreach_l2_next \
11196 _(ethernet, ETHERNET_INPUT) \
11197 _(ip4, IP4_INPUT) \
11201 unformat_l2_next_index (unformat_input_t * input, va_list * args)
11203 u32 *miss_next_indexp = va_arg (*args, u32 *);
11204 u32 next_index = 0;
11208 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11212 if (unformat (input, "%d", &tmp))
11221 *miss_next_indexp = next_index;
11225 #define foreach_ip_next \
11228 _(rewrite, REWRITE)
11231 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
11233 u32 *miss_next_indexp = va_arg (*args, u32 *);
11234 u32 next_index = 0;
11238 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11242 if (unformat (input, "%d", &tmp))
11251 *miss_next_indexp = next_index;
11255 #define foreach_acl_next \
11259 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
11261 u32 *miss_next_indexp = va_arg (*args, u32 *);
11262 u32 next_index = 0;
11266 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11270 if (unformat (input, "permit"))
11275 else if (unformat (input, "%d", &tmp))
11284 *miss_next_indexp = next_index;
11289 unformat_policer_precolor (unformat_input_t * input, va_list * args)
11291 u32 *r = va_arg (*args, u32 *);
11293 if (unformat (input, "conform-color"))
11294 *r = POLICE_CONFORM;
11295 else if (unformat (input, "exceed-color"))
11296 *r = POLICE_EXCEED;
11304 api_classify_add_del_table (vat_main_t * vam)
11306 unformat_input_t *i = vam->input;
11307 vl_api_classify_add_del_table_t *mp;
11314 u32 table_index = ~0;
11315 u32 next_table_index = ~0;
11316 u32 miss_next_index = ~0;
11317 u32 memory_size = 32 << 20;
11319 u32 current_data_flag = 0;
11320 int current_data_offset = 0;
11323 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11325 if (unformat (i, "del"))
11327 else if (unformat (i, "del-chain"))
11332 else if (unformat (i, "buckets %d", &nbuckets))
11334 else if (unformat (i, "memory_size %d", &memory_size))
11336 else if (unformat (i, "skip %d", &skip))
11338 else if (unformat (i, "match %d", &match))
11340 else if (unformat (i, "table %d", &table_index))
11342 else if (unformat (i, "mask %U", unformat_classify_mask,
11343 &mask, &skip, &match))
11345 else if (unformat (i, "next-table %d", &next_table_index))
11347 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
11350 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11353 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
11356 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
11358 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
11364 if (is_add && mask == 0)
11366 errmsg ("Mask required");
11370 if (is_add && skip == ~0)
11372 errmsg ("skip count required");
11376 if (is_add && match == ~0)
11378 errmsg ("match count required");
11382 if (!is_add && table_index == ~0)
11384 errmsg ("table index required for delete");
11388 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
11390 mp->is_add = is_add;
11391 mp->del_chain = del_chain;
11392 mp->table_index = ntohl (table_index);
11393 mp->nbuckets = ntohl (nbuckets);
11394 mp->memory_size = ntohl (memory_size);
11395 mp->skip_n_vectors = ntohl (skip);
11396 mp->match_n_vectors = ntohl (match);
11397 mp->next_table_index = ntohl (next_table_index);
11398 mp->miss_next_index = ntohl (miss_next_index);
11399 mp->current_data_flag = ntohl (current_data_flag);
11400 mp->current_data_offset = ntohl (current_data_offset);
11401 mp->mask_len = ntohl (vec_len (mask));
11402 clib_memcpy (mp->mask, mask, vec_len (mask));
11411 #if VPP_API_TEST_BUILTIN == 0
11413 unformat_l4_match (unformat_input_t * input, va_list * args)
11415 u8 **matchp = va_arg (*args, u8 **);
11417 u8 *proto_header = 0;
11423 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11425 if (unformat (input, "src_port %d", &src_port))
11427 else if (unformat (input, "dst_port %d", &dst_port))
11433 h.src_port = clib_host_to_net_u16 (src_port);
11434 h.dst_port = clib_host_to_net_u16 (dst_port);
11435 vec_validate (proto_header, sizeof (h) - 1);
11436 memcpy (proto_header, &h, sizeof (h));
11438 *matchp = proto_header;
11444 unformat_ip4_match (unformat_input_t * input, va_list * args)
11446 u8 **matchp = va_arg (*args, u8 **);
11451 int hdr_length = 0;
11452 u32 hdr_length_val;
11453 int src = 0, dst = 0;
11454 ip4_address_t src_val, dst_val;
11461 int fragment_id = 0;
11462 u32 fragment_id_val;
11468 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11470 if (unformat (input, "version %d", &version_val))
11472 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11474 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11476 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11478 else if (unformat (input, "proto %d", &proto_val))
11480 else if (unformat (input, "tos %d", &tos_val))
11482 else if (unformat (input, "length %d", &length_val))
11484 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11486 else if (unformat (input, "ttl %d", &ttl_val))
11488 else if (unformat (input, "checksum %d", &checksum_val))
11494 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11495 + ttl + checksum == 0)
11499 * Aligned because we use the real comparison functions
11501 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11503 ip = (ip4_header_t *) match;
11505 /* These are realistically matched in practice */
11507 ip->src_address.as_u32 = src_val.as_u32;
11510 ip->dst_address.as_u32 = dst_val.as_u32;
11513 ip->protocol = proto_val;
11516 /* These are not, but they're included for completeness */
11518 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11521 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11527 ip->length = clib_host_to_net_u16 (length_val);
11533 ip->checksum = clib_host_to_net_u16 (checksum_val);
11540 unformat_ip6_match (unformat_input_t * input, va_list * args)
11542 u8 **matchp = va_arg (*args, u8 **);
11547 u8 traffic_class = 0;
11548 u32 traffic_class_val = 0;
11551 int src = 0, dst = 0;
11552 ip6_address_t src_val, dst_val;
11555 int payload_length = 0;
11556 u32 payload_length_val;
11559 u32 ip_version_traffic_class_and_flow_label;
11561 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11563 if (unformat (input, "version %d", &version_val))
11565 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11567 else if (unformat (input, "flow_label %d", &flow_label_val))
11569 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11571 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11573 else if (unformat (input, "proto %d", &proto_val))
11575 else if (unformat (input, "payload_length %d", &payload_length_val))
11576 payload_length = 1;
11577 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11583 if (version + traffic_class + flow_label + src + dst + proto +
11584 payload_length + hop_limit == 0)
11588 * Aligned because we use the real comparison functions
11590 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11592 ip = (ip6_header_t *) match;
11595 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11598 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11601 ip->protocol = proto_val;
11603 ip_version_traffic_class_and_flow_label = 0;
11606 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11609 ip_version_traffic_class_and_flow_label |=
11610 (traffic_class_val & 0xFF) << 20;
11613 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11615 ip->ip_version_traffic_class_and_flow_label =
11616 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11618 if (payload_length)
11619 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11622 ip->hop_limit = hop_limit_val;
11629 unformat_l3_match (unformat_input_t * input, va_list * args)
11631 u8 **matchp = va_arg (*args, u8 **);
11633 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11635 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
11637 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
11646 unformat_vlan_tag (unformat_input_t * input, va_list * args)
11648 u8 *tagp = va_arg (*args, u8 *);
11651 if (unformat (input, "%d", &tag))
11653 tagp[0] = (tag >> 8) & 0x0F;
11654 tagp[1] = tag & 0xFF;
11662 unformat_l2_match (unformat_input_t * input, va_list * args)
11664 u8 **matchp = va_arg (*args, u8 **);
11677 u8 ignore_tag1 = 0;
11678 u8 ignore_tag2 = 0;
11684 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11686 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
11689 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
11691 else if (unformat (input, "proto %U",
11692 unformat_ethernet_type_host_byte_order, &proto_val))
11694 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
11696 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
11698 else if (unformat (input, "ignore-tag1"))
11700 else if (unformat (input, "ignore-tag2"))
11702 else if (unformat (input, "cos1 %d", &cos1_val))
11704 else if (unformat (input, "cos2 %d", &cos2_val))
11709 if ((src + dst + proto + tag1 + tag2 +
11710 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11713 if (tag1 || ignore_tag1 || cos1)
11715 if (tag2 || ignore_tag2 || cos2)
11718 vec_validate_aligned (match, len - 1, sizeof (u32x4));
11721 clib_memcpy (match, dst_val, 6);
11724 clib_memcpy (match + 6, src_val, 6);
11728 /* inner vlan tag */
11729 match[19] = tag2_val[1];
11730 match[18] = tag2_val[0];
11732 match[18] |= (cos2_val & 0x7) << 5;
11735 match[21] = proto_val & 0xff;
11736 match[20] = proto_val >> 8;
11740 match[15] = tag1_val[1];
11741 match[14] = tag1_val[0];
11744 match[14] |= (cos1_val & 0x7) << 5;
11750 match[15] = tag1_val[1];
11751 match[14] = tag1_val[0];
11754 match[17] = proto_val & 0xff;
11755 match[16] = proto_val >> 8;
11758 match[14] |= (cos1_val & 0x7) << 5;
11764 match[18] |= (cos2_val & 0x7) << 5;
11766 match[14] |= (cos1_val & 0x7) << 5;
11769 match[13] = proto_val & 0xff;
11770 match[12] = proto_val >> 8;
11778 unformat_qos_source (unformat_input_t * input, va_list * args)
11780 int *qs = va_arg (*args, int *);
11782 if (unformat (input, "ip"))
11783 *qs = QOS_SOURCE_IP;
11784 else if (unformat (input, "mpls"))
11785 *qs = QOS_SOURCE_MPLS;
11786 else if (unformat (input, "ext"))
11787 *qs = QOS_SOURCE_EXT;
11788 else if (unformat (input, "vlan"))
11789 *qs = QOS_SOURCE_VLAN;
11798 api_unformat_classify_match (unformat_input_t * input, va_list * args)
11800 u8 **matchp = va_arg (*args, u8 **);
11801 u32 skip_n_vectors = va_arg (*args, u32);
11802 u32 match_n_vectors = va_arg (*args, u32);
11809 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11811 if (unformat (input, "hex %U", unformat_hex_string, &match))
11813 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
11815 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
11817 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
11831 if (match || l2 || l3 || l4)
11833 if (l2 || l3 || l4)
11835 /* "Win a free Ethernet header in every packet" */
11837 vec_validate_aligned (l2, 13, sizeof (u32x4));
11841 vec_append_aligned (match, l3, sizeof (u32x4));
11846 vec_append_aligned (match, l4, sizeof (u32x4));
11851 /* Make sure the vector is big enough even if key is all 0's */
11852 vec_validate_aligned
11853 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
11856 /* Set size, include skipped vectors */
11857 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
11868 api_classify_add_del_session (vat_main_t * vam)
11870 unformat_input_t *i = vam->input;
11871 vl_api_classify_add_del_session_t *mp;
11873 u32 table_index = ~0;
11874 u32 hit_next_index = ~0;
11875 u32 opaque_index = ~0;
11878 u32 skip_n_vectors = 0;
11879 u32 match_n_vectors = 0;
11885 * Warning: you have to supply skip_n and match_n
11886 * because the API client cant simply look at the classify
11890 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11892 if (unformat (i, "del"))
11894 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
11897 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
11900 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
11903 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
11905 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
11907 else if (unformat (i, "opaque-index %d", &opaque_index))
11909 else if (unformat (i, "skip_n %d", &skip_n_vectors))
11911 else if (unformat (i, "match_n %d", &match_n_vectors))
11913 else if (unformat (i, "match %U", api_unformat_classify_match,
11914 &match, skip_n_vectors, match_n_vectors))
11916 else if (unformat (i, "advance %d", &advance))
11918 else if (unformat (i, "table-index %d", &table_index))
11920 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
11922 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
11924 else if (unformat (i, "action %d", &action))
11926 else if (unformat (i, "metadata %d", &metadata))
11932 if (table_index == ~0)
11934 errmsg ("Table index required");
11938 if (is_add && match == 0)
11940 errmsg ("Match value required");
11944 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
11946 mp->is_add = is_add;
11947 mp->table_index = ntohl (table_index);
11948 mp->hit_next_index = ntohl (hit_next_index);
11949 mp->opaque_index = ntohl (opaque_index);
11950 mp->advance = ntohl (advance);
11951 mp->action = action;
11952 mp->metadata = ntohl (metadata);
11953 mp->match_len = ntohl (vec_len (match));
11954 clib_memcpy (mp->match, match, vec_len (match));
11963 api_classify_set_interface_ip_table (vat_main_t * vam)
11965 unformat_input_t *i = vam->input;
11966 vl_api_classify_set_interface_ip_table_t *mp;
11968 int sw_if_index_set;
11969 u32 table_index = ~0;
11973 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11975 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11976 sw_if_index_set = 1;
11977 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11978 sw_if_index_set = 1;
11979 else if (unformat (i, "table %d", &table_index))
11983 clib_warning ("parse error '%U'", format_unformat_error, i);
11988 if (sw_if_index_set == 0)
11990 errmsg ("missing interface name or sw_if_index");
11995 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
11997 mp->sw_if_index = ntohl (sw_if_index);
11998 mp->table_index = ntohl (table_index);
11999 mp->is_ipv6 = is_ipv6;
12007 api_classify_set_interface_l2_tables (vat_main_t * vam)
12009 unformat_input_t *i = vam->input;
12010 vl_api_classify_set_interface_l2_tables_t *mp;
12012 int sw_if_index_set;
12013 u32 ip4_table_index = ~0;
12014 u32 ip6_table_index = ~0;
12015 u32 other_table_index = ~0;
12019 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12021 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12022 sw_if_index_set = 1;
12023 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12024 sw_if_index_set = 1;
12025 else if (unformat (i, "ip4-table %d", &ip4_table_index))
12027 else if (unformat (i, "ip6-table %d", &ip6_table_index))
12029 else if (unformat (i, "other-table %d", &other_table_index))
12031 else if (unformat (i, "is-input %d", &is_input))
12035 clib_warning ("parse error '%U'", format_unformat_error, i);
12040 if (sw_if_index_set == 0)
12042 errmsg ("missing interface name or sw_if_index");
12047 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
12049 mp->sw_if_index = ntohl (sw_if_index);
12050 mp->ip4_table_index = ntohl (ip4_table_index);
12051 mp->ip6_table_index = ntohl (ip6_table_index);
12052 mp->other_table_index = ntohl (other_table_index);
12053 mp->is_input = (u8) is_input;
12061 api_set_ipfix_exporter (vat_main_t * vam)
12063 unformat_input_t *i = vam->input;
12064 vl_api_set_ipfix_exporter_t *mp;
12065 ip4_address_t collector_address;
12066 u8 collector_address_set = 0;
12067 u32 collector_port = ~0;
12068 ip4_address_t src_address;
12069 u8 src_address_set = 0;
12072 u32 template_interval = ~0;
12073 u8 udp_checksum = 0;
12076 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12078 if (unformat (i, "collector_address %U", unformat_ip4_address,
12079 &collector_address))
12080 collector_address_set = 1;
12081 else if (unformat (i, "collector_port %d", &collector_port))
12083 else if (unformat (i, "src_address %U", unformat_ip4_address,
12085 src_address_set = 1;
12086 else if (unformat (i, "vrf_id %d", &vrf_id))
12088 else if (unformat (i, "path_mtu %d", &path_mtu))
12090 else if (unformat (i, "template_interval %d", &template_interval))
12092 else if (unformat (i, "udp_checksum"))
12098 if (collector_address_set == 0)
12100 errmsg ("collector_address required");
12104 if (src_address_set == 0)
12106 errmsg ("src_address required");
12110 M (SET_IPFIX_EXPORTER, mp);
12112 memcpy (mp->collector_address, collector_address.data,
12113 sizeof (collector_address.data));
12114 mp->collector_port = htons ((u16) collector_port);
12115 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
12116 mp->vrf_id = htonl (vrf_id);
12117 mp->path_mtu = htonl (path_mtu);
12118 mp->template_interval = htonl (template_interval);
12119 mp->udp_checksum = udp_checksum;
12127 api_set_ipfix_classify_stream (vat_main_t * vam)
12129 unformat_input_t *i = vam->input;
12130 vl_api_set_ipfix_classify_stream_t *mp;
12132 u32 src_port = UDP_DST_PORT_ipfix;
12135 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12137 if (unformat (i, "domain %d", &domain_id))
12139 else if (unformat (i, "src_port %d", &src_port))
12143 errmsg ("unknown input `%U'", format_unformat_error, i);
12148 M (SET_IPFIX_CLASSIFY_STREAM, mp);
12150 mp->domain_id = htonl (domain_id);
12151 mp->src_port = htons ((u16) src_port);
12159 api_ipfix_classify_table_add_del (vat_main_t * vam)
12161 unformat_input_t *i = vam->input;
12162 vl_api_ipfix_classify_table_add_del_t *mp;
12164 u32 classify_table_index = ~0;
12166 u8 transport_protocol = 255;
12169 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12171 if (unformat (i, "add"))
12173 else if (unformat (i, "del"))
12175 else if (unformat (i, "table %d", &classify_table_index))
12177 else if (unformat (i, "ip4"))
12179 else if (unformat (i, "ip6"))
12181 else if (unformat (i, "tcp"))
12182 transport_protocol = 6;
12183 else if (unformat (i, "udp"))
12184 transport_protocol = 17;
12187 errmsg ("unknown input `%U'", format_unformat_error, i);
12194 errmsg ("expecting: add|del");
12197 if (classify_table_index == ~0)
12199 errmsg ("classifier table not specified");
12202 if (ip_version == 0)
12204 errmsg ("IP version not specified");
12208 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
12210 mp->is_add = is_add;
12211 mp->table_id = htonl (classify_table_index);
12212 mp->ip_version = ip_version;
12213 mp->transport_protocol = transport_protocol;
12221 api_get_node_index (vat_main_t * vam)
12223 unformat_input_t *i = vam->input;
12224 vl_api_get_node_index_t *mp;
12228 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12230 if (unformat (i, "node %s", &name))
12237 errmsg ("node name required");
12240 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12242 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12246 M (GET_NODE_INDEX, mp);
12247 clib_memcpy (mp->node_name, name, vec_len (name));
12256 api_get_next_index (vat_main_t * vam)
12258 unformat_input_t *i = vam->input;
12259 vl_api_get_next_index_t *mp;
12260 u8 *node_name = 0, *next_node_name = 0;
12263 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12265 if (unformat (i, "node-name %s", &node_name))
12267 else if (unformat (i, "next-node-name %s", &next_node_name))
12271 if (node_name == 0)
12273 errmsg ("node name required");
12276 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12278 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12282 if (next_node_name == 0)
12284 errmsg ("next node name required");
12287 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12289 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12293 M (GET_NEXT_INDEX, mp);
12294 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12295 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12296 vec_free (node_name);
12297 vec_free (next_node_name);
12305 api_add_node_next (vat_main_t * vam)
12307 unformat_input_t *i = vam->input;
12308 vl_api_add_node_next_t *mp;
12313 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12315 if (unformat (i, "node %s", &name))
12317 else if (unformat (i, "next %s", &next))
12324 errmsg ("node name required");
12327 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12329 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12334 errmsg ("next node required");
12337 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12339 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12343 M (ADD_NODE_NEXT, mp);
12344 clib_memcpy (mp->node_name, name, vec_len (name));
12345 clib_memcpy (mp->next_name, next, vec_len (next));
12355 api_l2tpv3_create_tunnel (vat_main_t * vam)
12357 unformat_input_t *i = vam->input;
12358 ip6_address_t client_address, our_address;
12359 int client_address_set = 0;
12360 int our_address_set = 0;
12361 u32 local_session_id = 0;
12362 u32 remote_session_id = 0;
12363 u64 local_cookie = 0;
12364 u64 remote_cookie = 0;
12365 u8 l2_sublayer_present = 0;
12366 vl_api_l2tpv3_create_tunnel_t *mp;
12369 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12371 if (unformat (i, "client_address %U", unformat_ip6_address,
12373 client_address_set = 1;
12374 else if (unformat (i, "our_address %U", unformat_ip6_address,
12376 our_address_set = 1;
12377 else if (unformat (i, "local_session_id %d", &local_session_id))
12379 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12381 else if (unformat (i, "local_cookie %lld", &local_cookie))
12383 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12385 else if (unformat (i, "l2-sublayer-present"))
12386 l2_sublayer_present = 1;
12391 if (client_address_set == 0)
12393 errmsg ("client_address required");
12397 if (our_address_set == 0)
12399 errmsg ("our_address required");
12403 M (L2TPV3_CREATE_TUNNEL, mp);
12405 clib_memcpy (mp->client_address, client_address.as_u8,
12406 sizeof (mp->client_address));
12408 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12410 mp->local_session_id = ntohl (local_session_id);
12411 mp->remote_session_id = ntohl (remote_session_id);
12412 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12413 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12414 mp->l2_sublayer_present = l2_sublayer_present;
12423 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12425 unformat_input_t *i = vam->input;
12427 u8 sw_if_index_set = 0;
12428 u64 new_local_cookie = 0;
12429 u64 new_remote_cookie = 0;
12430 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
12433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12435 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12436 sw_if_index_set = 1;
12437 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12438 sw_if_index_set = 1;
12439 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12441 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12447 if (sw_if_index_set == 0)
12449 errmsg ("missing interface name or sw_if_index");
12453 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
12455 mp->sw_if_index = ntohl (sw_if_index);
12456 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12457 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12465 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12467 unformat_input_t *i = vam->input;
12468 vl_api_l2tpv3_interface_enable_disable_t *mp;
12470 u8 sw_if_index_set = 0;
12471 u8 enable_disable = 1;
12474 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12476 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12477 sw_if_index_set = 1;
12478 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12479 sw_if_index_set = 1;
12480 else if (unformat (i, "enable"))
12481 enable_disable = 1;
12482 else if (unformat (i, "disable"))
12483 enable_disable = 0;
12488 if (sw_if_index_set == 0)
12490 errmsg ("missing interface name or sw_if_index");
12494 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
12496 mp->sw_if_index = ntohl (sw_if_index);
12497 mp->enable_disable = enable_disable;
12505 api_l2tpv3_set_lookup_key (vat_main_t * vam)
12507 unformat_input_t *i = vam->input;
12508 vl_api_l2tpv3_set_lookup_key_t *mp;
12512 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12514 if (unformat (i, "lookup_v6_src"))
12515 key = L2T_LOOKUP_SRC_ADDRESS;
12516 else if (unformat (i, "lookup_v6_dst"))
12517 key = L2T_LOOKUP_DST_ADDRESS;
12518 else if (unformat (i, "lookup_session_id"))
12519 key = L2T_LOOKUP_SESSION_ID;
12524 if (key == (u8) ~ 0)
12526 errmsg ("l2tp session lookup key unset");
12530 M (L2TPV3_SET_LOOKUP_KEY, mp);
12539 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12540 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12542 vat_main_t *vam = &vat_main;
12544 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12545 format_ip6_address, mp->our_address,
12546 format_ip6_address, mp->client_address,
12547 clib_net_to_host_u32 (mp->sw_if_index));
12550 " local cookies %016llx %016llx remote cookie %016llx",
12551 clib_net_to_host_u64 (mp->local_cookie[0]),
12552 clib_net_to_host_u64 (mp->local_cookie[1]),
12553 clib_net_to_host_u64 (mp->remote_cookie));
12555 print (vam->ofp, " local session-id %d remote session-id %d",
12556 clib_net_to_host_u32 (mp->local_session_id),
12557 clib_net_to_host_u32 (mp->remote_session_id));
12559 print (vam->ofp, " l2 specific sublayer %s\n",
12560 mp->l2_sublayer_present ? "preset" : "absent");
12564 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12565 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12567 vat_main_t *vam = &vat_main;
12568 vat_json_node_t *node = NULL;
12569 struct in6_addr addr;
12571 if (VAT_JSON_ARRAY != vam->json_tree.type)
12573 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12574 vat_json_init_array (&vam->json_tree);
12576 node = vat_json_array_add (&vam->json_tree);
12578 vat_json_init_object (node);
12580 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12581 vat_json_object_add_ip6 (node, "our_address", addr);
12582 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12583 vat_json_object_add_ip6 (node, "client_address", addr);
12585 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12586 vat_json_init_array (lc);
12587 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12588 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12589 vat_json_object_add_uint (node, "remote_cookie",
12590 clib_net_to_host_u64 (mp->remote_cookie));
12592 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12593 vat_json_object_add_uint (node, "local_session_id",
12594 clib_net_to_host_u32 (mp->local_session_id));
12595 vat_json_object_add_uint (node, "remote_session_id",
12596 clib_net_to_host_u32 (mp->remote_session_id));
12597 vat_json_object_add_string_copy (node, "l2_sublayer",
12598 mp->l2_sublayer_present ? (u8 *) "present"
12599 : (u8 *) "absent");
12603 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12605 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
12606 vl_api_control_ping_t *mp_ping;
12609 /* Get list of l2tpv3-tunnel interfaces */
12610 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
12613 /* Use a control ping for synchronization */
12614 MPING (CONTROL_PING, mp_ping);
12622 static void vl_api_sw_interface_tap_details_t_handler
12623 (vl_api_sw_interface_tap_details_t * mp)
12625 vat_main_t *vam = &vat_main;
12627 print (vam->ofp, "%-16s %d",
12628 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
12631 static void vl_api_sw_interface_tap_details_t_handler_json
12632 (vl_api_sw_interface_tap_details_t * mp)
12634 vat_main_t *vam = &vat_main;
12635 vat_json_node_t *node = NULL;
12637 if (VAT_JSON_ARRAY != vam->json_tree.type)
12639 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12640 vat_json_init_array (&vam->json_tree);
12642 node = vat_json_array_add (&vam->json_tree);
12644 vat_json_init_object (node);
12645 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12646 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12650 api_sw_interface_tap_dump (vat_main_t * vam)
12652 vl_api_sw_interface_tap_dump_t *mp;
12653 vl_api_control_ping_t *mp_ping;
12656 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
12657 /* Get list of tap interfaces */
12658 M (SW_INTERFACE_TAP_DUMP, mp);
12661 /* Use a control ping for synchronization */
12662 MPING (CONTROL_PING, mp_ping);
12669 static void vl_api_sw_interface_tap_v2_details_t_handler
12670 (vl_api_sw_interface_tap_v2_details_t * mp)
12672 vat_main_t *vam = &vat_main;
12674 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
12675 mp->host_ip4_prefix_len);
12676 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
12677 mp->host_ip6_prefix_len);
12680 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s",
12681 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
12682 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12683 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
12684 mp->host_bridge, ip4, ip6);
12690 static void vl_api_sw_interface_tap_v2_details_t_handler_json
12691 (vl_api_sw_interface_tap_v2_details_t * mp)
12693 vat_main_t *vam = &vat_main;
12694 vat_json_node_t *node = NULL;
12696 if (VAT_JSON_ARRAY != vam->json_tree.type)
12698 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12699 vat_json_init_array (&vam->json_tree);
12701 node = vat_json_array_add (&vam->json_tree);
12703 vat_json_init_object (node);
12704 vat_json_object_add_uint (node, "id", ntohl (mp->id));
12705 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12706 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12707 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12708 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12709 vat_json_object_add_string_copy (node, "host_mac_addr",
12710 format (0, "%U", format_ethernet_address,
12711 &mp->host_mac_addr));
12712 vat_json_object_add_string_copy (node, "host_namespace",
12713 mp->host_namespace);
12714 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
12715 vat_json_object_add_string_copy (node, "host_ip4_addr",
12716 format (0, "%U/%d", format_ip4_address,
12718 mp->host_ip4_prefix_len));
12719 vat_json_object_add_string_copy (node, "host_ip6_addr",
12720 format (0, "%U/%d", format_ip6_address,
12722 mp->host_ip6_prefix_len));
12727 api_sw_interface_tap_v2_dump (vat_main_t * vam)
12729 vl_api_sw_interface_tap_v2_dump_t *mp;
12730 vl_api_control_ping_t *mp_ping;
12734 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
12735 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
12736 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
12739 /* Get list of tap interfaces */
12740 M (SW_INTERFACE_TAP_V2_DUMP, mp);
12743 /* Use a control ping for synchronization */
12744 MPING (CONTROL_PING, mp_ping);
12752 api_vxlan_offload_rx (vat_main_t * vam)
12754 unformat_input_t *line_input = vam->input;
12755 vl_api_vxlan_offload_rx_t *mp;
12756 u32 hw_if_index = ~0, rx_if_index = ~0;
12760 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12762 if (unformat (line_input, "del"))
12764 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
12767 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
12769 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
12772 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
12776 errmsg ("parse error '%U'", format_unformat_error, line_input);
12781 if (hw_if_index == ~0)
12783 errmsg ("no hw interface");
12787 if (rx_if_index == ~0)
12789 errmsg ("no rx tunnel");
12793 M (VXLAN_OFFLOAD_RX, mp);
12795 mp->hw_if_index = ntohl (hw_if_index);
12796 mp->sw_if_index = ntohl (rx_if_index);
12797 mp->enable = is_add;
12804 static uword unformat_vxlan_decap_next
12805 (unformat_input_t * input, va_list * args)
12807 u32 *result = va_arg (*args, u32 *);
12810 if (unformat (input, "l2"))
12811 *result = VXLAN_INPUT_NEXT_L2_INPUT;
12812 else if (unformat (input, "%d", &tmp))
12820 api_vxlan_add_del_tunnel (vat_main_t * vam)
12822 unformat_input_t *line_input = vam->input;
12823 vl_api_vxlan_add_del_tunnel_t *mp;
12824 ip46_address_t src, dst;
12826 u8 ipv4_set = 0, ipv6_set = 0;
12831 u32 mcast_sw_if_index = ~0;
12832 u32 encap_vrf_id = 0;
12833 u32 decap_next_index = ~0;
12837 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12838 clib_memset (&src, 0, sizeof src);
12839 clib_memset (&dst, 0, sizeof dst);
12841 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12843 if (unformat (line_input, "del"))
12845 else if (unformat (line_input, "instance %d", &instance))
12848 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12854 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12860 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
12866 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
12871 else if (unformat (line_input, "group %U %U",
12872 unformat_ip4_address, &dst.ip4,
12873 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12875 grp_set = dst_set = 1;
12878 else if (unformat (line_input, "group %U",
12879 unformat_ip4_address, &dst.ip4))
12881 grp_set = dst_set = 1;
12884 else if (unformat (line_input, "group %U %U",
12885 unformat_ip6_address, &dst.ip6,
12886 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12888 grp_set = dst_set = 1;
12891 else if (unformat (line_input, "group %U",
12892 unformat_ip6_address, &dst.ip6))
12894 grp_set = dst_set = 1;
12898 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12900 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12902 else if (unformat (line_input, "decap-next %U",
12903 unformat_vxlan_decap_next, &decap_next_index))
12905 else if (unformat (line_input, "vni %d", &vni))
12909 errmsg ("parse error '%U'", format_unformat_error, line_input);
12916 errmsg ("tunnel src address not specified");
12921 errmsg ("tunnel dst address not specified");
12925 if (grp_set && !ip46_address_is_multicast (&dst))
12927 errmsg ("tunnel group address not multicast");
12930 if (grp_set && mcast_sw_if_index == ~0)
12932 errmsg ("tunnel nonexistent multicast device");
12935 if (grp_set == 0 && ip46_address_is_multicast (&dst))
12937 errmsg ("tunnel dst address must be unicast");
12942 if (ipv4_set && ipv6_set)
12944 errmsg ("both IPv4 and IPv6 addresses specified");
12948 if ((vni == 0) || (vni >> 24))
12950 errmsg ("vni not specified or out of range");
12954 M (VXLAN_ADD_DEL_TUNNEL, mp);
12958 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
12959 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
12963 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
12964 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
12967 mp->instance = htonl (instance);
12968 mp->encap_vrf_id = ntohl (encap_vrf_id);
12969 mp->decap_next_index = ntohl (decap_next_index);
12970 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
12971 mp->vni = ntohl (vni);
12972 mp->is_add = is_add;
12973 mp->is_ipv6 = ipv6_set;
12980 static void vl_api_vxlan_tunnel_details_t_handler
12981 (vl_api_vxlan_tunnel_details_t * mp)
12983 vat_main_t *vam = &vat_main;
12984 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
12985 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
12987 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
12988 ntohl (mp->sw_if_index),
12989 ntohl (mp->instance),
12990 format_ip46_address, &src, IP46_TYPE_ANY,
12991 format_ip46_address, &dst, IP46_TYPE_ANY,
12992 ntohl (mp->encap_vrf_id),
12993 ntohl (mp->decap_next_index), ntohl (mp->vni),
12994 ntohl (mp->mcast_sw_if_index));
12997 static void vl_api_vxlan_tunnel_details_t_handler_json
12998 (vl_api_vxlan_tunnel_details_t * mp)
13000 vat_main_t *vam = &vat_main;
13001 vat_json_node_t *node = NULL;
13003 if (VAT_JSON_ARRAY != vam->json_tree.type)
13005 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13006 vat_json_init_array (&vam->json_tree);
13008 node = vat_json_array_add (&vam->json_tree);
13010 vat_json_init_object (node);
13011 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13013 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13017 struct in6_addr ip6;
13019 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13020 vat_json_object_add_ip6 (node, "src_address", ip6);
13021 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13022 vat_json_object_add_ip6 (node, "dst_address", ip6);
13026 struct in_addr ip4;
13028 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13029 vat_json_object_add_ip4 (node, "src_address", ip4);
13030 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13031 vat_json_object_add_ip4 (node, "dst_address", ip4);
13033 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13034 vat_json_object_add_uint (node, "decap_next_index",
13035 ntohl (mp->decap_next_index));
13036 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13037 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13038 vat_json_object_add_uint (node, "mcast_sw_if_index",
13039 ntohl (mp->mcast_sw_if_index));
13043 api_vxlan_tunnel_dump (vat_main_t * vam)
13045 unformat_input_t *i = vam->input;
13046 vl_api_vxlan_tunnel_dump_t *mp;
13047 vl_api_control_ping_t *mp_ping;
13049 u8 sw_if_index_set = 0;
13052 /* Parse args required to build the message */
13053 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13055 if (unformat (i, "sw_if_index %d", &sw_if_index))
13056 sw_if_index_set = 1;
13061 if (sw_if_index_set == 0)
13066 if (!vam->json_output)
13068 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
13069 "sw_if_index", "instance", "src_address", "dst_address",
13070 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13073 /* Get list of vxlan-tunnel interfaces */
13074 M (VXLAN_TUNNEL_DUMP, mp);
13076 mp->sw_if_index = htonl (sw_if_index);
13080 /* Use a control ping for synchronization */
13081 MPING (CONTROL_PING, mp_ping);
13088 static uword unformat_geneve_decap_next
13089 (unformat_input_t * input, va_list * args)
13091 u32 *result = va_arg (*args, u32 *);
13094 if (unformat (input, "l2"))
13095 *result = GENEVE_INPUT_NEXT_L2_INPUT;
13096 else if (unformat (input, "%d", &tmp))
13104 api_geneve_add_del_tunnel (vat_main_t * vam)
13106 unformat_input_t *line_input = vam->input;
13107 vl_api_geneve_add_del_tunnel_t *mp;
13108 ip46_address_t src, dst;
13110 u8 ipv4_set = 0, ipv6_set = 0;
13114 u32 mcast_sw_if_index = ~0;
13115 u32 encap_vrf_id = 0;
13116 u32 decap_next_index = ~0;
13120 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13121 clib_memset (&src, 0, sizeof src);
13122 clib_memset (&dst, 0, sizeof dst);
13124 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13126 if (unformat (line_input, "del"))
13129 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13135 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13141 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13147 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13152 else if (unformat (line_input, "group %U %U",
13153 unformat_ip4_address, &dst.ip4,
13154 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13156 grp_set = dst_set = 1;
13159 else if (unformat (line_input, "group %U",
13160 unformat_ip4_address, &dst.ip4))
13162 grp_set = dst_set = 1;
13165 else if (unformat (line_input, "group %U %U",
13166 unformat_ip6_address, &dst.ip6,
13167 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13169 grp_set = dst_set = 1;
13172 else if (unformat (line_input, "group %U",
13173 unformat_ip6_address, &dst.ip6))
13175 grp_set = dst_set = 1;
13179 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13181 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13183 else if (unformat (line_input, "decap-next %U",
13184 unformat_geneve_decap_next, &decap_next_index))
13186 else if (unformat (line_input, "vni %d", &vni))
13190 errmsg ("parse error '%U'", format_unformat_error, line_input);
13197 errmsg ("tunnel src address not specified");
13202 errmsg ("tunnel dst address not specified");
13206 if (grp_set && !ip46_address_is_multicast (&dst))
13208 errmsg ("tunnel group address not multicast");
13211 if (grp_set && mcast_sw_if_index == ~0)
13213 errmsg ("tunnel nonexistent multicast device");
13216 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13218 errmsg ("tunnel dst address must be unicast");
13223 if (ipv4_set && ipv6_set)
13225 errmsg ("both IPv4 and IPv6 addresses specified");
13229 if ((vni == 0) || (vni >> 24))
13231 errmsg ("vni not specified or out of range");
13235 M (GENEVE_ADD_DEL_TUNNEL, mp);
13239 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13240 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13244 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13245 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13247 mp->encap_vrf_id = ntohl (encap_vrf_id);
13248 mp->decap_next_index = ntohl (decap_next_index);
13249 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13250 mp->vni = ntohl (vni);
13251 mp->is_add = is_add;
13252 mp->is_ipv6 = ipv6_set;
13259 static void vl_api_geneve_tunnel_details_t_handler
13260 (vl_api_geneve_tunnel_details_t * mp)
13262 vat_main_t *vam = &vat_main;
13263 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13264 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13266 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13267 ntohl (mp->sw_if_index),
13268 format_ip46_address, &src, IP46_TYPE_ANY,
13269 format_ip46_address, &dst, IP46_TYPE_ANY,
13270 ntohl (mp->encap_vrf_id),
13271 ntohl (mp->decap_next_index), ntohl (mp->vni),
13272 ntohl (mp->mcast_sw_if_index));
13275 static void vl_api_geneve_tunnel_details_t_handler_json
13276 (vl_api_geneve_tunnel_details_t * mp)
13278 vat_main_t *vam = &vat_main;
13279 vat_json_node_t *node = NULL;
13281 if (VAT_JSON_ARRAY != vam->json_tree.type)
13283 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13284 vat_json_init_array (&vam->json_tree);
13286 node = vat_json_array_add (&vam->json_tree);
13288 vat_json_init_object (node);
13289 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13292 struct in6_addr ip6;
13294 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13295 vat_json_object_add_ip6 (node, "src_address", ip6);
13296 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13297 vat_json_object_add_ip6 (node, "dst_address", ip6);
13301 struct in_addr ip4;
13303 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13304 vat_json_object_add_ip4 (node, "src_address", ip4);
13305 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13306 vat_json_object_add_ip4 (node, "dst_address", ip4);
13308 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13309 vat_json_object_add_uint (node, "decap_next_index",
13310 ntohl (mp->decap_next_index));
13311 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13312 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13313 vat_json_object_add_uint (node, "mcast_sw_if_index",
13314 ntohl (mp->mcast_sw_if_index));
13318 api_geneve_tunnel_dump (vat_main_t * vam)
13320 unformat_input_t *i = vam->input;
13321 vl_api_geneve_tunnel_dump_t *mp;
13322 vl_api_control_ping_t *mp_ping;
13324 u8 sw_if_index_set = 0;
13327 /* Parse args required to build the message */
13328 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13330 if (unformat (i, "sw_if_index %d", &sw_if_index))
13331 sw_if_index_set = 1;
13336 if (sw_if_index_set == 0)
13341 if (!vam->json_output)
13343 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13344 "sw_if_index", "local_address", "remote_address",
13345 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13348 /* Get list of geneve-tunnel interfaces */
13349 M (GENEVE_TUNNEL_DUMP, mp);
13351 mp->sw_if_index = htonl (sw_if_index);
13355 /* Use a control ping for synchronization */
13356 M (CONTROL_PING, mp_ping);
13364 api_gre_add_del_tunnel (vat_main_t * vam)
13366 unformat_input_t *line_input = vam->input;
13367 vl_api_gre_add_del_tunnel_t *mp;
13368 ip4_address_t src4, dst4;
13369 ip6_address_t src6, dst6;
13373 u8 t_type = GRE_TUNNEL_TYPE_L3;
13376 u32 outer_fib_id = 0;
13377 u32 session_id = 0;
13381 clib_memset (&src4, 0, sizeof src4);
13382 clib_memset (&dst4, 0, sizeof dst4);
13383 clib_memset (&src6, 0, sizeof src6);
13384 clib_memset (&dst6, 0, sizeof dst6);
13386 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13388 if (unformat (line_input, "del"))
13390 else if (unformat (line_input, "instance %d", &instance))
13392 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
13397 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
13402 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
13407 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
13412 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13414 else if (unformat (line_input, "teb"))
13415 t_type = GRE_TUNNEL_TYPE_TEB;
13416 else if (unformat (line_input, "erspan %d", &session_id))
13417 t_type = GRE_TUNNEL_TYPE_ERSPAN;
13420 errmsg ("parse error '%U'", format_unformat_error, line_input);
13427 errmsg ("tunnel src address not specified");
13432 errmsg ("tunnel dst address not specified");
13435 if (ipv4_set && ipv6_set)
13437 errmsg ("both IPv4 and IPv6 addresses specified");
13442 M (GRE_ADD_DEL_TUNNEL, mp);
13446 clib_memcpy (&mp->src_address, &src4, 4);
13447 clib_memcpy (&mp->dst_address, &dst4, 4);
13451 clib_memcpy (&mp->src_address, &src6, 16);
13452 clib_memcpy (&mp->dst_address, &dst6, 16);
13454 mp->instance = htonl (instance);
13455 mp->outer_fib_id = htonl (outer_fib_id);
13456 mp->is_add = is_add;
13457 mp->session_id = htons ((u16) session_id);
13458 mp->tunnel_type = t_type;
13459 mp->is_ipv6 = ipv6_set;
13466 static void vl_api_gre_tunnel_details_t_handler
13467 (vl_api_gre_tunnel_details_t * mp)
13469 vat_main_t *vam = &vat_main;
13470 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
13471 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
13473 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
13474 ntohl (mp->sw_if_index),
13475 ntohl (mp->instance),
13476 format_ip46_address, &src, IP46_TYPE_ANY,
13477 format_ip46_address, &dst, IP46_TYPE_ANY,
13478 mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id));
13481 static void vl_api_gre_tunnel_details_t_handler_json
13482 (vl_api_gre_tunnel_details_t * mp)
13484 vat_main_t *vam = &vat_main;
13485 vat_json_node_t *node = NULL;
13486 struct in_addr ip4;
13487 struct in6_addr ip6;
13489 if (VAT_JSON_ARRAY != vam->json_tree.type)
13491 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13492 vat_json_init_array (&vam->json_tree);
13494 node = vat_json_array_add (&vam->json_tree);
13496 vat_json_init_object (node);
13497 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13498 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
13501 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
13502 vat_json_object_add_ip4 (node, "src_address", ip4);
13503 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
13504 vat_json_object_add_ip4 (node, "dst_address", ip4);
13508 clib_memcpy (&ip6, &mp->src_address, sizeof (ip6));
13509 vat_json_object_add_ip6 (node, "src_address", ip6);
13510 clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
13511 vat_json_object_add_ip6 (node, "dst_address", ip6);
13513 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type);
13514 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
13515 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
13516 vat_json_object_add_uint (node, "session_id", mp->session_id);
13520 api_gre_tunnel_dump (vat_main_t * vam)
13522 unformat_input_t *i = vam->input;
13523 vl_api_gre_tunnel_dump_t *mp;
13524 vl_api_control_ping_t *mp_ping;
13526 u8 sw_if_index_set = 0;
13529 /* Parse args required to build the message */
13530 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13532 if (unformat (i, "sw_if_index %d", &sw_if_index))
13533 sw_if_index_set = 1;
13538 if (sw_if_index_set == 0)
13543 if (!vam->json_output)
13545 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13546 "sw_if_index", "instance", "src_address", "dst_address",
13547 "tunnel_type", "outer_fib_id", "session_id");
13550 /* Get list of gre-tunnel interfaces */
13551 M (GRE_TUNNEL_DUMP, mp);
13553 mp->sw_if_index = htonl (sw_if_index);
13557 /* Use a control ping for synchronization */
13558 MPING (CONTROL_PING, mp_ping);
13566 api_l2_fib_clear_table (vat_main_t * vam)
13568 // unformat_input_t * i = vam->input;
13569 vl_api_l2_fib_clear_table_t *mp;
13572 M (L2_FIB_CLEAR_TABLE, mp);
13580 api_l2_interface_efp_filter (vat_main_t * vam)
13582 unformat_input_t *i = vam->input;
13583 vl_api_l2_interface_efp_filter_t *mp;
13586 u8 sw_if_index_set = 0;
13589 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13591 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13592 sw_if_index_set = 1;
13593 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13594 sw_if_index_set = 1;
13595 else if (unformat (i, "enable"))
13597 else if (unformat (i, "disable"))
13601 clib_warning ("parse error '%U'", format_unformat_error, i);
13606 if (sw_if_index_set == 0)
13608 errmsg ("missing sw_if_index");
13612 M (L2_INTERFACE_EFP_FILTER, mp);
13614 mp->sw_if_index = ntohl (sw_if_index);
13615 mp->enable_disable = enable;
13622 #define foreach_vtr_op \
13623 _("disable", L2_VTR_DISABLED) \
13624 _("push-1", L2_VTR_PUSH_1) \
13625 _("push-2", L2_VTR_PUSH_2) \
13626 _("pop-1", L2_VTR_POP_1) \
13627 _("pop-2", L2_VTR_POP_2) \
13628 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
13629 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
13630 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
13631 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
13634 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
13636 unformat_input_t *i = vam->input;
13637 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
13639 u8 sw_if_index_set = 0;
13642 u32 push_dot1q = 1;
13647 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13649 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13650 sw_if_index_set = 1;
13651 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13652 sw_if_index_set = 1;
13653 else if (unformat (i, "vtr_op %d", &vtr_op))
13655 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
13658 else if (unformat (i, "push_dot1q %d", &push_dot1q))
13660 else if (unformat (i, "tag1 %d", &tag1))
13662 else if (unformat (i, "tag2 %d", &tag2))
13666 clib_warning ("parse error '%U'", format_unformat_error, i);
13671 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
13673 errmsg ("missing vtr operation or sw_if_index");
13677 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
13678 mp->sw_if_index = ntohl (sw_if_index);
13679 mp->vtr_op = ntohl (vtr_op);
13680 mp->push_dot1q = ntohl (push_dot1q);
13681 mp->tag1 = ntohl (tag1);
13682 mp->tag2 = ntohl (tag2);
13690 api_create_vhost_user_if (vat_main_t * vam)
13692 unformat_input_t *i = vam->input;
13693 vl_api_create_vhost_user_if_t *mp;
13696 u8 file_name_set = 0;
13697 u32 custom_dev_instance = ~0;
13699 u8 use_custom_mac = 0;
13700 u8 disable_mrg_rxbuf = 0;
13701 u8 disable_indirect_desc = 0;
13705 /* Shut up coverity */
13706 clib_memset (hwaddr, 0, sizeof (hwaddr));
13708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13710 if (unformat (i, "socket %s", &file_name))
13714 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13716 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
13717 use_custom_mac = 1;
13718 else if (unformat (i, "server"))
13720 else if (unformat (i, "disable_mrg_rxbuf"))
13721 disable_mrg_rxbuf = 1;
13722 else if (unformat (i, "disable_indirect_desc"))
13723 disable_indirect_desc = 1;
13724 else if (unformat (i, "tag %s", &tag))
13730 if (file_name_set == 0)
13732 errmsg ("missing socket file name");
13736 if (vec_len (file_name) > 255)
13738 errmsg ("socket file name too long");
13741 vec_add1 (file_name, 0);
13743 M (CREATE_VHOST_USER_IF, mp);
13745 mp->is_server = is_server;
13746 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
13747 mp->disable_indirect_desc = disable_indirect_desc;
13748 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13749 vec_free (file_name);
13750 if (custom_dev_instance != ~0)
13753 mp->custom_dev_instance = ntohl (custom_dev_instance);
13756 mp->use_custom_mac = use_custom_mac;
13757 clib_memcpy (mp->mac_address, hwaddr, 6);
13759 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
13768 api_modify_vhost_user_if (vat_main_t * vam)
13770 unformat_input_t *i = vam->input;
13771 vl_api_modify_vhost_user_if_t *mp;
13774 u8 file_name_set = 0;
13775 u32 custom_dev_instance = ~0;
13776 u8 sw_if_index_set = 0;
13777 u32 sw_if_index = (u32) ~ 0;
13780 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13782 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13783 sw_if_index_set = 1;
13784 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13785 sw_if_index_set = 1;
13786 else if (unformat (i, "socket %s", &file_name))
13790 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13792 else if (unformat (i, "server"))
13798 if (sw_if_index_set == 0)
13800 errmsg ("missing sw_if_index or interface name");
13804 if (file_name_set == 0)
13806 errmsg ("missing socket file name");
13810 if (vec_len (file_name) > 255)
13812 errmsg ("socket file name too long");
13815 vec_add1 (file_name, 0);
13817 M (MODIFY_VHOST_USER_IF, mp);
13819 mp->sw_if_index = ntohl (sw_if_index);
13820 mp->is_server = is_server;
13821 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13822 vec_free (file_name);
13823 if (custom_dev_instance != ~0)
13826 mp->custom_dev_instance = ntohl (custom_dev_instance);
13835 api_delete_vhost_user_if (vat_main_t * vam)
13837 unformat_input_t *i = vam->input;
13838 vl_api_delete_vhost_user_if_t *mp;
13839 u32 sw_if_index = ~0;
13840 u8 sw_if_index_set = 0;
13843 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13845 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13846 sw_if_index_set = 1;
13847 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13848 sw_if_index_set = 1;
13853 if (sw_if_index_set == 0)
13855 errmsg ("missing sw_if_index or interface name");
13860 M (DELETE_VHOST_USER_IF, mp);
13862 mp->sw_if_index = ntohl (sw_if_index);
13869 static void vl_api_sw_interface_vhost_user_details_t_handler
13870 (vl_api_sw_interface_vhost_user_details_t * mp)
13872 vat_main_t *vam = &vat_main;
13874 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
13875 (char *) mp->interface_name,
13876 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
13877 clib_net_to_host_u64 (mp->features), mp->is_server,
13878 ntohl (mp->num_regions), (char *) mp->sock_filename);
13879 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
13882 static void vl_api_sw_interface_vhost_user_details_t_handler_json
13883 (vl_api_sw_interface_vhost_user_details_t * mp)
13885 vat_main_t *vam = &vat_main;
13886 vat_json_node_t *node = NULL;
13888 if (VAT_JSON_ARRAY != vam->json_tree.type)
13890 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13891 vat_json_init_array (&vam->json_tree);
13893 node = vat_json_array_add (&vam->json_tree);
13895 vat_json_init_object (node);
13896 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13897 vat_json_object_add_string_copy (node, "interface_name",
13898 mp->interface_name);
13899 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
13900 ntohl (mp->virtio_net_hdr_sz));
13901 vat_json_object_add_uint (node, "features",
13902 clib_net_to_host_u64 (mp->features));
13903 vat_json_object_add_uint (node, "is_server", mp->is_server);
13904 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
13905 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
13906 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
13910 api_sw_interface_vhost_user_dump (vat_main_t * vam)
13912 vl_api_sw_interface_vhost_user_dump_t *mp;
13913 vl_api_control_ping_t *mp_ping;
13916 "Interface name idx hdr_sz features server regions filename");
13918 /* Get list of vhost-user interfaces */
13919 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
13922 /* Use a control ping for synchronization */
13923 MPING (CONTROL_PING, mp_ping);
13931 api_show_version (vat_main_t * vam)
13933 vl_api_show_version_t *mp;
13936 M (SHOW_VERSION, mp);
13945 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
13947 unformat_input_t *line_input = vam->input;
13948 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
13949 ip4_address_t local4, remote4;
13950 ip6_address_t local6, remote6;
13952 u8 ipv4_set = 0, ipv6_set = 0;
13956 u32 mcast_sw_if_index = ~0;
13957 u32 encap_vrf_id = 0;
13958 u32 decap_vrf_id = 0;
13964 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13965 clib_memset (&local4, 0, sizeof local4);
13966 clib_memset (&remote4, 0, sizeof remote4);
13967 clib_memset (&local6, 0, sizeof local6);
13968 clib_memset (&remote6, 0, sizeof remote6);
13970 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13972 if (unformat (line_input, "del"))
13974 else if (unformat (line_input, "local %U",
13975 unformat_ip4_address, &local4))
13980 else if (unformat (line_input, "remote %U",
13981 unformat_ip4_address, &remote4))
13986 else if (unformat (line_input, "local %U",
13987 unformat_ip6_address, &local6))
13992 else if (unformat (line_input, "remote %U",
13993 unformat_ip6_address, &remote6))
13998 else if (unformat (line_input, "group %U %U",
13999 unformat_ip4_address, &remote4,
14000 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14002 grp_set = remote_set = 1;
14005 else if (unformat (line_input, "group %U",
14006 unformat_ip4_address, &remote4))
14008 grp_set = remote_set = 1;
14011 else if (unformat (line_input, "group %U %U",
14012 unformat_ip6_address, &remote6,
14013 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
14015 grp_set = remote_set = 1;
14018 else if (unformat (line_input, "group %U",
14019 unformat_ip6_address, &remote6))
14021 grp_set = remote_set = 1;
14025 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
14027 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
14029 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
14031 else if (unformat (line_input, "vni %d", &vni))
14033 else if (unformat (line_input, "next-ip4"))
14035 else if (unformat (line_input, "next-ip6"))
14037 else if (unformat (line_input, "next-ethernet"))
14039 else if (unformat (line_input, "next-nsh"))
14043 errmsg ("parse error '%U'", format_unformat_error, line_input);
14048 if (local_set == 0)
14050 errmsg ("tunnel local address not specified");
14053 if (remote_set == 0)
14055 errmsg ("tunnel remote address not specified");
14058 if (grp_set && mcast_sw_if_index == ~0)
14060 errmsg ("tunnel nonexistent multicast device");
14063 if (ipv4_set && ipv6_set)
14065 errmsg ("both IPv4 and IPv6 addresses specified");
14071 errmsg ("vni not specified");
14075 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
14080 clib_memcpy (&mp->local, &local6, sizeof (local6));
14081 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
14085 clib_memcpy (&mp->local, &local4, sizeof (local4));
14086 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
14089 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
14090 mp->encap_vrf_id = ntohl (encap_vrf_id);
14091 mp->decap_vrf_id = ntohl (decap_vrf_id);
14092 mp->protocol = protocol;
14093 mp->vni = ntohl (vni);
14094 mp->is_add = is_add;
14095 mp->is_ipv6 = ipv6_set;
14102 static void vl_api_vxlan_gpe_tunnel_details_t_handler
14103 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14105 vat_main_t *vam = &vat_main;
14106 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
14107 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
14109 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
14110 ntohl (mp->sw_if_index),
14111 format_ip46_address, &local, IP46_TYPE_ANY,
14112 format_ip46_address, &remote, IP46_TYPE_ANY,
14113 ntohl (mp->vni), mp->protocol,
14114 ntohl (mp->mcast_sw_if_index),
14115 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
14119 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
14120 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14122 vat_main_t *vam = &vat_main;
14123 vat_json_node_t *node = NULL;
14124 struct in_addr ip4;
14125 struct in6_addr ip6;
14127 if (VAT_JSON_ARRAY != vam->json_tree.type)
14129 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14130 vat_json_init_array (&vam->json_tree);
14132 node = vat_json_array_add (&vam->json_tree);
14134 vat_json_init_object (node);
14135 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14138 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
14139 vat_json_object_add_ip6 (node, "local", ip6);
14140 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
14141 vat_json_object_add_ip6 (node, "remote", ip6);
14145 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
14146 vat_json_object_add_ip4 (node, "local", ip4);
14147 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
14148 vat_json_object_add_ip4 (node, "remote", ip4);
14150 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
14151 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
14152 vat_json_object_add_uint (node, "mcast_sw_if_index",
14153 ntohl (mp->mcast_sw_if_index));
14154 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
14155 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
14156 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
14160 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14162 unformat_input_t *i = vam->input;
14163 vl_api_vxlan_gpe_tunnel_dump_t *mp;
14164 vl_api_control_ping_t *mp_ping;
14166 u8 sw_if_index_set = 0;
14169 /* Parse args required to build the message */
14170 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14172 if (unformat (i, "sw_if_index %d", &sw_if_index))
14173 sw_if_index_set = 1;
14178 if (sw_if_index_set == 0)
14183 if (!vam->json_output)
14185 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
14186 "sw_if_index", "local", "remote", "vni",
14187 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
14190 /* Get list of vxlan-tunnel interfaces */
14191 M (VXLAN_GPE_TUNNEL_DUMP, mp);
14193 mp->sw_if_index = htonl (sw_if_index);
14197 /* Use a control ping for synchronization */
14198 MPING (CONTROL_PING, mp_ping);
14205 static void vl_api_l2_fib_table_details_t_handler
14206 (vl_api_l2_fib_table_details_t * mp)
14208 vat_main_t *vam = &vat_main;
14210 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14212 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
14213 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14217 static void vl_api_l2_fib_table_details_t_handler_json
14218 (vl_api_l2_fib_table_details_t * mp)
14220 vat_main_t *vam = &vat_main;
14221 vat_json_node_t *node = NULL;
14223 if (VAT_JSON_ARRAY != vam->json_tree.type)
14225 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14226 vat_json_init_array (&vam->json_tree);
14228 node = vat_json_array_add (&vam->json_tree);
14230 vat_json_init_object (node);
14231 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
14232 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
14233 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14234 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14235 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14236 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14240 api_l2_fib_table_dump (vat_main_t * vam)
14242 unformat_input_t *i = vam->input;
14243 vl_api_l2_fib_table_dump_t *mp;
14244 vl_api_control_ping_t *mp_ping;
14249 /* Parse args required to build the message */
14250 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14252 if (unformat (i, "bd_id %d", &bd_id))
14258 if (bd_id_set == 0)
14260 errmsg ("missing bridge domain");
14264 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14266 /* Get list of l2 fib entries */
14267 M (L2_FIB_TABLE_DUMP, mp);
14269 mp->bd_id = ntohl (bd_id);
14272 /* Use a control ping for synchronization */
14273 MPING (CONTROL_PING, mp_ping);
14282 api_interface_name_renumber (vat_main_t * vam)
14284 unformat_input_t *line_input = vam->input;
14285 vl_api_interface_name_renumber_t *mp;
14286 u32 sw_if_index = ~0;
14287 u32 new_show_dev_instance = ~0;
14290 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14292 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14295 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14297 else if (unformat (line_input, "new_show_dev_instance %d",
14298 &new_show_dev_instance))
14304 if (sw_if_index == ~0)
14306 errmsg ("missing interface name or sw_if_index");
14310 if (new_show_dev_instance == ~0)
14312 errmsg ("missing new_show_dev_instance");
14316 M (INTERFACE_NAME_RENUMBER, mp);
14318 mp->sw_if_index = ntohl (sw_if_index);
14319 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14327 api_ip_probe_neighbor (vat_main_t * vam)
14329 unformat_input_t *i = vam->input;
14330 vl_api_ip_probe_neighbor_t *mp;
14338 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14340 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14342 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14344 else if (unformat (i, "address %U", unformat_ip4_address, dst_adr))
14346 else if (unformat (i, "address %U", unformat_ip6_address, dst_adr))
14357 errmsg ("missing interface");
14363 errmsg ("missing addresses");
14367 M (IP_PROBE_NEIGHBOR, mp);
14369 mp->sw_if_index = ntohl (sw_if_index);
14370 mp->is_ipv6 = is_ipv6;
14371 clib_memcpy (mp->dst_address, dst_adr, sizeof (dst_adr));
14379 api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14381 unformat_input_t *i = vam->input;
14382 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14383 u8 mode = IP_SCAN_V46_NEIGHBORS;
14384 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14387 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14389 if (unformat (i, "ip4"))
14390 mode = IP_SCAN_V4_NEIGHBORS;
14391 else if (unformat (i, "ip6"))
14392 mode = IP_SCAN_V6_NEIGHBORS;
14393 if (unformat (i, "both"))
14394 mode = IP_SCAN_V46_NEIGHBORS;
14395 else if (unformat (i, "disable"))
14396 mode = IP_SCAN_DISABLED;
14397 else if (unformat (i, "interval %d", &interval))
14399 else if (unformat (i, "max-time %d", &time))
14401 else if (unformat (i, "max-update %d", &update))
14403 else if (unformat (i, "delay %d", &delay))
14405 else if (unformat (i, "stale %d", &stale))
14411 if (interval > 255)
14413 errmsg ("interval cannot exceed 255 minutes.");
14418 errmsg ("max-time cannot exceed 255 usec.");
14423 errmsg ("max-update cannot exceed 255.");
14428 errmsg ("delay cannot exceed 255 msec.");
14433 errmsg ("stale cannot exceed 255 minutes.");
14437 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14439 mp->scan_interval = interval;
14440 mp->max_proc_time = time;
14441 mp->max_update = update;
14442 mp->scan_int_delay = delay;
14443 mp->stale_threshold = stale;
14451 api_want_ip4_arp_events (vat_main_t * vam)
14453 unformat_input_t *line_input = vam->input;
14454 vl_api_want_ip4_arp_events_t *mp;
14455 ip4_address_t address;
14456 int address_set = 0;
14457 u32 enable_disable = 1;
14460 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14462 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14464 else if (unformat (line_input, "del"))
14465 enable_disable = 0;
14470 if (address_set == 0)
14472 errmsg ("missing addresses");
14476 M (WANT_IP4_ARP_EVENTS, mp);
14477 mp->enable_disable = enable_disable;
14478 mp->pid = htonl (getpid ());
14479 mp->address = address.as_u32;
14487 api_want_ip6_nd_events (vat_main_t * vam)
14489 unformat_input_t *line_input = vam->input;
14490 vl_api_want_ip6_nd_events_t *mp;
14491 ip6_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_ip6_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_IP6_ND_EVENTS, mp);
14513 mp->enable_disable = enable_disable;
14514 mp->pid = htonl (getpid ());
14515 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
14523 api_want_l2_macs_events (vat_main_t * vam)
14525 unformat_input_t *line_input = vam->input;
14526 vl_api_want_l2_macs_events_t *mp;
14527 u8 enable_disable = 1;
14528 u32 scan_delay = 0;
14529 u32 max_macs_in_event = 0;
14530 u32 learn_limit = 0;
14533 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14535 if (unformat (line_input, "learn-limit %d", &learn_limit))
14537 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14539 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14541 else if (unformat (line_input, "disable"))
14542 enable_disable = 0;
14547 M (WANT_L2_MACS_EVENTS, mp);
14548 mp->enable_disable = enable_disable;
14549 mp->pid = htonl (getpid ());
14550 mp->learn_limit = htonl (learn_limit);
14551 mp->scan_delay = (u8) scan_delay;
14552 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14559 api_input_acl_set_interface (vat_main_t * vam)
14561 unformat_input_t *i = vam->input;
14562 vl_api_input_acl_set_interface_t *mp;
14564 int sw_if_index_set;
14565 u32 ip4_table_index = ~0;
14566 u32 ip6_table_index = ~0;
14567 u32 l2_table_index = ~0;
14571 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14573 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14574 sw_if_index_set = 1;
14575 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14576 sw_if_index_set = 1;
14577 else if (unformat (i, "del"))
14579 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14581 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14583 else if (unformat (i, "l2-table %d", &l2_table_index))
14587 clib_warning ("parse error '%U'", format_unformat_error, i);
14592 if (sw_if_index_set == 0)
14594 errmsg ("missing interface name or sw_if_index");
14598 M (INPUT_ACL_SET_INTERFACE, mp);
14600 mp->sw_if_index = ntohl (sw_if_index);
14601 mp->ip4_table_index = ntohl (ip4_table_index);
14602 mp->ip6_table_index = ntohl (ip6_table_index);
14603 mp->l2_table_index = ntohl (l2_table_index);
14604 mp->is_add = is_add;
14612 api_output_acl_set_interface (vat_main_t * vam)
14614 unformat_input_t *i = vam->input;
14615 vl_api_output_acl_set_interface_t *mp;
14617 int sw_if_index_set;
14618 u32 ip4_table_index = ~0;
14619 u32 ip6_table_index = ~0;
14620 u32 l2_table_index = ~0;
14624 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14626 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14627 sw_if_index_set = 1;
14628 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14629 sw_if_index_set = 1;
14630 else if (unformat (i, "del"))
14632 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14634 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14636 else if (unformat (i, "l2-table %d", &l2_table_index))
14640 clib_warning ("parse error '%U'", format_unformat_error, i);
14645 if (sw_if_index_set == 0)
14647 errmsg ("missing interface name or sw_if_index");
14651 M (OUTPUT_ACL_SET_INTERFACE, mp);
14653 mp->sw_if_index = ntohl (sw_if_index);
14654 mp->ip4_table_index = ntohl (ip4_table_index);
14655 mp->ip6_table_index = ntohl (ip6_table_index);
14656 mp->l2_table_index = ntohl (l2_table_index);
14657 mp->is_add = is_add;
14665 api_ip_address_dump (vat_main_t * vam)
14667 unformat_input_t *i = vam->input;
14668 vl_api_ip_address_dump_t *mp;
14669 vl_api_control_ping_t *mp_ping;
14670 u32 sw_if_index = ~0;
14671 u8 sw_if_index_set = 0;
14676 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14678 if (unformat (i, "sw_if_index %d", &sw_if_index))
14679 sw_if_index_set = 1;
14681 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14682 sw_if_index_set = 1;
14683 else if (unformat (i, "ipv4"))
14685 else if (unformat (i, "ipv6"))
14691 if (ipv4_set && ipv6_set)
14693 errmsg ("ipv4 and ipv6 flags cannot be both set");
14697 if ((!ipv4_set) && (!ipv6_set))
14699 errmsg ("no ipv4 nor ipv6 flag set");
14703 if (sw_if_index_set == 0)
14705 errmsg ("missing interface name or sw_if_index");
14709 vam->current_sw_if_index = sw_if_index;
14710 vam->is_ipv6 = ipv6_set;
14712 M (IP_ADDRESS_DUMP, mp);
14713 mp->sw_if_index = ntohl (sw_if_index);
14714 mp->is_ipv6 = ipv6_set;
14717 /* Use a control ping for synchronization */
14718 MPING (CONTROL_PING, mp_ping);
14726 api_ip_dump (vat_main_t * vam)
14728 vl_api_ip_dump_t *mp;
14729 vl_api_control_ping_t *mp_ping;
14730 unformat_input_t *in = vam->input;
14737 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
14739 if (unformat (in, "ipv4"))
14741 else if (unformat (in, "ipv6"))
14747 if (ipv4_set && ipv6_set)
14749 errmsg ("ipv4 and ipv6 flags cannot be both set");
14753 if ((!ipv4_set) && (!ipv6_set))
14755 errmsg ("no ipv4 nor ipv6 flag set");
14759 is_ipv6 = ipv6_set;
14760 vam->is_ipv6 = is_ipv6;
14762 /* free old data */
14763 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
14765 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
14767 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
14770 mp->is_ipv6 = ipv6_set;
14773 /* Use a control ping for synchronization */
14774 MPING (CONTROL_PING, mp_ping);
14782 api_ipsec_spd_add_del (vat_main_t * vam)
14784 unformat_input_t *i = vam->input;
14785 vl_api_ipsec_spd_add_del_t *mp;
14790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14792 if (unformat (i, "spd_id %d", &spd_id))
14794 else if (unformat (i, "del"))
14798 clib_warning ("parse error '%U'", format_unformat_error, i);
14804 errmsg ("spd_id must be set");
14808 M (IPSEC_SPD_ADD_DEL, mp);
14810 mp->spd_id = ntohl (spd_id);
14811 mp->is_add = is_add;
14819 api_ipsec_interface_add_del_spd (vat_main_t * vam)
14821 unformat_input_t *i = vam->input;
14822 vl_api_ipsec_interface_add_del_spd_t *mp;
14824 u8 sw_if_index_set = 0;
14825 u32 spd_id = (u32) ~ 0;
14829 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14831 if (unformat (i, "del"))
14833 else if (unformat (i, "spd_id %d", &spd_id))
14836 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14837 sw_if_index_set = 1;
14838 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14839 sw_if_index_set = 1;
14842 clib_warning ("parse error '%U'", format_unformat_error, i);
14848 if (spd_id == (u32) ~ 0)
14850 errmsg ("spd_id must be set");
14854 if (sw_if_index_set == 0)
14856 errmsg ("missing interface name or sw_if_index");
14860 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
14862 mp->spd_id = ntohl (spd_id);
14863 mp->sw_if_index = ntohl (sw_if_index);
14864 mp->is_add = is_add;
14872 api_ipsec_spd_add_del_entry (vat_main_t * vam)
14874 unformat_input_t *i = vam->input;
14875 vl_api_ipsec_spd_add_del_entry_t *mp;
14876 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
14877 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
14879 u32 rport_start = 0, rport_stop = (u32) ~ 0;
14880 u32 lport_start = 0, lport_stop = (u32) ~ 0;
14881 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
14882 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
14885 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
14886 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
14887 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
14888 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
14889 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
14890 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
14892 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14894 if (unformat (i, "del"))
14896 if (unformat (i, "outbound"))
14898 if (unformat (i, "inbound"))
14900 else if (unformat (i, "spd_id %d", &spd_id))
14902 else if (unformat (i, "sa_id %d", &sa_id))
14904 else if (unformat (i, "priority %d", &priority))
14906 else if (unformat (i, "protocol %d", &protocol))
14908 else if (unformat (i, "lport_start %d", &lport_start))
14910 else if (unformat (i, "lport_stop %d", &lport_stop))
14912 else if (unformat (i, "rport_start %d", &rport_start))
14914 else if (unformat (i, "rport_stop %d", &rport_stop))
14918 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
14924 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
14931 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
14937 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
14944 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
14950 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
14957 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
14963 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
14969 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
14971 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
14973 clib_warning ("unsupported action: 'resolve'");
14979 clib_warning ("parse error '%U'", format_unformat_error, i);
14985 M (IPSEC_SPD_ADD_DEL_ENTRY, mp);
14987 mp->spd_id = ntohl (spd_id);
14988 mp->priority = ntohl (priority);
14989 mp->is_outbound = is_outbound;
14991 mp->is_ipv6 = is_ipv6;
14992 if (is_ipv6 || is_ip_any)
14994 clib_memcpy (mp->remote_address_start, &raddr6_start,
14995 sizeof (ip6_address_t));
14996 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
14997 sizeof (ip6_address_t));
14998 clib_memcpy (mp->local_address_start, &laddr6_start,
14999 sizeof (ip6_address_t));
15000 clib_memcpy (mp->local_address_stop, &laddr6_stop,
15001 sizeof (ip6_address_t));
15005 clib_memcpy (mp->remote_address_start, &raddr4_start,
15006 sizeof (ip4_address_t));
15007 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
15008 sizeof (ip4_address_t));
15009 clib_memcpy (mp->local_address_start, &laddr4_start,
15010 sizeof (ip4_address_t));
15011 clib_memcpy (mp->local_address_stop, &laddr4_stop,
15012 sizeof (ip4_address_t));
15014 mp->protocol = (u8) protocol;
15015 mp->local_port_start = ntohs ((u16) lport_start);
15016 mp->local_port_stop = ntohs ((u16) lport_stop);
15017 mp->remote_port_start = ntohs ((u16) rport_start);
15018 mp->remote_port_stop = ntohs ((u16) rport_stop);
15019 mp->policy = (u8) policy;
15020 mp->sa_id = ntohl (sa_id);
15021 mp->is_add = is_add;
15022 mp->is_ip_any = is_ip_any;
15029 api_ipsec_sad_add_del_entry (vat_main_t * vam)
15031 unformat_input_t *i = vam->input;
15032 vl_api_ipsec_sad_add_del_entry_t *mp;
15033 u32 sad_id = 0, spi = 0;
15034 u8 *ck = 0, *ik = 0;
15037 u8 protocol = IPSEC_PROTOCOL_AH;
15038 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
15039 u32 crypto_alg = 0, integ_alg = 0;
15040 ip4_address_t tun_src4;
15041 ip4_address_t tun_dst4;
15042 ip6_address_t tun_src6;
15043 ip6_address_t tun_dst6;
15046 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15048 if (unformat (i, "del"))
15050 else if (unformat (i, "sad_id %d", &sad_id))
15052 else if (unformat (i, "spi %d", &spi))
15054 else if (unformat (i, "esp"))
15055 protocol = IPSEC_PROTOCOL_ESP;
15056 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
15059 is_tunnel_ipv6 = 0;
15061 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
15064 is_tunnel_ipv6 = 0;
15066 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
15069 is_tunnel_ipv6 = 1;
15071 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
15074 is_tunnel_ipv6 = 1;
15078 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15080 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15082 clib_warning ("unsupported crypto-alg: '%U'",
15083 format_ipsec_crypto_alg, crypto_alg);
15087 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15091 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15093 if (integ_alg >= IPSEC_INTEG_N_ALG)
15095 clib_warning ("unsupported integ-alg: '%U'",
15096 format_ipsec_integ_alg, integ_alg);
15100 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15104 clib_warning ("parse error '%U'", format_unformat_error, i);
15110 M (IPSEC_SAD_ADD_DEL_ENTRY, mp);
15112 mp->sad_id = ntohl (sad_id);
15113 mp->is_add = is_add;
15114 mp->protocol = protocol;
15115 mp->spi = ntohl (spi);
15116 mp->is_tunnel = is_tunnel;
15117 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
15118 mp->crypto_algorithm = crypto_alg;
15119 mp->integrity_algorithm = integ_alg;
15120 mp->crypto_key_length = vec_len (ck);
15121 mp->integrity_key_length = vec_len (ik);
15123 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15124 mp->crypto_key_length = sizeof (mp->crypto_key);
15126 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15127 mp->integrity_key_length = sizeof (mp->integrity_key);
15130 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15132 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15136 if (is_tunnel_ipv6)
15138 clib_memcpy (mp->tunnel_src_address, &tun_src6,
15139 sizeof (ip6_address_t));
15140 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
15141 sizeof (ip6_address_t));
15145 clib_memcpy (mp->tunnel_src_address, &tun_src4,
15146 sizeof (ip4_address_t));
15147 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
15148 sizeof (ip4_address_t));
15158 api_ipsec_sa_set_key (vat_main_t * vam)
15160 unformat_input_t *i = vam->input;
15161 vl_api_ipsec_sa_set_key_t *mp;
15163 u8 *ck = 0, *ik = 0;
15166 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15168 if (unformat (i, "sa_id %d", &sa_id))
15170 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
15172 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
15176 clib_warning ("parse error '%U'", format_unformat_error, i);
15181 M (IPSEC_SA_SET_KEY, mp);
15183 mp->sa_id = ntohl (sa_id);
15184 mp->crypto_key_length = vec_len (ck);
15185 mp->integrity_key_length = vec_len (ik);
15187 if (mp->crypto_key_length > sizeof (mp->crypto_key))
15188 mp->crypto_key_length = sizeof (mp->crypto_key);
15190 if (mp->integrity_key_length > sizeof (mp->integrity_key))
15191 mp->integrity_key_length = sizeof (mp->integrity_key);
15194 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
15196 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
15204 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
15206 unformat_input_t *i = vam->input;
15207 vl_api_ipsec_tunnel_if_add_del_t *mp;
15208 u32 local_spi = 0, remote_spi = 0;
15209 u32 crypto_alg = 0, integ_alg = 0;
15210 u8 *lck = NULL, *rck = NULL;
15211 u8 *lik = NULL, *rik = NULL;
15212 ip4_address_t local_ip = { {0} };
15213 ip4_address_t remote_ip = { {0} };
15216 u8 anti_replay = 0;
15221 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15223 if (unformat (i, "del"))
15225 else if (unformat (i, "esn"))
15227 else if (unformat (i, "anti_replay"))
15229 else if (unformat (i, "local_spi %d", &local_spi))
15231 else if (unformat (i, "remote_spi %d", &remote_spi))
15233 else if (unformat (i, "local_ip %U", unformat_ip4_address, &local_ip))
15235 else if (unformat (i, "remote_ip %U", unformat_ip4_address, &remote_ip))
15237 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
15240 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
15242 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
15244 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
15248 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
15250 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15252 errmsg ("unsupported crypto-alg: '%U'\n",
15253 format_ipsec_crypto_alg, crypto_alg);
15259 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
15261 if (integ_alg >= IPSEC_INTEG_N_ALG)
15263 errmsg ("unsupported integ-alg: '%U'\n",
15264 format_ipsec_integ_alg, integ_alg);
15268 else if (unformat (i, "instance %u", &instance))
15272 errmsg ("parse error '%U'\n", format_unformat_error, i);
15277 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
15279 mp->is_add = is_add;
15281 mp->anti_replay = anti_replay;
15283 clib_memcpy (mp->local_ip, &local_ip, sizeof (ip4_address_t));
15284 clib_memcpy (mp->remote_ip, &remote_ip, sizeof (ip4_address_t));
15286 mp->local_spi = htonl (local_spi);
15287 mp->remote_spi = htonl (remote_spi);
15288 mp->crypto_alg = (u8) crypto_alg;
15290 mp->local_crypto_key_len = 0;
15293 mp->local_crypto_key_len = vec_len (lck);
15294 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15295 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15296 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15299 mp->remote_crypto_key_len = 0;
15302 mp->remote_crypto_key_len = vec_len (rck);
15303 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15304 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15305 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15308 mp->integ_alg = (u8) integ_alg;
15310 mp->local_integ_key_len = 0;
15313 mp->local_integ_key_len = vec_len (lik);
15314 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15315 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15316 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15319 mp->remote_integ_key_len = 0;
15322 mp->remote_integ_key_len = vec_len (rik);
15323 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15324 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15325 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15330 mp->renumber = renumber;
15331 mp->show_instance = ntohl (instance);
15340 vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15342 vat_main_t *vam = &vat_main;
15344 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
15345 "crypto_key %U integ_alg %u integ_key %U use_esn %u "
15346 "use_anti_replay %u is_tunnel %u is_tunnel_ip6 %u "
15347 "tunnel_src_addr %U tunnel_dst_addr %U "
15348 "salt %u seq_outbound %lu last_seq_inbound %lu "
15349 "replay_window %lu total_data_size %lu\n",
15350 ntohl (mp->sa_id), ntohl (mp->sw_if_index), ntohl (mp->spi),
15352 mp->crypto_alg, format_hex_bytes, mp->crypto_key, mp->crypto_key_len,
15353 mp->integ_alg, format_hex_bytes, mp->integ_key, mp->integ_key_len,
15354 mp->use_esn, mp->use_anti_replay, mp->is_tunnel, mp->is_tunnel_ip6,
15355 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15356 mp->tunnel_src_addr,
15357 (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address,
15358 mp->tunnel_dst_addr,
15360 clib_net_to_host_u64 (mp->seq_outbound),
15361 clib_net_to_host_u64 (mp->last_seq_inbound),
15362 clib_net_to_host_u64 (mp->replay_window),
15363 clib_net_to_host_u64 (mp->total_data_size));
15366 #define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15367 #define vl_api_ipsec_sa_details_t_print vl_noop_handler
15369 static void vl_api_ipsec_sa_details_t_handler_json
15370 (vl_api_ipsec_sa_details_t * mp)
15372 vat_main_t *vam = &vat_main;
15373 vat_json_node_t *node = NULL;
15374 struct in_addr src_ip4, dst_ip4;
15375 struct in6_addr src_ip6, dst_ip6;
15377 if (VAT_JSON_ARRAY != vam->json_tree.type)
15379 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15380 vat_json_init_array (&vam->json_tree);
15382 node = vat_json_array_add (&vam->json_tree);
15384 vat_json_init_object (node);
15385 vat_json_object_add_uint (node, "sa_id", ntohl (mp->sa_id));
15386 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15387 vat_json_object_add_uint (node, "spi", ntohl (mp->spi));
15388 vat_json_object_add_uint (node, "proto", mp->protocol);
15389 vat_json_object_add_uint (node, "crypto_alg", mp->crypto_alg);
15390 vat_json_object_add_uint (node, "integ_alg", mp->integ_alg);
15391 vat_json_object_add_uint (node, "use_esn", mp->use_esn);
15392 vat_json_object_add_uint (node, "use_anti_replay", mp->use_anti_replay);
15393 vat_json_object_add_uint (node, "is_tunnel", mp->is_tunnel);
15394 vat_json_object_add_uint (node, "is_tunnel_ip6", mp->is_tunnel_ip6);
15395 vat_json_object_add_bytes (node, "crypto_key", mp->crypto_key,
15396 mp->crypto_key_len);
15397 vat_json_object_add_bytes (node, "integ_key", mp->integ_key,
15398 mp->integ_key_len);
15399 if (mp->is_tunnel_ip6)
15401 clib_memcpy (&src_ip6, mp->tunnel_src_addr, sizeof (src_ip6));
15402 vat_json_object_add_ip6 (node, "tunnel_src_addr", src_ip6);
15403 clib_memcpy (&dst_ip6, mp->tunnel_dst_addr, sizeof (dst_ip6));
15404 vat_json_object_add_ip6 (node, "tunnel_dst_addr", dst_ip6);
15408 clib_memcpy (&src_ip4, mp->tunnel_src_addr, sizeof (src_ip4));
15409 vat_json_object_add_ip4 (node, "tunnel_src_addr", src_ip4);
15410 clib_memcpy (&dst_ip4, mp->tunnel_dst_addr, sizeof (dst_ip4));
15411 vat_json_object_add_ip4 (node, "tunnel_dst_addr", dst_ip4);
15413 vat_json_object_add_uint (node, "replay_window",
15414 clib_net_to_host_u64 (mp->replay_window));
15415 vat_json_object_add_uint (node, "total_data_size",
15416 clib_net_to_host_u64 (mp->total_data_size));
15421 api_ipsec_sa_dump (vat_main_t * vam)
15423 unformat_input_t *i = vam->input;
15424 vl_api_ipsec_sa_dump_t *mp;
15425 vl_api_control_ping_t *mp_ping;
15429 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15431 if (unformat (i, "sa_id %d", &sa_id))
15435 clib_warning ("parse error '%U'", format_unformat_error, i);
15440 M (IPSEC_SA_DUMP, mp);
15442 mp->sa_id = ntohl (sa_id);
15446 /* Use a control ping for synchronization */
15447 M (CONTROL_PING, mp_ping);
15455 api_ipsec_tunnel_if_set_key (vat_main_t * vam)
15457 unformat_input_t *i = vam->input;
15458 vl_api_ipsec_tunnel_if_set_key_t *mp;
15459 u32 sw_if_index = ~0;
15460 u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE;
15465 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15467 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15470 if (unformat (i, "local crypto %U", unformat_ipsec_crypto_alg, &alg))
15471 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO;
15473 if (unformat (i, "remote crypto %U", unformat_ipsec_crypto_alg, &alg))
15474 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO;
15475 else if (unformat (i, "local integ %U", unformat_ipsec_integ_alg, &alg))
15476 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG;
15478 if (unformat (i, "remote integ %U", unformat_ipsec_integ_alg, &alg))
15479 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG;
15480 else if (unformat (i, "%U", unformat_hex_string, &key))
15484 clib_warning ("parse error '%U'", format_unformat_error, i);
15489 if (sw_if_index == ~0)
15491 errmsg ("interface must be specified");
15495 if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE)
15497 errmsg ("key type must be specified");
15503 errmsg ("algorithm must be specified");
15507 if (vec_len (key) == 0)
15509 errmsg ("key must be specified");
15513 M (IPSEC_TUNNEL_IF_SET_KEY, mp);
15515 mp->sw_if_index = htonl (sw_if_index);
15517 mp->key_type = key_type;
15518 mp->key_len = vec_len (key);
15519 clib_memcpy (mp->key, key, vec_len (key));
15528 api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15530 unformat_input_t *i = vam->input;
15531 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15532 u32 sw_if_index = ~0;
15534 u8 is_outbound = (u8) ~ 0;
15537 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15539 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15541 else if (unformat (i, "sa_id %d", &sa_id))
15543 else if (unformat (i, "outbound"))
15545 else if (unformat (i, "inbound"))
15549 clib_warning ("parse error '%U'", format_unformat_error, i);
15554 if (sw_if_index == ~0)
15556 errmsg ("interface must be specified");
15562 errmsg ("SA ID must be specified");
15566 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15568 mp->sw_if_index = htonl (sw_if_index);
15569 mp->sa_id = htonl (sa_id);
15570 mp->is_outbound = is_outbound;
15579 api_ikev2_profile_add_del (vat_main_t * vam)
15581 unformat_input_t *i = vam->input;
15582 vl_api_ikev2_profile_add_del_t *mp;
15587 const char *valid_chars = "a-zA-Z0-9_";
15589 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15591 if (unformat (i, "del"))
15593 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15594 vec_add1 (name, 0);
15597 errmsg ("parse error '%U'", format_unformat_error, i);
15602 if (!vec_len (name))
15604 errmsg ("profile name must be specified");
15608 if (vec_len (name) > 64)
15610 errmsg ("profile name too long");
15614 M (IKEV2_PROFILE_ADD_DEL, mp);
15616 clib_memcpy (mp->name, name, vec_len (name));
15617 mp->is_add = is_add;
15626 api_ikev2_profile_set_auth (vat_main_t * vam)
15628 unformat_input_t *i = vam->input;
15629 vl_api_ikev2_profile_set_auth_t *mp;
15632 u32 auth_method = 0;
15636 const char *valid_chars = "a-zA-Z0-9_";
15638 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15640 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15641 vec_add1 (name, 0);
15642 else if (unformat (i, "auth_method %U",
15643 unformat_ikev2_auth_method, &auth_method))
15645 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
15647 else if (unformat (i, "auth_data %v", &data))
15651 errmsg ("parse error '%U'", format_unformat_error, i);
15656 if (!vec_len (name))
15658 errmsg ("profile name must be specified");
15662 if (vec_len (name) > 64)
15664 errmsg ("profile name too long");
15668 if (!vec_len (data))
15670 errmsg ("auth_data must be specified");
15676 errmsg ("auth_method must be specified");
15680 M (IKEV2_PROFILE_SET_AUTH, mp);
15682 mp->is_hex = is_hex;
15683 mp->auth_method = (u8) auth_method;
15684 mp->data_len = vec_len (data);
15685 clib_memcpy (mp->name, name, vec_len (name));
15686 clib_memcpy (mp->data, data, vec_len (data));
15696 api_ikev2_profile_set_id (vat_main_t * vam)
15698 unformat_input_t *i = vam->input;
15699 vl_api_ikev2_profile_set_id_t *mp;
15707 const char *valid_chars = "a-zA-Z0-9_";
15709 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15711 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15712 vec_add1 (name, 0);
15713 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
15715 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
15717 data = vec_new (u8, 4);
15718 clib_memcpy (data, ip4.as_u8, 4);
15720 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
15722 else if (unformat (i, "id_data %v", &data))
15724 else if (unformat (i, "local"))
15726 else if (unformat (i, "remote"))
15730 errmsg ("parse error '%U'", format_unformat_error, i);
15735 if (!vec_len (name))
15737 errmsg ("profile name must be specified");
15741 if (vec_len (name) > 64)
15743 errmsg ("profile name too long");
15747 if (!vec_len (data))
15749 errmsg ("id_data must be specified");
15755 errmsg ("id_type must be specified");
15759 M (IKEV2_PROFILE_SET_ID, mp);
15761 mp->is_local = is_local;
15762 mp->id_type = (u8) id_type;
15763 mp->data_len = vec_len (data);
15764 clib_memcpy (mp->name, name, vec_len (name));
15765 clib_memcpy (mp->data, data, vec_len (data));
15775 api_ikev2_profile_set_ts (vat_main_t * vam)
15777 unformat_input_t *i = vam->input;
15778 vl_api_ikev2_profile_set_ts_t *mp;
15781 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
15782 ip4_address_t start_addr, end_addr;
15784 const char *valid_chars = "a-zA-Z0-9_";
15787 start_addr.as_u32 = 0;
15788 end_addr.as_u32 = (u32) ~ 0;
15790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15792 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
15793 vec_add1 (name, 0);
15794 else if (unformat (i, "protocol %d", &proto))
15796 else if (unformat (i, "start_port %d", &start_port))
15798 else if (unformat (i, "end_port %d", &end_port))
15801 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
15803 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
15805 else if (unformat (i, "local"))
15807 else if (unformat (i, "remote"))
15811 errmsg ("parse error '%U'", format_unformat_error, i);
15816 if (!vec_len (name))
15818 errmsg ("profile name must be specified");
15822 if (vec_len (name) > 64)
15824 errmsg ("profile name too long");
15828 M (IKEV2_PROFILE_SET_TS, mp);
15830 mp->is_local = is_local;
15831 mp->proto = (u8) proto;
15832 mp->start_port = (u16) start_port;
15833 mp->end_port = (u16) end_port;
15834 mp->start_addr = start_addr.as_u32;
15835 mp->end_addr = end_addr.as_u32;
15836 clib_memcpy (mp->name, name, vec_len (name));
15845 api_ikev2_set_local_key (vat_main_t * vam)
15847 unformat_input_t *i = vam->input;
15848 vl_api_ikev2_set_local_key_t *mp;
15852 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15854 if (unformat (i, "file %v", &file))
15855 vec_add1 (file, 0);
15858 errmsg ("parse error '%U'", format_unformat_error, i);
15863 if (!vec_len (file))
15865 errmsg ("RSA key file must be specified");
15869 if (vec_len (file) > 256)
15871 errmsg ("file name too long");
15875 M (IKEV2_SET_LOCAL_KEY, mp);
15877 clib_memcpy (mp->key_file, file, vec_len (file));
15886 api_ikev2_set_responder (vat_main_t * vam)
15888 unformat_input_t *i = vam->input;
15889 vl_api_ikev2_set_responder_t *mp;
15892 u32 sw_if_index = ~0;
15893 ip4_address_t address;
15895 const char *valid_chars = "a-zA-Z0-9_";
15897 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15900 (i, "%U interface %d address %U", unformat_token, valid_chars,
15901 &name, &sw_if_index, unformat_ip4_address, &address))
15902 vec_add1 (name, 0);
15905 errmsg ("parse error '%U'", format_unformat_error, i);
15910 if (!vec_len (name))
15912 errmsg ("profile name must be specified");
15916 if (vec_len (name) > 64)
15918 errmsg ("profile name too long");
15922 M (IKEV2_SET_RESPONDER, mp);
15924 clib_memcpy (mp->name, name, vec_len (name));
15927 mp->sw_if_index = sw_if_index;
15928 clib_memcpy (mp->address, &address, sizeof (address));
15936 api_ikev2_set_ike_transforms (vat_main_t * vam)
15938 unformat_input_t *i = vam->input;
15939 vl_api_ikev2_set_ike_transforms_t *mp;
15942 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
15944 const char *valid_chars = "a-zA-Z0-9_";
15946 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15948 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
15949 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
15950 vec_add1 (name, 0);
15953 errmsg ("parse error '%U'", format_unformat_error, i);
15958 if (!vec_len (name))
15960 errmsg ("profile name must be specified");
15964 if (vec_len (name) > 64)
15966 errmsg ("profile name too long");
15970 M (IKEV2_SET_IKE_TRANSFORMS, mp);
15972 clib_memcpy (mp->name, name, vec_len (name));
15974 mp->crypto_alg = crypto_alg;
15975 mp->crypto_key_size = crypto_key_size;
15976 mp->integ_alg = integ_alg;
15977 mp->dh_group = dh_group;
15986 api_ikev2_set_esp_transforms (vat_main_t * vam)
15988 unformat_input_t *i = vam->input;
15989 vl_api_ikev2_set_esp_transforms_t *mp;
15992 u32 crypto_alg, crypto_key_size, integ_alg, dh_group;
15994 const char *valid_chars = "a-zA-Z0-9_";
15996 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15998 if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name,
15999 &crypto_alg, &crypto_key_size, &integ_alg, &dh_group))
16000 vec_add1 (name, 0);
16003 errmsg ("parse error '%U'", format_unformat_error, i);
16008 if (!vec_len (name))
16010 errmsg ("profile name must be specified");
16014 if (vec_len (name) > 64)
16016 errmsg ("profile name too long");
16020 M (IKEV2_SET_ESP_TRANSFORMS, mp);
16022 clib_memcpy (mp->name, name, vec_len (name));
16024 mp->crypto_alg = crypto_alg;
16025 mp->crypto_key_size = crypto_key_size;
16026 mp->integ_alg = integ_alg;
16027 mp->dh_group = dh_group;
16035 api_ikev2_set_sa_lifetime (vat_main_t * vam)
16037 unformat_input_t *i = vam->input;
16038 vl_api_ikev2_set_sa_lifetime_t *mp;
16041 u64 lifetime, lifetime_maxdata;
16042 u32 lifetime_jitter, handover;
16044 const char *valid_chars = "a-zA-Z0-9_";
16046 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16048 if (unformat (i, "%U %lu %u %u %lu", unformat_token, valid_chars, &name,
16049 &lifetime, &lifetime_jitter, &handover,
16050 &lifetime_maxdata))
16051 vec_add1 (name, 0);
16054 errmsg ("parse error '%U'", format_unformat_error, i);
16059 if (!vec_len (name))
16061 errmsg ("profile name must be specified");
16065 if (vec_len (name) > 64)
16067 errmsg ("profile name too long");
16071 M (IKEV2_SET_SA_LIFETIME, mp);
16073 clib_memcpy (mp->name, name, vec_len (name));
16075 mp->lifetime = lifetime;
16076 mp->lifetime_jitter = lifetime_jitter;
16077 mp->handover = handover;
16078 mp->lifetime_maxdata = lifetime_maxdata;
16086 api_ikev2_initiate_sa_init (vat_main_t * vam)
16088 unformat_input_t *i = vam->input;
16089 vl_api_ikev2_initiate_sa_init_t *mp;
16093 const char *valid_chars = "a-zA-Z0-9_";
16095 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16097 if (unformat (i, "%U", unformat_token, valid_chars, &name))
16098 vec_add1 (name, 0);
16101 errmsg ("parse error '%U'", format_unformat_error, i);
16106 if (!vec_len (name))
16108 errmsg ("profile name must be specified");
16112 if (vec_len (name) > 64)
16114 errmsg ("profile name too long");
16118 M (IKEV2_INITIATE_SA_INIT, mp);
16120 clib_memcpy (mp->name, name, vec_len (name));
16129 api_ikev2_initiate_del_ike_sa (vat_main_t * vam)
16131 unformat_input_t *i = vam->input;
16132 vl_api_ikev2_initiate_del_ike_sa_t *mp;
16137 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16139 if (unformat (i, "%lx", &ispi))
16143 errmsg ("parse error '%U'", format_unformat_error, i);
16148 M (IKEV2_INITIATE_DEL_IKE_SA, mp);
16158 api_ikev2_initiate_del_child_sa (vat_main_t * vam)
16160 unformat_input_t *i = vam->input;
16161 vl_api_ikev2_initiate_del_child_sa_t *mp;
16166 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16168 if (unformat (i, "%x", &ispi))
16172 errmsg ("parse error '%U'", format_unformat_error, i);
16177 M (IKEV2_INITIATE_DEL_CHILD_SA, mp);
16187 api_ikev2_initiate_rekey_child_sa (vat_main_t * vam)
16189 unformat_input_t *i = vam->input;
16190 vl_api_ikev2_initiate_rekey_child_sa_t *mp;
16195 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16197 if (unformat (i, "%x", &ispi))
16201 errmsg ("parse error '%U'", format_unformat_error, i);
16206 M (IKEV2_INITIATE_REKEY_CHILD_SA, mp);
16216 api_get_first_msg_id (vat_main_t * vam)
16218 vl_api_get_first_msg_id_t *mp;
16219 unformat_input_t *i = vam->input;
16224 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
16226 if (unformat (i, "client %s", &name))
16234 errmsg ("missing client name");
16237 vec_add1 (name, 0);
16239 if (vec_len (name) > 63)
16241 errmsg ("client name too long");
16245 M (GET_FIRST_MSG_ID, mp);
16246 clib_memcpy (mp->name, name, vec_len (name));
16253 api_cop_interface_enable_disable (vat_main_t * vam)
16255 unformat_input_t *line_input = vam->input;
16256 vl_api_cop_interface_enable_disable_t *mp;
16257 u32 sw_if_index = ~0;
16258 u8 enable_disable = 1;
16261 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16263 if (unformat (line_input, "disable"))
16264 enable_disable = 0;
16265 if (unformat (line_input, "enable"))
16266 enable_disable = 1;
16267 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16268 vam, &sw_if_index))
16270 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16276 if (sw_if_index == ~0)
16278 errmsg ("missing interface name or sw_if_index");
16282 /* Construct the API message */
16283 M (COP_INTERFACE_ENABLE_DISABLE, mp);
16284 mp->sw_if_index = ntohl (sw_if_index);
16285 mp->enable_disable = enable_disable;
16289 /* Wait for the reply */
16295 api_cop_whitelist_enable_disable (vat_main_t * vam)
16297 unformat_input_t *line_input = vam->input;
16298 vl_api_cop_whitelist_enable_disable_t *mp;
16299 u32 sw_if_index = ~0;
16300 u8 ip4 = 0, ip6 = 0, default_cop = 0;
16304 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16306 if (unformat (line_input, "ip4"))
16308 else if (unformat (line_input, "ip6"))
16310 else if (unformat (line_input, "default"))
16312 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
16313 vam, &sw_if_index))
16315 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
16317 else if (unformat (line_input, "fib-id %d", &fib_id))
16323 if (sw_if_index == ~0)
16325 errmsg ("missing interface name or sw_if_index");
16329 /* Construct the API message */
16330 M (COP_WHITELIST_ENABLE_DISABLE, mp);
16331 mp->sw_if_index = ntohl (sw_if_index);
16332 mp->fib_id = ntohl (fib_id);
16335 mp->default_cop = default_cop;
16339 /* Wait for the reply */
16345 api_get_node_graph (vat_main_t * vam)
16347 vl_api_get_node_graph_t *mp;
16350 M (GET_NODE_GRAPH, mp);
16354 /* Wait for the reply */
16360 /** Used for parsing LISP eids */
16361 typedef CLIB_PACKED(struct{
16362 u8 addr[16]; /**< eid address */
16363 u32 len; /**< prefix length if IP */
16364 u8 type; /**< type of eid */
16369 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
16371 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
16373 clib_memset (a, 0, sizeof (a[0]));
16375 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
16377 a->type = 0; /* ipv4 type */
16379 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
16381 a->type = 1; /* ipv6 type */
16383 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
16385 a->type = 2; /* mac type */
16387 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
16389 a->type = 3; /* NSH type */
16390 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
16391 nsh->spi = clib_host_to_net_u32 (nsh->spi);
16398 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
16407 lisp_eid_size_vat (u8 type)
16424 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
16426 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
16430 api_one_add_del_locator_set (vat_main_t * vam)
16432 unformat_input_t *input = vam->input;
16433 vl_api_one_add_del_locator_set_t *mp;
16435 u8 *locator_set_name = NULL;
16436 u8 locator_set_name_set = 0;
16437 vl_api_local_locator_t locator, *locators = 0;
16438 u32 sw_if_index, priority, weight;
16442 /* Parse args required to build the message */
16443 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16445 if (unformat (input, "del"))
16449 else if (unformat (input, "locator-set %s", &locator_set_name))
16451 locator_set_name_set = 1;
16453 else if (unformat (input, "sw_if_index %u p %u w %u",
16454 &sw_if_index, &priority, &weight))
16456 locator.sw_if_index = htonl (sw_if_index);
16457 locator.priority = priority;
16458 locator.weight = weight;
16459 vec_add1 (locators, locator);
16463 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
16464 &sw_if_index, &priority, &weight))
16466 locator.sw_if_index = htonl (sw_if_index);
16467 locator.priority = priority;
16468 locator.weight = weight;
16469 vec_add1 (locators, locator);
16475 if (locator_set_name_set == 0)
16477 errmsg ("missing locator-set name");
16478 vec_free (locators);
16482 if (vec_len (locator_set_name) > 64)
16484 errmsg ("locator-set name too long");
16485 vec_free (locator_set_name);
16486 vec_free (locators);
16489 vec_add1 (locator_set_name, 0);
16491 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
16493 /* Construct the API message */
16494 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
16496 mp->is_add = is_add;
16497 clib_memcpy (mp->locator_set_name, locator_set_name,
16498 vec_len (locator_set_name));
16499 vec_free (locator_set_name);
16501 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
16503 clib_memcpy (mp->locators, locators, data_len);
16504 vec_free (locators);
16509 /* Wait for a reply... */
16514 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
16517 api_one_add_del_locator (vat_main_t * vam)
16519 unformat_input_t *input = vam->input;
16520 vl_api_one_add_del_locator_t *mp;
16521 u32 tmp_if_index = ~0;
16522 u32 sw_if_index = ~0;
16523 u8 sw_if_index_set = 0;
16524 u8 sw_if_index_if_name_set = 0;
16526 u8 priority_set = 0;
16530 u8 *locator_set_name = NULL;
16531 u8 locator_set_name_set = 0;
16534 /* Parse args required to build the message */
16535 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16537 if (unformat (input, "del"))
16541 else if (unformat (input, "locator-set %s", &locator_set_name))
16543 locator_set_name_set = 1;
16545 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
16548 sw_if_index_if_name_set = 1;
16549 sw_if_index = tmp_if_index;
16551 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
16553 sw_if_index_set = 1;
16554 sw_if_index = tmp_if_index;
16556 else if (unformat (input, "p %d", &priority))
16560 else if (unformat (input, "w %d", &weight))
16568 if (locator_set_name_set == 0)
16570 errmsg ("missing locator-set name");
16574 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
16576 errmsg ("missing sw_if_index");
16577 vec_free (locator_set_name);
16581 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
16583 errmsg ("cannot use both params interface name and sw_if_index");
16584 vec_free (locator_set_name);
16588 if (priority_set == 0)
16590 errmsg ("missing locator-set priority");
16591 vec_free (locator_set_name);
16595 if (weight_set == 0)
16597 errmsg ("missing locator-set weight");
16598 vec_free (locator_set_name);
16602 if (vec_len (locator_set_name) > 64)
16604 errmsg ("locator-set name too long");
16605 vec_free (locator_set_name);
16608 vec_add1 (locator_set_name, 0);
16610 /* Construct the API message */
16611 M (ONE_ADD_DEL_LOCATOR, mp);
16613 mp->is_add = is_add;
16614 mp->sw_if_index = ntohl (sw_if_index);
16615 mp->priority = priority;
16616 mp->weight = weight;
16617 clib_memcpy (mp->locator_set_name, locator_set_name,
16618 vec_len (locator_set_name));
16619 vec_free (locator_set_name);
16624 /* Wait for a reply... */
16629 #define api_lisp_add_del_locator api_one_add_del_locator
16632 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
16634 u32 *key_id = va_arg (*args, u32 *);
16637 if (unformat (input, "%s", &s))
16639 if (!strcmp ((char *) s, "sha1"))
16640 key_id[0] = HMAC_SHA_1_96;
16641 else if (!strcmp ((char *) s, "sha256"))
16642 key_id[0] = HMAC_SHA_256_128;
16645 clib_warning ("invalid key_id: '%s'", s);
16646 key_id[0] = HMAC_NO_KEY;
16657 api_one_add_del_local_eid (vat_main_t * vam)
16659 unformat_input_t *input = vam->input;
16660 vl_api_one_add_del_local_eid_t *mp;
16663 lisp_eid_vat_t _eid, *eid = &_eid;
16664 u8 *locator_set_name = 0;
16665 u8 locator_set_name_set = 0;
16671 /* Parse args required to build the message */
16672 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16674 if (unformat (input, "del"))
16678 else if (unformat (input, "vni %d", &vni))
16682 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
16686 else if (unformat (input, "locator-set %s", &locator_set_name))
16688 locator_set_name_set = 1;
16690 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
16692 else if (unformat (input, "secret-key %_%v%_", &key))
16698 if (locator_set_name_set == 0)
16700 errmsg ("missing locator-set name");
16706 errmsg ("EID address not set!");
16707 vec_free (locator_set_name);
16711 if (key && (0 == key_id))
16713 errmsg ("invalid key_id!");
16717 if (vec_len (key) > 64)
16719 errmsg ("key too long");
16724 if (vec_len (locator_set_name) > 64)
16726 errmsg ("locator-set name too long");
16727 vec_free (locator_set_name);
16730 vec_add1 (locator_set_name, 0);
16732 /* Construct the API message */
16733 M (ONE_ADD_DEL_LOCAL_EID, mp);
16735 mp->is_add = is_add;
16736 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
16737 mp->eid_type = eid->type;
16738 mp->prefix_len = eid->len;
16739 mp->vni = clib_host_to_net_u32 (vni);
16740 mp->key_id = clib_host_to_net_u16 (key_id);
16741 clib_memcpy (mp->locator_set_name, locator_set_name,
16742 vec_len (locator_set_name));
16743 clib_memcpy (mp->key, key, vec_len (key));
16745 vec_free (locator_set_name);
16751 /* Wait for a reply... */
16756 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
16759 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
16761 u32 dp_table = 0, vni = 0;;
16762 unformat_input_t *input = vam->input;
16763 vl_api_gpe_add_del_fwd_entry_t *mp;
16765 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
16766 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
16767 u8 rmt_eid_set = 0, lcl_eid_set = 0;
16768 u32 action = ~0, w;
16769 ip4_address_t rmt_rloc4, lcl_rloc4;
16770 ip6_address_t rmt_rloc6, lcl_rloc6;
16771 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
16774 clib_memset (&rloc, 0, sizeof (rloc));
16776 /* Parse args required to build the message */
16777 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16779 if (unformat (input, "del"))
16781 else if (unformat (input, "add"))
16783 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
16787 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
16791 else if (unformat (input, "vrf %d", &dp_table))
16793 else if (unformat (input, "bd %d", &dp_table))
16795 else if (unformat (input, "vni %d", &vni))
16797 else if (unformat (input, "w %d", &w))
16801 errmsg ("No RLOC configured for setting priority/weight!");
16804 curr_rloc->weight = w;
16806 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
16807 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
16811 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
16813 vec_add1 (lcl_locs, rloc);
16815 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
16816 vec_add1 (rmt_locs, rloc);
16817 /* weight saved in rmt loc */
16818 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16820 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
16821 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
16824 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
16826 vec_add1 (lcl_locs, rloc);
16828 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
16829 vec_add1 (rmt_locs, rloc);
16830 /* weight saved in rmt loc */
16831 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16833 else if (unformat (input, "action %d", &action))
16839 clib_warning ("parse error '%U'", format_unformat_error, input);
16846 errmsg ("remote eid addresses not set");
16850 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
16852 errmsg ("eid types don't match");
16856 if (0 == rmt_locs && (u32) ~ 0 == action)
16858 errmsg ("action not set for negative mapping");
16862 /* Construct the API message */
16863 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
16864 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
16866 mp->is_add = is_add;
16867 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
16868 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
16869 mp->eid_type = rmt_eid->type;
16870 mp->dp_table = clib_host_to_net_u32 (dp_table);
16871 mp->vni = clib_host_to_net_u32 (vni);
16872 mp->rmt_len = rmt_eid->len;
16873 mp->lcl_len = lcl_eid->len;
16874 mp->action = action;
16876 if (0 != rmt_locs && 0 != lcl_locs)
16878 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
16879 clib_memcpy (mp->locs, lcl_locs,
16880 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
16882 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
16883 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
16884 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
16886 vec_free (lcl_locs);
16887 vec_free (rmt_locs);
16892 /* Wait for a reply... */
16898 api_one_add_del_map_server (vat_main_t * vam)
16900 unformat_input_t *input = vam->input;
16901 vl_api_one_add_del_map_server_t *mp;
16905 ip4_address_t ipv4;
16906 ip6_address_t ipv6;
16909 /* Parse args required to build the message */
16910 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16912 if (unformat (input, "del"))
16916 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16920 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16928 if (ipv4_set && ipv6_set)
16930 errmsg ("both eid v4 and v6 addresses set");
16934 if (!ipv4_set && !ipv6_set)
16936 errmsg ("eid addresses not set");
16940 /* Construct the API message */
16941 M (ONE_ADD_DEL_MAP_SERVER, mp);
16943 mp->is_add = is_add;
16947 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16952 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16958 /* Wait for a reply... */
16963 #define api_lisp_add_del_map_server api_one_add_del_map_server
16966 api_one_add_del_map_resolver (vat_main_t * vam)
16968 unformat_input_t *input = vam->input;
16969 vl_api_one_add_del_map_resolver_t *mp;
16973 ip4_address_t ipv4;
16974 ip6_address_t ipv6;
16977 /* Parse args required to build the message */
16978 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16980 if (unformat (input, "del"))
16984 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16988 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16996 if (ipv4_set && ipv6_set)
16998 errmsg ("both eid v4 and v6 addresses set");
17002 if (!ipv4_set && !ipv6_set)
17004 errmsg ("eid addresses not set");
17008 /* Construct the API message */
17009 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
17011 mp->is_add = is_add;
17015 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
17020 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
17026 /* Wait for a reply... */
17031 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
17034 api_lisp_gpe_enable_disable (vat_main_t * vam)
17036 unformat_input_t *input = vam->input;
17037 vl_api_gpe_enable_disable_t *mp;
17042 /* Parse args required to build the message */
17043 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17045 if (unformat (input, "enable"))
17050 else if (unformat (input, "disable"))
17061 errmsg ("Value not set");
17065 /* Construct the API message */
17066 M (GPE_ENABLE_DISABLE, mp);
17073 /* Wait for a reply... */
17079 api_one_rloc_probe_enable_disable (vat_main_t * vam)
17081 unformat_input_t *input = vam->input;
17082 vl_api_one_rloc_probe_enable_disable_t *mp;
17087 /* Parse args required to build the message */
17088 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17090 if (unformat (input, "enable"))
17095 else if (unformat (input, "disable"))
17103 errmsg ("Value not set");
17107 /* Construct the API message */
17108 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
17110 mp->is_enabled = is_en;
17115 /* Wait for a reply... */
17120 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
17123 api_one_map_register_enable_disable (vat_main_t * vam)
17125 unformat_input_t *input = vam->input;
17126 vl_api_one_map_register_enable_disable_t *mp;
17131 /* Parse args required to build the message */
17132 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17134 if (unformat (input, "enable"))
17139 else if (unformat (input, "disable"))
17147 errmsg ("Value not set");
17151 /* Construct the API message */
17152 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
17154 mp->is_enabled = is_en;
17159 /* Wait for a reply... */
17164 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
17167 api_one_enable_disable (vat_main_t * vam)
17169 unformat_input_t *input = vam->input;
17170 vl_api_one_enable_disable_t *mp;
17175 /* Parse args required to build the message */
17176 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17178 if (unformat (input, "enable"))
17183 else if (unformat (input, "disable"))
17193 errmsg ("Value not set");
17197 /* Construct the API message */
17198 M (ONE_ENABLE_DISABLE, mp);
17205 /* Wait for a reply... */
17210 #define api_lisp_enable_disable api_one_enable_disable
17213 api_one_enable_disable_xtr_mode (vat_main_t * vam)
17215 unformat_input_t *input = vam->input;
17216 vl_api_one_enable_disable_xtr_mode_t *mp;
17221 /* Parse args required to build the message */
17222 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17224 if (unformat (input, "enable"))
17229 else if (unformat (input, "disable"))
17239 errmsg ("Value not set");
17243 /* Construct the API message */
17244 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
17251 /* Wait for a reply... */
17257 api_one_show_xtr_mode (vat_main_t * vam)
17259 vl_api_one_show_xtr_mode_t *mp;
17262 /* Construct the API message */
17263 M (ONE_SHOW_XTR_MODE, mp);
17268 /* Wait for a reply... */
17274 api_one_enable_disable_pitr_mode (vat_main_t * vam)
17276 unformat_input_t *input = vam->input;
17277 vl_api_one_enable_disable_pitr_mode_t *mp;
17282 /* Parse args required to build the message */
17283 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17285 if (unformat (input, "enable"))
17290 else if (unformat (input, "disable"))
17300 errmsg ("Value not set");
17304 /* Construct the API message */
17305 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
17312 /* Wait for a reply... */
17318 api_one_show_pitr_mode (vat_main_t * vam)
17320 vl_api_one_show_pitr_mode_t *mp;
17323 /* Construct the API message */
17324 M (ONE_SHOW_PITR_MODE, mp);
17329 /* Wait for a reply... */
17335 api_one_enable_disable_petr_mode (vat_main_t * vam)
17337 unformat_input_t *input = vam->input;
17338 vl_api_one_enable_disable_petr_mode_t *mp;
17343 /* Parse args required to build the message */
17344 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17346 if (unformat (input, "enable"))
17351 else if (unformat (input, "disable"))
17361 errmsg ("Value not set");
17365 /* Construct the API message */
17366 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
17373 /* Wait for a reply... */
17379 api_one_show_petr_mode (vat_main_t * vam)
17381 vl_api_one_show_petr_mode_t *mp;
17384 /* Construct the API message */
17385 M (ONE_SHOW_PETR_MODE, mp);
17390 /* Wait for a reply... */
17396 api_show_one_map_register_state (vat_main_t * vam)
17398 vl_api_show_one_map_register_state_t *mp;
17401 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
17406 /* wait for reply */
17411 #define api_show_lisp_map_register_state api_show_one_map_register_state
17414 api_show_one_rloc_probe_state (vat_main_t * vam)
17416 vl_api_show_one_rloc_probe_state_t *mp;
17419 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
17424 /* wait for reply */
17429 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
17432 api_one_add_del_ndp_entry (vat_main_t * vam)
17434 vl_api_one_add_del_ndp_entry_t *mp;
17435 unformat_input_t *input = vam->input;
17440 u8 mac[6] = { 0, };
17441 u8 ip6[16] = { 0, };
17445 /* Parse args required to build the message */
17446 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17448 if (unformat (input, "del"))
17450 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17452 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
17454 else if (unformat (input, "bd %d", &bd))
17458 errmsg ("parse error '%U'", format_unformat_error, input);
17463 if (!bd_set || !ip_set || (!mac_set && is_add))
17465 errmsg ("Missing BD, IP or MAC!");
17469 M (ONE_ADD_DEL_NDP_ENTRY, mp);
17470 mp->is_add = is_add;
17471 clib_memcpy (mp->mac, mac, 6);
17472 mp->bd = clib_host_to_net_u32 (bd);
17473 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
17478 /* wait for reply */
17484 api_one_add_del_l2_arp_entry (vat_main_t * vam)
17486 vl_api_one_add_del_l2_arp_entry_t *mp;
17487 unformat_input_t *input = vam->input;
17492 u8 mac[6] = { 0, };
17493 u32 ip4 = 0, bd = ~0;
17496 /* Parse args required to build the message */
17497 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17499 if (unformat (input, "del"))
17501 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
17503 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
17505 else if (unformat (input, "bd %d", &bd))
17509 errmsg ("parse error '%U'", format_unformat_error, input);
17514 if (!bd_set || !ip_set || (!mac_set && is_add))
17516 errmsg ("Missing BD, IP or MAC!");
17520 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
17521 mp->is_add = is_add;
17522 clib_memcpy (mp->mac, mac, 6);
17523 mp->bd = clib_host_to_net_u32 (bd);
17529 /* wait for reply */
17535 api_one_ndp_bd_get (vat_main_t * vam)
17537 vl_api_one_ndp_bd_get_t *mp;
17540 M (ONE_NDP_BD_GET, mp);
17545 /* wait for reply */
17551 api_one_ndp_entries_get (vat_main_t * vam)
17553 vl_api_one_ndp_entries_get_t *mp;
17554 unformat_input_t *input = vam->input;
17559 /* Parse args required to build the message */
17560 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17562 if (unformat (input, "bd %d", &bd))
17566 errmsg ("parse error '%U'", format_unformat_error, input);
17573 errmsg ("Expected bridge domain!");
17577 M (ONE_NDP_ENTRIES_GET, mp);
17578 mp->bd = clib_host_to_net_u32 (bd);
17583 /* wait for reply */
17589 api_one_l2_arp_bd_get (vat_main_t * vam)
17591 vl_api_one_l2_arp_bd_get_t *mp;
17594 M (ONE_L2_ARP_BD_GET, mp);
17599 /* wait for reply */
17605 api_one_l2_arp_entries_get (vat_main_t * vam)
17607 vl_api_one_l2_arp_entries_get_t *mp;
17608 unformat_input_t *input = vam->input;
17613 /* Parse args required to build the message */
17614 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17616 if (unformat (input, "bd %d", &bd))
17620 errmsg ("parse error '%U'", format_unformat_error, input);
17627 errmsg ("Expected bridge domain!");
17631 M (ONE_L2_ARP_ENTRIES_GET, mp);
17632 mp->bd = clib_host_to_net_u32 (bd);
17637 /* wait for reply */
17643 api_one_stats_enable_disable (vat_main_t * vam)
17645 vl_api_one_stats_enable_disable_t *mp;
17646 unformat_input_t *input = vam->input;
17651 /* Parse args required to build the message */
17652 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17654 if (unformat (input, "enable"))
17659 else if (unformat (input, "disable"))
17669 errmsg ("Value not set");
17673 M (ONE_STATS_ENABLE_DISABLE, mp);
17679 /* wait for reply */
17685 api_show_one_stats_enable_disable (vat_main_t * vam)
17687 vl_api_show_one_stats_enable_disable_t *mp;
17690 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
17695 /* wait for reply */
17701 api_show_one_map_request_mode (vat_main_t * vam)
17703 vl_api_show_one_map_request_mode_t *mp;
17706 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
17711 /* wait for reply */
17716 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
17719 api_one_map_request_mode (vat_main_t * vam)
17721 unformat_input_t *input = vam->input;
17722 vl_api_one_map_request_mode_t *mp;
17726 /* Parse args required to build the message */
17727 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17729 if (unformat (input, "dst-only"))
17731 else if (unformat (input, "src-dst"))
17735 errmsg ("parse error '%U'", format_unformat_error, input);
17740 M (ONE_MAP_REQUEST_MODE, mp);
17747 /* wait for reply */
17752 #define api_lisp_map_request_mode api_one_map_request_mode
17755 * Enable/disable ONE proxy ITR.
17757 * @param vam vpp API test context
17758 * @return return code
17761 api_one_pitr_set_locator_set (vat_main_t * vam)
17763 u8 ls_name_set = 0;
17764 unformat_input_t *input = vam->input;
17765 vl_api_one_pitr_set_locator_set_t *mp;
17770 /* Parse args required to build the message */
17771 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17773 if (unformat (input, "del"))
17775 else if (unformat (input, "locator-set %s", &ls_name))
17779 errmsg ("parse error '%U'", format_unformat_error, input);
17786 errmsg ("locator-set name not set!");
17790 M (ONE_PITR_SET_LOCATOR_SET, mp);
17792 mp->is_add = is_add;
17793 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17794 vec_free (ls_name);
17799 /* wait for reply */
17804 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
17807 api_one_nsh_set_locator_set (vat_main_t * vam)
17809 u8 ls_name_set = 0;
17810 unformat_input_t *input = vam->input;
17811 vl_api_one_nsh_set_locator_set_t *mp;
17816 /* Parse args required to build the message */
17817 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17819 if (unformat (input, "del"))
17821 else if (unformat (input, "ls %s", &ls_name))
17825 errmsg ("parse error '%U'", format_unformat_error, input);
17830 if (!ls_name_set && is_add)
17832 errmsg ("locator-set name not set!");
17836 M (ONE_NSH_SET_LOCATOR_SET, mp);
17838 mp->is_add = is_add;
17839 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17840 vec_free (ls_name);
17845 /* wait for reply */
17851 api_show_one_pitr (vat_main_t * vam)
17853 vl_api_show_one_pitr_t *mp;
17856 if (!vam->json_output)
17858 print (vam->ofp, "%=20s", "lisp status:");
17861 M (SHOW_ONE_PITR, mp);
17865 /* Wait for a reply... */
17870 #define api_show_lisp_pitr api_show_one_pitr
17873 api_one_use_petr (vat_main_t * vam)
17875 unformat_input_t *input = vam->input;
17876 vl_api_one_use_petr_t *mp;
17881 clib_memset (&ip, 0, sizeof (ip));
17883 /* Parse args required to build the message */
17884 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17886 if (unformat (input, "disable"))
17889 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
17892 ip_addr_version (&ip) = IP4;
17895 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
17898 ip_addr_version (&ip) = IP6;
17902 errmsg ("parse error '%U'", format_unformat_error, input);
17907 M (ONE_USE_PETR, mp);
17909 mp->is_add = is_add;
17912 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
17914 clib_memcpy (mp->address, &ip, 4);
17916 clib_memcpy (mp->address, &ip, 16);
17922 /* wait for reply */
17927 #define api_lisp_use_petr api_one_use_petr
17930 api_show_one_nsh_mapping (vat_main_t * vam)
17932 vl_api_show_one_use_petr_t *mp;
17935 if (!vam->json_output)
17937 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
17940 M (SHOW_ONE_NSH_MAPPING, mp);
17944 /* Wait for a reply... */
17950 api_show_one_use_petr (vat_main_t * vam)
17952 vl_api_show_one_use_petr_t *mp;
17955 if (!vam->json_output)
17957 print (vam->ofp, "%=20s", "Proxy-ETR status:");
17960 M (SHOW_ONE_USE_PETR, mp);
17964 /* Wait for a reply... */
17969 #define api_show_lisp_use_petr api_show_one_use_petr
17972 * Add/delete mapping between vni and vrf
17975 api_one_eid_table_add_del_map (vat_main_t * vam)
17977 unformat_input_t *input = vam->input;
17978 vl_api_one_eid_table_add_del_map_t *mp;
17979 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
17980 u32 vni, vrf, bd_index;
17983 /* Parse args required to build the message */
17984 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17986 if (unformat (input, "del"))
17988 else if (unformat (input, "vrf %d", &vrf))
17990 else if (unformat (input, "bd_index %d", &bd_index))
17992 else if (unformat (input, "vni %d", &vni))
17998 if (!vni_set || (!vrf_set && !bd_index_set))
18000 errmsg ("missing arguments!");
18004 if (vrf_set && bd_index_set)
18006 errmsg ("error: both vrf and bd entered!");
18010 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
18012 mp->is_add = is_add;
18013 mp->vni = htonl (vni);
18014 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
18015 mp->is_l2 = bd_index_set;
18020 /* wait for reply */
18025 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
18028 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
18030 u32 *action = va_arg (*args, u32 *);
18033 if (unformat (input, "%s", &s))
18035 if (!strcmp ((char *) s, "no-action"))
18037 else if (!strcmp ((char *) s, "natively-forward"))
18039 else if (!strcmp ((char *) s, "send-map-request"))
18041 else if (!strcmp ((char *) s, "drop"))
18045 clib_warning ("invalid action: '%s'", s);
18057 * Add/del remote mapping to/from ONE control plane
18059 * @param vam vpp API test context
18060 * @return return code
18063 api_one_add_del_remote_mapping (vat_main_t * vam)
18065 unformat_input_t *input = vam->input;
18066 vl_api_one_add_del_remote_mapping_t *mp;
18068 lisp_eid_vat_t _eid, *eid = &_eid;
18069 lisp_eid_vat_t _seid, *seid = &_seid;
18070 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
18071 u32 action = ~0, p, w, data_len;
18072 ip4_address_t rloc4;
18073 ip6_address_t rloc6;
18074 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
18077 clib_memset (&rloc, 0, sizeof (rloc));
18079 /* Parse args required to build the message */
18080 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18082 if (unformat (input, "del-all"))
18086 else if (unformat (input, "del"))
18090 else if (unformat (input, "add"))
18094 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
18098 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
18102 else if (unformat (input, "vni %d", &vni))
18106 else if (unformat (input, "p %d w %d", &p, &w))
18110 errmsg ("No RLOC configured for setting priority/weight!");
18113 curr_rloc->priority = p;
18114 curr_rloc->weight = w;
18116 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
18119 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
18120 vec_add1 (rlocs, rloc);
18121 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18123 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
18126 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
18127 vec_add1 (rlocs, rloc);
18128 curr_rloc = &rlocs[vec_len (rlocs) - 1];
18130 else if (unformat (input, "action %U",
18131 unformat_negative_mapping_action, &action))
18137 clib_warning ("parse error '%U'", format_unformat_error, input);
18144 errmsg ("missing params!");
18148 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
18150 errmsg ("no action set for negative map-reply!");
18154 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
18156 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
18157 mp->is_add = is_add;
18158 mp->vni = htonl (vni);
18159 mp->action = (u8) action;
18160 mp->is_src_dst = seid_set;
18161 mp->eid_len = eid->len;
18162 mp->seid_len = seid->len;
18163 mp->del_all = del_all;
18164 mp->eid_type = eid->type;
18165 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
18166 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
18168 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
18169 clib_memcpy (mp->rlocs, rlocs, data_len);
18175 /* Wait for a reply... */
18180 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
18183 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
18184 * forwarding entries in data-plane accordingly.
18186 * @param vam vpp API test context
18187 * @return return code
18190 api_one_add_del_adjacency (vat_main_t * vam)
18192 unformat_input_t *input = vam->input;
18193 vl_api_one_add_del_adjacency_t *mp;
18195 ip4_address_t leid4, reid4;
18196 ip6_address_t leid6, reid6;
18197 u8 reid_mac[6] = { 0 };
18198 u8 leid_mac[6] = { 0 };
18199 u8 reid_type, leid_type;
18200 u32 leid_len = 0, reid_len = 0, len;
18204 leid_type = reid_type = (u8) ~ 0;
18206 /* Parse args required to build the message */
18207 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18209 if (unformat (input, "del"))
18213 else if (unformat (input, "add"))
18217 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
18220 reid_type = 0; /* ipv4 */
18223 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
18226 reid_type = 1; /* ipv6 */
18229 else if (unformat (input, "reid %U", unformat_ethernet_address,
18232 reid_type = 2; /* mac */
18234 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
18237 leid_type = 0; /* ipv4 */
18240 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
18243 leid_type = 1; /* ipv6 */
18246 else if (unformat (input, "leid %U", unformat_ethernet_address,
18249 leid_type = 2; /* mac */
18251 else if (unformat (input, "vni %d", &vni))
18257 errmsg ("parse error '%U'", format_unformat_error, input);
18262 if ((u8) ~ 0 == reid_type)
18264 errmsg ("missing params!");
18268 if (leid_type != reid_type)
18270 errmsg ("remote and local EIDs are of different types!");
18274 M (ONE_ADD_DEL_ADJACENCY, mp);
18275 mp->is_add = is_add;
18276 mp->vni = htonl (vni);
18277 mp->leid_len = leid_len;
18278 mp->reid_len = reid_len;
18279 mp->eid_type = reid_type;
18281 switch (mp->eid_type)
18284 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
18285 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
18288 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
18289 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
18292 clib_memcpy (mp->leid, leid_mac, 6);
18293 clib_memcpy (mp->reid, reid_mac, 6);
18296 errmsg ("unknown EID type %d!", mp->eid_type);
18303 /* Wait for a reply... */
18308 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
18311 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
18313 u32 *mode = va_arg (*args, u32 *);
18315 if (unformat (input, "lisp"))
18317 else if (unformat (input, "vxlan"))
18326 api_gpe_get_encap_mode (vat_main_t * vam)
18328 vl_api_gpe_get_encap_mode_t *mp;
18331 /* Construct the API message */
18332 M (GPE_GET_ENCAP_MODE, mp);
18337 /* Wait for a reply... */
18343 api_gpe_set_encap_mode (vat_main_t * vam)
18345 unformat_input_t *input = vam->input;
18346 vl_api_gpe_set_encap_mode_t *mp;
18350 /* Parse args required to build the message */
18351 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18353 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
18359 /* Construct the API message */
18360 M (GPE_SET_ENCAP_MODE, mp);
18367 /* Wait for a reply... */
18373 api_lisp_gpe_add_del_iface (vat_main_t * vam)
18375 unformat_input_t *input = vam->input;
18376 vl_api_gpe_add_del_iface_t *mp;
18377 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
18378 u32 dp_table = 0, vni = 0;
18381 /* Parse args required to build the message */
18382 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18384 if (unformat (input, "up"))
18389 else if (unformat (input, "down"))
18394 else if (unformat (input, "table_id %d", &dp_table))
18398 else if (unformat (input, "bd_id %d", &dp_table))
18403 else if (unformat (input, "vni %d", &vni))
18411 if (action_set == 0)
18413 errmsg ("Action not set");
18416 if (dp_table_set == 0 || vni_set == 0)
18418 errmsg ("vni and dp_table must be set");
18422 /* Construct the API message */
18423 M (GPE_ADD_DEL_IFACE, mp);
18425 mp->is_add = is_add;
18426 mp->dp_table = clib_host_to_net_u32 (dp_table);
18428 mp->vni = clib_host_to_net_u32 (vni);
18433 /* Wait for a reply... */
18439 api_one_map_register_fallback_threshold (vat_main_t * vam)
18441 unformat_input_t *input = vam->input;
18442 vl_api_one_map_register_fallback_threshold_t *mp;
18447 /* Parse args required to build the message */
18448 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18450 if (unformat (input, "%u", &value))
18454 clib_warning ("parse error '%U'", format_unformat_error, input);
18461 errmsg ("fallback threshold value is missing!");
18465 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18466 mp->value = clib_host_to_net_u32 (value);
18471 /* Wait for a reply... */
18477 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
18479 vl_api_show_one_map_register_fallback_threshold_t *mp;
18482 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
18487 /* Wait for a reply... */
18493 unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
18495 u32 *proto = va_arg (*args, u32 *);
18497 if (unformat (input, "udp"))
18499 else if (unformat (input, "api"))
18508 api_one_set_transport_protocol (vat_main_t * vam)
18510 unformat_input_t *input = vam->input;
18511 vl_api_one_set_transport_protocol_t *mp;
18516 /* Parse args required to build the message */
18517 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18519 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
18523 clib_warning ("parse error '%U'", format_unformat_error, input);
18530 errmsg ("Transport protocol missing!");
18534 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
18535 mp->protocol = (u8) protocol;
18540 /* Wait for a reply... */
18546 api_one_get_transport_protocol (vat_main_t * vam)
18548 vl_api_one_get_transport_protocol_t *mp;
18551 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
18556 /* Wait for a reply... */
18562 api_one_map_register_set_ttl (vat_main_t * vam)
18564 unformat_input_t *input = vam->input;
18565 vl_api_one_map_register_set_ttl_t *mp;
18570 /* Parse args required to build the message */
18571 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18573 if (unformat (input, "%u", &ttl))
18577 clib_warning ("parse error '%U'", format_unformat_error, input);
18584 errmsg ("TTL value missing!");
18588 M (ONE_MAP_REGISTER_SET_TTL, mp);
18589 mp->ttl = clib_host_to_net_u32 (ttl);
18594 /* Wait for a reply... */
18600 api_show_one_map_register_ttl (vat_main_t * vam)
18602 vl_api_show_one_map_register_ttl_t *mp;
18605 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
18610 /* Wait for a reply... */
18616 * Add/del map request itr rlocs from ONE control plane and updates
18618 * @param vam vpp API test context
18619 * @return return code
18622 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
18624 unformat_input_t *input = vam->input;
18625 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
18626 u8 *locator_set_name = 0;
18627 u8 locator_set_name_set = 0;
18631 /* Parse args required to build the message */
18632 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18634 if (unformat (input, "del"))
18638 else if (unformat (input, "%_%v%_", &locator_set_name))
18640 locator_set_name_set = 1;
18644 clib_warning ("parse error '%U'", format_unformat_error, input);
18649 if (is_add && !locator_set_name_set)
18651 errmsg ("itr-rloc is not set!");
18655 if (is_add && vec_len (locator_set_name) > 64)
18657 errmsg ("itr-rloc locator-set name too long");
18658 vec_free (locator_set_name);
18662 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
18663 mp->is_add = is_add;
18666 clib_memcpy (mp->locator_set_name, locator_set_name,
18667 vec_len (locator_set_name));
18671 clib_memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
18673 vec_free (locator_set_name);
18678 /* Wait for a reply... */
18683 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
18686 api_one_locator_dump (vat_main_t * vam)
18688 unformat_input_t *input = vam->input;
18689 vl_api_one_locator_dump_t *mp;
18690 vl_api_control_ping_t *mp_ping;
18691 u8 is_index_set = 0, is_name_set = 0;
18696 /* Parse args required to build the message */
18697 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18699 if (unformat (input, "ls_name %_%v%_", &ls_name))
18703 else if (unformat (input, "ls_index %d", &ls_index))
18709 errmsg ("parse error '%U'", format_unformat_error, input);
18714 if (!is_index_set && !is_name_set)
18716 errmsg ("error: expected one of index or name!");
18720 if (is_index_set && is_name_set)
18722 errmsg ("error: only one param expected!");
18726 if (vec_len (ls_name) > 62)
18728 errmsg ("error: locator set name too long!");
18732 if (!vam->json_output)
18734 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
18737 M (ONE_LOCATOR_DUMP, mp);
18738 mp->is_index_set = is_index_set;
18741 mp->ls_index = clib_host_to_net_u32 (ls_index);
18744 vec_add1 (ls_name, 0);
18745 strncpy ((char *) mp->ls_name, (char *) ls_name,
18746 sizeof (mp->ls_name) - 1);
18752 /* Use a control ping for synchronization */
18753 MPING (CONTROL_PING, mp_ping);
18756 /* Wait for a reply... */
18761 #define api_lisp_locator_dump api_one_locator_dump
18764 api_one_locator_set_dump (vat_main_t * vam)
18766 vl_api_one_locator_set_dump_t *mp;
18767 vl_api_control_ping_t *mp_ping;
18768 unformat_input_t *input = vam->input;
18772 /* Parse args required to build the message */
18773 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18775 if (unformat (input, "local"))
18779 else if (unformat (input, "remote"))
18785 errmsg ("parse error '%U'", format_unformat_error, input);
18790 if (!vam->json_output)
18792 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
18795 M (ONE_LOCATOR_SET_DUMP, mp);
18797 mp->filter = filter;
18802 /* Use a control ping for synchronization */
18803 MPING (CONTROL_PING, mp_ping);
18806 /* Wait for a reply... */
18811 #define api_lisp_locator_set_dump api_one_locator_set_dump
18814 api_one_eid_table_map_dump (vat_main_t * vam)
18818 unformat_input_t *input = vam->input;
18819 vl_api_one_eid_table_map_dump_t *mp;
18820 vl_api_control_ping_t *mp_ping;
18823 /* Parse args required to build the message */
18824 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18826 if (unformat (input, "l2"))
18831 else if (unformat (input, "l3"))
18838 errmsg ("parse error '%U'", format_unformat_error, input);
18845 errmsg ("expected one of 'l2' or 'l3' parameter!");
18849 if (!vam->json_output)
18851 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
18854 M (ONE_EID_TABLE_MAP_DUMP, mp);
18860 /* Use a control ping for synchronization */
18861 MPING (CONTROL_PING, mp_ping);
18864 /* Wait for a reply... */
18869 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
18872 api_one_eid_table_vni_dump (vat_main_t * vam)
18874 vl_api_one_eid_table_vni_dump_t *mp;
18875 vl_api_control_ping_t *mp_ping;
18878 if (!vam->json_output)
18880 print (vam->ofp, "VNI");
18883 M (ONE_EID_TABLE_VNI_DUMP, mp);
18888 /* Use a control ping for synchronization */
18889 MPING (CONTROL_PING, mp_ping);
18892 /* Wait for a reply... */
18897 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
18900 api_one_eid_table_dump (vat_main_t * vam)
18902 unformat_input_t *i = vam->input;
18903 vl_api_one_eid_table_dump_t *mp;
18904 vl_api_control_ping_t *mp_ping;
18905 struct in_addr ip4;
18906 struct in6_addr ip6;
18908 u8 eid_type = ~0, eid_set = 0;
18909 u32 prefix_length = ~0, t, vni = 0;
18912 lisp_nsh_api_t nsh;
18914 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18916 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
18922 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
18928 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
18933 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
18938 else if (unformat (i, "vni %d", &t))
18942 else if (unformat (i, "local"))
18946 else if (unformat (i, "remote"))
18952 errmsg ("parse error '%U'", format_unformat_error, i);
18957 if (!vam->json_output)
18959 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
18960 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
18963 M (ONE_EID_TABLE_DUMP, mp);
18965 mp->filter = filter;
18969 mp->vni = htonl (vni);
18970 mp->eid_type = eid_type;
18974 mp->prefix_length = prefix_length;
18975 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
18978 mp->prefix_length = prefix_length;
18979 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
18982 clib_memcpy (mp->eid, mac, sizeof (mac));
18985 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
18988 errmsg ("unknown EID type %d!", eid_type);
18996 /* Use a control ping for synchronization */
18997 MPING (CONTROL_PING, mp_ping);
19000 /* Wait for a reply... */
19005 #define api_lisp_eid_table_dump api_one_eid_table_dump
19008 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
19010 unformat_input_t *i = vam->input;
19011 vl_api_gpe_fwd_entries_get_t *mp;
19016 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19018 if (unformat (i, "vni %d", &vni))
19024 errmsg ("parse error '%U'", format_unformat_error, i);
19031 errmsg ("vni not set!");
19035 if (!vam->json_output)
19037 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
19041 M (GPE_FWD_ENTRIES_GET, mp);
19042 mp->vni = clib_host_to_net_u32 (vni);
19047 /* Wait for a reply... */
19052 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
19053 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
19054 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
19055 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
19056 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
19057 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
19058 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
19059 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
19062 api_one_adjacencies_get (vat_main_t * vam)
19064 unformat_input_t *i = vam->input;
19065 vl_api_one_adjacencies_get_t *mp;
19070 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19072 if (unformat (i, "vni %d", &vni))
19078 errmsg ("parse error '%U'", format_unformat_error, i);
19085 errmsg ("vni not set!");
19089 if (!vam->json_output)
19091 print (vam->ofp, "%s %40s", "leid", "reid");
19094 M (ONE_ADJACENCIES_GET, mp);
19095 mp->vni = clib_host_to_net_u32 (vni);
19100 /* Wait for a reply... */
19105 #define api_lisp_adjacencies_get api_one_adjacencies_get
19108 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
19110 unformat_input_t *i = vam->input;
19111 vl_api_gpe_native_fwd_rpaths_get_t *mp;
19113 u8 ip_family_set = 0, is_ip4 = 1;
19115 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19117 if (unformat (i, "ip4"))
19122 else if (unformat (i, "ip6"))
19129 errmsg ("parse error '%U'", format_unformat_error, i);
19134 if (!ip_family_set)
19136 errmsg ("ip family not set!");
19140 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
19141 mp->is_ip4 = is_ip4;
19146 /* Wait for a reply... */
19152 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
19154 vl_api_gpe_fwd_entry_vnis_get_t *mp;
19157 if (!vam->json_output)
19159 print (vam->ofp, "VNIs");
19162 M (GPE_FWD_ENTRY_VNIS_GET, mp);
19167 /* Wait for a reply... */
19173 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
19175 unformat_input_t *i = vam->input;
19176 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
19178 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
19179 struct in_addr ip4;
19180 struct in6_addr ip6;
19181 u32 table_id = 0, nh_sw_if_index = ~0;
19183 clib_memset (&ip4, 0, sizeof (ip4));
19184 clib_memset (&ip6, 0, sizeof (ip6));
19186 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19188 if (unformat (i, "del"))
19190 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
19191 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19196 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
19197 api_unformat_sw_if_index, vam, &nh_sw_if_index))
19202 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
19206 nh_sw_if_index = ~0;
19208 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
19212 nh_sw_if_index = ~0;
19214 else if (unformat (i, "table %d", &table_id))
19218 errmsg ("parse error '%U'", format_unformat_error, i);
19225 errmsg ("nh addr not set!");
19229 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
19230 mp->is_add = is_add;
19231 mp->table_id = clib_host_to_net_u32 (table_id);
19232 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
19233 mp->is_ip4 = is_ip4;
19235 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
19237 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
19242 /* Wait for a reply... */
19248 api_one_map_server_dump (vat_main_t * vam)
19250 vl_api_one_map_server_dump_t *mp;
19251 vl_api_control_ping_t *mp_ping;
19254 if (!vam->json_output)
19256 print (vam->ofp, "%=20s", "Map server");
19259 M (ONE_MAP_SERVER_DUMP, mp);
19263 /* Use a control ping for synchronization */
19264 MPING (CONTROL_PING, mp_ping);
19267 /* Wait for a reply... */
19272 #define api_lisp_map_server_dump api_one_map_server_dump
19275 api_one_map_resolver_dump (vat_main_t * vam)
19277 vl_api_one_map_resolver_dump_t *mp;
19278 vl_api_control_ping_t *mp_ping;
19281 if (!vam->json_output)
19283 print (vam->ofp, "%=20s", "Map resolver");
19286 M (ONE_MAP_RESOLVER_DUMP, mp);
19290 /* Use a control ping for synchronization */
19291 MPING (CONTROL_PING, mp_ping);
19294 /* Wait for a reply... */
19299 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
19302 api_one_stats_flush (vat_main_t * vam)
19304 vl_api_one_stats_flush_t *mp;
19307 M (ONE_STATS_FLUSH, mp);
19314 api_one_stats_dump (vat_main_t * vam)
19316 vl_api_one_stats_dump_t *mp;
19317 vl_api_control_ping_t *mp_ping;
19320 M (ONE_STATS_DUMP, mp);
19324 /* Use a control ping for synchronization */
19325 MPING (CONTROL_PING, mp_ping);
19328 /* Wait for a reply... */
19334 api_show_one_status (vat_main_t * vam)
19336 vl_api_show_one_status_t *mp;
19339 if (!vam->json_output)
19341 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
19344 M (SHOW_ONE_STATUS, mp);
19347 /* Wait for a reply... */
19352 #define api_show_lisp_status api_show_one_status
19355 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
19357 vl_api_gpe_fwd_entry_path_dump_t *mp;
19358 vl_api_control_ping_t *mp_ping;
19359 unformat_input_t *i = vam->input;
19360 u32 fwd_entry_index = ~0;
19363 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19365 if (unformat (i, "index %d", &fwd_entry_index))
19371 if (~0 == fwd_entry_index)
19373 errmsg ("no index specified!");
19377 if (!vam->json_output)
19379 print (vam->ofp, "first line");
19382 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
19386 /* Use a control ping for synchronization */
19387 MPING (CONTROL_PING, mp_ping);
19390 /* Wait for a reply... */
19396 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
19398 vl_api_one_get_map_request_itr_rlocs_t *mp;
19401 if (!vam->json_output)
19403 print (vam->ofp, "%=20s", "itr-rlocs:");
19406 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
19409 /* Wait for a reply... */
19414 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
19417 api_af_packet_create (vat_main_t * vam)
19419 unformat_input_t *i = vam->input;
19420 vl_api_af_packet_create_t *mp;
19421 u8 *host_if_name = 0;
19423 u8 random_hw_addr = 1;
19426 clib_memset (hw_addr, 0, sizeof (hw_addr));
19428 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19430 if (unformat (i, "name %s", &host_if_name))
19431 vec_add1 (host_if_name, 0);
19432 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19433 random_hw_addr = 0;
19438 if (!vec_len (host_if_name))
19440 errmsg ("host-interface name must be specified");
19444 if (vec_len (host_if_name) > 64)
19446 errmsg ("host-interface name too long");
19450 M (AF_PACKET_CREATE, mp);
19452 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19453 clib_memcpy (mp->hw_addr, hw_addr, 6);
19454 mp->use_random_hw_addr = random_hw_addr;
19455 vec_free (host_if_name);
19463 fprintf (vam->ofp ? vam->ofp : stderr,
19464 " new sw_if_index = %d\n", vam->sw_if_index);
19471 api_af_packet_delete (vat_main_t * vam)
19473 unformat_input_t *i = vam->input;
19474 vl_api_af_packet_delete_t *mp;
19475 u8 *host_if_name = 0;
19478 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19480 if (unformat (i, "name %s", &host_if_name))
19481 vec_add1 (host_if_name, 0);
19486 if (!vec_len (host_if_name))
19488 errmsg ("host-interface name must be specified");
19492 if (vec_len (host_if_name) > 64)
19494 errmsg ("host-interface name too long");
19498 M (AF_PACKET_DELETE, mp);
19500 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
19501 vec_free (host_if_name);
19508 static void vl_api_af_packet_details_t_handler
19509 (vl_api_af_packet_details_t * mp)
19511 vat_main_t *vam = &vat_main;
19513 print (vam->ofp, "%-16s %d",
19514 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
19517 static void vl_api_af_packet_details_t_handler_json
19518 (vl_api_af_packet_details_t * mp)
19520 vat_main_t *vam = &vat_main;
19521 vat_json_node_t *node = NULL;
19523 if (VAT_JSON_ARRAY != vam->json_tree.type)
19525 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19526 vat_json_init_array (&vam->json_tree);
19528 node = vat_json_array_add (&vam->json_tree);
19530 vat_json_init_object (node);
19531 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
19532 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
19536 api_af_packet_dump (vat_main_t * vam)
19538 vl_api_af_packet_dump_t *mp;
19539 vl_api_control_ping_t *mp_ping;
19542 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
19543 /* Get list of tap interfaces */
19544 M (AF_PACKET_DUMP, mp);
19547 /* Use a control ping for synchronization */
19548 MPING (CONTROL_PING, mp_ping);
19556 api_policer_add_del (vat_main_t * vam)
19558 unformat_input_t *i = vam->input;
19559 vl_api_policer_add_del_t *mp;
19569 u8 color_aware = 0;
19570 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
19573 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
19574 conform_action.dscp = 0;
19575 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
19576 exceed_action.dscp = 0;
19577 violate_action.action_type = SSE2_QOS_ACTION_DROP;
19578 violate_action.dscp = 0;
19580 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19582 if (unformat (i, "del"))
19584 else if (unformat (i, "name %s", &name))
19585 vec_add1 (name, 0);
19586 else if (unformat (i, "cir %u", &cir))
19588 else if (unformat (i, "eir %u", &eir))
19590 else if (unformat (i, "cb %u", &cb))
19592 else if (unformat (i, "eb %u", &eb))
19594 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
19597 else if (unformat (i, "round_type %U", unformat_policer_round_type,
19600 else if (unformat (i, "type %U", unformat_policer_type, &type))
19602 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
19605 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
19608 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
19611 else if (unformat (i, "color-aware"))
19617 if (!vec_len (name))
19619 errmsg ("policer name must be specified");
19623 if (vec_len (name) > 64)
19625 errmsg ("policer name too long");
19629 M (POLICER_ADD_DEL, mp);
19631 clib_memcpy (mp->name, name, vec_len (name));
19633 mp->is_add = is_add;
19634 mp->cir = ntohl (cir);
19635 mp->eir = ntohl (eir);
19636 mp->cb = clib_net_to_host_u64 (cb);
19637 mp->eb = clib_net_to_host_u64 (eb);
19638 mp->rate_type = rate_type;
19639 mp->round_type = round_type;
19641 mp->conform_action_type = conform_action.action_type;
19642 mp->conform_dscp = conform_action.dscp;
19643 mp->exceed_action_type = exceed_action.action_type;
19644 mp->exceed_dscp = exceed_action.dscp;
19645 mp->violate_action_type = violate_action.action_type;
19646 mp->violate_dscp = violate_action.dscp;
19647 mp->color_aware = color_aware;
19655 api_policer_dump (vat_main_t * vam)
19657 unformat_input_t *i = vam->input;
19658 vl_api_policer_dump_t *mp;
19659 vl_api_control_ping_t *mp_ping;
19660 u8 *match_name = 0;
19661 u8 match_name_valid = 0;
19664 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19666 if (unformat (i, "name %s", &match_name))
19668 vec_add1 (match_name, 0);
19669 match_name_valid = 1;
19675 M (POLICER_DUMP, mp);
19676 mp->match_name_valid = match_name_valid;
19677 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
19678 vec_free (match_name);
19682 /* Use a control ping for synchronization */
19683 MPING (CONTROL_PING, mp_ping);
19686 /* Wait for a reply... */
19692 api_policer_classify_set_interface (vat_main_t * vam)
19694 unformat_input_t *i = vam->input;
19695 vl_api_policer_classify_set_interface_t *mp;
19697 int sw_if_index_set;
19698 u32 ip4_table_index = ~0;
19699 u32 ip6_table_index = ~0;
19700 u32 l2_table_index = ~0;
19704 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19706 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19707 sw_if_index_set = 1;
19708 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19709 sw_if_index_set = 1;
19710 else if (unformat (i, "del"))
19712 else if (unformat (i, "ip4-table %d", &ip4_table_index))
19714 else if (unformat (i, "ip6-table %d", &ip6_table_index))
19716 else if (unformat (i, "l2-table %d", &l2_table_index))
19720 clib_warning ("parse error '%U'", format_unformat_error, i);
19725 if (sw_if_index_set == 0)
19727 errmsg ("missing interface name or sw_if_index");
19731 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
19733 mp->sw_if_index = ntohl (sw_if_index);
19734 mp->ip4_table_index = ntohl (ip4_table_index);
19735 mp->ip6_table_index = ntohl (ip6_table_index);
19736 mp->l2_table_index = ntohl (l2_table_index);
19737 mp->is_add = is_add;
19745 api_policer_classify_dump (vat_main_t * vam)
19747 unformat_input_t *i = vam->input;
19748 vl_api_policer_classify_dump_t *mp;
19749 vl_api_control_ping_t *mp_ping;
19750 u8 type = POLICER_CLASSIFY_N_TABLES;
19753 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
19757 errmsg ("classify table type must be specified");
19761 if (!vam->json_output)
19763 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
19766 M (POLICER_CLASSIFY_DUMP, mp);
19771 /* Use a control ping for synchronization */
19772 MPING (CONTROL_PING, mp_ping);
19775 /* Wait for a reply... */
19781 api_netmap_create (vat_main_t * vam)
19783 unformat_input_t *i = vam->input;
19784 vl_api_netmap_create_t *mp;
19787 u8 random_hw_addr = 1;
19792 clib_memset (hw_addr, 0, sizeof (hw_addr));
19794 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19796 if (unformat (i, "name %s", &if_name))
19797 vec_add1 (if_name, 0);
19798 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19799 random_hw_addr = 0;
19800 else if (unformat (i, "pipe"))
19802 else if (unformat (i, "master"))
19804 else if (unformat (i, "slave"))
19810 if (!vec_len (if_name))
19812 errmsg ("interface name must be specified");
19816 if (vec_len (if_name) > 64)
19818 errmsg ("interface name too long");
19822 M (NETMAP_CREATE, mp);
19824 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19825 clib_memcpy (mp->hw_addr, hw_addr, 6);
19826 mp->use_random_hw_addr = random_hw_addr;
19827 mp->is_pipe = is_pipe;
19828 mp->is_master = is_master;
19829 vec_free (if_name);
19837 api_netmap_delete (vat_main_t * vam)
19839 unformat_input_t *i = vam->input;
19840 vl_api_netmap_delete_t *mp;
19844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19846 if (unformat (i, "name %s", &if_name))
19847 vec_add1 (if_name, 0);
19852 if (!vec_len (if_name))
19854 errmsg ("interface name must be specified");
19858 if (vec_len (if_name) > 64)
19860 errmsg ("interface name too long");
19864 M (NETMAP_DELETE, mp);
19866 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19867 vec_free (if_name);
19875 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
19877 if (fp->afi == IP46_TYPE_IP6)
19879 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19880 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19881 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19882 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19883 format_ip6_address, fp->next_hop);
19884 else if (fp->afi == IP46_TYPE_IP4)
19886 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19887 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19888 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19889 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19890 format_ip4_address, fp->next_hop);
19894 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
19895 vl_api_fib_path_t * fp)
19897 struct in_addr ip4;
19898 struct in6_addr ip6;
19900 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19901 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19902 vat_json_object_add_uint (node, "is_local", fp->is_local);
19903 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19904 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19905 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19906 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19907 if (fp->afi == IP46_TYPE_IP4)
19909 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19910 vat_json_object_add_ip4 (node, "next_hop", ip4);
19912 else if (fp->afi == IP46_TYPE_IP6)
19914 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19915 vat_json_object_add_ip6 (node, "next_hop", ip6);
19920 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
19922 vat_main_t *vam = &vat_main;
19923 int count = ntohl (mp->mt_count);
19924 vl_api_fib_path_t *fp;
19927 print (vam->ofp, "[%d]: sw_if_index %d via:",
19928 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
19930 for (i = 0; i < count; i++)
19932 vl_api_mpls_fib_path_print (vam, fp);
19936 print (vam->ofp, "");
19939 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
19940 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
19943 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
19945 vat_main_t *vam = &vat_main;
19946 vat_json_node_t *node = NULL;
19947 int count = ntohl (mp->mt_count);
19948 vl_api_fib_path_t *fp;
19951 if (VAT_JSON_ARRAY != vam->json_tree.type)
19953 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19954 vat_json_init_array (&vam->json_tree);
19956 node = vat_json_array_add (&vam->json_tree);
19958 vat_json_init_object (node);
19959 vat_json_object_add_uint (node, "tunnel_index",
19960 ntohl (mp->mt_tunnel_index));
19961 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
19963 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
19966 for (i = 0; i < count; i++)
19968 vl_api_mpls_fib_path_json_print (node, fp);
19974 api_mpls_tunnel_dump (vat_main_t * vam)
19976 vl_api_mpls_tunnel_dump_t *mp;
19977 vl_api_control_ping_t *mp_ping;
19978 u32 sw_if_index = ~0;
19981 /* Parse args required to build the message */
19982 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
19984 if (unformat (vam->input, "sw_if_index %d", &sw_if_index))
19988 print (vam->ofp, " sw_if_index %d", sw_if_index);
19990 M (MPLS_TUNNEL_DUMP, mp);
19991 mp->sw_if_index = htonl (sw_if_index);
19994 /* Use a control ping for synchronization */
19995 MPING (CONTROL_PING, mp_ping);
20002 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
20003 #define vl_api_mpls_fib_details_t_print vl_noop_handler
20007 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
20009 vat_main_t *vam = &vat_main;
20010 int count = ntohl (mp->count);
20011 vl_api_fib_path_t *fp;
20015 "table-id %d, label %u, ess_bit %u",
20016 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
20018 for (i = 0; i < count; i++)
20020 vl_api_mpls_fib_path_print (vam, fp);
20025 static void vl_api_mpls_fib_details_t_handler_json
20026 (vl_api_mpls_fib_details_t * mp)
20028 vat_main_t *vam = &vat_main;
20029 int count = ntohl (mp->count);
20030 vat_json_node_t *node = NULL;
20031 vl_api_fib_path_t *fp;
20034 if (VAT_JSON_ARRAY != vam->json_tree.type)
20036 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20037 vat_json_init_array (&vam->json_tree);
20039 node = vat_json_array_add (&vam->json_tree);
20041 vat_json_init_object (node);
20042 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20043 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
20044 vat_json_object_add_uint (node, "label", ntohl (mp->label));
20045 vat_json_object_add_uint (node, "path_count", count);
20047 for (i = 0; i < count; i++)
20049 vl_api_mpls_fib_path_json_print (node, fp);
20055 api_mpls_fib_dump (vat_main_t * vam)
20057 vl_api_mpls_fib_dump_t *mp;
20058 vl_api_control_ping_t *mp_ping;
20061 M (MPLS_FIB_DUMP, mp);
20064 /* Use a control ping for synchronization */
20065 MPING (CONTROL_PING, mp_ping);
20072 #define vl_api_ip_fib_details_t_endian vl_noop_handler
20073 #define vl_api_ip_fib_details_t_print vl_noop_handler
20076 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
20078 vat_main_t *vam = &vat_main;
20079 int count = ntohl (mp->count);
20080 vl_api_fib_path_t *fp;
20084 "table-id %d, prefix %U/%d stats-index %d",
20085 ntohl (mp->table_id), format_ip4_address, mp->address,
20086 mp->address_length, ntohl (mp->stats_index));
20088 for (i = 0; i < count; i++)
20090 if (fp->afi == IP46_TYPE_IP6)
20092 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20093 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20094 "next_hop_table %d",
20095 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20096 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20097 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
20098 else if (fp->afi == IP46_TYPE_IP4)
20100 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20101 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
20102 "next_hop_table %d",
20103 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20104 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20105 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
20110 static void vl_api_ip_fib_details_t_handler_json
20111 (vl_api_ip_fib_details_t * mp)
20113 vat_main_t *vam = &vat_main;
20114 int count = ntohl (mp->count);
20115 vat_json_node_t *node = NULL;
20116 struct in_addr ip4;
20117 struct in6_addr ip6;
20118 vl_api_fib_path_t *fp;
20121 if (VAT_JSON_ARRAY != vam->json_tree.type)
20123 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20124 vat_json_init_array (&vam->json_tree);
20126 node = vat_json_array_add (&vam->json_tree);
20128 vat_json_init_object (node);
20129 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20130 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
20131 vat_json_object_add_ip4 (node, "prefix", ip4);
20132 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20133 vat_json_object_add_uint (node, "path_count", count);
20135 for (i = 0; i < count; i++)
20137 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20138 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20139 vat_json_object_add_uint (node, "is_local", fp->is_local);
20140 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20141 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20142 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20143 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20144 if (fp->afi == IP46_TYPE_IP4)
20146 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20147 vat_json_object_add_ip4 (node, "next_hop", ip4);
20149 else if (fp->afi == IP46_TYPE_IP6)
20151 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20152 vat_json_object_add_ip6 (node, "next_hop", ip6);
20158 api_ip_fib_dump (vat_main_t * vam)
20160 vl_api_ip_fib_dump_t *mp;
20161 vl_api_control_ping_t *mp_ping;
20164 M (IP_FIB_DUMP, mp);
20167 /* Use a control ping for synchronization */
20168 MPING (CONTROL_PING, mp_ping);
20176 api_ip_mfib_dump (vat_main_t * vam)
20178 vl_api_ip_mfib_dump_t *mp;
20179 vl_api_control_ping_t *mp_ping;
20182 M (IP_MFIB_DUMP, mp);
20185 /* Use a control ping for synchronization */
20186 MPING (CONTROL_PING, mp_ping);
20193 static void vl_api_ip_neighbor_details_t_handler
20194 (vl_api_ip_neighbor_details_t * mp)
20196 vat_main_t *vam = &vat_main;
20198 print (vam->ofp, "%c %U %U",
20199 (mp->is_static) ? 'S' : 'D',
20200 format_ethernet_address, &mp->mac_address,
20201 (mp->is_ipv6) ? format_ip6_address : format_ip4_address,
20205 static void vl_api_ip_neighbor_details_t_handler_json
20206 (vl_api_ip_neighbor_details_t * mp)
20209 vat_main_t *vam = &vat_main;
20210 vat_json_node_t *node;
20211 struct in_addr ip4;
20212 struct in6_addr ip6;
20214 if (VAT_JSON_ARRAY != vam->json_tree.type)
20216 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20217 vat_json_init_array (&vam->json_tree);
20219 node = vat_json_array_add (&vam->json_tree);
20221 vat_json_init_object (node);
20222 vat_json_object_add_string_copy (node, "flag",
20223 (mp->is_static) ? (u8 *) "static" : (u8 *)
20226 vat_json_object_add_string_copy (node, "link_layer",
20227 format (0, "%U", format_ethernet_address,
20228 &mp->mac_address));
20232 clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6));
20233 vat_json_object_add_ip6 (node, "ip_address", ip6);
20237 clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4));
20238 vat_json_object_add_ip4 (node, "ip_address", ip4);
20243 api_ip_neighbor_dump (vat_main_t * vam)
20245 unformat_input_t *i = vam->input;
20246 vl_api_ip_neighbor_dump_t *mp;
20247 vl_api_control_ping_t *mp_ping;
20249 u32 sw_if_index = ~0;
20252 /* Parse args required to build the message */
20253 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20255 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20257 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20259 else if (unformat (i, "ip6"))
20265 if (sw_if_index == ~0)
20267 errmsg ("missing interface name or sw_if_index");
20271 M (IP_NEIGHBOR_DUMP, mp);
20272 mp->is_ipv6 = (u8) is_ipv6;
20273 mp->sw_if_index = ntohl (sw_if_index);
20276 /* Use a control ping for synchronization */
20277 MPING (CONTROL_PING, mp_ping);
20284 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
20285 #define vl_api_ip6_fib_details_t_print vl_noop_handler
20288 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
20290 vat_main_t *vam = &vat_main;
20291 int count = ntohl (mp->count);
20292 vl_api_fib_path_t *fp;
20296 "table-id %d, prefix %U/%d stats-index %d",
20297 ntohl (mp->table_id), format_ip6_address, mp->address,
20298 mp->address_length, ntohl (mp->stats_index));
20300 for (i = 0; i < count; i++)
20302 if (fp->afi == IP46_TYPE_IP6)
20304 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20305 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20306 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20307 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20308 format_ip6_address, fp->next_hop);
20309 else if (fp->afi == IP46_TYPE_IP4)
20311 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
20312 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
20313 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
20314 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
20315 format_ip4_address, fp->next_hop);
20320 static void vl_api_ip6_fib_details_t_handler_json
20321 (vl_api_ip6_fib_details_t * mp)
20323 vat_main_t *vam = &vat_main;
20324 int count = ntohl (mp->count);
20325 vat_json_node_t *node = NULL;
20326 struct in_addr ip4;
20327 struct in6_addr ip6;
20328 vl_api_fib_path_t *fp;
20331 if (VAT_JSON_ARRAY != vam->json_tree.type)
20333 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20334 vat_json_init_array (&vam->json_tree);
20336 node = vat_json_array_add (&vam->json_tree);
20338 vat_json_init_object (node);
20339 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
20340 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
20341 vat_json_object_add_ip6 (node, "prefix", ip6);
20342 vat_json_object_add_uint (node, "mask_length", mp->address_length);
20343 vat_json_object_add_uint (node, "path_count", count);
20345 for (i = 0; i < count; i++)
20347 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
20348 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
20349 vat_json_object_add_uint (node, "is_local", fp->is_local);
20350 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
20351 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
20352 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
20353 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
20354 if (fp->afi == IP46_TYPE_IP4)
20356 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
20357 vat_json_object_add_ip4 (node, "next_hop", ip4);
20359 else if (fp->afi == IP46_TYPE_IP6)
20361 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
20362 vat_json_object_add_ip6 (node, "next_hop", ip6);
20368 api_ip6_fib_dump (vat_main_t * vam)
20370 vl_api_ip6_fib_dump_t *mp;
20371 vl_api_control_ping_t *mp_ping;
20374 M (IP6_FIB_DUMP, mp);
20377 /* Use a control ping for synchronization */
20378 MPING (CONTROL_PING, mp_ping);
20386 api_ip6_mfib_dump (vat_main_t * vam)
20388 vl_api_ip6_mfib_dump_t *mp;
20389 vl_api_control_ping_t *mp_ping;
20392 M (IP6_MFIB_DUMP, mp);
20395 /* Use a control ping for synchronization */
20396 MPING (CONTROL_PING, mp_ping);
20404 api_classify_table_ids (vat_main_t * vam)
20406 vl_api_classify_table_ids_t *mp;
20409 /* Construct the API message */
20410 M (CLASSIFY_TABLE_IDS, mp);
20419 api_classify_table_by_interface (vat_main_t * vam)
20421 unformat_input_t *input = vam->input;
20422 vl_api_classify_table_by_interface_t *mp;
20424 u32 sw_if_index = ~0;
20426 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20428 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20430 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20435 if (sw_if_index == ~0)
20437 errmsg ("missing interface name or sw_if_index");
20441 /* Construct the API message */
20442 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
20444 mp->sw_if_index = ntohl (sw_if_index);
20452 api_classify_table_info (vat_main_t * vam)
20454 unformat_input_t *input = vam->input;
20455 vl_api_classify_table_info_t *mp;
20459 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20461 if (unformat (input, "table_id %d", &table_id))
20466 if (table_id == ~0)
20468 errmsg ("missing table id");
20472 /* Construct the API message */
20473 M (CLASSIFY_TABLE_INFO, mp);
20475 mp->table_id = ntohl (table_id);
20483 api_classify_session_dump (vat_main_t * vam)
20485 unformat_input_t *input = vam->input;
20486 vl_api_classify_session_dump_t *mp;
20487 vl_api_control_ping_t *mp_ping;
20491 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20493 if (unformat (input, "table_id %d", &table_id))
20498 if (table_id == ~0)
20500 errmsg ("missing table id");
20504 /* Construct the API message */
20505 M (CLASSIFY_SESSION_DUMP, mp);
20507 mp->table_id = ntohl (table_id);
20510 /* Use a control ping for synchronization */
20511 MPING (CONTROL_PING, mp_ping);
20519 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
20521 vat_main_t *vam = &vat_main;
20523 print (vam->ofp, "collector_address %U, collector_port %d, "
20524 "src_address %U, vrf_id %d, path_mtu %u, "
20525 "template_interval %u, udp_checksum %d",
20526 format_ip4_address, mp->collector_address,
20527 ntohs (mp->collector_port),
20528 format_ip4_address, mp->src_address,
20529 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
20530 ntohl (mp->template_interval), mp->udp_checksum);
20533 vam->result_ready = 1;
20537 vl_api_ipfix_exporter_details_t_handler_json
20538 (vl_api_ipfix_exporter_details_t * mp)
20540 vat_main_t *vam = &vat_main;
20541 vat_json_node_t node;
20542 struct in_addr collector_address;
20543 struct in_addr src_address;
20545 vat_json_init_object (&node);
20546 clib_memcpy (&collector_address, &mp->collector_address,
20547 sizeof (collector_address));
20548 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
20549 vat_json_object_add_uint (&node, "collector_port",
20550 ntohs (mp->collector_port));
20551 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
20552 vat_json_object_add_ip4 (&node, "src_address", src_address);
20553 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
20554 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
20555 vat_json_object_add_uint (&node, "template_interval",
20556 ntohl (mp->template_interval));
20557 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
20559 vat_json_print (vam->ofp, &node);
20560 vat_json_free (&node);
20562 vam->result_ready = 1;
20566 api_ipfix_exporter_dump (vat_main_t * vam)
20568 vl_api_ipfix_exporter_dump_t *mp;
20571 /* Construct the API message */
20572 M (IPFIX_EXPORTER_DUMP, mp);
20581 api_ipfix_classify_stream_dump (vat_main_t * vam)
20583 vl_api_ipfix_classify_stream_dump_t *mp;
20586 /* Construct the API message */
20587 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
20598 vl_api_ipfix_classify_stream_details_t_handler
20599 (vl_api_ipfix_classify_stream_details_t * mp)
20601 vat_main_t *vam = &vat_main;
20602 print (vam->ofp, "domain_id %d, src_port %d",
20603 ntohl (mp->domain_id), ntohs (mp->src_port));
20605 vam->result_ready = 1;
20609 vl_api_ipfix_classify_stream_details_t_handler_json
20610 (vl_api_ipfix_classify_stream_details_t * mp)
20612 vat_main_t *vam = &vat_main;
20613 vat_json_node_t node;
20615 vat_json_init_object (&node);
20616 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
20617 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
20619 vat_json_print (vam->ofp, &node);
20620 vat_json_free (&node);
20622 vam->result_ready = 1;
20626 api_ipfix_classify_table_dump (vat_main_t * vam)
20628 vl_api_ipfix_classify_table_dump_t *mp;
20629 vl_api_control_ping_t *mp_ping;
20632 if (!vam->json_output)
20634 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
20635 "transport_protocol");
20638 /* Construct the API message */
20639 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
20644 /* Use a control ping for synchronization */
20645 MPING (CONTROL_PING, mp_ping);
20653 vl_api_ipfix_classify_table_details_t_handler
20654 (vl_api_ipfix_classify_table_details_t * mp)
20656 vat_main_t *vam = &vat_main;
20657 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
20658 mp->transport_protocol);
20662 vl_api_ipfix_classify_table_details_t_handler_json
20663 (vl_api_ipfix_classify_table_details_t * mp)
20665 vat_json_node_t *node = NULL;
20666 vat_main_t *vam = &vat_main;
20668 if (VAT_JSON_ARRAY != vam->json_tree.type)
20670 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20671 vat_json_init_array (&vam->json_tree);
20674 node = vat_json_array_add (&vam->json_tree);
20675 vat_json_init_object (node);
20677 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
20678 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
20679 vat_json_object_add_uint (node, "transport_protocol",
20680 mp->transport_protocol);
20684 api_sw_interface_span_enable_disable (vat_main_t * vam)
20686 unformat_input_t *i = vam->input;
20687 vl_api_sw_interface_span_enable_disable_t *mp;
20688 u32 src_sw_if_index = ~0;
20689 u32 dst_sw_if_index = ~0;
20694 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20697 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
20699 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
20703 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
20705 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
20707 else if (unformat (i, "disable"))
20709 else if (unformat (i, "rx"))
20711 else if (unformat (i, "tx"))
20713 else if (unformat (i, "both"))
20715 else if (unformat (i, "l2"))
20721 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
20723 mp->sw_if_index_from = htonl (src_sw_if_index);
20724 mp->sw_if_index_to = htonl (dst_sw_if_index);
20734 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
20737 vat_main_t *vam = &vat_main;
20738 u8 *sw_if_from_name = 0;
20739 u8 *sw_if_to_name = 0;
20740 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
20741 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
20742 char *states[] = { "none", "rx", "tx", "both" };
20746 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
20748 if ((u32) p->value[0] == sw_if_index_from)
20750 sw_if_from_name = (u8 *)(p->key);
20754 if ((u32) p->value[0] == sw_if_index_to)
20756 sw_if_to_name = (u8 *)(p->key);
20757 if (sw_if_from_name)
20762 print (vam->ofp, "%20s => %20s (%s) %s",
20763 sw_if_from_name, sw_if_to_name, states[mp->state],
20764 mp->is_l2 ? "l2" : "device");
20768 vl_api_sw_interface_span_details_t_handler_json
20769 (vl_api_sw_interface_span_details_t * mp)
20771 vat_main_t *vam = &vat_main;
20772 vat_json_node_t *node = NULL;
20773 u8 *sw_if_from_name = 0;
20774 u8 *sw_if_to_name = 0;
20775 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
20776 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
20780 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
20782 if ((u32) p->value[0] == sw_if_index_from)
20784 sw_if_from_name = (u8 *)(p->key);
20788 if ((u32) p->value[0] == sw_if_index_to)
20790 sw_if_to_name = (u8 *)(p->key);
20791 if (sw_if_from_name)
20797 if (VAT_JSON_ARRAY != vam->json_tree.type)
20799 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20800 vat_json_init_array (&vam->json_tree);
20802 node = vat_json_array_add (&vam->json_tree);
20804 vat_json_init_object (node);
20805 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
20806 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
20807 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
20808 if (0 != sw_if_to_name)
20810 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
20812 vat_json_object_add_uint (node, "state", mp->state);
20813 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
20817 api_sw_interface_span_dump (vat_main_t * vam)
20819 unformat_input_t *input = vam->input;
20820 vl_api_sw_interface_span_dump_t *mp;
20821 vl_api_control_ping_t *mp_ping;
20825 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20827 if (unformat (input, "l2"))
20833 M (SW_INTERFACE_SPAN_DUMP, mp);
20837 /* Use a control ping for synchronization */
20838 MPING (CONTROL_PING, mp_ping);
20846 api_pg_create_interface (vat_main_t * vam)
20848 unformat_input_t *input = vam->input;
20849 vl_api_pg_create_interface_t *mp;
20853 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20855 if (unformat (input, "if_id %d", &if_id))
20862 errmsg ("missing pg interface index");
20866 /* Construct the API message */
20867 M (PG_CREATE_INTERFACE, mp);
20869 mp->interface_id = ntohl (if_id);
20877 api_pg_capture (vat_main_t * vam)
20879 unformat_input_t *input = vam->input;
20880 vl_api_pg_capture_t *mp;
20885 u8 pcap_file_set = 0;
20888 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20890 if (unformat (input, "if_id %d", &if_id))
20892 else if (unformat (input, "pcap %s", &pcap_file))
20894 else if (unformat (input, "count %d", &count))
20896 else if (unformat (input, "disable"))
20903 errmsg ("missing pg interface index");
20906 if (pcap_file_set > 0)
20908 if (vec_len (pcap_file) > 255)
20910 errmsg ("pcap file name is too long");
20915 u32 name_len = vec_len (pcap_file);
20916 /* Construct the API message */
20917 M (PG_CAPTURE, mp);
20919 mp->interface_id = ntohl (if_id);
20920 mp->is_enabled = enable;
20921 mp->count = ntohl (count);
20922 mp->pcap_name_length = ntohl (name_len);
20923 if (pcap_file_set != 0)
20925 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
20927 vec_free (pcap_file);
20935 api_pg_enable_disable (vat_main_t * vam)
20937 unformat_input_t *input = vam->input;
20938 vl_api_pg_enable_disable_t *mp;
20941 u8 stream_name_set = 0;
20942 u8 *stream_name = 0;
20944 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20946 if (unformat (input, "stream %s", &stream_name))
20947 stream_name_set = 1;
20948 else if (unformat (input, "disable"))
20954 if (stream_name_set > 0)
20956 if (vec_len (stream_name) > 255)
20958 errmsg ("stream name too long");
20963 u32 name_len = vec_len (stream_name);
20964 /* Construct the API message */
20965 M (PG_ENABLE_DISABLE, mp);
20967 mp->is_enabled = enable;
20968 if (stream_name_set != 0)
20970 mp->stream_name_length = ntohl (name_len);
20971 clib_memcpy (mp->stream_name, stream_name, name_len);
20973 vec_free (stream_name);
20981 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
20983 unformat_input_t *input = vam->input;
20984 vl_api_ip_source_and_port_range_check_add_del_t *mp;
20986 u16 *low_ports = 0;
20987 u16 *high_ports = 0;
20990 ip4_address_t ip4_addr;
20991 ip6_address_t ip6_addr;
21000 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21002 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
21008 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
21013 else if (unformat (input, "vrf %d", &vrf_id))
21015 else if (unformat (input, "del"))
21017 else if (unformat (input, "port %d", &tmp))
21019 if (tmp == 0 || tmp > 65535)
21021 errmsg ("port %d out of range", tmp);
21025 this_hi = this_low + 1;
21026 vec_add1 (low_ports, this_low);
21027 vec_add1 (high_ports, this_hi);
21029 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
21031 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
21033 errmsg ("incorrect range parameters");
21037 /* Note: in debug CLI +1 is added to high before
21038 passing to real fn that does "the work"
21039 (ip_source_and_port_range_check_add_del).
21040 This fn is a wrapper around the binary API fn a
21041 control plane will call, which expects this increment
21042 to have occurred. Hence letting the binary API control
21043 plane fn do the increment for consistency between VAT
21044 and other control planes.
21047 vec_add1 (low_ports, this_low);
21048 vec_add1 (high_ports, this_hi);
21054 if (prefix_set == 0)
21056 errmsg ("<address>/<mask> not specified");
21062 errmsg ("VRF ID required, not specified");
21069 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21073 if (vec_len (low_ports) == 0)
21075 errmsg ("At least one port or port range required");
21079 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
21081 mp->is_add = is_add;
21086 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
21091 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
21094 mp->mask_length = length;
21095 mp->number_of_ranges = vec_len (low_ports);
21097 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
21098 vec_free (low_ports);
21100 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
21101 vec_free (high_ports);
21103 mp->vrf_id = ntohl (vrf_id);
21111 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
21113 unformat_input_t *input = vam->input;
21114 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
21115 u32 sw_if_index = ~0;
21117 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
21118 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
21122 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
21124 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21126 else if (unformat (input, "sw_if_index %d", &sw_if_index))
21128 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
21130 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
21132 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
21134 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
21136 else if (unformat (input, "del"))
21142 if (sw_if_index == ~0)
21144 errmsg ("Interface required but not specified");
21150 errmsg ("VRF ID required but not specified");
21154 if (tcp_out_vrf_id == 0
21155 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
21158 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
21162 /* Construct the API message */
21163 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
21165 mp->sw_if_index = ntohl (sw_if_index);
21166 mp->is_add = is_add;
21167 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
21168 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
21169 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
21170 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
21175 /* Wait for a reply... */
21181 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
21183 unformat_input_t *i = vam->input;
21184 vl_api_ipsec_gre_add_del_tunnel_t *mp;
21185 u32 local_sa_id = 0;
21186 u32 remote_sa_id = 0;
21187 ip4_address_t src_address;
21188 ip4_address_t dst_address;
21192 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21194 if (unformat (i, "local_sa %d", &local_sa_id))
21196 else if (unformat (i, "remote_sa %d", &remote_sa_id))
21198 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
21200 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
21202 else if (unformat (i, "del"))
21206 clib_warning ("parse error '%U'", format_unformat_error, i);
21211 M (IPSEC_GRE_ADD_DEL_TUNNEL, mp);
21213 mp->local_sa_id = ntohl (local_sa_id);
21214 mp->remote_sa_id = ntohl (remote_sa_id);
21215 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
21216 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
21217 mp->is_add = is_add;
21225 api_set_punt (vat_main_t * vam)
21227 unformat_input_t *i = vam->input;
21228 vl_api_set_punt_t *mp;
21235 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21237 if (unformat (i, "ip %d", &ipv))
21239 else if (unformat (i, "protocol %d", &protocol))
21241 else if (unformat (i, "port %d", &port))
21243 else if (unformat (i, "del"))
21247 clib_warning ("parse error '%U'", format_unformat_error, i);
21254 mp->is_add = (u8) is_add;
21255 mp->punt.ipv = (u8) ipv;
21256 mp->punt.l4_protocol = (u8) protocol;
21257 mp->punt.l4_port = htons ((u16) port);
21264 static void vl_api_ipsec_gre_tunnel_details_t_handler
21265 (vl_api_ipsec_gre_tunnel_details_t * mp)
21267 vat_main_t *vam = &vat_main;
21269 print (vam->ofp, "%11d%15U%15U%14d%14d",
21270 ntohl (mp->sw_if_index),
21271 format_ip4_address, &mp->src_address,
21272 format_ip4_address, &mp->dst_address,
21273 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
21276 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
21277 (vl_api_ipsec_gre_tunnel_details_t * mp)
21279 vat_main_t *vam = &vat_main;
21280 vat_json_node_t *node = NULL;
21281 struct in_addr ip4;
21283 if (VAT_JSON_ARRAY != vam->json_tree.type)
21285 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21286 vat_json_init_array (&vam->json_tree);
21288 node = vat_json_array_add (&vam->json_tree);
21290 vat_json_init_object (node);
21291 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
21292 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
21293 vat_json_object_add_ip4 (node, "src_address", ip4);
21294 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
21295 vat_json_object_add_ip4 (node, "dst_address", ip4);
21296 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
21297 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
21301 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
21303 unformat_input_t *i = vam->input;
21304 vl_api_ipsec_gre_tunnel_dump_t *mp;
21305 vl_api_control_ping_t *mp_ping;
21307 u8 sw_if_index_set = 0;
21310 /* Parse args required to build the message */
21311 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21313 if (unformat (i, "sw_if_index %d", &sw_if_index))
21314 sw_if_index_set = 1;
21319 if (sw_if_index_set == 0)
21324 if (!vam->json_output)
21326 print (vam->ofp, "%11s%15s%15s%14s%14s",
21327 "sw_if_index", "src_address", "dst_address",
21328 "local_sa_id", "remote_sa_id");
21331 /* Get list of gre-tunnel interfaces */
21332 M (IPSEC_GRE_TUNNEL_DUMP, mp);
21334 mp->sw_if_index = htonl (sw_if_index);
21338 /* Use a control ping for synchronization */
21339 MPING (CONTROL_PING, mp_ping);
21347 api_delete_subif (vat_main_t * vam)
21349 unformat_input_t *i = vam->input;
21350 vl_api_delete_subif_t *mp;
21351 u32 sw_if_index = ~0;
21354 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21356 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21358 if (unformat (i, "sw_if_index %d", &sw_if_index))
21364 if (sw_if_index == ~0)
21366 errmsg ("missing sw_if_index");
21370 /* Construct the API message */
21371 M (DELETE_SUBIF, mp);
21372 mp->sw_if_index = ntohl (sw_if_index);
21379 #define foreach_pbb_vtr_op \
21380 _("disable", L2_VTR_DISABLED) \
21381 _("pop", L2_VTR_POP_2) \
21382 _("push", L2_VTR_PUSH_2)
21385 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
21387 unformat_input_t *i = vam->input;
21388 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
21389 u32 sw_if_index = ~0, vtr_op = ~0;
21390 u16 outer_tag = ~0;
21391 u8 dmac[6], smac[6];
21392 u8 dmac_set = 0, smac_set = 0;
21398 /* Shut up coverity */
21399 clib_memset (dmac, 0, sizeof (dmac));
21400 clib_memset (smac, 0, sizeof (smac));
21402 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21404 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21406 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21408 else if (unformat (i, "vtr_op %d", &vtr_op))
21410 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
21413 else if (unformat (i, "translate_pbb_stag"))
21415 if (unformat (i, "%d", &tmp))
21417 vtr_op = L2_VTR_TRANSLATE_2_1;
21423 ("translate_pbb_stag operation requires outer tag definition");
21427 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
21429 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
21431 else if (unformat (i, "sid %d", &sid))
21433 else if (unformat (i, "vlanid %d", &tmp))
21437 clib_warning ("parse error '%U'", format_unformat_error, i);
21442 if ((sw_if_index == ~0) || (vtr_op == ~0))
21444 errmsg ("missing sw_if_index or vtr operation");
21447 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
21448 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
21451 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
21455 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
21456 mp->sw_if_index = ntohl (sw_if_index);
21457 mp->vtr_op = ntohl (vtr_op);
21458 mp->outer_tag = ntohs (outer_tag);
21459 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
21460 clib_memcpy (mp->b_smac, smac, sizeof (smac));
21461 mp->b_vlanid = ntohs (vlanid);
21462 mp->i_sid = ntohl (sid);
21470 api_flow_classify_set_interface (vat_main_t * vam)
21472 unformat_input_t *i = vam->input;
21473 vl_api_flow_classify_set_interface_t *mp;
21475 int sw_if_index_set;
21476 u32 ip4_table_index = ~0;
21477 u32 ip6_table_index = ~0;
21481 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21483 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21484 sw_if_index_set = 1;
21485 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21486 sw_if_index_set = 1;
21487 else if (unformat (i, "del"))
21489 else if (unformat (i, "ip4-table %d", &ip4_table_index))
21491 else if (unformat (i, "ip6-table %d", &ip6_table_index))
21495 clib_warning ("parse error '%U'", format_unformat_error, i);
21500 if (sw_if_index_set == 0)
21502 errmsg ("missing interface name or sw_if_index");
21506 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
21508 mp->sw_if_index = ntohl (sw_if_index);
21509 mp->ip4_table_index = ntohl (ip4_table_index);
21510 mp->ip6_table_index = ntohl (ip6_table_index);
21511 mp->is_add = is_add;
21519 api_flow_classify_dump (vat_main_t * vam)
21521 unformat_input_t *i = vam->input;
21522 vl_api_flow_classify_dump_t *mp;
21523 vl_api_control_ping_t *mp_ping;
21524 u8 type = FLOW_CLASSIFY_N_TABLES;
21527 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
21531 errmsg ("classify table type must be specified");
21535 if (!vam->json_output)
21537 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
21540 M (FLOW_CLASSIFY_DUMP, mp);
21545 /* Use a control ping for synchronization */
21546 MPING (CONTROL_PING, mp_ping);
21549 /* Wait for a reply... */
21555 api_feature_enable_disable (vat_main_t * vam)
21557 unformat_input_t *i = vam->input;
21558 vl_api_feature_enable_disable_t *mp;
21560 u8 *feature_name = 0;
21561 u32 sw_if_index = ~0;
21565 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21567 if (unformat (i, "arc_name %s", &arc_name))
21569 else if (unformat (i, "feature_name %s", &feature_name))
21572 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21574 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21576 else if (unformat (i, "disable"))
21584 errmsg ("missing arc name");
21587 if (vec_len (arc_name) > 63)
21589 errmsg ("arc name too long");
21592 if (feature_name == 0)
21594 errmsg ("missing feature name");
21597 if (vec_len (feature_name) > 63)
21599 errmsg ("feature name too long");
21602 if (sw_if_index == ~0)
21604 errmsg ("missing interface name or sw_if_index");
21608 /* Construct the API message */
21609 M (FEATURE_ENABLE_DISABLE, mp);
21610 mp->sw_if_index = ntohl (sw_if_index);
21611 mp->enable = enable;
21612 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
21613 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
21614 vec_free (arc_name);
21615 vec_free (feature_name);
21623 api_sw_interface_tag_add_del (vat_main_t * vam)
21625 unformat_input_t *i = vam->input;
21626 vl_api_sw_interface_tag_add_del_t *mp;
21627 u32 sw_if_index = ~0;
21632 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21634 if (unformat (i, "tag %s", &tag))
21636 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21638 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21640 else if (unformat (i, "del"))
21646 if (sw_if_index == ~0)
21648 errmsg ("missing interface name or sw_if_index");
21652 if (enable && (tag == 0))
21654 errmsg ("no tag specified");
21658 /* Construct the API message */
21659 M (SW_INTERFACE_TAG_ADD_DEL, mp);
21660 mp->sw_if_index = ntohl (sw_if_index);
21661 mp->is_add = enable;
21663 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
21671 static void vl_api_l2_xconnect_details_t_handler
21672 (vl_api_l2_xconnect_details_t * mp)
21674 vat_main_t *vam = &vat_main;
21676 print (vam->ofp, "%15d%15d",
21677 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
21680 static void vl_api_l2_xconnect_details_t_handler_json
21681 (vl_api_l2_xconnect_details_t * mp)
21683 vat_main_t *vam = &vat_main;
21684 vat_json_node_t *node = NULL;
21686 if (VAT_JSON_ARRAY != vam->json_tree.type)
21688 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21689 vat_json_init_array (&vam->json_tree);
21691 node = vat_json_array_add (&vam->json_tree);
21693 vat_json_init_object (node);
21694 vat_json_object_add_uint (node, "rx_sw_if_index",
21695 ntohl (mp->rx_sw_if_index));
21696 vat_json_object_add_uint (node, "tx_sw_if_index",
21697 ntohl (mp->tx_sw_if_index));
21701 api_l2_xconnect_dump (vat_main_t * vam)
21703 vl_api_l2_xconnect_dump_t *mp;
21704 vl_api_control_ping_t *mp_ping;
21707 if (!vam->json_output)
21709 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
21712 M (L2_XCONNECT_DUMP, mp);
21716 /* Use a control ping for synchronization */
21717 MPING (CONTROL_PING, mp_ping);
21725 api_hw_interface_set_mtu (vat_main_t * vam)
21727 unformat_input_t *i = vam->input;
21728 vl_api_hw_interface_set_mtu_t *mp;
21729 u32 sw_if_index = ~0;
21733 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21735 if (unformat (i, "mtu %d", &mtu))
21737 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21739 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21745 if (sw_if_index == ~0)
21747 errmsg ("missing interface name or sw_if_index");
21753 errmsg ("no mtu specified");
21757 /* Construct the API message */
21758 M (HW_INTERFACE_SET_MTU, mp);
21759 mp->sw_if_index = ntohl (sw_if_index);
21760 mp->mtu = ntohs ((u16) mtu);
21768 api_p2p_ethernet_add (vat_main_t * vam)
21770 unformat_input_t *i = vam->input;
21771 vl_api_p2p_ethernet_add_t *mp;
21772 u32 parent_if_index = ~0;
21778 clib_memset (remote_mac, 0, sizeof (remote_mac));
21779 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21781 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21783 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21787 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21789 else if (unformat (i, "sub_id %d", &sub_id))
21793 clib_warning ("parse error '%U'", format_unformat_error, i);
21798 if (parent_if_index == ~0)
21800 errmsg ("missing interface name or sw_if_index");
21805 errmsg ("missing remote mac address");
21810 errmsg ("missing sub-interface id");
21814 M (P2P_ETHERNET_ADD, mp);
21815 mp->parent_if_index = ntohl (parent_if_index);
21816 mp->subif_id = ntohl (sub_id);
21817 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21825 api_p2p_ethernet_del (vat_main_t * vam)
21827 unformat_input_t *i = vam->input;
21828 vl_api_p2p_ethernet_del_t *mp;
21829 u32 parent_if_index = ~0;
21834 clib_memset (remote_mac, 0, sizeof (remote_mac));
21835 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21837 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21839 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21843 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21847 clib_warning ("parse error '%U'", format_unformat_error, i);
21852 if (parent_if_index == ~0)
21854 errmsg ("missing interface name or sw_if_index");
21859 errmsg ("missing remote mac address");
21863 M (P2P_ETHERNET_DEL, mp);
21864 mp->parent_if_index = ntohl (parent_if_index);
21865 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21873 api_lldp_config (vat_main_t * vam)
21875 unformat_input_t *i = vam->input;
21876 vl_api_lldp_config_t *mp;
21878 int tx_interval = 0;
21879 u8 *sys_name = NULL;
21882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21884 if (unformat (i, "system-name %s", &sys_name))
21886 else if (unformat (i, "tx-hold %d", &tx_hold))
21888 else if (unformat (i, "tx-interval %d", &tx_interval))
21892 clib_warning ("parse error '%U'", format_unformat_error, i);
21897 vec_add1 (sys_name, 0);
21899 M (LLDP_CONFIG, mp);
21900 mp->tx_hold = htonl (tx_hold);
21901 mp->tx_interval = htonl (tx_interval);
21902 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
21903 vec_free (sys_name);
21911 api_sw_interface_set_lldp (vat_main_t * vam)
21913 unformat_input_t *i = vam->input;
21914 vl_api_sw_interface_set_lldp_t *mp;
21915 u32 sw_if_index = ~0;
21917 u8 *port_desc = NULL, *mgmt_oid = NULL;
21918 ip4_address_t ip4_addr;
21919 ip6_address_t ip6_addr;
21922 clib_memset (&ip4_addr, 0, sizeof (ip4_addr));
21923 clib_memset (&ip6_addr, 0, sizeof (ip6_addr));
21925 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21927 if (unformat (i, "disable"))
21930 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21932 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21934 else if (unformat (i, "port-desc %s", &port_desc))
21936 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
21938 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
21940 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
21946 if (sw_if_index == ~0)
21948 errmsg ("missing interface name or sw_if_index");
21952 /* Construct the API message */
21953 vec_add1 (port_desc, 0);
21954 vec_add1 (mgmt_oid, 0);
21955 M (SW_INTERFACE_SET_LLDP, mp);
21956 mp->sw_if_index = ntohl (sw_if_index);
21957 mp->enable = enable;
21958 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
21959 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
21960 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
21961 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
21962 vec_free (port_desc);
21963 vec_free (mgmt_oid);
21971 api_tcp_configure_src_addresses (vat_main_t * vam)
21973 vl_api_tcp_configure_src_addresses_t *mp;
21974 unformat_input_t *i = vam->input;
21975 ip4_address_t v4first, v4last;
21976 ip6_address_t v6first, v6last;
21981 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21983 if (unformat (i, "%U - %U",
21984 unformat_ip4_address, &v4first,
21985 unformat_ip4_address, &v4last))
21989 errmsg ("one range per message (range already set)");
21994 else if (unformat (i, "%U - %U",
21995 unformat_ip6_address, &v6first,
21996 unformat_ip6_address, &v6last))
22000 errmsg ("one range per message (range already set)");
22005 else if (unformat (i, "vrf %d", &vrf_id))
22011 if (range_set == 0)
22013 errmsg ("address range not set");
22017 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
22018 mp->vrf_id = ntohl (vrf_id);
22020 if (range_set == 2)
22023 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
22024 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
22029 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
22030 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
22037 static void vl_api_app_namespace_add_del_reply_t_handler
22038 (vl_api_app_namespace_add_del_reply_t * mp)
22040 vat_main_t *vam = &vat_main;
22041 i32 retval = ntohl (mp->retval);
22042 if (vam->async_mode)
22044 vam->async_errors += (retval < 0);
22048 vam->retval = retval;
22050 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
22051 vam->result_ready = 1;
22055 static void vl_api_app_namespace_add_del_reply_t_handler_json
22056 (vl_api_app_namespace_add_del_reply_t * mp)
22058 vat_main_t *vam = &vat_main;
22059 vat_json_node_t node;
22061 vat_json_init_object (&node);
22062 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
22063 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
22065 vat_json_print (vam->ofp, &node);
22066 vat_json_free (&node);
22068 vam->retval = ntohl (mp->retval);
22069 vam->result_ready = 1;
22073 api_app_namespace_add_del (vat_main_t * vam)
22075 vl_api_app_namespace_add_del_t *mp;
22076 unformat_input_t *i = vam->input;
22077 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
22078 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
22082 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22084 if (unformat (i, "id %_%v%_", &ns_id))
22086 else if (unformat (i, "secret %lu", &secret))
22088 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22089 sw_if_index_set = 1;
22090 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
22092 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
22097 if (!ns_id || !secret_set || !sw_if_index_set)
22099 errmsg ("namespace id, secret and sw_if_index must be set");
22102 if (vec_len (ns_id) > 64)
22104 errmsg ("namespace id too long");
22107 M (APP_NAMESPACE_ADD_DEL, mp);
22109 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
22110 mp->namespace_id_len = vec_len (ns_id);
22111 mp->secret = clib_host_to_net_u64 (secret);
22112 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22113 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
22114 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
22122 api_sock_init_shm (vat_main_t * vam)
22124 #if VPP_API_TEST_BUILTIN == 0
22125 unformat_input_t *i = vam->input;
22126 vl_api_shm_elem_config_t *config = 0;
22127 u64 size = 64 << 20;
22130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22132 if (unformat (i, "size %U", unformat_memory_size, &size))
22139 * Canned custom ring allocator config.
22140 * Should probably parse all of this
22142 vec_validate (config, 6);
22143 config[0].type = VL_API_VLIB_RING;
22144 config[0].size = 256;
22145 config[0].count = 32;
22147 config[1].type = VL_API_VLIB_RING;
22148 config[1].size = 1024;
22149 config[1].count = 16;
22151 config[2].type = VL_API_VLIB_RING;
22152 config[2].size = 4096;
22153 config[2].count = 2;
22155 config[3].type = VL_API_CLIENT_RING;
22156 config[3].size = 256;
22157 config[3].count = 32;
22159 config[4].type = VL_API_CLIENT_RING;
22160 config[4].size = 1024;
22161 config[4].count = 16;
22163 config[5].type = VL_API_CLIENT_RING;
22164 config[5].size = 4096;
22165 config[5].count = 2;
22167 config[6].type = VL_API_QUEUE;
22168 config[6].count = 128;
22169 config[6].size = sizeof (uword);
22171 rv = vl_socket_client_init_shm (config);
22173 vam->client_index_invalid = 1;
22181 api_dns_enable_disable (vat_main_t * vam)
22183 unformat_input_t *line_input = vam->input;
22184 vl_api_dns_enable_disable_t *mp;
22185 u8 enable_disable = 1;
22188 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22190 if (unformat (line_input, "disable"))
22191 enable_disable = 0;
22192 if (unformat (line_input, "enable"))
22193 enable_disable = 1;
22198 /* Construct the API message */
22199 M (DNS_ENABLE_DISABLE, mp);
22200 mp->enable = enable_disable;
22204 /* Wait for the reply */
22210 api_dns_resolve_name (vat_main_t * vam)
22212 unformat_input_t *line_input = vam->input;
22213 vl_api_dns_resolve_name_t *mp;
22217 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22219 if (unformat (line_input, "%s", &name))
22225 if (vec_len (name) > 127)
22227 errmsg ("name too long");
22231 /* Construct the API message */
22232 M (DNS_RESOLVE_NAME, mp);
22233 memcpy (mp->name, name, vec_len (name));
22238 /* Wait for the reply */
22244 api_dns_resolve_ip (vat_main_t * vam)
22246 unformat_input_t *line_input = vam->input;
22247 vl_api_dns_resolve_ip_t *mp;
22249 ip4_address_t addr4;
22250 ip6_address_t addr6;
22253 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22255 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
22257 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
22265 errmsg ("missing address");
22269 /* Construct the API message */
22270 M (DNS_RESOLVE_IP, mp);
22271 mp->is_ip6 = is_ip6;
22273 memcpy (mp->address, &addr6, sizeof (addr6));
22275 memcpy (mp->address, &addr4, sizeof (addr4));
22279 /* Wait for the reply */
22285 api_dns_name_server_add_del (vat_main_t * vam)
22287 unformat_input_t *i = vam->input;
22288 vl_api_dns_name_server_add_del_t *mp;
22290 ip6_address_t ip6_server;
22291 ip4_address_t ip4_server;
22296 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22298 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
22300 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
22302 else if (unformat (i, "del"))
22306 clib_warning ("parse error '%U'", format_unformat_error, i);
22311 if (ip4_set && ip6_set)
22313 errmsg ("Only one server address allowed per message");
22316 if ((ip4_set + ip6_set) == 0)
22318 errmsg ("Server address required");
22322 /* Construct the API message */
22323 M (DNS_NAME_SERVER_ADD_DEL, mp);
22327 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
22332 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
22336 mp->is_add = is_add;
22341 /* Wait for a reply, return good/bad news */
22347 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
22349 vat_main_t *vam = &vat_main;
22354 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22355 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22356 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
22357 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
22358 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22359 clib_net_to_host_u32 (mp->action_index), mp->tag);
22364 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
22365 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
22366 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
22367 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
22368 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
22369 clib_net_to_host_u32 (mp->action_index), mp->tag);
22374 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
22377 vat_main_t *vam = &vat_main;
22378 vat_json_node_t *node = NULL;
22379 struct in6_addr ip6;
22380 struct in_addr ip4;
22382 if (VAT_JSON_ARRAY != vam->json_tree.type)
22384 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
22385 vat_json_init_array (&vam->json_tree);
22387 node = vat_json_array_add (&vam->json_tree);
22388 vat_json_init_object (node);
22390 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
22391 vat_json_object_add_uint (node, "appns_index",
22392 clib_net_to_host_u32 (mp->appns_index));
22393 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
22394 vat_json_object_add_uint (node, "scope", mp->scope);
22395 vat_json_object_add_uint (node, "action_index",
22396 clib_net_to_host_u32 (mp->action_index));
22397 vat_json_object_add_uint (node, "lcl_port",
22398 clib_net_to_host_u16 (mp->lcl_port));
22399 vat_json_object_add_uint (node, "rmt_port",
22400 clib_net_to_host_u16 (mp->rmt_port));
22401 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
22402 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
22403 vat_json_object_add_string_copy (node, "tag", mp->tag);
22406 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
22407 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
22408 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
22409 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
22413 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
22414 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
22415 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
22416 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
22421 api_session_rule_add_del (vat_main_t * vam)
22423 vl_api_session_rule_add_del_t *mp;
22424 unformat_input_t *i = vam->input;
22425 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
22426 u32 appns_index = 0, scope = 0;
22427 ip4_address_t lcl_ip4, rmt_ip4;
22428 ip6_address_t lcl_ip6, rmt_ip6;
22429 u8 is_ip4 = 1, conn_set = 0;
22430 u8 is_add = 1, *tag = 0;
22433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22435 if (unformat (i, "del"))
22437 else if (unformat (i, "add"))
22439 else if (unformat (i, "proto tcp"))
22441 else if (unformat (i, "proto udp"))
22443 else if (unformat (i, "appns %d", &appns_index))
22445 else if (unformat (i, "scope %d", &scope))
22447 else if (unformat (i, "tag %_%v%_", &tag))
22451 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
22452 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
22460 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
22461 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
22467 else if (unformat (i, "action %d", &action))
22472 if (proto == ~0 || !conn_set || action == ~0)
22474 errmsg ("transport proto, connection and action must be set");
22480 errmsg ("scope should be 0-3");
22484 M (SESSION_RULE_ADD_DEL, mp);
22486 mp->is_ip4 = is_ip4;
22487 mp->transport_proto = proto;
22488 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
22489 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
22490 mp->lcl_plen = lcl_plen;
22491 mp->rmt_plen = rmt_plen;
22492 mp->action_index = clib_host_to_net_u32 (action);
22493 mp->appns_index = clib_host_to_net_u32 (appns_index);
22495 mp->is_add = is_add;
22498 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
22499 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
22503 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
22504 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
22508 clib_memcpy (mp->tag, tag, vec_len (tag));
22518 api_session_rules_dump (vat_main_t * vam)
22520 vl_api_session_rules_dump_t *mp;
22521 vl_api_control_ping_t *mp_ping;
22524 if (!vam->json_output)
22526 print (vam->ofp, "%=20s", "Session Rules");
22529 M (SESSION_RULES_DUMP, mp);
22533 /* Use a control ping for synchronization */
22534 MPING (CONTROL_PING, mp_ping);
22537 /* Wait for a reply... */
22543 api_ip_container_proxy_add_del (vat_main_t * vam)
22545 vl_api_ip_container_proxy_add_del_t *mp;
22546 unformat_input_t *i = vam->input;
22547 u32 plen = ~0, sw_if_index = ~0;
22554 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22556 if (unformat (i, "del"))
22558 else if (unformat (i, "add"))
22560 if (unformat (i, "%U", unformat_ip4_address, &ip4))
22565 else if (unformat (i, "%U", unformat_ip6_address, &ip6))
22570 else if (unformat (i, "sw_if_index %u", &sw_if_index))
22575 if (sw_if_index == ~0 || plen == ~0)
22577 errmsg ("address and sw_if_index must be set");
22581 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
22583 mp->is_ip4 = is_ip4;
22584 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
22586 mp->is_add = is_add;
22588 clib_memcpy (mp->ip, &ip4, sizeof (ip4));
22590 clib_memcpy (mp->ip, &ip6, sizeof (ip6));
22598 api_qos_record_enable_disable (vat_main_t * vam)
22600 unformat_input_t *i = vam->input;
22601 vl_api_qos_record_enable_disable_t *mp;
22602 u32 sw_if_index, qs = 0xff;
22603 u8 sw_if_index_set = 0;
22607 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
22609 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
22610 sw_if_index_set = 1;
22611 else if (unformat (i, "sw_if_index %d", &sw_if_index))
22612 sw_if_index_set = 1;
22613 else if (unformat (i, "%U", unformat_qos_source, &qs))
22615 else if (unformat (i, "disable"))
22619 clib_warning ("parse error '%U'", format_unformat_error, i);
22624 if (sw_if_index_set == 0)
22626 errmsg ("missing interface name or sw_if_index");
22631 errmsg ("input location must be specified");
22635 M (QOS_RECORD_ENABLE_DISABLE, mp);
22637 mp->sw_if_index = ntohl (sw_if_index);
22638 mp->input_source = qs;
22639 mp->enable = enable;
22648 q_or_quit (vat_main_t * vam)
22650 #if VPP_API_TEST_BUILTIN == 0
22651 longjmp (vam->jump_buf, 1);
22653 return 0; /* not so much */
22657 q (vat_main_t * vam)
22659 return q_or_quit (vam);
22663 quit (vat_main_t * vam)
22665 return q_or_quit (vam);
22669 comment (vat_main_t * vam)
22675 statseg (vat_main_t * vam)
22677 ssvm_private_t *ssvmp = &vam->stat_segment;
22678 ssvm_shared_header_t *shared_header = ssvmp->sh;
22679 vlib_counter_t **counters;
22680 u64 thread0_index1_packets;
22681 u64 thread0_index1_bytes;
22682 f64 vector_rate, input_rate;
22685 uword *counter_vector_by_name;
22686 if (vam->stat_segment_lockp == 0)
22688 errmsg ("Stat segment not mapped...");
22692 /* look up "/if/rx for sw_if_index 1 as a test */
22694 clib_spinlock_lock (vam->stat_segment_lockp);
22696 counter_vector_by_name = (uword *) shared_header->opaque[1];
22698 p = hash_get_mem (counter_vector_by_name, "/if/rx");
22701 clib_spinlock_unlock (vam->stat_segment_lockp);
22702 errmsg ("/if/tx not found?");
22706 /* Fish per-thread vector of combined counters from shared memory */
22707 counters = (vlib_counter_t **) p[0];
22709 if (vec_len (counters[0]) < 2)
22711 clib_spinlock_unlock (vam->stat_segment_lockp);
22712 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
22716 /* Read thread 0 sw_if_index 1 counter */
22717 thread0_index1_packets = counters[0][1].packets;
22718 thread0_index1_bytes = counters[0][1].bytes;
22720 p = hash_get_mem (counter_vector_by_name, "vector_rate");
22723 clib_spinlock_unlock (vam->stat_segment_lockp);
22724 errmsg ("vector_rate not found?");
22728 vector_rate = *(f64 *) (p[0]);
22729 p = hash_get_mem (counter_vector_by_name, "input_rate");
22732 clib_spinlock_unlock (vam->stat_segment_lockp);
22733 errmsg ("input_rate not found?");
22736 input_rate = *(f64 *) (p[0]);
22738 clib_spinlock_unlock (vam->stat_segment_lockp);
22740 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
22741 vector_rate, input_rate);
22742 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
22743 thread0_index1_packets, thread0_index1_bytes);
22749 cmd_cmp (void *a1, void *a2)
22754 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
22758 help (vat_main_t * vam)
22763 unformat_input_t *i = vam->input;
22766 if (unformat (i, "%s", &name))
22770 vec_add1 (name, 0);
22772 hs = hash_get_mem (vam->help_by_name, name);
22774 print (vam->ofp, "usage: %s %s", name, hs[0]);
22776 print (vam->ofp, "No such msg / command '%s'", name);
22781 print (vam->ofp, "Help is available for the following:");
22784 hash_foreach_pair (p, vam->function_by_name,
22786 vec_add1 (cmds, (u8 *)(p->key));
22790 vec_sort_with_function (cmds, cmd_cmp);
22792 for (j = 0; j < vec_len (cmds); j++)
22793 print (vam->ofp, "%s", cmds[j]);
22800 set (vat_main_t * vam)
22802 u8 *name = 0, *value = 0;
22803 unformat_input_t *i = vam->input;
22805 if (unformat (i, "%s", &name))
22807 /* The input buffer is a vector, not a string. */
22808 value = vec_dup (i->buffer);
22809 vec_delete (value, i->index, 0);
22810 /* Almost certainly has a trailing newline */
22811 if (value[vec_len (value) - 1] == '\n')
22812 value[vec_len (value) - 1] = 0;
22813 /* Make sure it's a proper string, one way or the other */
22814 vec_add1 (value, 0);
22815 (void) clib_macro_set_value (&vam->macro_main,
22816 (char *) name, (char *) value);
22819 errmsg ("usage: set <name> <value>");
22827 unset (vat_main_t * vam)
22831 if (unformat (vam->input, "%s", &name))
22832 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
22833 errmsg ("unset: %s wasn't set", name);
22846 macro_sort_cmp (void *a1, void *a2)
22848 macro_sort_t *s1 = a1;
22849 macro_sort_t *s2 = a2;
22851 return strcmp ((char *) (s1->name), (char *) (s2->name));
22855 dump_macro_table (vat_main_t * vam)
22857 macro_sort_t *sort_me = 0, *sm;
22862 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
22864 vec_add2 (sort_me, sm, 1);
22865 sm->name = (u8 *)(p->key);
22866 sm->value = (u8 *) (p->value[0]);
22870 vec_sort_with_function (sort_me, macro_sort_cmp);
22872 if (vec_len (sort_me))
22873 print (vam->ofp, "%-15s%s", "Name", "Value");
22875 print (vam->ofp, "The macro table is empty...");
22877 for (i = 0; i < vec_len (sort_me); i++)
22878 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
22883 dump_node_table (vat_main_t * vam)
22886 vlib_node_t *node, *next_node;
22888 if (vec_len (vam->graph_nodes) == 0)
22890 print (vam->ofp, "Node table empty, issue get_node_graph...");
22894 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
22896 node = vam->graph_nodes[0][i];
22897 print (vam->ofp, "[%d] %s", i, node->name);
22898 for (j = 0; j < vec_len (node->next_nodes); j++)
22900 if (node->next_nodes[j] != ~0)
22902 next_node = vam->graph_nodes[0][node->next_nodes[j]];
22903 print (vam->ofp, " [%d] %s", j, next_node->name);
22911 value_sort_cmp (void *a1, void *a2)
22913 name_sort_t *n1 = a1;
22914 name_sort_t *n2 = a2;
22916 if (n1->value < n2->value)
22918 if (n1->value > n2->value)
22925 dump_msg_api_table (vat_main_t * vam)
22927 api_main_t *am = &api_main;
22928 name_sort_t *nses = 0, *ns;
22933 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
22935 vec_add2 (nses, ns, 1);
22936 ns->name = (u8 *)(hp->key);
22937 ns->value = (u32) hp->value[0];
22941 vec_sort_with_function (nses, value_sort_cmp);
22943 for (i = 0; i < vec_len (nses); i++)
22944 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
22950 get_msg_id (vat_main_t * vam)
22955 if (unformat (vam->input, "%s", &name_and_crc))
22957 message_index = vl_msg_api_get_msg_index (name_and_crc);
22958 if (message_index == ~0)
22960 print (vam->ofp, " '%s' not found", name_and_crc);
22963 print (vam->ofp, " '%s' has message index %d",
22964 name_and_crc, message_index);
22967 errmsg ("name_and_crc required...");
22972 search_node_table (vat_main_t * vam)
22974 unformat_input_t *line_input = vam->input;
22977 vlib_node_t *node, *next_node;
22980 if (vam->graph_node_index_by_name == 0)
22982 print (vam->ofp, "Node table empty, issue get_node_graph...");
22986 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22988 if (unformat (line_input, "%s", &node_to_find))
22990 vec_add1 (node_to_find, 0);
22991 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
22994 print (vam->ofp, "%s not found...", node_to_find);
22997 node = vam->graph_nodes[0][p[0]];
22998 print (vam->ofp, "[%d] %s", p[0], node->name);
22999 for (j = 0; j < vec_len (node->next_nodes); j++)
23001 if (node->next_nodes[j] != ~0)
23003 next_node = vam->graph_nodes[0][node->next_nodes[j]];
23004 print (vam->ofp, " [%d] %s", j, next_node->name);
23011 clib_warning ("parse error '%U'", format_unformat_error,
23017 vec_free (node_to_find);
23026 script (vat_main_t * vam)
23028 #if (VPP_API_TEST_BUILTIN==0)
23030 char *save_current_file;
23031 unformat_input_t save_input;
23032 jmp_buf save_jump_buf;
23033 u32 save_line_number;
23035 FILE *new_fp, *save_ifp;
23037 if (unformat (vam->input, "%s", &s))
23039 new_fp = fopen ((char *) s, "r");
23042 errmsg ("Couldn't open script file %s", s);
23049 errmsg ("Missing script name");
23053 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
23054 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
23055 save_ifp = vam->ifp;
23056 save_line_number = vam->input_line_number;
23057 save_current_file = (char *) vam->current_file;
23059 vam->input_line_number = 0;
23061 vam->current_file = s;
23064 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
23065 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
23066 vam->ifp = save_ifp;
23067 vam->input_line_number = save_line_number;
23068 vam->current_file = (u8 *) save_current_file;
23073 clib_warning ("use the exec command...");
23079 echo (vat_main_t * vam)
23081 print (vam->ofp, "%v", vam->input->buffer);
23085 /* List of API message constructors, CLI names map to api_xxx */
23086 #define foreach_vpe_api_msg \
23087 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
23088 _(sw_interface_dump,"") \
23089 _(sw_interface_set_flags, \
23090 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
23091 _(sw_interface_add_del_address, \
23092 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
23093 _(sw_interface_set_rx_mode, \
23094 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
23095 _(sw_interface_set_rx_placement, \
23096 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
23097 _(sw_interface_rx_placement_dump, \
23098 "[<intfc> | sw_if_index <id>]") \
23099 _(sw_interface_set_table, \
23100 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
23101 _(sw_interface_set_mpls_enable, \
23102 "<intfc> | sw_if_index [disable | dis]") \
23103 _(sw_interface_set_vpath, \
23104 "<intfc> | sw_if_index <id> enable | disable") \
23105 _(sw_interface_set_vxlan_bypass, \
23106 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23107 _(sw_interface_set_geneve_bypass, \
23108 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
23109 _(sw_interface_set_l2_xconnect, \
23110 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23111 "enable | disable") \
23112 _(sw_interface_set_l2_bridge, \
23113 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
23114 "[shg <split-horizon-group>] [bvi]\n" \
23115 "enable | disable") \
23116 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
23117 _(bridge_domain_add_del, \
23118 "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") \
23119 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
23121 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
23122 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
23123 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
23125 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23127 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
23129 "tapname <name> mac <mac-addr> | random-mac [tag <string>]") \
23131 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
23133 "<vpp-if-name> | sw_if_index <id>") \
23134 _(sw_interface_tap_dump, "") \
23136 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
23138 "<vpp-if-name> | sw_if_index <id>") \
23139 _(sw_interface_tap_v2_dump, "") \
23141 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
23142 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]}") \
23144 "<vpp-if-name> | sw_if_index <id>") \
23146 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
23147 _(bond_detach_slave, \
23148 "sw_if_index <n>") \
23149 _(sw_interface_bond_dump, "") \
23150 _(sw_interface_slave_dump, \
23151 "<vpp-if-name> | sw_if_index <id>") \
23152 _(ip_table_add_del, \
23153 "table <n> [ipv6] [add | del]\n") \
23154 _(ip_add_del_route, \
23155 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
23156 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
23157 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
23158 "[multipath] [count <n>] [del]") \
23159 _(ip_mroute_add_del, \
23160 "<src> <grp>/<mask> [table-id <n>]\n" \
23161 "[<intfc> | sw_if_index <id>] [local] [del]") \
23162 _(mpls_table_add_del, \
23163 "table <n> [add | del]\n") \
23164 _(mpls_route_add_del, \
23165 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
23166 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
23167 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
23168 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
23169 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
23170 "[count <n>] [del]") \
23171 _(mpls_ip_bind_unbind, \
23172 "<label> <addr/len>") \
23173 _(mpls_tunnel_add_del, \
23174 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
23175 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
23176 "[l2-only] [out-label <n>]") \
23177 _(sr_mpls_policy_add, \
23178 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
23179 _(sr_mpls_policy_del, \
23181 _(bier_table_add_del, \
23182 "<label> <sub-domain> <set> <bsl> [del]") \
23183 _(bier_route_add_del, \
23184 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
23185 "[<intfc> | sw_if_index <id>]" \
23186 "[weight <n>] [del] [multipath]") \
23187 _(proxy_arp_add_del, \
23188 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
23189 _(proxy_arp_intfc_enable_disable, \
23190 "<intfc> | sw_if_index <id> enable | disable") \
23191 _(sw_interface_set_unnumbered, \
23192 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
23193 _(ip_neighbor_add_del, \
23194 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
23195 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
23196 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
23197 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
23198 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
23199 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
23200 "[outer_vlan_id_any][inner_vlan_id_any]") \
23201 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
23202 _(reset_fib, "vrf <n> [ipv6]") \
23203 _(dhcp_proxy_config, \
23204 "svr <v46-address> src <v46-address>\n" \
23205 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
23206 _(dhcp_proxy_set_vss, \
23207 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
23208 _(dhcp_proxy_dump, "ip6") \
23209 _(dhcp_client_config, \
23210 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
23211 _(set_ip_flow_hash, \
23212 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
23213 _(sw_interface_ip6_enable_disable, \
23214 "<intfc> | sw_if_index <id> enable | disable") \
23215 _(ip6nd_proxy_add_del, \
23216 "<intfc> | sw_if_index <id> <ip6-address>") \
23217 _(ip6nd_proxy_dump, "") \
23218 _(sw_interface_ip6nd_ra_prefix, \
23219 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
23220 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
23221 "[nolink] [isno]") \
23222 _(sw_interface_ip6nd_ra_config, \
23223 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
23224 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
23225 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
23226 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
23227 _(l2_patch_add_del, \
23228 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
23229 "enable | disable") \
23230 _(sr_localsid_add_del, \
23231 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
23232 "fib-table <num> (end.psp) sw_if_index <num>") \
23233 _(classify_add_del_table, \
23234 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
23235 " [del] [del-chain] mask <mask-value>\n" \
23236 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
23237 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
23238 _(classify_add_del_session, \
23239 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
23240 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
23241 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
23242 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
23243 _(classify_set_interface_ip_table, \
23244 "<intfc> | sw_if_index <nn> table <nn>") \
23245 _(classify_set_interface_l2_tables, \
23246 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23247 " [other-table <nn>]") \
23248 _(get_node_index, "node <node-name") \
23249 _(add_node_next, "node <node-name> next <next-node-name>") \
23250 _(l2tpv3_create_tunnel, \
23251 "client_address <ip6-addr> our_address <ip6-addr>\n" \
23252 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
23253 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
23254 _(l2tpv3_set_tunnel_cookies, \
23255 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
23256 "[new_remote_cookie <nn>]\n") \
23257 _(l2tpv3_interface_enable_disable, \
23258 "<intfc> | sw_if_index <nn> enable | disable") \
23259 _(l2tpv3_set_lookup_key, \
23260 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
23261 _(sw_if_l2tpv3_tunnel_dump, "") \
23262 _(vxlan_offload_rx, \
23263 "hw { <interface name> | hw_if_index <nn>} " \
23264 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
23265 _(vxlan_add_del_tunnel, \
23266 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23267 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
23268 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23269 _(geneve_add_del_tunnel, \
23270 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
23271 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23272 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
23273 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23274 _(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23275 _(gre_add_del_tunnel, \
23276 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
23277 "[teb | erspan <session-id>] [del]") \
23278 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23279 _(l2_fib_clear_table, "") \
23280 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
23281 _(l2_interface_vlan_tag_rewrite, \
23282 "<intfc> | sw_if_index <nn> \n" \
23283 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
23284 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
23285 _(create_vhost_user_if, \
23286 "socket <filename> [server] [renumber <dev_instance>] " \
23287 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
23288 "[mac <mac_address>]") \
23289 _(modify_vhost_user_if, \
23290 "<intfc> | sw_if_index <nn> socket <filename>\n" \
23291 "[server] [renumber <dev_instance>]") \
23292 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
23293 _(sw_interface_vhost_user_dump, "") \
23294 _(show_version, "") \
23295 _(show_threads, "") \
23296 _(vxlan_gpe_add_del_tunnel, \
23297 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
23298 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
23299 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
23300 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
23301 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
23302 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
23303 _(interface_name_renumber, \
23304 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
23305 _(input_acl_set_interface, \
23306 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23307 " [l2-table <nn>] [del]") \
23308 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
23309 _(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
23310 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
23311 _(want_ip4_arp_events, "address <ip4-address> [del]") \
23312 _(want_ip6_nd_events, "address <ip6-address> [del]") \
23313 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
23314 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
23315 _(ip_dump, "ipv4 | ipv6") \
23316 _(ipsec_spd_add_del, "spd_id <n> [del]") \
23317 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
23319 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
23320 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
23321 " integ_alg <alg> integ_key <hex>") \
23322 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
23323 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
23324 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
23325 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
23326 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
23327 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
23328 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
23329 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
23330 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
23331 " [instance <n>]") \
23332 _(ipsec_sa_dump, "[sa_id <n>]") \
23333 _(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
23334 " <alg> <hex>\n") \
23335 _(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
23336 _(ikev2_profile_add_del, "name <profile_name> [del]") \
23337 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
23338 "(auth_data 0x<data> | auth_data <data>)") \
23339 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
23340 "(id_data 0x<data> | id_data <data>) (local|remote)") \
23341 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
23342 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
23343 "(local|remote)") \
23344 _(ikev2_set_local_key, "file <absolute_file_path>") \
23345 _(ikev2_set_responder, "<profile_name> interface <interface> address <addr>") \
23346 _(ikev2_set_ike_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23347 _(ikev2_set_esp_transforms, "<profile_name> <crypto alg> <key size> <integrity alg> <DH group>") \
23348 _(ikev2_set_sa_lifetime, "<profile_name> <seconds> <jitter> <handover> <max bytes>") \
23349 _(ikev2_initiate_sa_init, "<profile_name>") \
23350 _(ikev2_initiate_del_ike_sa, "<ispi>") \
23351 _(ikev2_initiate_del_child_sa, "<ispi>") \
23352 _(ikev2_initiate_rekey_child_sa, "<ispi>") \
23353 _(delete_loopback,"sw_if_index <nn>") \
23354 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
23355 _(bd_ip_mac_dump, "[bd_id] <id>") \
23356 _(want_interface_events, "enable|disable") \
23357 _(get_first_msg_id, "client <name>") \
23358 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
23359 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
23360 "fib-id <nn> [ip4][ip6][default]") \
23361 _(get_node_graph, " ") \
23362 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
23363 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
23364 _(ioam_disable, "") \
23365 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
23366 " sw_if_index <sw_if_index> p <priority> " \
23367 "w <weight>] [del]") \
23368 _(one_add_del_locator, "locator-set <locator_name> " \
23369 "iface <intf> | sw_if_index <sw_if_index> " \
23370 "p <priority> w <weight> [del]") \
23371 _(one_add_del_local_eid,"vni <vni> eid " \
23372 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23373 "locator-set <locator_name> [del]" \
23374 "[key-id sha1|sha256 secret-key <secret-key>]")\
23375 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
23376 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
23377 _(one_enable_disable, "enable|disable") \
23378 _(one_map_register_enable_disable, "enable|disable") \
23379 _(one_map_register_fallback_threshold, "<value>") \
23380 _(one_rloc_probe_enable_disable, "enable|disable") \
23381 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23383 "rloc <locator> p <prio> " \
23384 "w <weight> [rloc <loc> ... ] " \
23385 "action <action> [del-all]") \
23386 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23388 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23389 _(one_use_petr, "ip-address> | disable") \
23390 _(one_map_request_mode, "src-dst|dst-only") \
23391 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23392 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23393 _(one_locator_set_dump, "[local | remote]") \
23394 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
23395 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23396 "[local] | [remote]") \
23397 _(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
23398 _(one_ndp_bd_get, "") \
23399 _(one_ndp_entries_get, "bd <bridge-domain>") \
23400 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
23401 _(one_l2_arp_bd_get, "") \
23402 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
23403 _(one_stats_enable_disable, "enable|disable") \
23404 _(show_one_stats_enable_disable, "") \
23405 _(one_eid_table_vni_dump, "") \
23406 _(one_eid_table_map_dump, "l2|l3") \
23407 _(one_map_resolver_dump, "") \
23408 _(one_map_server_dump, "") \
23409 _(one_adjacencies_get, "vni <vni>") \
23410 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
23411 _(show_one_rloc_probe_state, "") \
23412 _(show_one_map_register_state, "") \
23413 _(show_one_status, "") \
23414 _(one_stats_dump, "") \
23415 _(one_stats_flush, "") \
23416 _(one_get_map_request_itr_rlocs, "") \
23417 _(one_map_register_set_ttl, "<ttl>") \
23418 _(one_set_transport_protocol, "udp|api") \
23419 _(one_get_transport_protocol, "") \
23420 _(one_enable_disable_xtr_mode, "enable|disable") \
23421 _(one_show_xtr_mode, "") \
23422 _(one_enable_disable_pitr_mode, "enable|disable") \
23423 _(one_show_pitr_mode, "") \
23424 _(one_enable_disable_petr_mode, "enable|disable") \
23425 _(one_show_petr_mode, "") \
23426 _(show_one_nsh_mapping, "") \
23427 _(show_one_pitr, "") \
23428 _(show_one_use_petr, "") \
23429 _(show_one_map_request_mode, "") \
23430 _(show_one_map_register_ttl, "") \
23431 _(show_one_map_register_fallback_threshold, "") \
23432 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
23433 " sw_if_index <sw_if_index> p <priority> " \
23434 "w <weight>] [del]") \
23435 _(lisp_add_del_locator, "locator-set <locator_name> " \
23436 "iface <intf> | sw_if_index <sw_if_index> " \
23437 "p <priority> w <weight> [del]") \
23438 _(lisp_add_del_local_eid,"vni <vni> eid " \
23439 "<ipv4|ipv6>/<prefix> | <L2 address> " \
23440 "locator-set <locator_name> [del]" \
23441 "[key-id sha1|sha256 secret-key <secret-key>]") \
23442 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
23443 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
23444 _(lisp_enable_disable, "enable|disable") \
23445 _(lisp_map_register_enable_disable, "enable|disable") \
23446 _(lisp_rloc_probe_enable_disable, "enable|disable") \
23447 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
23449 "rloc <locator> p <prio> " \
23450 "w <weight> [rloc <loc> ... ] " \
23451 "action <action> [del-all]") \
23452 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
23454 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
23455 _(lisp_use_petr, "<ip-address> | disable") \
23456 _(lisp_map_request_mode, "src-dst|dst-only") \
23457 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
23458 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
23459 _(lisp_locator_set_dump, "[local | remote]") \
23460 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
23461 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
23462 "[local] | [remote]") \
23463 _(lisp_eid_table_vni_dump, "") \
23464 _(lisp_eid_table_map_dump, "l2|l3") \
23465 _(lisp_map_resolver_dump, "") \
23466 _(lisp_map_server_dump, "") \
23467 _(lisp_adjacencies_get, "vni <vni>") \
23468 _(gpe_fwd_entry_vnis_get, "") \
23469 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
23470 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
23471 "[table <table-id>]") \
23472 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
23473 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
23474 _(gpe_set_encap_mode, "lisp|vxlan") \
23475 _(gpe_get_encap_mode, "") \
23476 _(lisp_gpe_add_del_iface, "up|down") \
23477 _(lisp_gpe_enable_disable, "enable|disable") \
23478 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
23479 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
23480 _(show_lisp_rloc_probe_state, "") \
23481 _(show_lisp_map_register_state, "") \
23482 _(show_lisp_status, "") \
23483 _(lisp_get_map_request_itr_rlocs, "") \
23484 _(show_lisp_pitr, "") \
23485 _(show_lisp_use_petr, "") \
23486 _(show_lisp_map_request_mode, "") \
23487 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
23488 _(af_packet_delete, "name <host interface name>") \
23489 _(af_packet_dump, "") \
23490 _(policer_add_del, "name <policer name> <params> [del]") \
23491 _(policer_dump, "[name <policer name>]") \
23492 _(policer_classify_set_interface, \
23493 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23494 " [l2-table <nn>] [del]") \
23495 _(policer_classify_dump, "type [ip4|ip6|l2]") \
23496 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
23497 "[master|slave]") \
23498 _(netmap_delete, "name <interface name>") \
23499 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
23500 _(mpls_fib_dump, "") \
23501 _(classify_table_ids, "") \
23502 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
23503 _(classify_table_info, "table_id <nn>") \
23504 _(classify_session_dump, "table_id <nn>") \
23505 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
23506 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
23507 "[template_interval <nn>] [udp_checksum]") \
23508 _(ipfix_exporter_dump, "") \
23509 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
23510 _(ipfix_classify_stream_dump, "") \
23511 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
23512 _(ipfix_classify_table_dump, "") \
23513 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
23514 _(sw_interface_span_dump, "[l2]") \
23515 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
23516 _(pg_create_interface, "if_id <nn>") \
23517 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
23518 _(pg_enable_disable, "[stream <id>] disable") \
23519 _(ip_source_and_port_range_check_add_del, \
23520 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
23521 _(ip_source_and_port_range_check_interface_add_del, \
23522 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
23523 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
23524 _(ipsec_gre_add_del_tunnel, \
23525 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
23526 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
23527 _(delete_subif,"<intfc> | sw_if_index <nn>") \
23528 _(l2_interface_pbb_tag_rewrite, \
23529 "<intfc> | sw_if_index <nn> \n" \
23530 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
23531 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
23532 _(set_punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
23533 _(flow_classify_set_interface, \
23534 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
23535 _(flow_classify_dump, "type [ip4|ip6]") \
23536 _(ip_fib_dump, "") \
23537 _(ip_mfib_dump, "") \
23538 _(ip6_fib_dump, "") \
23539 _(ip6_mfib_dump, "") \
23540 _(feature_enable_disable, "arc_name <arc_name> " \
23541 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
23542 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
23544 _(l2_xconnect_dump, "") \
23545 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
23546 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
23547 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
23548 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
23549 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
23550 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
23551 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
23552 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
23553 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
23554 _(sock_init_shm, "size <nnn>") \
23555 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
23556 _(dns_enable_disable, "[enable][disable]") \
23557 _(dns_name_server_add_del, "<ip-address> [del]") \
23558 _(dns_resolve_name, "<hostname>") \
23559 _(dns_resolve_ip, "<ip4|ip6>") \
23560 _(dns_name_server_add_del, "<ip-address> [del]") \
23561 _(dns_resolve_name, "<hostname>") \
23562 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
23563 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
23564 _(session_rules_dump, "") \
23565 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
23566 _(output_acl_set_interface, \
23567 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
23568 " [l2-table <nn>] [del]") \
23569 _(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
23571 /* List of command functions, CLI names map directly to functions */
23572 #define foreach_cli_function \
23573 _(comment, "usage: comment <ignore-rest-of-line>") \
23574 _(dump_interface_table, "usage: dump_interface_table") \
23575 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
23576 _(dump_ipv4_table, "usage: dump_ipv4_table") \
23577 _(dump_ipv6_table, "usage: dump_ipv6_table") \
23578 _(dump_macro_table, "usage: dump_macro_table ") \
23579 _(dump_node_table, "usage: dump_node_table") \
23580 _(dump_msg_api_table, "usage: dump_msg_api_table") \
23581 _(get_msg_id, "usage: get_msg_id name_and_crc") \
23582 _(echo, "usage: echo <message>") \
23583 _(exec, "usage: exec <vpe-debug-CLI-command>") \
23584 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
23585 _(help, "usage: help") \
23586 _(q, "usage: quit") \
23587 _(quit, "usage: quit") \
23588 _(search_node_table, "usage: search_node_table <name>...") \
23589 _(set, "usage: set <variable-name> <value>") \
23590 _(script, "usage: script <file-name>") \
23591 _(statseg, "usage: statseg"); \
23592 _(unset, "usage: unset <variable-name>")
23595 static void vl_api_##n##_t_handler_uni \
23596 (vl_api_##n##_t * mp) \
23598 vat_main_t * vam = &vat_main; \
23599 if (vam->json_output) { \
23600 vl_api_##n##_t_handler_json(mp); \
23602 vl_api_##n##_t_handler(mp); \
23605 foreach_vpe_api_reply_msg;
23606 #if VPP_API_TEST_BUILTIN == 0
23607 foreach_standalone_reply_msg;
23612 vat_api_hookup (vat_main_t * vam)
23615 vl_msg_api_set_handlers(VL_API_##N, #n, \
23616 vl_api_##n##_t_handler_uni, \
23618 vl_api_##n##_t_endian, \
23619 vl_api_##n##_t_print, \
23620 sizeof(vl_api_##n##_t), 1);
23621 foreach_vpe_api_reply_msg;
23622 #if VPP_API_TEST_BUILTIN == 0
23623 foreach_standalone_reply_msg;
23627 #if (VPP_API_TEST_BUILTIN==0)
23628 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
23630 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
23632 vam->function_by_name = hash_create_string (0, sizeof (uword));
23634 vam->help_by_name = hash_create_string (0, sizeof (uword));
23637 /* API messages we can send */
23638 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
23639 foreach_vpe_api_msg;
23643 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
23644 foreach_vpe_api_msg;
23647 /* CLI functions */
23648 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
23649 foreach_cli_function;
23653 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
23654 foreach_cli_function;
23658 #if VPP_API_TEST_BUILTIN
23659 static clib_error_t *
23660 vat_api_hookup_shim (vlib_main_t * vm)
23662 vat_api_hookup (&vat_main);
23666 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
23670 * fd.io coding-style-patch-verification: ON
23673 * eval: (c-set-style "gnu")