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/ip/ip_types_api.h>
28 #include <vnet/l2/l2_input.h>
29 #include <vnet/l2tp/l2tp.h>
30 #include <vnet/vxlan/vxlan.h>
31 #include <vnet/geneve/geneve.h>
32 #include <vnet/gre/gre.h>
33 #include <vnet/vxlan-gpe/vxlan_gpe.h>
34 #include <vnet/lisp-gpe/lisp_gpe.h>
36 #include <vpp/api/vpe_msg_enum.h>
37 #include <vnet/l2/l2_classify.h>
38 #include <vnet/l2/l2_vtr.h>
39 #include <vnet/classify/in_out_acl.h>
40 #include <vnet/classify/policer_classify.h>
41 #include <vnet/classify/flow_classify.h>
42 #include <vnet/mpls/mpls.h>
43 #include <vnet/ipsec/ipsec.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 <vnet/ethernet/ethernet_types_api.h>
57 #include <vnet/ip/ip_types_api.h>
58 #include "vat/json_format.h"
59 #include <vnet/ip/ip_types_api.h>
60 #include <vnet/ethernet/ethernet_types_api.h>
65 #define vl_typedefs /* define message structures */
66 #include <vpp/api/vpe_all_api_h.h>
69 /* declare message handlers for each api */
71 #define vl_endianfun /* define message structures */
72 #include <vpp/api/vpe_all_api_h.h>
75 /* instantiate all the print functions we know about */
76 #define vl_print(handle, ...)
78 #include <vpp/api/vpe_all_api_h.h>
81 #define __plugin_msg_base 0
82 #include <vlibapi/vat_helper_macros.h>
84 #if VPP_API_TEST_BUILTIN == 0
94 vat_socket_connect (vat_main_t * vam)
97 vam->socket_client_main = &socket_client_main;
98 if ((rv = vl_socket_client_connect ((char *) vam->socket_name,
100 0 /* default socket rx, tx buffer */ )))
102 /* vpp expects the client index in network order */
103 vam->my_client_index = htonl (socket_client_main.client_index);
106 #else /* vpp built-in case, we don't do sockets... */
108 vat_socket_connect (vat_main_t * vam)
114 vl_socket_client_read (int wait)
120 vl_socket_client_write ()
126 vl_socket_client_msg_alloc (int nbytes)
134 vat_time_now (vat_main_t * vam)
136 #if VPP_API_TEST_BUILTIN
137 return vlib_time_now (vam->vlib_main);
139 return clib_time_now (&vam->clib_time);
144 errmsg (char *fmt, ...)
146 vat_main_t *vam = &vat_main;
151 s = va_format (0, fmt, &va);
156 #if VPP_API_TEST_BUILTIN
157 vlib_cli_output (vam->vlib_main, (char *) s);
160 if (vam->ifp != stdin)
161 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
162 vam->input_line_number);
163 fformat (vam->ofp, (char *) s);
171 #if VPP_API_TEST_BUILTIN == 0
173 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
175 vat_main_t *vam = va_arg (*args, vat_main_t *);
176 u32 *result = va_arg (*args, u32 *);
180 if (!unformat (input, "%s", &if_name))
183 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
191 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
196 /* Parse an IP4 address %d.%d.%d.%d. */
198 unformat_ip4_address (unformat_input_t * input, va_list * args)
200 u8 *result = va_arg (*args, u8 *);
203 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
206 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
218 unformat_ethernet_address (unformat_input_t * input, va_list * args)
220 u8 *result = va_arg (*args, u8 *);
223 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
224 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
228 for (i = 0; i < 6; i++)
229 if (a[i] >= (1 << 8))
232 for (i = 0; i < 6; i++)
238 /* Returns ethernet type as an int in host byte order. */
240 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
243 u16 *result = va_arg (*args, u16 *);
247 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
249 if (type >= (1 << 16))
257 /* Parse an IP6 address. */
259 unformat_ip6_address (unformat_input_t * input, va_list * args)
261 ip6_address_t *result = va_arg (*args, ip6_address_t *);
263 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
264 uword c, n_colon, double_colon_index;
266 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
267 double_colon_index = ARRAY_LEN (hex_quads);
268 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
271 if (c >= '0' && c <= '9')
273 else if (c >= 'a' && c <= 'f')
274 hex_digit = c + 10 - 'a';
275 else if (c >= 'A' && c <= 'F')
276 hex_digit = c + 10 - 'A';
277 else if (c == ':' && n_colon < 2)
281 unformat_put_input (input);
285 /* Too many hex quads. */
286 if (n_hex_quads >= ARRAY_LEN (hex_quads))
291 hex_quad = (hex_quad << 4) | hex_digit;
293 /* Hex quad must fit in 16 bits. */
294 if (n_hex_digits >= 4)
301 /* Save position of :: */
304 /* More than one :: ? */
305 if (double_colon_index < ARRAY_LEN (hex_quads))
307 double_colon_index = n_hex_quads;
310 if (n_colon > 0 && n_hex_digits > 0)
312 hex_quads[n_hex_quads++] = hex_quad;
318 if (n_hex_digits > 0)
319 hex_quads[n_hex_quads++] = hex_quad;
324 /* Expand :: to appropriate number of zero hex quads. */
325 if (double_colon_index < ARRAY_LEN (hex_quads))
327 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
329 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
330 hex_quads[n_zero + i] = hex_quads[i];
332 for (i = 0; i < n_zero; i++)
333 hex_quads[double_colon_index + i] = 0;
335 n_hex_quads = ARRAY_LEN (hex_quads);
338 /* Too few hex quads given. */
339 if (n_hex_quads < ARRAY_LEN (hex_quads))
342 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
343 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
350 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
352 u32 *r = va_arg (*args, u32 *);
355 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
356 foreach_ipsec_policy_action
364 format_ipsec_crypto_alg (u8 * s, va_list * args)
366 u32 i = va_arg (*args, u32);
371 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
372 foreach_ipsec_crypto_alg
375 return format (s, "unknown");
377 return format (s, "%s", t);
381 format_ipsec_integ_alg (u8 * s, va_list * args)
383 u32 i = va_arg (*args, u32);
388 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
389 foreach_ipsec_integ_alg
392 return format (s, "unknown");
394 return format (s, "%s", t);
397 #else /* VPP_API_TEST_BUILTIN == 1 */
399 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
401 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
402 vnet_main_t *vnm = vnet_get_main ();
403 u32 *result = va_arg (*args, u32 *);
405 return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result);
409 api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
411 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
412 vnet_main_t *vnm = vnet_get_main ();
413 u32 *result = va_arg (*args, u32 *);
415 return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result);
418 #endif /* VPP_API_TEST_BUILTIN */
421 unformat_ipsec_api_crypto_alg (unformat_input_t * input, va_list * args)
423 u32 *r = va_arg (*args, u32 *);
426 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_CRYPTO_ALG_##f;
427 foreach_ipsec_crypto_alg
435 unformat_ipsec_api_integ_alg (unformat_input_t * input, va_list * args)
437 u32 *r = va_arg (*args, u32 *);
440 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_INTEG_ALG_##f;
441 foreach_ipsec_integ_alg
449 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
451 u8 *r = va_arg (*args, u8 *);
453 if (unformat (input, "kbps"))
454 *r = SSE2_QOS_RATE_KBPS;
455 else if (unformat (input, "pps"))
456 *r = SSE2_QOS_RATE_PPS;
463 unformat_policer_round_type (unformat_input_t * input, va_list * args)
465 u8 *r = va_arg (*args, u8 *);
467 if (unformat (input, "closest"))
468 *r = SSE2_QOS_ROUND_TO_CLOSEST;
469 else if (unformat (input, "up"))
470 *r = SSE2_QOS_ROUND_TO_UP;
471 else if (unformat (input, "down"))
472 *r = SSE2_QOS_ROUND_TO_DOWN;
479 unformat_policer_type (unformat_input_t * input, va_list * args)
481 u8 *r = va_arg (*args, u8 *);
483 if (unformat (input, "1r2c"))
484 *r = SSE2_QOS_POLICER_TYPE_1R2C;
485 else if (unformat (input, "1r3c"))
486 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
487 else if (unformat (input, "2r3c-2698"))
488 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
489 else if (unformat (input, "2r3c-4115"))
490 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
491 else if (unformat (input, "2r3c-mef5cf1"))
492 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
499 unformat_dscp (unformat_input_t * input, va_list * va)
501 u8 *r = va_arg (*va, u8 *);
504 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
513 unformat_policer_action_type (unformat_input_t * input, va_list * va)
515 sse2_qos_pol_action_params_st *a
516 = va_arg (*va, sse2_qos_pol_action_params_st *);
518 if (unformat (input, "drop"))
519 a->action_type = SSE2_QOS_ACTION_DROP;
520 else if (unformat (input, "transmit"))
521 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
522 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
523 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
530 unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
532 u32 *r = va_arg (*va, u32 *);
535 if (unformat (input, "ip4"))
536 tid = POLICER_CLASSIFY_TABLE_IP4;
537 else if (unformat (input, "ip6"))
538 tid = POLICER_CLASSIFY_TABLE_IP6;
539 else if (unformat (input, "l2"))
540 tid = POLICER_CLASSIFY_TABLE_L2;
549 unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
551 u32 *r = va_arg (*va, u32 *);
554 if (unformat (input, "ip4"))
555 tid = FLOW_CLASSIFY_TABLE_IP4;
556 else if (unformat (input, "ip6"))
557 tid = FLOW_CLASSIFY_TABLE_IP6;
565 static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
566 static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
567 static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
568 static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
570 #if (VPP_API_TEST_BUILTIN==0)
572 unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
574 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
575 mfib_itf_attribute_t attr;
578 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
580 if (unformat (input, mfib_itf_flag_long_names[attr]))
581 *iflags |= (1 << attr);
583 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
585 if (unformat (input, mfib_itf_flag_names[attr]))
586 *iflags |= (1 << attr);
589 return (old == *iflags ? 0 : 1);
593 unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
595 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
596 mfib_entry_attribute_t attr;
599 FOR_EACH_MFIB_ATTRIBUTE (attr)
601 if (unformat (input, mfib_flag_long_names[attr]))
602 *eflags |= (1 << attr);
604 FOR_EACH_MFIB_ATTRIBUTE (attr)
606 if (unformat (input, mfib_flag_names[attr]))
607 *eflags |= (1 << attr);
610 return (old == *eflags ? 0 : 1);
614 format_ip4_address (u8 * s, va_list * args)
616 u8 *a = va_arg (*args, u8 *);
617 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
621 format_ip6_address (u8 * s, va_list * args)
623 ip6_address_t *a = va_arg (*args, ip6_address_t *);
624 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
626 i_max_n_zero = ARRAY_LEN (a->as_u16);
628 i_first_zero = i_max_n_zero;
630 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
632 u32 is_zero = a->as_u16[i] == 0;
633 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
639 if ((!is_zero && n_zeros > max_n_zeros)
640 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
642 i_max_n_zero = i_first_zero;
643 max_n_zeros = n_zeros;
644 i_first_zero = ARRAY_LEN (a->as_u16);
649 last_double_colon = 0;
650 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
652 if (i == i_max_n_zero && max_n_zeros > 1)
654 s = format (s, "::");
655 i += max_n_zeros - 1;
656 last_double_colon = 1;
660 s = format (s, "%s%x",
661 (last_double_colon || i == 0) ? "" : ":",
662 clib_net_to_host_u16 (a->as_u16[i]));
663 last_double_colon = 0;
670 /* Format an IP46 address. */
672 format_ip46_address (u8 * s, va_list * args)
674 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
675 ip46_type_t type = va_arg (*args, ip46_type_t);
681 is_ip4 = ip46_address_is_ip4 (ip46);
692 format (s, "%U", format_ip4_address, &ip46->ip4) :
693 format (s, "%U", format_ip6_address, &ip46->ip6);
697 format_ethernet_address (u8 * s, va_list * args)
699 u8 *a = va_arg (*args, u8 *);
701 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
702 a[0], a[1], a[2], a[3], a[4], a[5]);
707 increment_v4_address (ip4_address_t * a)
711 v = ntohl (a->as_u32) + 1;
712 a->as_u32 = ntohl (v);
716 increment_vl_v4_address (vl_api_ip4_address_t * a)
724 clib_memcpy (a, &v, sizeof (v));
728 increment_vl_address (vl_api_address_t * a)
730 if (ADDRESS_IP4 == a->af)
731 increment_vl_v4_address (&a->un.ip4);
735 increment_v6_address (ip6_address_t * a)
739 v0 = clib_net_to_host_u64 (a->as_u64[0]);
740 v1 = clib_net_to_host_u64 (a->as_u64[1]);
745 a->as_u64[0] = clib_net_to_host_u64 (v0);
746 a->as_u64[1] = clib_net_to_host_u64 (v1);
750 increment_mac_address (u8 * mac)
752 u64 tmp = *((u64 *) mac);
753 tmp = clib_net_to_host_u64 (tmp);
754 tmp += 1 << 16; /* skip unused (least significant) octets */
755 tmp = clib_host_to_net_u64 (tmp);
757 clib_memcpy (mac, &tmp, 6);
760 static void vl_api_create_loopback_reply_t_handler
761 (vl_api_create_loopback_reply_t * mp)
763 vat_main_t *vam = &vat_main;
764 i32 retval = ntohl (mp->retval);
766 vam->retval = retval;
767 vam->regenerate_interface_table = 1;
768 vam->sw_if_index = ntohl (mp->sw_if_index);
769 vam->result_ready = 1;
772 static void vl_api_create_loopback_reply_t_handler_json
773 (vl_api_create_loopback_reply_t * mp)
775 vat_main_t *vam = &vat_main;
776 vat_json_node_t node;
778 vat_json_init_object (&node);
779 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
780 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
782 vat_json_print (vam->ofp, &node);
783 vat_json_free (&node);
784 vam->retval = ntohl (mp->retval);
785 vam->result_ready = 1;
788 static void vl_api_create_loopback_instance_reply_t_handler
789 (vl_api_create_loopback_instance_reply_t * mp)
791 vat_main_t *vam = &vat_main;
792 i32 retval = ntohl (mp->retval);
794 vam->retval = retval;
795 vam->regenerate_interface_table = 1;
796 vam->sw_if_index = ntohl (mp->sw_if_index);
797 vam->result_ready = 1;
800 static void vl_api_create_loopback_instance_reply_t_handler_json
801 (vl_api_create_loopback_instance_reply_t * mp)
803 vat_main_t *vam = &vat_main;
804 vat_json_node_t node;
806 vat_json_init_object (&node);
807 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
808 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
810 vat_json_print (vam->ofp, &node);
811 vat_json_free (&node);
812 vam->retval = ntohl (mp->retval);
813 vam->result_ready = 1;
816 static void vl_api_af_packet_create_reply_t_handler
817 (vl_api_af_packet_create_reply_t * mp)
819 vat_main_t *vam = &vat_main;
820 i32 retval = ntohl (mp->retval);
822 vam->retval = retval;
823 vam->regenerate_interface_table = 1;
824 vam->sw_if_index = ntohl (mp->sw_if_index);
825 vam->result_ready = 1;
828 static void vl_api_af_packet_create_reply_t_handler_json
829 (vl_api_af_packet_create_reply_t * mp)
831 vat_main_t *vam = &vat_main;
832 vat_json_node_t node;
834 vat_json_init_object (&node);
835 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
836 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
838 vat_json_print (vam->ofp, &node);
839 vat_json_free (&node);
841 vam->retval = ntohl (mp->retval);
842 vam->result_ready = 1;
845 static void vl_api_create_vlan_subif_reply_t_handler
846 (vl_api_create_vlan_subif_reply_t * mp)
848 vat_main_t *vam = &vat_main;
849 i32 retval = ntohl (mp->retval);
851 vam->retval = retval;
852 vam->regenerate_interface_table = 1;
853 vam->sw_if_index = ntohl (mp->sw_if_index);
854 vam->result_ready = 1;
857 static void vl_api_create_vlan_subif_reply_t_handler_json
858 (vl_api_create_vlan_subif_reply_t * mp)
860 vat_main_t *vam = &vat_main;
861 vat_json_node_t node;
863 vat_json_init_object (&node);
864 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
865 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
867 vat_json_print (vam->ofp, &node);
868 vat_json_free (&node);
870 vam->retval = ntohl (mp->retval);
871 vam->result_ready = 1;
874 static void vl_api_create_subif_reply_t_handler
875 (vl_api_create_subif_reply_t * mp)
877 vat_main_t *vam = &vat_main;
878 i32 retval = ntohl (mp->retval);
880 vam->retval = retval;
881 vam->regenerate_interface_table = 1;
882 vam->sw_if_index = ntohl (mp->sw_if_index);
883 vam->result_ready = 1;
886 static void vl_api_create_subif_reply_t_handler_json
887 (vl_api_create_subif_reply_t * mp)
889 vat_main_t *vam = &vat_main;
890 vat_json_node_t node;
892 vat_json_init_object (&node);
893 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
894 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
896 vat_json_print (vam->ofp, &node);
897 vat_json_free (&node);
899 vam->retval = ntohl (mp->retval);
900 vam->result_ready = 1;
903 static void vl_api_interface_name_renumber_reply_t_handler
904 (vl_api_interface_name_renumber_reply_t * mp)
906 vat_main_t *vam = &vat_main;
907 i32 retval = ntohl (mp->retval);
909 vam->retval = retval;
910 vam->regenerate_interface_table = 1;
911 vam->result_ready = 1;
914 static void vl_api_interface_name_renumber_reply_t_handler_json
915 (vl_api_interface_name_renumber_reply_t * mp)
917 vat_main_t *vam = &vat_main;
918 vat_json_node_t node;
920 vat_json_init_object (&node);
921 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
923 vat_json_print (vam->ofp, &node);
924 vat_json_free (&node);
926 vam->retval = ntohl (mp->retval);
927 vam->result_ready = 1;
931 * Special-case: build the interface table, maintain
932 * the next loopback sw_if_index vbl.
934 static void vl_api_sw_interface_details_t_handler
935 (vl_api_sw_interface_details_t * mp)
937 vat_main_t *vam = &vat_main;
938 u8 *s = format (0, "%s%c", mp->interface_name, 0);
940 hash_set_mem (vam->sw_if_index_by_interface_name, s,
941 ntohl (mp->sw_if_index));
943 /* In sub interface case, fill the sub interface table entry */
944 if (mp->sw_if_index != mp->sup_sw_if_index)
946 sw_interface_subif_t *sub = NULL;
948 vec_add2 (vam->sw_if_subif_table, sub, 1);
950 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
951 strncpy ((char *) sub->interface_name, (char *) s,
952 vec_len (sub->interface_name));
953 sub->sw_if_index = ntohl (mp->sw_if_index);
954 sub->sub_id = ntohl (mp->sub_id);
956 sub->sub_dot1ad = mp->sub_dot1ad;
957 sub->sub_number_of_tags = mp->sub_number_of_tags;
958 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
959 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
960 sub->sub_exact_match = mp->sub_exact_match;
961 sub->sub_default = mp->sub_default;
962 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
963 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
965 /* vlan tag rewrite */
966 sub->vtr_op = ntohl (mp->vtr_op);
967 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
968 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
969 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
973 static void vl_api_sw_interface_details_t_handler_json
974 (vl_api_sw_interface_details_t * mp)
976 vat_main_t *vam = &vat_main;
977 vat_json_node_t *node = NULL;
979 if (VAT_JSON_ARRAY != vam->json_tree.type)
981 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
982 vat_json_init_array (&vam->json_tree);
984 node = vat_json_array_add (&vam->json_tree);
986 vat_json_init_object (node);
987 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
988 vat_json_object_add_uint (node, "sup_sw_if_index",
989 ntohl (mp->sup_sw_if_index));
990 vat_json_object_add_uint (node, "l2_address_length",
991 ntohl (mp->l2_address_length));
992 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
993 sizeof (mp->l2_address));
994 vat_json_object_add_string_copy (node, "interface_name",
996 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
997 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
998 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
999 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
1000 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
1001 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
1002 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
1003 vat_json_object_add_uint (node, "sub_number_of_tags",
1004 mp->sub_number_of_tags);
1005 vat_json_object_add_uint (node, "sub_outer_vlan_id",
1006 ntohs (mp->sub_outer_vlan_id));
1007 vat_json_object_add_uint (node, "sub_inner_vlan_id",
1008 ntohs (mp->sub_inner_vlan_id));
1009 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
1010 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
1011 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
1012 mp->sub_outer_vlan_id_any);
1013 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
1014 mp->sub_inner_vlan_id_any);
1015 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
1016 vat_json_object_add_uint (node, "vtr_push_dot1q",
1017 ntohl (mp->vtr_push_dot1q));
1018 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
1019 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
1022 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
1024 format_ethernet_address,
1026 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
1028 format_ethernet_address,
1030 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
1031 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
1035 #if VPP_API_TEST_BUILTIN == 0
1036 static void vl_api_sw_interface_event_t_handler
1037 (vl_api_sw_interface_event_t * mp)
1039 vat_main_t *vam = &vat_main;
1040 if (vam->interface_event_display)
1041 errmsg ("interface flags: sw_if_index %d %s %s",
1042 ntohl (mp->sw_if_index),
1043 mp->admin_up_down ? "admin-up" : "admin-down",
1044 mp->link_up_down ? "link-up" : "link-down");
1048 static void vl_api_sw_interface_event_t_handler_json
1049 (vl_api_sw_interface_event_t * mp)
1051 /* JSON output not supported */
1055 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
1057 vat_main_t *vam = &vat_main;
1058 i32 retval = ntohl (mp->retval);
1060 vam->retval = retval;
1061 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
1062 vam->result_ready = 1;
1066 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
1068 vat_main_t *vam = &vat_main;
1069 vat_json_node_t node;
1070 api_main_t *am = &api_main;
1074 vat_json_init_object (&node);
1075 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1076 vat_json_object_add_uint (&node, "reply_in_shmem",
1077 ntohl (mp->reply_in_shmem));
1078 /* Toss the shared-memory original... */
1079 pthread_mutex_lock (&am->vlib_rp->mutex);
1080 oldheap = svm_push_data_heap (am->vlib_rp);
1082 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1085 svm_pop_heap (oldheap);
1086 pthread_mutex_unlock (&am->vlib_rp->mutex);
1088 vat_json_print (vam->ofp, &node);
1089 vat_json_free (&node);
1091 vam->retval = ntohl (mp->retval);
1092 vam->result_ready = 1;
1096 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
1098 vat_main_t *vam = &vat_main;
1099 i32 retval = ntohl (mp->retval);
1100 u32 length = vl_api_string_len (&mp->reply);
1102 vec_reset_length (vam->cmd_reply);
1104 vam->retval = retval;
1107 vec_validate (vam->cmd_reply, length);
1108 clib_memcpy ((char *) (vam->cmd_reply),
1109 vl_api_from_api_string (&mp->reply), length);
1110 vam->cmd_reply[length] = 0;
1112 vam->result_ready = 1;
1116 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
1118 vat_main_t *vam = &vat_main;
1119 vat_json_node_t node;
1121 vec_reset_length (vam->cmd_reply);
1123 vat_json_init_object (&node);
1124 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1125 vat_json_object_add_string_copy (&node, "reply",
1126 vl_api_from_api_string (&mp->reply));
1128 vat_json_print (vam->ofp, &node);
1129 vat_json_free (&node);
1131 vam->retval = ntohl (mp->retval);
1132 vam->result_ready = 1;
1135 static void vl_api_classify_add_del_table_reply_t_handler
1136 (vl_api_classify_add_del_table_reply_t * mp)
1138 vat_main_t *vam = &vat_main;
1139 i32 retval = ntohl (mp->retval);
1140 if (vam->async_mode)
1142 vam->async_errors += (retval < 0);
1146 vam->retval = retval;
1148 ((mp->new_table_index != 0xFFFFFFFF) ||
1149 (mp->skip_n_vectors != 0xFFFFFFFF) ||
1150 (mp->match_n_vectors != 0xFFFFFFFF)))
1152 * Note: this is just barely thread-safe, depends on
1153 * the main thread spinning waiting for an answer...
1155 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d",
1156 ntohl (mp->new_table_index),
1157 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
1158 vam->result_ready = 1;
1162 static void vl_api_classify_add_del_table_reply_t_handler_json
1163 (vl_api_classify_add_del_table_reply_t * mp)
1165 vat_main_t *vam = &vat_main;
1166 vat_json_node_t node;
1168 vat_json_init_object (&node);
1169 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1170 vat_json_object_add_uint (&node, "new_table_index",
1171 ntohl (mp->new_table_index));
1172 vat_json_object_add_uint (&node, "skip_n_vectors",
1173 ntohl (mp->skip_n_vectors));
1174 vat_json_object_add_uint (&node, "match_n_vectors",
1175 ntohl (mp->match_n_vectors));
1177 vat_json_print (vam->ofp, &node);
1178 vat_json_free (&node);
1180 vam->retval = ntohl (mp->retval);
1181 vam->result_ready = 1;
1184 static void vl_api_get_node_index_reply_t_handler
1185 (vl_api_get_node_index_reply_t * mp)
1187 vat_main_t *vam = &vat_main;
1188 i32 retval = ntohl (mp->retval);
1189 if (vam->async_mode)
1191 vam->async_errors += (retval < 0);
1195 vam->retval = retval;
1197 errmsg ("node index %d", ntohl (mp->node_index));
1198 vam->result_ready = 1;
1202 static void vl_api_get_node_index_reply_t_handler_json
1203 (vl_api_get_node_index_reply_t * mp)
1205 vat_main_t *vam = &vat_main;
1206 vat_json_node_t node;
1208 vat_json_init_object (&node);
1209 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1210 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1212 vat_json_print (vam->ofp, &node);
1213 vat_json_free (&node);
1215 vam->retval = ntohl (mp->retval);
1216 vam->result_ready = 1;
1219 static void vl_api_get_next_index_reply_t_handler
1220 (vl_api_get_next_index_reply_t * mp)
1222 vat_main_t *vam = &vat_main;
1223 i32 retval = ntohl (mp->retval);
1224 if (vam->async_mode)
1226 vam->async_errors += (retval < 0);
1230 vam->retval = retval;
1232 errmsg ("next node index %d", ntohl (mp->next_index));
1233 vam->result_ready = 1;
1237 static void vl_api_get_next_index_reply_t_handler_json
1238 (vl_api_get_next_index_reply_t * mp)
1240 vat_main_t *vam = &vat_main;
1241 vat_json_node_t node;
1243 vat_json_init_object (&node);
1244 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1245 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1247 vat_json_print (vam->ofp, &node);
1248 vat_json_free (&node);
1250 vam->retval = ntohl (mp->retval);
1251 vam->result_ready = 1;
1254 static void vl_api_add_node_next_reply_t_handler
1255 (vl_api_add_node_next_reply_t * mp)
1257 vat_main_t *vam = &vat_main;
1258 i32 retval = ntohl (mp->retval);
1259 if (vam->async_mode)
1261 vam->async_errors += (retval < 0);
1265 vam->retval = retval;
1267 errmsg ("next index %d", ntohl (mp->next_index));
1268 vam->result_ready = 1;
1272 static void vl_api_add_node_next_reply_t_handler_json
1273 (vl_api_add_node_next_reply_t * mp)
1275 vat_main_t *vam = &vat_main;
1276 vat_json_node_t node;
1278 vat_json_init_object (&node);
1279 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1280 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1282 vat_json_print (vam->ofp, &node);
1283 vat_json_free (&node);
1285 vam->retval = ntohl (mp->retval);
1286 vam->result_ready = 1;
1289 static void vl_api_show_version_reply_t_handler
1290 (vl_api_show_version_reply_t * mp)
1292 vat_main_t *vam = &vat_main;
1293 i32 retval = ntohl (mp->retval);
1298 char *p = (char *) &mp->program;
1300 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1301 errmsg (" program: %s\n", s);
1305 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1306 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1307 errmsg (" version: %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 (" build date: %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 directory: %s\n", s);
1322 vam->retval = retval;
1323 vam->result_ready = 1;
1326 static void vl_api_show_version_reply_t_handler_json
1327 (vl_api_show_version_reply_t * mp)
1329 vat_main_t *vam = &vat_main;
1330 vat_json_node_t node;
1332 vat_json_init_object (&node);
1333 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1334 char *p = (char *) &mp->program;
1335 vat_json_object_add_string_copy (&node, "program",
1336 vl_api_from_api_string ((vl_api_string_t *)
1338 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1339 vat_json_object_add_string_copy (&node, "version",
1340 vl_api_from_api_string ((vl_api_string_t *)
1342 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1343 vat_json_object_add_string_copy (&node, "build_date",
1344 vl_api_from_api_string ((vl_api_string_t *)
1346 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1347 vat_json_object_add_string_copy (&node, "build_directory",
1348 vl_api_from_api_string ((vl_api_string_t *)
1351 vat_json_print (vam->ofp, &node);
1352 vat_json_free (&node);
1354 vam->retval = ntohl (mp->retval);
1355 vam->result_ready = 1;
1358 static void vl_api_show_threads_reply_t_handler
1359 (vl_api_show_threads_reply_t * mp)
1361 vat_main_t *vam = &vat_main;
1362 i32 retval = ntohl (mp->retval);
1366 count = ntohl (mp->count);
1368 for (i = 0; i < count; i++)
1370 "\n%-2d %-11s %-11s %-5d %-6d %-4d %-6d",
1371 ntohl (mp->thread_data[i].id), mp->thread_data[i].name,
1372 mp->thread_data[i].type, ntohl (mp->thread_data[i].pid),
1373 ntohl (mp->thread_data[i].cpu_id), ntohl (mp->thread_data[i].core),
1374 ntohl (mp->thread_data[i].cpu_socket));
1376 vam->retval = retval;
1377 vam->result_ready = 1;
1380 static void vl_api_show_threads_reply_t_handler_json
1381 (vl_api_show_threads_reply_t * mp)
1383 vat_main_t *vam = &vat_main;
1384 vat_json_node_t node;
1385 vl_api_thread_data_t *td;
1386 i32 retval = ntohl (mp->retval);
1390 count = ntohl (mp->count);
1392 vat_json_init_object (&node);
1393 vat_json_object_add_int (&node, "retval", retval);
1394 vat_json_object_add_uint (&node, "count", count);
1396 for (i = 0; i < count; i++)
1398 td = &mp->thread_data[i];
1399 vat_json_object_add_uint (&node, "id", ntohl (td->id));
1400 vat_json_object_add_string_copy (&node, "name", td->name);
1401 vat_json_object_add_string_copy (&node, "type", td->type);
1402 vat_json_object_add_uint (&node, "pid", ntohl (td->pid));
1403 vat_json_object_add_int (&node, "cpu_id", ntohl (td->cpu_id));
1404 vat_json_object_add_int (&node, "core", ntohl (td->id));
1405 vat_json_object_add_int (&node, "cpu_socket", ntohl (td->cpu_socket));
1408 vat_json_print (vam->ofp, &node);
1409 vat_json_free (&node);
1411 vam->retval = retval;
1412 vam->result_ready = 1;
1416 api_show_threads (vat_main_t * vam)
1418 vl_api_show_threads_t *mp;
1422 "\n%-2s %-11s %-11s %-5s %-6s %-4s %-6s",
1423 "ID", "Name", "Type", "LWP", "cpu_id", "Core", "Socket");
1425 M (SHOW_THREADS, mp);
1433 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1435 u32 sw_if_index = ntohl (mp->sw_if_index);
1436 errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n",
1437 mp->mac_ip ? "mac/ip binding" : "address resolution",
1438 ntohl (mp->pid), format_ip4_address, mp->ip,
1439 format_vl_api_mac_address, &mp->mac, sw_if_index);
1443 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1445 /* JSON output not supported */
1449 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1451 u32 sw_if_index = ntohl (mp->sw_if_index);
1452 errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n",
1453 mp->mac_ip ? "mac/ip binding" : "address resolution",
1454 ntohl (mp->pid), format_vl_api_ip6_address, mp->ip,
1455 format_vl_api_mac_address, mp->mac, sw_if_index);
1459 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1461 /* JSON output not supported */
1465 vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1467 u32 n_macs = ntohl (mp->n_macs);
1468 errmsg ("L2MAC event received with pid %d cl-idx %d for %d macs: \n",
1469 ntohl (mp->pid), mp->client_index, n_macs);
1471 for (i = 0; i < n_macs; i++)
1473 vl_api_mac_entry_t *mac = &mp->mac[i];
1474 errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
1475 i + 1, ntohl (mac->sw_if_index),
1476 format_ethernet_address, mac->mac_addr, mac->action);
1483 vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1485 /* JSON output not supported */
1488 #define vl_api_bridge_domain_details_t_endian vl_noop_handler
1489 #define vl_api_bridge_domain_details_t_print vl_noop_handler
1492 * Special-case: build the bridge domain table, maintain
1493 * the next bd id vbl.
1495 static void vl_api_bridge_domain_details_t_handler
1496 (vl_api_bridge_domain_details_t * mp)
1498 vat_main_t *vam = &vat_main;
1499 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1502 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-6s %-3s",
1503 " ID", "LRN", "FWD", "FLD", "BVI", "UU-FWD", "#IF");
1505 print (vam->ofp, "%3d %3d %3d %3d %3d %6d %3d",
1506 ntohl (mp->bd_id), mp->learn, mp->forward,
1507 mp->flood, ntohl (mp->bvi_sw_if_index),
1508 ntohl (mp->uu_fwd_sw_if_index), n_sw_ifs);
1512 vl_api_bridge_domain_sw_if_t *sw_ifs;
1513 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1516 sw_ifs = mp->sw_if_details;
1517 for (i = 0; i < n_sw_ifs; i++)
1523 sw_if_index = ntohl (sw_ifs->sw_if_index);
1526 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1528 if ((u32) p->value[0] == sw_if_index)
1530 sw_if_name = (u8 *)(p->key);
1535 print (vam->ofp, "%7d %3d %s", sw_if_index,
1536 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1537 "sw_if_index not found!");
1544 static void vl_api_bridge_domain_details_t_handler_json
1545 (vl_api_bridge_domain_details_t * mp)
1547 vat_main_t *vam = &vat_main;
1548 vat_json_node_t *node, *array = NULL;
1549 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1551 if (VAT_JSON_ARRAY != vam->json_tree.type)
1553 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1554 vat_json_init_array (&vam->json_tree);
1556 node = vat_json_array_add (&vam->json_tree);
1558 vat_json_init_object (node);
1559 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1560 vat_json_object_add_uint (node, "flood", mp->flood);
1561 vat_json_object_add_uint (node, "forward", mp->forward);
1562 vat_json_object_add_uint (node, "learn", mp->learn);
1563 vat_json_object_add_uint (node, "bvi_sw_if_index",
1564 ntohl (mp->bvi_sw_if_index));
1565 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
1566 array = vat_json_object_add (node, "sw_if");
1567 vat_json_init_array (array);
1573 vl_api_bridge_domain_sw_if_t *sw_ifs;
1576 sw_ifs = mp->sw_if_details;
1577 for (i = 0; i < n_sw_ifs; i++)
1579 node = vat_json_array_add (array);
1580 vat_json_init_object (node);
1581 vat_json_object_add_uint (node, "sw_if_index",
1582 ntohl (sw_ifs->sw_if_index));
1583 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1589 static void vl_api_control_ping_reply_t_handler
1590 (vl_api_control_ping_reply_t * mp)
1592 vat_main_t *vam = &vat_main;
1593 i32 retval = ntohl (mp->retval);
1594 if (vam->async_mode)
1596 vam->async_errors += (retval < 0);
1600 vam->retval = retval;
1601 vam->result_ready = 1;
1603 if (vam->socket_client_main)
1604 vam->socket_client_main->control_pings_outstanding--;
1607 static void vl_api_control_ping_reply_t_handler_json
1608 (vl_api_control_ping_reply_t * mp)
1610 vat_main_t *vam = &vat_main;
1611 i32 retval = ntohl (mp->retval);
1613 if (VAT_JSON_NONE != vam->json_tree.type)
1615 vat_json_print (vam->ofp, &vam->json_tree);
1616 vat_json_free (&vam->json_tree);
1617 vam->json_tree.type = VAT_JSON_NONE;
1622 vat_json_init_array (&vam->json_tree);
1623 vat_json_print (vam->ofp, &vam->json_tree);
1624 vam->json_tree.type = VAT_JSON_NONE;
1627 vam->retval = retval;
1628 vam->result_ready = 1;
1632 vl_api_bridge_domain_set_mac_age_reply_t_handler
1633 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1635 vat_main_t *vam = &vat_main;
1636 i32 retval = ntohl (mp->retval);
1637 if (vam->async_mode)
1639 vam->async_errors += (retval < 0);
1643 vam->retval = retval;
1644 vam->result_ready = 1;
1648 static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1649 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1651 vat_main_t *vam = &vat_main;
1652 vat_json_node_t node;
1654 vat_json_init_object (&node);
1655 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1657 vat_json_print (vam->ofp, &node);
1658 vat_json_free (&node);
1660 vam->retval = ntohl (mp->retval);
1661 vam->result_ready = 1;
1665 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1667 vat_main_t *vam = &vat_main;
1668 i32 retval = ntohl (mp->retval);
1669 if (vam->async_mode)
1671 vam->async_errors += (retval < 0);
1675 vam->retval = retval;
1676 vam->result_ready = 1;
1680 static void vl_api_l2_flags_reply_t_handler_json
1681 (vl_api_l2_flags_reply_t * mp)
1683 vat_main_t *vam = &vat_main;
1684 vat_json_node_t node;
1686 vat_json_init_object (&node);
1687 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1688 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1689 ntohl (mp->resulting_feature_bitmap));
1691 vat_json_print (vam->ofp, &node);
1692 vat_json_free (&node);
1694 vam->retval = ntohl (mp->retval);
1695 vam->result_ready = 1;
1698 static void vl_api_bridge_flags_reply_t_handler
1699 (vl_api_bridge_flags_reply_t * mp)
1701 vat_main_t *vam = &vat_main;
1702 i32 retval = ntohl (mp->retval);
1703 if (vam->async_mode)
1705 vam->async_errors += (retval < 0);
1709 vam->retval = retval;
1710 vam->result_ready = 1;
1714 static void vl_api_bridge_flags_reply_t_handler_json
1715 (vl_api_bridge_flags_reply_t * mp)
1717 vat_main_t *vam = &vat_main;
1718 vat_json_node_t node;
1720 vat_json_init_object (&node);
1721 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1722 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1723 ntohl (mp->resulting_feature_bitmap));
1725 vat_json_print (vam->ofp, &node);
1726 vat_json_free (&node);
1728 vam->retval = ntohl (mp->retval);
1729 vam->result_ready = 1;
1733 vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp)
1735 vat_main_t *vam = &vat_main;
1736 i32 retval = ntohl (mp->retval);
1737 if (vam->async_mode)
1739 vam->async_errors += (retval < 0);
1743 vam->retval = retval;
1744 vam->sw_if_index = ntohl (mp->sw_if_index);
1745 vam->result_ready = 1;
1750 static void vl_api_tap_create_v2_reply_t_handler_json
1751 (vl_api_tap_create_v2_reply_t * mp)
1753 vat_main_t *vam = &vat_main;
1754 vat_json_node_t node;
1756 vat_json_init_object (&node);
1757 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1758 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1760 vat_json_print (vam->ofp, &node);
1761 vat_json_free (&node);
1763 vam->retval = ntohl (mp->retval);
1764 vam->result_ready = 1;
1769 vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp)
1771 vat_main_t *vam = &vat_main;
1772 i32 retval = ntohl (mp->retval);
1773 if (vam->async_mode)
1775 vam->async_errors += (retval < 0);
1779 vam->retval = retval;
1780 vam->result_ready = 1;
1784 static void vl_api_tap_delete_v2_reply_t_handler_json
1785 (vl_api_tap_delete_v2_reply_t * mp)
1787 vat_main_t *vam = &vat_main;
1788 vat_json_node_t node;
1790 vat_json_init_object (&node);
1791 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1793 vat_json_print (vam->ofp, &node);
1794 vat_json_free (&node);
1796 vam->retval = ntohl (mp->retval);
1797 vam->result_ready = 1;
1801 vl_api_virtio_pci_create_reply_t_handler (vl_api_virtio_pci_create_reply_t *
1804 vat_main_t *vam = &vat_main;
1805 i32 retval = ntohl (mp->retval);
1806 if (vam->async_mode)
1808 vam->async_errors += (retval < 0);
1812 vam->retval = retval;
1813 vam->sw_if_index = ntohl (mp->sw_if_index);
1814 vam->result_ready = 1;
1818 static void vl_api_virtio_pci_create_reply_t_handler_json
1819 (vl_api_virtio_pci_create_reply_t * mp)
1821 vat_main_t *vam = &vat_main;
1822 vat_json_node_t node;
1824 vat_json_init_object (&node);
1825 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1826 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1828 vat_json_print (vam->ofp, &node);
1829 vat_json_free (&node);
1831 vam->retval = ntohl (mp->retval);
1832 vam->result_ready = 1;
1837 vl_api_virtio_pci_delete_reply_t_handler (vl_api_virtio_pci_delete_reply_t *
1840 vat_main_t *vam = &vat_main;
1841 i32 retval = ntohl (mp->retval);
1842 if (vam->async_mode)
1844 vam->async_errors += (retval < 0);
1848 vam->retval = retval;
1849 vam->result_ready = 1;
1853 static void vl_api_virtio_pci_delete_reply_t_handler_json
1854 (vl_api_virtio_pci_delete_reply_t * mp)
1856 vat_main_t *vam = &vat_main;
1857 vat_json_node_t node;
1859 vat_json_init_object (&node);
1860 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1862 vat_json_print (vam->ofp, &node);
1863 vat_json_free (&node);
1865 vam->retval = ntohl (mp->retval);
1866 vam->result_ready = 1;
1870 vl_api_bond_create_reply_t_handler (vl_api_bond_create_reply_t * mp)
1872 vat_main_t *vam = &vat_main;
1873 i32 retval = ntohl (mp->retval);
1875 if (vam->async_mode)
1877 vam->async_errors += (retval < 0);
1881 vam->retval = retval;
1882 vam->sw_if_index = ntohl (mp->sw_if_index);
1883 vam->result_ready = 1;
1887 static void vl_api_bond_create_reply_t_handler_json
1888 (vl_api_bond_create_reply_t * mp)
1890 vat_main_t *vam = &vat_main;
1891 vat_json_node_t node;
1893 vat_json_init_object (&node);
1894 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1895 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1897 vat_json_print (vam->ofp, &node);
1898 vat_json_free (&node);
1900 vam->retval = ntohl (mp->retval);
1901 vam->result_ready = 1;
1905 vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp)
1907 vat_main_t *vam = &vat_main;
1908 i32 retval = ntohl (mp->retval);
1910 if (vam->async_mode)
1912 vam->async_errors += (retval < 0);
1916 vam->retval = retval;
1917 vam->result_ready = 1;
1921 static void vl_api_bond_delete_reply_t_handler_json
1922 (vl_api_bond_delete_reply_t * mp)
1924 vat_main_t *vam = &vat_main;
1925 vat_json_node_t node;
1927 vat_json_init_object (&node);
1928 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1930 vat_json_print (vam->ofp, &node);
1931 vat_json_free (&node);
1933 vam->retval = ntohl (mp->retval);
1934 vam->result_ready = 1;
1938 vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
1940 vat_main_t *vam = &vat_main;
1941 i32 retval = ntohl (mp->retval);
1943 if (vam->async_mode)
1945 vam->async_errors += (retval < 0);
1949 vam->retval = retval;
1950 vam->result_ready = 1;
1954 static void vl_api_bond_enslave_reply_t_handler_json
1955 (vl_api_bond_enslave_reply_t * mp)
1957 vat_main_t *vam = &vat_main;
1958 vat_json_node_t node;
1960 vat_json_init_object (&node);
1961 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1963 vat_json_print (vam->ofp, &node);
1964 vat_json_free (&node);
1966 vam->retval = ntohl (mp->retval);
1967 vam->result_ready = 1;
1971 vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
1974 vat_main_t *vam = &vat_main;
1975 i32 retval = ntohl (mp->retval);
1977 if (vam->async_mode)
1979 vam->async_errors += (retval < 0);
1983 vam->retval = retval;
1984 vam->result_ready = 1;
1988 static void vl_api_bond_detach_slave_reply_t_handler_json
1989 (vl_api_bond_detach_slave_reply_t * mp)
1991 vat_main_t *vam = &vat_main;
1992 vat_json_node_t node;
1994 vat_json_init_object (&node);
1995 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1997 vat_json_print (vam->ofp, &node);
1998 vat_json_free (&node);
2000 vam->retval = ntohl (mp->retval);
2001 vam->result_ready = 1;
2004 static void vl_api_sw_interface_bond_details_t_handler
2005 (vl_api_sw_interface_bond_details_t * mp)
2007 vat_main_t *vam = &vat_main;
2010 "%-16s %-12d %-12U %-13U %-14u %-14u",
2011 mp->interface_name, ntohl (mp->sw_if_index),
2012 format_bond_mode, mp->mode, format_bond_load_balance, mp->lb,
2013 ntohl (mp->active_slaves), ntohl (mp->slaves));
2016 static void vl_api_sw_interface_bond_details_t_handler_json
2017 (vl_api_sw_interface_bond_details_t * mp)
2019 vat_main_t *vam = &vat_main;
2020 vat_json_node_t *node = NULL;
2022 if (VAT_JSON_ARRAY != vam->json_tree.type)
2024 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2025 vat_json_init_array (&vam->json_tree);
2027 node = vat_json_array_add (&vam->json_tree);
2029 vat_json_init_object (node);
2030 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2031 vat_json_object_add_string_copy (node, "interface_name",
2032 mp->interface_name);
2033 vat_json_object_add_uint (node, "mode", mp->mode);
2034 vat_json_object_add_uint (node, "load_balance", mp->lb);
2035 vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
2036 vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
2040 api_sw_interface_bond_dump (vat_main_t * vam)
2042 vl_api_sw_interface_bond_dump_t *mp;
2043 vl_api_control_ping_t *mp_ping;
2047 "\n%-16s %-12s %-12s %-13s %-14s %-14s",
2048 "interface name", "sw_if_index", "mode", "load balance",
2049 "active slaves", "slaves");
2051 /* Get list of bond interfaces */
2052 M (SW_INTERFACE_BOND_DUMP, mp);
2055 /* Use a control ping for synchronization */
2056 MPING (CONTROL_PING, mp_ping);
2063 static void vl_api_sw_interface_slave_details_t_handler
2064 (vl_api_sw_interface_slave_details_t * mp)
2066 vat_main_t *vam = &vat_main;
2069 "%-25s %-12d %-12d %d", mp->interface_name,
2070 ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout);
2073 static void vl_api_sw_interface_slave_details_t_handler_json
2074 (vl_api_sw_interface_slave_details_t * mp)
2076 vat_main_t *vam = &vat_main;
2077 vat_json_node_t *node = NULL;
2079 if (VAT_JSON_ARRAY != vam->json_tree.type)
2081 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2082 vat_json_init_array (&vam->json_tree);
2084 node = vat_json_array_add (&vam->json_tree);
2086 vat_json_init_object (node);
2087 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2088 vat_json_object_add_string_copy (node, "interface_name",
2089 mp->interface_name);
2090 vat_json_object_add_uint (node, "passive", mp->is_passive);
2091 vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout);
2095 api_sw_interface_slave_dump (vat_main_t * vam)
2097 unformat_input_t *i = vam->input;
2098 vl_api_sw_interface_slave_dump_t *mp;
2099 vl_api_control_ping_t *mp_ping;
2100 u32 sw_if_index = ~0;
2101 u8 sw_if_index_set = 0;
2104 /* Parse args required to build the message */
2105 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2107 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2108 sw_if_index_set = 1;
2109 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2110 sw_if_index_set = 1;
2115 if (sw_if_index_set == 0)
2117 errmsg ("missing vpp interface name. ");
2122 "\n%-25s %-12s %-12s %s",
2123 "slave interface name", "sw_if_index", "passive", "long_timeout");
2125 /* Get list of bond interfaces */
2126 M (SW_INTERFACE_SLAVE_DUMP, mp);
2127 mp->sw_if_index = ntohl (sw_if_index);
2130 /* Use a control ping for synchronization */
2131 MPING (CONTROL_PING, mp_ping);
2138 static void vl_api_mpls_tunnel_add_del_reply_t_handler
2139 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2141 vat_main_t *vam = &vat_main;
2142 i32 retval = ntohl (mp->retval);
2143 if (vam->async_mode)
2145 vam->async_errors += (retval < 0);
2149 vam->retval = retval;
2150 vam->sw_if_index = ntohl (mp->sw_if_index);
2151 vam->result_ready = 1;
2153 vam->regenerate_interface_table = 1;
2156 static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
2157 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2159 vat_main_t *vam = &vat_main;
2160 vat_json_node_t node;
2162 vat_json_init_object (&node);
2163 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2164 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
2165 ntohl (mp->sw_if_index));
2167 vat_json_print (vam->ofp, &node);
2168 vat_json_free (&node);
2170 vam->retval = ntohl (mp->retval);
2171 vam->result_ready = 1;
2174 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
2175 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2177 vat_main_t *vam = &vat_main;
2178 i32 retval = ntohl (mp->retval);
2179 if (vam->async_mode)
2181 vam->async_errors += (retval < 0);
2185 vam->retval = retval;
2186 vam->sw_if_index = ntohl (mp->sw_if_index);
2187 vam->result_ready = 1;
2191 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
2192 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2194 vat_main_t *vam = &vat_main;
2195 vat_json_node_t node;
2197 vat_json_init_object (&node);
2198 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2199 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2201 vat_json_print (vam->ofp, &node);
2202 vat_json_free (&node);
2204 vam->retval = ntohl (mp->retval);
2205 vam->result_ready = 1;
2208 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
2209 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2211 vat_main_t *vam = &vat_main;
2212 i32 retval = ntohl (mp->retval);
2213 if (vam->async_mode)
2215 vam->async_errors += (retval < 0);
2219 vam->retval = retval;
2220 vam->result_ready = 1;
2224 static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
2225 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2227 vat_main_t *vam = &vat_main;
2228 vat_json_node_t node;
2230 vat_json_init_object (&node);
2231 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2232 vat_json_object_add_uint (&node, "fwd_entry_index",
2233 clib_net_to_host_u32 (mp->fwd_entry_index));
2235 vat_json_print (vam->ofp, &node);
2236 vat_json_free (&node);
2238 vam->retval = ntohl (mp->retval);
2239 vam->result_ready = 1;
2243 format_lisp_transport_protocol (u8 * s, va_list * args)
2245 u32 proto = va_arg (*args, u32);
2250 return format (s, "udp");
2252 return format (s, "api");
2259 static void vl_api_one_get_transport_protocol_reply_t_handler
2260 (vl_api_one_get_transport_protocol_reply_t * mp)
2262 vat_main_t *vam = &vat_main;
2263 i32 retval = ntohl (mp->retval);
2264 if (vam->async_mode)
2266 vam->async_errors += (retval < 0);
2270 u32 proto = mp->protocol;
2271 print (vam->ofp, "Transport protocol: %U",
2272 format_lisp_transport_protocol, proto);
2273 vam->retval = retval;
2274 vam->result_ready = 1;
2278 static void vl_api_one_get_transport_protocol_reply_t_handler_json
2279 (vl_api_one_get_transport_protocol_reply_t * mp)
2281 vat_main_t *vam = &vat_main;
2282 vat_json_node_t node;
2285 s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
2288 vat_json_init_object (&node);
2289 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2290 vat_json_object_add_string_copy (&node, "transport-protocol", s);
2293 vat_json_print (vam->ofp, &node);
2294 vat_json_free (&node);
2296 vam->retval = ntohl (mp->retval);
2297 vam->result_ready = 1;
2300 static void vl_api_one_add_del_locator_set_reply_t_handler
2301 (vl_api_one_add_del_locator_set_reply_t * mp)
2303 vat_main_t *vam = &vat_main;
2304 i32 retval = ntohl (mp->retval);
2305 if (vam->async_mode)
2307 vam->async_errors += (retval < 0);
2311 vam->retval = retval;
2312 vam->result_ready = 1;
2316 static void vl_api_one_add_del_locator_set_reply_t_handler_json
2317 (vl_api_one_add_del_locator_set_reply_t * mp)
2319 vat_main_t *vam = &vat_main;
2320 vat_json_node_t node;
2322 vat_json_init_object (&node);
2323 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2324 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
2326 vat_json_print (vam->ofp, &node);
2327 vat_json_free (&node);
2329 vam->retval = ntohl (mp->retval);
2330 vam->result_ready = 1;
2333 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
2334 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2336 vat_main_t *vam = &vat_main;
2337 i32 retval = ntohl (mp->retval);
2338 if (vam->async_mode)
2340 vam->async_errors += (retval < 0);
2344 vam->retval = retval;
2345 vam->sw_if_index = ntohl (mp->sw_if_index);
2346 vam->result_ready = 1;
2348 vam->regenerate_interface_table = 1;
2351 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
2352 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2354 vat_main_t *vam = &vat_main;
2355 vat_json_node_t node;
2357 vat_json_init_object (&node);
2358 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2359 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2361 vat_json_print (vam->ofp, &node);
2362 vat_json_free (&node);
2364 vam->retval = ntohl (mp->retval);
2365 vam->result_ready = 1;
2368 static void vl_api_vxlan_offload_rx_reply_t_handler
2369 (vl_api_vxlan_offload_rx_reply_t * mp)
2371 vat_main_t *vam = &vat_main;
2372 i32 retval = ntohl (mp->retval);
2373 if (vam->async_mode)
2375 vam->async_errors += (retval < 0);
2379 vam->retval = retval;
2380 vam->result_ready = 1;
2384 static void vl_api_vxlan_offload_rx_reply_t_handler_json
2385 (vl_api_vxlan_offload_rx_reply_t * mp)
2387 vat_main_t *vam = &vat_main;
2388 vat_json_node_t node;
2390 vat_json_init_object (&node);
2391 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2393 vat_json_print (vam->ofp, &node);
2394 vat_json_free (&node);
2396 vam->retval = ntohl (mp->retval);
2397 vam->result_ready = 1;
2400 static void vl_api_geneve_add_del_tunnel_reply_t_handler
2401 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2403 vat_main_t *vam = &vat_main;
2404 i32 retval = ntohl (mp->retval);
2405 if (vam->async_mode)
2407 vam->async_errors += (retval < 0);
2411 vam->retval = retval;
2412 vam->sw_if_index = ntohl (mp->sw_if_index);
2413 vam->result_ready = 1;
2417 static void vl_api_geneve_add_del_tunnel_reply_t_handler_json
2418 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2420 vat_main_t *vam = &vat_main;
2421 vat_json_node_t node;
2423 vat_json_init_object (&node);
2424 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2425 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2427 vat_json_print (vam->ofp, &node);
2428 vat_json_free (&node);
2430 vam->retval = ntohl (mp->retval);
2431 vam->result_ready = 1;
2434 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
2435 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2437 vat_main_t *vam = &vat_main;
2438 i32 retval = ntohl (mp->retval);
2439 if (vam->async_mode)
2441 vam->async_errors += (retval < 0);
2445 vam->retval = retval;
2446 vam->sw_if_index = ntohl (mp->sw_if_index);
2447 vam->result_ready = 1;
2449 vam->regenerate_interface_table = 1;
2452 static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
2453 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2455 vat_main_t *vam = &vat_main;
2456 vat_json_node_t node;
2458 vat_json_init_object (&node);
2459 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2460 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2462 vat_json_print (vam->ofp, &node);
2463 vat_json_free (&node);
2465 vam->retval = ntohl (mp->retval);
2466 vam->result_ready = 1;
2469 static void vl_api_gre_tunnel_add_del_reply_t_handler
2470 (vl_api_gre_tunnel_add_del_reply_t * mp)
2472 vat_main_t *vam = &vat_main;
2473 i32 retval = ntohl (mp->retval);
2474 if (vam->async_mode)
2476 vam->async_errors += (retval < 0);
2480 vam->retval = retval;
2481 vam->sw_if_index = ntohl (mp->sw_if_index);
2482 vam->result_ready = 1;
2486 static void vl_api_gre_tunnel_add_del_reply_t_handler_json
2487 (vl_api_gre_tunnel_add_del_reply_t * mp)
2489 vat_main_t *vam = &vat_main;
2490 vat_json_node_t node;
2492 vat_json_init_object (&node);
2493 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2494 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2496 vat_json_print (vam->ofp, &node);
2497 vat_json_free (&node);
2499 vam->retval = ntohl (mp->retval);
2500 vam->result_ready = 1;
2503 static void vl_api_create_vhost_user_if_reply_t_handler
2504 (vl_api_create_vhost_user_if_reply_t * mp)
2506 vat_main_t *vam = &vat_main;
2507 i32 retval = ntohl (mp->retval);
2508 if (vam->async_mode)
2510 vam->async_errors += (retval < 0);
2514 vam->retval = retval;
2515 vam->sw_if_index = ntohl (mp->sw_if_index);
2516 vam->result_ready = 1;
2518 vam->regenerate_interface_table = 1;
2521 static void vl_api_create_vhost_user_if_reply_t_handler_json
2522 (vl_api_create_vhost_user_if_reply_t * mp)
2524 vat_main_t *vam = &vat_main;
2525 vat_json_node_t node;
2527 vat_json_init_object (&node);
2528 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2529 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2531 vat_json_print (vam->ofp, &node);
2532 vat_json_free (&node);
2534 vam->retval = ntohl (mp->retval);
2535 vam->result_ready = 1;
2538 static void vl_api_dns_resolve_name_reply_t_handler
2539 (vl_api_dns_resolve_name_reply_t * mp)
2541 vat_main_t *vam = &vat_main;
2542 i32 retval = ntohl (mp->retval);
2543 if (vam->async_mode)
2545 vam->async_errors += (retval < 0);
2549 vam->retval = retval;
2550 vam->result_ready = 1;
2555 clib_warning ("ip4 address %U", format_ip4_address,
2556 (ip4_address_t *) mp->ip4_address);
2558 clib_warning ("ip6 address %U", format_ip6_address,
2559 (ip6_address_t *) mp->ip6_address);
2562 clib_warning ("retval %d", retval);
2566 static void vl_api_dns_resolve_name_reply_t_handler_json
2567 (vl_api_dns_resolve_name_reply_t * mp)
2569 clib_warning ("not implemented");
2572 static void vl_api_dns_resolve_ip_reply_t_handler
2573 (vl_api_dns_resolve_ip_reply_t * mp)
2575 vat_main_t *vam = &vat_main;
2576 i32 retval = ntohl (mp->retval);
2577 if (vam->async_mode)
2579 vam->async_errors += (retval < 0);
2583 vam->retval = retval;
2584 vam->result_ready = 1;
2588 clib_warning ("canonical name %s", mp->name);
2591 clib_warning ("retval %d", retval);
2595 static void vl_api_dns_resolve_ip_reply_t_handler_json
2596 (vl_api_dns_resolve_ip_reply_t * mp)
2598 clib_warning ("not implemented");
2602 static void vl_api_ip_address_details_t_handler
2603 (vl_api_ip_address_details_t * mp)
2605 vat_main_t *vam = &vat_main;
2606 static ip_address_details_t empty_ip_address_details = { {0} };
2607 ip_address_details_t *address = NULL;
2608 ip_details_t *current_ip_details = NULL;
2609 ip_details_t *details = NULL;
2611 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
2613 if (!details || vam->current_sw_if_index >= vec_len (details)
2614 || !details[vam->current_sw_if_index].present)
2616 errmsg ("ip address details arrived but not stored");
2617 errmsg ("ip_dump should be called first");
2621 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
2623 #define addresses (current_ip_details->addr)
2625 vec_validate_init_empty (addresses, vec_len (addresses),
2626 empty_ip_address_details);
2628 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
2630 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
2631 address->prefix_length = mp->prefix_length;
2635 static void vl_api_ip_address_details_t_handler_json
2636 (vl_api_ip_address_details_t * mp)
2638 vat_main_t *vam = &vat_main;
2639 vat_json_node_t *node = NULL;
2640 struct in6_addr ip6;
2643 if (VAT_JSON_ARRAY != vam->json_tree.type)
2645 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2646 vat_json_init_array (&vam->json_tree);
2648 node = vat_json_array_add (&vam->json_tree);
2650 vat_json_init_object (node);
2653 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
2654 vat_json_object_add_ip6 (node, "ip", ip6);
2658 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
2659 vat_json_object_add_ip4 (node, "ip", ip4);
2661 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
2665 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
2667 vat_main_t *vam = &vat_main;
2668 static ip_details_t empty_ip_details = { 0 };
2669 ip_details_t *ip = NULL;
2670 u32 sw_if_index = ~0;
2672 sw_if_index = ntohl (mp->sw_if_index);
2674 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2675 sw_if_index, empty_ip_details);
2677 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2684 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
2686 vat_main_t *vam = &vat_main;
2688 if (VAT_JSON_ARRAY != vam->json_tree.type)
2690 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2691 vat_json_init_array (&vam->json_tree);
2693 vat_json_array_add_uint (&vam->json_tree,
2694 clib_net_to_host_u32 (mp->sw_if_index));
2698 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
2702 s = format (0, "DHCP compl event: pid %d %s hostname %s host_addr %U "
2703 "host_mac %U router_addr %U",
2704 ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4",
2706 format_ip4_address, mp->lease.host_address,
2707 format_ethernet_address, mp->lease.host_mac,
2708 format_ip4_address, mp->lease.router_address);
2710 for (i = 0; i < mp->lease.count; i++)
2712 format (s, " domain_server_addr %U", format_ip4_address,
2713 mp->lease.domain_server[i].address);
2715 errmsg ((char *) s);
2719 static void vl_api_dhcp_compl_event_t_handler_json
2720 (vl_api_dhcp_compl_event_t * mp)
2722 /* JSON output not supported */
2725 static void vl_api_get_first_msg_id_reply_t_handler
2726 (vl_api_get_first_msg_id_reply_t * mp)
2728 vat_main_t *vam = &vat_main;
2729 i32 retval = ntohl (mp->retval);
2731 if (vam->async_mode)
2733 vam->async_errors += (retval < 0);
2737 vam->retval = retval;
2738 vam->result_ready = 1;
2742 errmsg ("first message id %d", ntohs (mp->first_msg_id));
2746 static void vl_api_get_first_msg_id_reply_t_handler_json
2747 (vl_api_get_first_msg_id_reply_t * mp)
2749 vat_main_t *vam = &vat_main;
2750 vat_json_node_t node;
2752 vat_json_init_object (&node);
2753 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2754 vat_json_object_add_uint (&node, "first_msg_id",
2755 (uint) ntohs (mp->first_msg_id));
2757 vat_json_print (vam->ofp, &node);
2758 vat_json_free (&node);
2760 vam->retval = ntohl (mp->retval);
2761 vam->result_ready = 1;
2764 static void vl_api_get_node_graph_reply_t_handler
2765 (vl_api_get_node_graph_reply_t * mp)
2767 vat_main_t *vam = &vat_main;
2768 api_main_t *am = &api_main;
2769 i32 retval = ntohl (mp->retval);
2770 u8 *pvt_copy, *reply;
2775 if (vam->async_mode)
2777 vam->async_errors += (retval < 0);
2781 vam->retval = retval;
2782 vam->result_ready = 1;
2785 /* "Should never happen..." */
2789 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2790 pvt_copy = vec_dup (reply);
2792 /* Toss the shared-memory original... */
2793 pthread_mutex_lock (&am->vlib_rp->mutex);
2794 oldheap = svm_push_data_heap (am->vlib_rp);
2798 svm_pop_heap (oldheap);
2799 pthread_mutex_unlock (&am->vlib_rp->mutex);
2801 if (vam->graph_nodes)
2803 hash_free (vam->graph_node_index_by_name);
2805 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
2807 node = vam->graph_nodes[0][i];
2808 vec_free (node->name);
2809 vec_free (node->next_nodes);
2812 vec_free (vam->graph_nodes[0]);
2813 vec_free (vam->graph_nodes);
2816 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2817 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2818 vec_free (pvt_copy);
2820 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
2822 node = vam->graph_nodes[0][i];
2823 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2827 static void vl_api_get_node_graph_reply_t_handler_json
2828 (vl_api_get_node_graph_reply_t * mp)
2830 vat_main_t *vam = &vat_main;
2831 api_main_t *am = &api_main;
2833 vat_json_node_t node;
2836 /* $$$$ make this real? */
2837 vat_json_init_object (&node);
2838 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2839 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2841 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
2843 /* Toss the shared-memory original... */
2844 pthread_mutex_lock (&am->vlib_rp->mutex);
2845 oldheap = svm_push_data_heap (am->vlib_rp);
2849 svm_pop_heap (oldheap);
2850 pthread_mutex_unlock (&am->vlib_rp->mutex);
2852 vat_json_print (vam->ofp, &node);
2853 vat_json_free (&node);
2855 vam->retval = ntohl (mp->retval);
2856 vam->result_ready = 1;
2860 vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
2862 vat_main_t *vam = &vat_main;
2867 s = format (s, "%=16d%=16d%=16d",
2868 ntohl (mp->sw_if_index), mp->priority, mp->weight);
2872 s = format (s, "%=16U%=16d%=16d",
2873 mp->is_ipv6 ? format_ip6_address :
2875 mp->ip_address, mp->priority, mp->weight);
2878 print (vam->ofp, "%v", s);
2883 vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
2885 vat_main_t *vam = &vat_main;
2886 vat_json_node_t *node = NULL;
2887 struct in6_addr ip6;
2890 if (VAT_JSON_ARRAY != vam->json_tree.type)
2892 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2893 vat_json_init_array (&vam->json_tree);
2895 node = vat_json_array_add (&vam->json_tree);
2896 vat_json_init_object (node);
2898 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2899 vat_json_object_add_uint (node, "priority", mp->priority);
2900 vat_json_object_add_uint (node, "weight", mp->weight);
2903 vat_json_object_add_uint (node, "sw_if_index",
2904 clib_net_to_host_u32 (mp->sw_if_index));
2909 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2910 vat_json_object_add_ip6 (node, "address", ip6);
2914 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2915 vat_json_object_add_ip4 (node, "address", ip4);
2921 vl_api_one_locator_set_details_t_handler (vl_api_one_locator_set_details_t *
2924 vat_main_t *vam = &vat_main;
2927 ls_name = format (0, "%s", mp->ls_name);
2929 print (vam->ofp, "%=10d%=15v", clib_net_to_host_u32 (mp->ls_index),
2935 vl_api_one_locator_set_details_t_handler_json
2936 (vl_api_one_locator_set_details_t * mp)
2938 vat_main_t *vam = &vat_main;
2939 vat_json_node_t *node = 0;
2942 ls_name = format (0, "%s", mp->ls_name);
2943 vec_add1 (ls_name, 0);
2945 if (VAT_JSON_ARRAY != vam->json_tree.type)
2947 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2948 vat_json_init_array (&vam->json_tree);
2950 node = vat_json_array_add (&vam->json_tree);
2952 vat_json_init_object (node);
2953 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2954 vat_json_object_add_uint (node, "ls_index",
2955 clib_net_to_host_u32 (mp->ls_index));
2963 } __attribute__ ((__packed__)) lisp_nsh_api_t;
2966 unformat_nsh_address (unformat_input_t * input, va_list * args)
2968 lisp_nsh_api_t *nsh = va_arg (*args, lisp_nsh_api_t *);
2969 return unformat (input, "SPI:%d SI:%d", &nsh->spi, &nsh->si);
2973 format_nsh_address_vat (u8 * s, va_list * args)
2975 nsh_t *a = va_arg (*args, nsh_t *);
2976 return format (s, "SPI:%d SI:%d", clib_net_to_host_u32 (a->spi), a->si);
2980 format_lisp_flat_eid (u8 * s, va_list * args)
2982 u32 type = va_arg (*args, u32);
2983 u8 *eid = va_arg (*args, u8 *);
2984 u32 eid_len = va_arg (*args, u32);
2989 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
2991 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
2993 return format (s, "%U", format_ethernet_address, eid);
2995 return format (s, "%U", format_nsh_address_vat, eid);
3001 format_lisp_eid_vat (u8 * s, va_list * args)
3003 u32 type = va_arg (*args, u32);
3004 u8 *eid = va_arg (*args, u8 *);
3005 u32 eid_len = va_arg (*args, u32);
3006 u8 *seid = va_arg (*args, u8 *);
3007 u32 seid_len = va_arg (*args, u32);
3008 u32 is_src_dst = va_arg (*args, u32);
3011 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
3013 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
3019 vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
3021 vat_main_t *vam = &vat_main;
3022 u8 *s = 0, *eid = 0;
3024 if (~0 == mp->locator_set_index)
3025 s = format (0, "action: %d", mp->action);
3027 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
3029 eid = format (0, "%U", format_lisp_eid_vat,
3033 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3036 print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
3037 clib_net_to_host_u32 (mp->vni),
3039 mp->is_local ? "local" : "remote",
3040 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
3041 clib_net_to_host_u16 (mp->key_id), mp->key);
3048 vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
3051 vat_main_t *vam = &vat_main;
3052 vat_json_node_t *node = 0;
3055 if (VAT_JSON_ARRAY != vam->json_tree.type)
3057 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3058 vat_json_init_array (&vam->json_tree);
3060 node = vat_json_array_add (&vam->json_tree);
3062 vat_json_init_object (node);
3063 if (~0 == mp->locator_set_index)
3064 vat_json_object_add_uint (node, "action", mp->action);
3066 vat_json_object_add_uint (node, "locator_set_index",
3067 clib_net_to_host_u32 (mp->locator_set_index));
3069 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
3070 if (mp->eid_type == 3)
3072 vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
3073 vat_json_init_object (nsh_json);
3074 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
3075 vat_json_object_add_uint (nsh_json, "spi",
3076 clib_net_to_host_u32 (nsh->spi));
3077 vat_json_object_add_uint (nsh_json, "si", nsh->si);
3081 eid = format (0, "%U", format_lisp_eid_vat,
3085 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3087 vat_json_object_add_string_copy (node, "eid", eid);
3090 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3091 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
3092 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
3096 vat_json_object_add_uint (node, "key_id",
3097 clib_net_to_host_u16 (mp->key_id));
3098 vat_json_object_add_string_copy (node, "key", mp->key);
3103 vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
3105 vat_main_t *vam = &vat_main;
3106 u8 *seid = 0, *deid = 0;
3107 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3109 deid = format (0, "%U", format_lisp_eid_vat,
3110 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3112 seid = format (0, "%U", format_lisp_eid_vat,
3113 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3119 format_ip_address_fcn = format_ip4_address;
3121 format_ip_address_fcn = format_ip6_address;
3124 print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
3125 clib_net_to_host_u32 (mp->vni),
3127 format_ip_address_fcn, mp->lloc,
3128 format_ip_address_fcn, mp->rloc,
3129 clib_net_to_host_u32 (mp->pkt_count),
3130 clib_net_to_host_u32 (mp->bytes));
3137 vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
3139 struct in6_addr ip6;
3141 vat_main_t *vam = &vat_main;
3142 vat_json_node_t *node = 0;
3143 u8 *deid = 0, *seid = 0;
3145 if (VAT_JSON_ARRAY != vam->json_tree.type)
3147 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3148 vat_json_init_array (&vam->json_tree);
3150 node = vat_json_array_add (&vam->json_tree);
3152 vat_json_init_object (node);
3153 deid = format (0, "%U", format_lisp_eid_vat,
3154 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3156 seid = format (0, "%U", format_lisp_eid_vat,
3157 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3162 vat_json_object_add_string_copy (node, "seid", seid);
3163 vat_json_object_add_string_copy (node, "deid", deid);
3164 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3168 clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
3169 vat_json_object_add_ip4 (node, "lloc", ip4);
3170 clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
3171 vat_json_object_add_ip4 (node, "rloc", ip4);
3175 clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
3176 vat_json_object_add_ip6 (node, "lloc", ip6);
3177 clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
3178 vat_json_object_add_ip6 (node, "rloc", ip6);
3180 vat_json_object_add_uint (node, "pkt_count",
3181 clib_net_to_host_u32 (mp->pkt_count));
3182 vat_json_object_add_uint (node, "bytes", clib_net_to_host_u32 (mp->bytes));
3189 vl_api_one_eid_table_map_details_t_handler
3190 (vl_api_one_eid_table_map_details_t * mp)
3192 vat_main_t *vam = &vat_main;
3194 u8 *line = format (0, "%=10d%=10d",
3195 clib_net_to_host_u32 (mp->vni),
3196 clib_net_to_host_u32 (mp->dp_table));
3197 print (vam->ofp, "%v", line);
3202 vl_api_one_eid_table_map_details_t_handler_json
3203 (vl_api_one_eid_table_map_details_t * mp)
3205 vat_main_t *vam = &vat_main;
3206 vat_json_node_t *node = NULL;
3208 if (VAT_JSON_ARRAY != vam->json_tree.type)
3210 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3211 vat_json_init_array (&vam->json_tree);
3213 node = vat_json_array_add (&vam->json_tree);
3214 vat_json_init_object (node);
3215 vat_json_object_add_uint (node, "dp_table",
3216 clib_net_to_host_u32 (mp->dp_table));
3217 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3221 vl_api_one_eid_table_vni_details_t_handler
3222 (vl_api_one_eid_table_vni_details_t * mp)
3224 vat_main_t *vam = &vat_main;
3226 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
3227 print (vam->ofp, "%v", line);
3232 vl_api_one_eid_table_vni_details_t_handler_json
3233 (vl_api_one_eid_table_vni_details_t * mp)
3235 vat_main_t *vam = &vat_main;
3236 vat_json_node_t *node = NULL;
3238 if (VAT_JSON_ARRAY != vam->json_tree.type)
3240 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3241 vat_json_init_array (&vam->json_tree);
3243 node = vat_json_array_add (&vam->json_tree);
3244 vat_json_init_object (node);
3245 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3249 vl_api_show_one_map_register_fallback_threshold_reply_t_handler
3250 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3252 vat_main_t *vam = &vat_main;
3253 int retval = clib_net_to_host_u32 (mp->retval);
3255 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3256 print (vam->ofp, "fallback threshold value: %d", mp->value);
3258 vam->retval = retval;
3259 vam->result_ready = 1;
3263 vl_api_show_one_map_register_fallback_threshold_reply_t_handler_json
3264 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3266 vat_main_t *vam = &vat_main;
3267 vat_json_node_t _node, *node = &_node;
3268 int retval = clib_net_to_host_u32 (mp->retval);
3270 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3271 vat_json_init_object (node);
3272 vat_json_object_add_uint (node, "value", mp->value);
3274 vat_json_print (vam->ofp, node);
3275 vat_json_free (node);
3277 vam->retval = retval;
3278 vam->result_ready = 1;
3282 vl_api_show_one_map_register_state_reply_t_handler
3283 (vl_api_show_one_map_register_state_reply_t * mp)
3285 vat_main_t *vam = &vat_main;
3286 int retval = clib_net_to_host_u32 (mp->retval);
3288 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3290 vam->retval = retval;
3291 vam->result_ready = 1;
3295 vl_api_show_one_map_register_state_reply_t_handler_json
3296 (vl_api_show_one_map_register_state_reply_t * mp)
3298 vat_main_t *vam = &vat_main;
3299 vat_json_node_t _node, *node = &_node;
3300 int retval = clib_net_to_host_u32 (mp->retval);
3302 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3304 vat_json_init_object (node);
3305 vat_json_object_add_string_copy (node, "state", s);
3307 vat_json_print (vam->ofp, node);
3308 vat_json_free (node);
3310 vam->retval = retval;
3311 vam->result_ready = 1;
3316 vl_api_show_one_rloc_probe_state_reply_t_handler
3317 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3319 vat_main_t *vam = &vat_main;
3320 int retval = clib_net_to_host_u32 (mp->retval);
3325 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3327 vam->retval = retval;
3328 vam->result_ready = 1;
3332 vl_api_show_one_rloc_probe_state_reply_t_handler_json
3333 (vl_api_show_one_rloc_probe_state_reply_t * mp)
3335 vat_main_t *vam = &vat_main;
3336 vat_json_node_t _node, *node = &_node;
3337 int retval = clib_net_to_host_u32 (mp->retval);
3339 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3340 vat_json_init_object (node);
3341 vat_json_object_add_string_copy (node, "state", s);
3343 vat_json_print (vam->ofp, node);
3344 vat_json_free (node);
3346 vam->retval = retval;
3347 vam->result_ready = 1;
3352 vl_api_show_one_stats_enable_disable_reply_t_handler
3353 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3355 vat_main_t *vam = &vat_main;
3356 int retval = clib_net_to_host_u32 (mp->retval);
3361 print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
3363 vam->retval = retval;
3364 vam->result_ready = 1;
3368 vl_api_show_one_stats_enable_disable_reply_t_handler_json
3369 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3371 vat_main_t *vam = &vat_main;
3372 vat_json_node_t _node, *node = &_node;
3373 int retval = clib_net_to_host_u32 (mp->retval);
3375 u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
3376 vat_json_init_object (node);
3377 vat_json_object_add_string_copy (node, "state", s);
3379 vat_json_print (vam->ofp, node);
3380 vat_json_free (node);
3382 vam->retval = retval;
3383 vam->result_ready = 1;
3388 api_gpe_fwd_entry_net_to_host (vl_api_gpe_fwd_entry_t * e)
3390 e->dp_table = clib_net_to_host_u32 (e->dp_table);
3391 e->fwd_entry_index = clib_net_to_host_u32 (e->fwd_entry_index);
3392 e->vni = clib_net_to_host_u32 (e->vni);
3396 gpe_fwd_entries_get_reply_t_net_to_host
3397 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3401 mp->count = clib_net_to_host_u32 (mp->count);
3402 for (i = 0; i < mp->count; i++)
3404 api_gpe_fwd_entry_net_to_host (&mp->entries[i]);
3409 format_gpe_encap_mode (u8 * s, va_list * args)
3411 u32 mode = va_arg (*args, u32);
3416 return format (s, "lisp");
3418 return format (s, "vxlan");
3424 vl_api_gpe_get_encap_mode_reply_t_handler
3425 (vl_api_gpe_get_encap_mode_reply_t * mp)
3427 vat_main_t *vam = &vat_main;
3429 print (vam->ofp, "gpe mode: %U", format_gpe_encap_mode, mp->encap_mode);
3430 vam->retval = ntohl (mp->retval);
3431 vam->result_ready = 1;
3435 vl_api_gpe_get_encap_mode_reply_t_handler_json
3436 (vl_api_gpe_get_encap_mode_reply_t * mp)
3438 vat_main_t *vam = &vat_main;
3439 vat_json_node_t node;
3441 u8 *encap_mode = format (0, "%U", format_gpe_encap_mode, mp->encap_mode);
3442 vec_add1 (encap_mode, 0);
3444 vat_json_init_object (&node);
3445 vat_json_object_add_string_copy (&node, "gpe_mode", encap_mode);
3447 vec_free (encap_mode);
3448 vat_json_print (vam->ofp, &node);
3449 vat_json_free (&node);
3451 vam->retval = ntohl (mp->retval);
3452 vam->result_ready = 1;
3456 vl_api_gpe_fwd_entry_path_details_t_handler
3457 (vl_api_gpe_fwd_entry_path_details_t * mp)
3459 vat_main_t *vam = &vat_main;
3460 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3462 if (mp->lcl_loc.is_ip4)
3463 format_ip_address_fcn = format_ip4_address;
3465 format_ip_address_fcn = format_ip6_address;
3467 print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
3468 format_ip_address_fcn, &mp->lcl_loc,
3469 format_ip_address_fcn, &mp->rmt_loc);
3473 lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
3475 struct in6_addr ip6;
3480 clib_memcpy (&ip4, loc->addr, sizeof (ip4));
3481 vat_json_object_add_ip4 (n, "address", ip4);
3485 clib_memcpy (&ip6, loc->addr, sizeof (ip6));
3486 vat_json_object_add_ip6 (n, "address", ip6);
3488 vat_json_object_add_uint (n, "weight", loc->weight);
3492 vl_api_gpe_fwd_entry_path_details_t_handler_json
3493 (vl_api_gpe_fwd_entry_path_details_t * mp)
3495 vat_main_t *vam = &vat_main;
3496 vat_json_node_t *node = NULL;
3497 vat_json_node_t *loc_node;
3499 if (VAT_JSON_ARRAY != vam->json_tree.type)
3501 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3502 vat_json_init_array (&vam->json_tree);
3504 node = vat_json_array_add (&vam->json_tree);
3505 vat_json_init_object (node);
3507 loc_node = vat_json_object_add (node, "local_locator");
3508 vat_json_init_object (loc_node);
3509 lisp_fill_locator_node (loc_node, &mp->lcl_loc);
3511 loc_node = vat_json_object_add (node, "remote_locator");
3512 vat_json_init_object (loc_node);
3513 lisp_fill_locator_node (loc_node, &mp->rmt_loc);
3517 vl_api_gpe_fwd_entries_get_reply_t_handler
3518 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3520 vat_main_t *vam = &vat_main;
3522 int retval = clib_net_to_host_u32 (mp->retval);
3523 vl_api_gpe_fwd_entry_t *e;
3528 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3530 for (i = 0; i < mp->count; i++)
3532 e = &mp->entries[i];
3533 print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
3534 format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
3535 format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
3539 vam->retval = retval;
3540 vam->result_ready = 1;
3544 vl_api_gpe_fwd_entries_get_reply_t_handler_json
3545 (vl_api_gpe_fwd_entries_get_reply_t * mp)
3548 vat_main_t *vam = &vat_main;
3549 vat_json_node_t *e = 0, root;
3551 int retval = clib_net_to_host_u32 (mp->retval);
3552 vl_api_gpe_fwd_entry_t *fwd;
3557 gpe_fwd_entries_get_reply_t_net_to_host (mp);
3558 vat_json_init_array (&root);
3560 for (i = 0; i < mp->count; i++)
3562 e = vat_json_array_add (&root);
3563 fwd = &mp->entries[i];
3565 vat_json_init_object (e);
3566 vat_json_object_add_int (e, "fwd_entry_index", fwd->fwd_entry_index);
3567 vat_json_object_add_int (e, "dp_table", fwd->dp_table);
3568 vat_json_object_add_int (e, "vni", fwd->vni);
3569 vat_json_object_add_int (e, "action", fwd->action);
3571 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
3572 fwd->leid_prefix_len);
3574 vat_json_object_add_string_copy (e, "leid", s);
3577 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
3578 fwd->reid_prefix_len);
3580 vat_json_object_add_string_copy (e, "reid", s);
3584 vat_json_print (vam->ofp, &root);
3585 vat_json_free (&root);
3588 vam->retval = retval;
3589 vam->result_ready = 1;
3593 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler
3594 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3596 vat_main_t *vam = &vat_main;
3598 int retval = clib_net_to_host_u32 (mp->retval);
3599 vl_api_gpe_native_fwd_rpath_t *r;
3604 n = clib_net_to_host_u32 (mp->count);
3606 for (i = 0; i < n; i++)
3608 r = &mp->entries[i];
3609 print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
3610 clib_net_to_host_u32 (r->fib_index),
3611 clib_net_to_host_u32 (r->nh_sw_if_index),
3612 r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
3616 vam->retval = retval;
3617 vam->result_ready = 1;
3621 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler_json
3622 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3624 vat_main_t *vam = &vat_main;
3625 vat_json_node_t root, *e;
3627 int retval = clib_net_to_host_u32 (mp->retval);
3628 vl_api_gpe_native_fwd_rpath_t *r;
3634 n = clib_net_to_host_u32 (mp->count);
3635 vat_json_init_array (&root);
3637 for (i = 0; i < n; i++)
3639 e = vat_json_array_add (&root);
3640 vat_json_init_object (e);
3641 r = &mp->entries[i];
3643 format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
3646 vat_json_object_add_string_copy (e, "ip4", s);
3649 vat_json_object_add_uint (e, "fib_index",
3650 clib_net_to_host_u32 (r->fib_index));
3651 vat_json_object_add_uint (e, "nh_sw_if_index",
3652 clib_net_to_host_u32 (r->nh_sw_if_index));
3655 vat_json_print (vam->ofp, &root);
3656 vat_json_free (&root);
3659 vam->retval = retval;
3660 vam->result_ready = 1;
3664 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler
3665 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3667 vat_main_t *vam = &vat_main;
3669 int retval = clib_net_to_host_u32 (mp->retval);
3674 n = clib_net_to_host_u32 (mp->count);
3676 for (i = 0; i < n; i++)
3677 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->vnis[i]));
3680 vam->retval = retval;
3681 vam->result_ready = 1;
3685 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler_json
3686 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3688 vat_main_t *vam = &vat_main;
3689 vat_json_node_t root;
3691 int retval = clib_net_to_host_u32 (mp->retval);
3696 n = clib_net_to_host_u32 (mp->count);
3697 vat_json_init_array (&root);
3699 for (i = 0; i < n; i++)
3700 vat_json_array_add_uint (&root, clib_net_to_host_u32 (mp->vnis[i]));
3702 vat_json_print (vam->ofp, &root);
3703 vat_json_free (&root);
3706 vam->retval = retval;
3707 vam->result_ready = 1;
3711 vl_api_one_ndp_entries_get_reply_t_handler
3712 (vl_api_one_ndp_entries_get_reply_t * mp)
3714 vat_main_t *vam = &vat_main;
3716 int retval = clib_net_to_host_u32 (mp->retval);
3721 n = clib_net_to_host_u32 (mp->count);
3723 for (i = 0; i < n; i++)
3724 print (vam->ofp, "%U -> %U", format_ip6_address, &mp->entries[i].ip6,
3725 format_ethernet_address, mp->entries[i].mac);
3728 vam->retval = retval;
3729 vam->result_ready = 1;
3733 vl_api_one_ndp_entries_get_reply_t_handler_json
3734 (vl_api_one_ndp_entries_get_reply_t * mp)
3737 vat_main_t *vam = &vat_main;
3738 vat_json_node_t *e = 0, root;
3740 int retval = clib_net_to_host_u32 (mp->retval);
3741 vl_api_one_ndp_entry_t *arp_entry;
3746 n = clib_net_to_host_u32 (mp->count);
3747 vat_json_init_array (&root);
3749 for (i = 0; i < n; i++)
3751 e = vat_json_array_add (&root);
3752 arp_entry = &mp->entries[i];
3754 vat_json_init_object (e);
3755 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3758 vat_json_object_add_string_copy (e, "mac", s);
3761 s = format (0, "%U", format_ip6_address, &arp_entry->ip6);
3763 vat_json_object_add_string_copy (e, "ip6", s);
3767 vat_json_print (vam->ofp, &root);
3768 vat_json_free (&root);
3771 vam->retval = retval;
3772 vam->result_ready = 1;
3776 vl_api_one_l2_arp_entries_get_reply_t_handler
3777 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3779 vat_main_t *vam = &vat_main;
3781 int retval = clib_net_to_host_u32 (mp->retval);
3786 n = clib_net_to_host_u32 (mp->count);
3788 for (i = 0; i < n; i++)
3789 print (vam->ofp, "%U -> %U", format_ip4_address, &mp->entries[i].ip4,
3790 format_ethernet_address, mp->entries[i].mac);
3793 vam->retval = retval;
3794 vam->result_ready = 1;
3798 vl_api_one_l2_arp_entries_get_reply_t_handler_json
3799 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3802 vat_main_t *vam = &vat_main;
3803 vat_json_node_t *e = 0, root;
3805 int retval = clib_net_to_host_u32 (mp->retval);
3806 vl_api_one_l2_arp_entry_t *arp_entry;
3811 n = clib_net_to_host_u32 (mp->count);
3812 vat_json_init_array (&root);
3814 for (i = 0; i < n; i++)
3816 e = vat_json_array_add (&root);
3817 arp_entry = &mp->entries[i];
3819 vat_json_init_object (e);
3820 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3823 vat_json_object_add_string_copy (e, "mac", s);
3826 s = format (0, "%U", format_ip4_address, &arp_entry->ip4);
3828 vat_json_object_add_string_copy (e, "ip4", s);
3832 vat_json_print (vam->ofp, &root);
3833 vat_json_free (&root);
3836 vam->retval = retval;
3837 vam->result_ready = 1;
3841 vl_api_one_ndp_bd_get_reply_t_handler (vl_api_one_ndp_bd_get_reply_t * mp)
3843 vat_main_t *vam = &vat_main;
3845 int retval = clib_net_to_host_u32 (mp->retval);
3850 n = clib_net_to_host_u32 (mp->count);
3852 for (i = 0; i < n; i++)
3854 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3858 vam->retval = retval;
3859 vam->result_ready = 1;
3863 vl_api_one_ndp_bd_get_reply_t_handler_json
3864 (vl_api_one_ndp_bd_get_reply_t * mp)
3866 vat_main_t *vam = &vat_main;
3867 vat_json_node_t root;
3869 int retval = clib_net_to_host_u32 (mp->retval);
3874 n = clib_net_to_host_u32 (mp->count);
3875 vat_json_init_array (&root);
3877 for (i = 0; i < n; i++)
3879 vat_json_array_add_uint (&root,
3880 clib_net_to_host_u32 (mp->bridge_domains[i]));
3883 vat_json_print (vam->ofp, &root);
3884 vat_json_free (&root);
3887 vam->retval = retval;
3888 vam->result_ready = 1;
3892 vl_api_one_l2_arp_bd_get_reply_t_handler
3893 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3895 vat_main_t *vam = &vat_main;
3897 int retval = clib_net_to_host_u32 (mp->retval);
3902 n = clib_net_to_host_u32 (mp->count);
3904 for (i = 0; i < n; i++)
3906 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3910 vam->retval = retval;
3911 vam->result_ready = 1;
3915 vl_api_one_l2_arp_bd_get_reply_t_handler_json
3916 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3918 vat_main_t *vam = &vat_main;
3919 vat_json_node_t root;
3921 int retval = clib_net_to_host_u32 (mp->retval);
3926 n = clib_net_to_host_u32 (mp->count);
3927 vat_json_init_array (&root);
3929 for (i = 0; i < n; i++)
3931 vat_json_array_add_uint (&root,
3932 clib_net_to_host_u32 (mp->bridge_domains[i]));
3935 vat_json_print (vam->ofp, &root);
3936 vat_json_free (&root);
3939 vam->retval = retval;
3940 vam->result_ready = 1;
3944 vl_api_one_adjacencies_get_reply_t_handler
3945 (vl_api_one_adjacencies_get_reply_t * mp)
3947 vat_main_t *vam = &vat_main;
3949 int retval = clib_net_to_host_u32 (mp->retval);
3950 vl_api_one_adjacency_t *a;
3955 n = clib_net_to_host_u32 (mp->count);
3957 for (i = 0; i < n; i++)
3959 a = &mp->adjacencies[i];
3960 print (vam->ofp, "%U %40U",
3961 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
3962 format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
3966 vam->retval = retval;
3967 vam->result_ready = 1;
3971 vl_api_one_adjacencies_get_reply_t_handler_json
3972 (vl_api_one_adjacencies_get_reply_t * mp)
3975 vat_main_t *vam = &vat_main;
3976 vat_json_node_t *e = 0, root;
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);
3985 vat_json_init_array (&root);
3987 for (i = 0; i < n; i++)
3989 e = vat_json_array_add (&root);
3990 a = &mp->adjacencies[i];
3992 vat_json_init_object (e);
3993 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
3994 a->leid_prefix_len);
3996 vat_json_object_add_string_copy (e, "leid", s);
3999 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
4000 a->reid_prefix_len);
4002 vat_json_object_add_string_copy (e, "reid", s);
4006 vat_json_print (vam->ofp, &root);
4007 vat_json_free (&root);
4010 vam->retval = retval;
4011 vam->result_ready = 1;
4015 vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
4017 vat_main_t *vam = &vat_main;
4019 print (vam->ofp, "%=20U",
4020 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4025 vl_api_one_map_server_details_t_handler_json
4026 (vl_api_one_map_server_details_t * mp)
4028 vat_main_t *vam = &vat_main;
4029 vat_json_node_t *node = NULL;
4030 struct in6_addr ip6;
4033 if (VAT_JSON_ARRAY != vam->json_tree.type)
4035 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4036 vat_json_init_array (&vam->json_tree);
4038 node = vat_json_array_add (&vam->json_tree);
4040 vat_json_init_object (node);
4043 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4044 vat_json_object_add_ip6 (node, "map-server", ip6);
4048 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4049 vat_json_object_add_ip4 (node, "map-server", ip4);
4054 vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
4057 vat_main_t *vam = &vat_main;
4059 print (vam->ofp, "%=20U",
4060 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4065 vl_api_one_map_resolver_details_t_handler_json
4066 (vl_api_one_map_resolver_details_t * mp)
4068 vat_main_t *vam = &vat_main;
4069 vat_json_node_t *node = NULL;
4070 struct in6_addr ip6;
4073 if (VAT_JSON_ARRAY != vam->json_tree.type)
4075 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4076 vat_json_init_array (&vam->json_tree);
4078 node = vat_json_array_add (&vam->json_tree);
4080 vat_json_init_object (node);
4083 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4084 vat_json_object_add_ip6 (node, "map resolver", ip6);
4088 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4089 vat_json_object_add_ip4 (node, "map resolver", ip4);
4094 vl_api_show_one_status_reply_t_handler (vl_api_show_one_status_reply_t * mp)
4096 vat_main_t *vam = &vat_main;
4097 i32 retval = ntohl (mp->retval);
4101 print (vam->ofp, "feature: %s\ngpe: %s",
4102 mp->feature_status ? "enabled" : "disabled",
4103 mp->gpe_status ? "enabled" : "disabled");
4106 vam->retval = retval;
4107 vam->result_ready = 1;
4111 vl_api_show_one_status_reply_t_handler_json
4112 (vl_api_show_one_status_reply_t * mp)
4114 vat_main_t *vam = &vat_main;
4115 vat_json_node_t node;
4116 u8 *gpe_status = NULL;
4117 u8 *feature_status = NULL;
4119 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
4120 feature_status = format (0, "%s",
4121 mp->feature_status ? "enabled" : "disabled");
4122 vec_add1 (gpe_status, 0);
4123 vec_add1 (feature_status, 0);
4125 vat_json_init_object (&node);
4126 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
4127 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
4129 vec_free (gpe_status);
4130 vec_free (feature_status);
4132 vat_json_print (vam->ofp, &node);
4133 vat_json_free (&node);
4135 vam->retval = ntohl (mp->retval);
4136 vam->result_ready = 1;
4140 vl_api_one_get_map_request_itr_rlocs_reply_t_handler
4141 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4143 vat_main_t *vam = &vat_main;
4144 i32 retval = ntohl (mp->retval);
4148 print (vam->ofp, "%=20s", mp->locator_set_name);
4151 vam->retval = retval;
4152 vam->result_ready = 1;
4156 vl_api_one_get_map_request_itr_rlocs_reply_t_handler_json
4157 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
4159 vat_main_t *vam = &vat_main;
4160 vat_json_node_t *node = NULL;
4162 if (VAT_JSON_ARRAY != vam->json_tree.type)
4164 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4165 vat_json_init_array (&vam->json_tree);
4167 node = vat_json_array_add (&vam->json_tree);
4169 vat_json_init_object (node);
4170 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
4172 vat_json_print (vam->ofp, node);
4173 vat_json_free (node);
4175 vam->retval = ntohl (mp->retval);
4176 vam->result_ready = 1;
4180 format_lisp_map_request_mode (u8 * s, va_list * args)
4182 u32 mode = va_arg (*args, u32);
4187 return format (0, "dst-only");
4189 return format (0, "src-dst");
4195 vl_api_show_one_map_request_mode_reply_t_handler
4196 (vl_api_show_one_map_request_mode_reply_t * mp)
4198 vat_main_t *vam = &vat_main;
4199 i32 retval = ntohl (mp->retval);
4203 u32 mode = mp->mode;
4204 print (vam->ofp, "map_request_mode: %U",
4205 format_lisp_map_request_mode, mode);
4208 vam->retval = retval;
4209 vam->result_ready = 1;
4213 vl_api_show_one_map_request_mode_reply_t_handler_json
4214 (vl_api_show_one_map_request_mode_reply_t * mp)
4216 vat_main_t *vam = &vat_main;
4217 vat_json_node_t node;
4222 s = format (0, "%U", format_lisp_map_request_mode, mode);
4225 vat_json_init_object (&node);
4226 vat_json_object_add_string_copy (&node, "map_request_mode", s);
4227 vat_json_print (vam->ofp, &node);
4228 vat_json_free (&node);
4231 vam->retval = ntohl (mp->retval);
4232 vam->result_ready = 1;
4236 vl_api_one_show_xtr_mode_reply_t_handler
4237 (vl_api_one_show_xtr_mode_reply_t * mp)
4239 vat_main_t *vam = &vat_main;
4240 i32 retval = ntohl (mp->retval);
4244 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4247 vam->retval = retval;
4248 vam->result_ready = 1;
4252 vl_api_one_show_xtr_mode_reply_t_handler_json
4253 (vl_api_one_show_xtr_mode_reply_t * mp)
4255 vat_main_t *vam = &vat_main;
4256 vat_json_node_t node;
4259 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4260 vec_add1 (status, 0);
4262 vat_json_init_object (&node);
4263 vat_json_object_add_string_copy (&node, "status", status);
4267 vat_json_print (vam->ofp, &node);
4268 vat_json_free (&node);
4270 vam->retval = ntohl (mp->retval);
4271 vam->result_ready = 1;
4275 vl_api_one_show_pitr_mode_reply_t_handler
4276 (vl_api_one_show_pitr_mode_reply_t * mp)
4278 vat_main_t *vam = &vat_main;
4279 i32 retval = ntohl (mp->retval);
4283 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4286 vam->retval = retval;
4287 vam->result_ready = 1;
4291 vl_api_one_show_pitr_mode_reply_t_handler_json
4292 (vl_api_one_show_pitr_mode_reply_t * mp)
4294 vat_main_t *vam = &vat_main;
4295 vat_json_node_t node;
4298 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4299 vec_add1 (status, 0);
4301 vat_json_init_object (&node);
4302 vat_json_object_add_string_copy (&node, "status", status);
4306 vat_json_print (vam->ofp, &node);
4307 vat_json_free (&node);
4309 vam->retval = ntohl (mp->retval);
4310 vam->result_ready = 1;
4314 vl_api_one_show_petr_mode_reply_t_handler
4315 (vl_api_one_show_petr_mode_reply_t * mp)
4317 vat_main_t *vam = &vat_main;
4318 i32 retval = ntohl (mp->retval);
4322 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4325 vam->retval = retval;
4326 vam->result_ready = 1;
4330 vl_api_one_show_petr_mode_reply_t_handler_json
4331 (vl_api_one_show_petr_mode_reply_t * mp)
4333 vat_main_t *vam = &vat_main;
4334 vat_json_node_t node;
4337 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4338 vec_add1 (status, 0);
4340 vat_json_init_object (&node);
4341 vat_json_object_add_string_copy (&node, "status", status);
4345 vat_json_print (vam->ofp, &node);
4346 vat_json_free (&node);
4348 vam->retval = ntohl (mp->retval);
4349 vam->result_ready = 1;
4353 vl_api_show_one_use_petr_reply_t_handler
4354 (vl_api_show_one_use_petr_reply_t * mp)
4356 vat_main_t *vam = &vat_main;
4357 i32 retval = ntohl (mp->retval);
4361 print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
4364 print (vam->ofp, "Proxy-ETR address; %U",
4365 mp->is_ip4 ? format_ip4_address : format_ip6_address,
4370 vam->retval = retval;
4371 vam->result_ready = 1;
4375 vl_api_show_one_use_petr_reply_t_handler_json
4376 (vl_api_show_one_use_petr_reply_t * mp)
4378 vat_main_t *vam = &vat_main;
4379 vat_json_node_t node;
4382 struct in6_addr ip6;
4384 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4385 vec_add1 (status, 0);
4387 vat_json_init_object (&node);
4388 vat_json_object_add_string_copy (&node, "status", status);
4393 clib_memcpy (&ip6, mp->address, sizeof (ip6));
4394 vat_json_object_add_ip6 (&node, "address", ip6);
4398 clib_memcpy (&ip4, mp->address, sizeof (ip4));
4399 vat_json_object_add_ip4 (&node, "address", ip4);
4405 vat_json_print (vam->ofp, &node);
4406 vat_json_free (&node);
4408 vam->retval = ntohl (mp->retval);
4409 vam->result_ready = 1;
4413 vl_api_show_one_nsh_mapping_reply_t_handler
4414 (vl_api_show_one_nsh_mapping_reply_t * mp)
4416 vat_main_t *vam = &vat_main;
4417 i32 retval = ntohl (mp->retval);
4421 print (vam->ofp, "%-20s%-16s",
4422 mp->is_set ? "set" : "not-set",
4423 mp->is_set ? (char *) mp->locator_set_name : "");
4426 vam->retval = retval;
4427 vam->result_ready = 1;
4431 vl_api_show_one_nsh_mapping_reply_t_handler_json
4432 (vl_api_show_one_nsh_mapping_reply_t * mp)
4434 vat_main_t *vam = &vat_main;
4435 vat_json_node_t node;
4438 status = format (0, "%s", mp->is_set ? "yes" : "no");
4439 vec_add1 (status, 0);
4441 vat_json_init_object (&node);
4442 vat_json_object_add_string_copy (&node, "is_set", status);
4445 vat_json_object_add_string_copy (&node, "locator_set",
4446 mp->locator_set_name);
4451 vat_json_print (vam->ofp, &node);
4452 vat_json_free (&node);
4454 vam->retval = ntohl (mp->retval);
4455 vam->result_ready = 1;
4459 vl_api_show_one_map_register_ttl_reply_t_handler
4460 (vl_api_show_one_map_register_ttl_reply_t * mp)
4462 vat_main_t *vam = &vat_main;
4463 i32 retval = ntohl (mp->retval);
4465 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4469 print (vam->ofp, "ttl: %u", mp->ttl);
4472 vam->retval = retval;
4473 vam->result_ready = 1;
4477 vl_api_show_one_map_register_ttl_reply_t_handler_json
4478 (vl_api_show_one_map_register_ttl_reply_t * mp)
4480 vat_main_t *vam = &vat_main;
4481 vat_json_node_t node;
4483 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4484 vat_json_init_object (&node);
4485 vat_json_object_add_uint (&node, "ttl", mp->ttl);
4487 vat_json_print (vam->ofp, &node);
4488 vat_json_free (&node);
4490 vam->retval = ntohl (mp->retval);
4491 vam->result_ready = 1;
4495 vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
4497 vat_main_t *vam = &vat_main;
4498 i32 retval = ntohl (mp->retval);
4502 print (vam->ofp, "%-20s%-16s",
4503 mp->status ? "enabled" : "disabled",
4504 mp->status ? (char *) mp->locator_set_name : "");
4507 vam->retval = retval;
4508 vam->result_ready = 1;
4512 vl_api_show_one_pitr_reply_t_handler_json (vl_api_show_one_pitr_reply_t * mp)
4514 vat_main_t *vam = &vat_main;
4515 vat_json_node_t node;
4518 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4519 vec_add1 (status, 0);
4521 vat_json_init_object (&node);
4522 vat_json_object_add_string_copy (&node, "status", status);
4525 vat_json_object_add_string_copy (&node, "locator_set",
4526 mp->locator_set_name);
4531 vat_json_print (vam->ofp, &node);
4532 vat_json_free (&node);
4534 vam->retval = ntohl (mp->retval);
4535 vam->result_ready = 1;
4539 format_policer_type (u8 * s, va_list * va)
4541 u32 i = va_arg (*va, u32);
4543 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
4544 s = format (s, "1r2c");
4545 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
4546 s = format (s, "1r3c");
4547 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
4548 s = format (s, "2r3c-2698");
4549 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
4550 s = format (s, "2r3c-4115");
4551 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
4552 s = format (s, "2r3c-mef5cf1");
4554 s = format (s, "ILLEGAL");
4559 format_policer_rate_type (u8 * s, va_list * va)
4561 u32 i = va_arg (*va, u32);
4563 if (i == SSE2_QOS_RATE_KBPS)
4564 s = format (s, "kbps");
4565 else if (i == SSE2_QOS_RATE_PPS)
4566 s = format (s, "pps");
4568 s = format (s, "ILLEGAL");
4573 format_policer_round_type (u8 * s, va_list * va)
4575 u32 i = va_arg (*va, u32);
4577 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
4578 s = format (s, "closest");
4579 else if (i == SSE2_QOS_ROUND_TO_UP)
4580 s = format (s, "up");
4581 else if (i == SSE2_QOS_ROUND_TO_DOWN)
4582 s = format (s, "down");
4584 s = format (s, "ILLEGAL");
4589 format_policer_action_type (u8 * s, va_list * va)
4591 u32 i = va_arg (*va, u32);
4593 if (i == SSE2_QOS_ACTION_DROP)
4594 s = format (s, "drop");
4595 else if (i == SSE2_QOS_ACTION_TRANSMIT)
4596 s = format (s, "transmit");
4597 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4598 s = format (s, "mark-and-transmit");
4600 s = format (s, "ILLEGAL");
4605 format_dscp (u8 * s, va_list * va)
4607 u32 i = va_arg (*va, u32);
4612 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
4616 return format (s, "ILLEGAL");
4618 s = format (s, "%s", t);
4623 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
4625 vat_main_t *vam = &vat_main;
4626 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
4628 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4629 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4631 conform_dscp_str = format (0, "");
4633 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4634 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4636 exceed_dscp_str = format (0, "");
4638 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4639 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4641 violate_dscp_str = format (0, "");
4643 print (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
4644 "rate type %U, round type %U, %s rate, %s color-aware, "
4645 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
4646 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
4647 "conform action %U%s, exceed action %U%s, violate action %U%s",
4649 format_policer_type, mp->type,
4652 clib_net_to_host_u64 (mp->cb),
4653 clib_net_to_host_u64 (mp->eb),
4654 format_policer_rate_type, mp->rate_type,
4655 format_policer_round_type, mp->round_type,
4656 mp->single_rate ? "single" : "dual",
4657 mp->color_aware ? "is" : "not",
4658 ntohl (mp->cir_tokens_per_period),
4659 ntohl (mp->pir_tokens_per_period),
4661 ntohl (mp->current_limit),
4662 ntohl (mp->current_bucket),
4663 ntohl (mp->extended_limit),
4664 ntohl (mp->extended_bucket),
4665 clib_net_to_host_u64 (mp->last_update_time),
4666 format_policer_action_type, mp->conform_action_type,
4668 format_policer_action_type, mp->exceed_action_type,
4670 format_policer_action_type, mp->violate_action_type,
4673 vec_free (conform_dscp_str);
4674 vec_free (exceed_dscp_str);
4675 vec_free (violate_dscp_str);
4678 static void vl_api_policer_details_t_handler_json
4679 (vl_api_policer_details_t * mp)
4681 vat_main_t *vam = &vat_main;
4682 vat_json_node_t *node;
4683 u8 *rate_type_str, *round_type_str, *type_str;
4684 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
4686 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
4688 format (0, "%U", format_policer_round_type, mp->round_type);
4689 type_str = format (0, "%U", format_policer_type, mp->type);
4690 conform_action_str = format (0, "%U", format_policer_action_type,
4691 mp->conform_action_type);
4692 exceed_action_str = format (0, "%U", format_policer_action_type,
4693 mp->exceed_action_type);
4694 violate_action_str = format (0, "%U", format_policer_action_type,
4695 mp->violate_action_type);
4697 if (VAT_JSON_ARRAY != vam->json_tree.type)
4699 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4700 vat_json_init_array (&vam->json_tree);
4702 node = vat_json_array_add (&vam->json_tree);
4704 vat_json_init_object (node);
4705 vat_json_object_add_string_copy (node, "name", mp->name);
4706 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
4707 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
4708 vat_json_object_add_uint (node, "cb", clib_net_to_host_u64 (mp->cb));
4709 vat_json_object_add_uint (node, "eb", clib_net_to_host_u64 (mp->eb));
4710 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
4711 vat_json_object_add_string_copy (node, "round_type", round_type_str);
4712 vat_json_object_add_string_copy (node, "type", type_str);
4713 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
4714 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
4715 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
4716 vat_json_object_add_uint (node, "cir_tokens_per_period",
4717 ntohl (mp->cir_tokens_per_period));
4718 vat_json_object_add_uint (node, "eir_tokens_per_period",
4719 ntohl (mp->pir_tokens_per_period));
4720 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
4721 vat_json_object_add_uint (node, "current_bucket",
4722 ntohl (mp->current_bucket));
4723 vat_json_object_add_uint (node, "extended_limit",
4724 ntohl (mp->extended_limit));
4725 vat_json_object_add_uint (node, "extended_bucket",
4726 ntohl (mp->extended_bucket));
4727 vat_json_object_add_uint (node, "last_update_time",
4728 ntohl (mp->last_update_time));
4729 vat_json_object_add_string_copy (node, "conform_action",
4730 conform_action_str);
4731 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4733 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4734 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
4735 vec_free (dscp_str);
4737 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
4738 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4740 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4741 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
4742 vec_free (dscp_str);
4744 vat_json_object_add_string_copy (node, "violate_action",
4745 violate_action_str);
4746 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4748 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4749 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
4750 vec_free (dscp_str);
4753 vec_free (rate_type_str);
4754 vec_free (round_type_str);
4755 vec_free (type_str);
4756 vec_free (conform_action_str);
4757 vec_free (exceed_action_str);
4758 vec_free (violate_action_str);
4762 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
4765 vat_main_t *vam = &vat_main;
4766 int i, count = ntohl (mp->count);
4769 print (vam->ofp, "classify table ids (%d) : ", count);
4770 for (i = 0; i < count; i++)
4772 print (vam->ofp, "%d", ntohl (mp->ids[i]));
4773 print (vam->ofp, (i < count - 1) ? "," : "");
4775 vam->retval = ntohl (mp->retval);
4776 vam->result_ready = 1;
4780 vl_api_classify_table_ids_reply_t_handler_json
4781 (vl_api_classify_table_ids_reply_t * mp)
4783 vat_main_t *vam = &vat_main;
4784 int i, count = ntohl (mp->count);
4788 vat_json_node_t node;
4790 vat_json_init_object (&node);
4791 for (i = 0; i < count; i++)
4793 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
4795 vat_json_print (vam->ofp, &node);
4796 vat_json_free (&node);
4798 vam->retval = ntohl (mp->retval);
4799 vam->result_ready = 1;
4803 vl_api_classify_table_by_interface_reply_t_handler
4804 (vl_api_classify_table_by_interface_reply_t * mp)
4806 vat_main_t *vam = &vat_main;
4809 table_id = ntohl (mp->l2_table_id);
4811 print (vam->ofp, "l2 table id : %d", table_id);
4813 print (vam->ofp, "l2 table id : No input ACL tables configured");
4814 table_id = ntohl (mp->ip4_table_id);
4816 print (vam->ofp, "ip4 table id : %d", table_id);
4818 print (vam->ofp, "ip4 table id : No input ACL tables configured");
4819 table_id = ntohl (mp->ip6_table_id);
4821 print (vam->ofp, "ip6 table id : %d", table_id);
4823 print (vam->ofp, "ip6 table id : No input ACL tables configured");
4824 vam->retval = ntohl (mp->retval);
4825 vam->result_ready = 1;
4829 vl_api_classify_table_by_interface_reply_t_handler_json
4830 (vl_api_classify_table_by_interface_reply_t * mp)
4832 vat_main_t *vam = &vat_main;
4833 vat_json_node_t node;
4835 vat_json_init_object (&node);
4837 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
4838 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
4839 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
4841 vat_json_print (vam->ofp, &node);
4842 vat_json_free (&node);
4844 vam->retval = ntohl (mp->retval);
4845 vam->result_ready = 1;
4848 static void vl_api_policer_add_del_reply_t_handler
4849 (vl_api_policer_add_del_reply_t * mp)
4851 vat_main_t *vam = &vat_main;
4852 i32 retval = ntohl (mp->retval);
4853 if (vam->async_mode)
4855 vam->async_errors += (retval < 0);
4859 vam->retval = retval;
4860 vam->result_ready = 1;
4861 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
4863 * Note: this is just barely thread-safe, depends on
4864 * the main thread spinning waiting for an answer...
4866 errmsg ("policer index %d", ntohl (mp->policer_index));
4870 static void vl_api_policer_add_del_reply_t_handler_json
4871 (vl_api_policer_add_del_reply_t * mp)
4873 vat_main_t *vam = &vat_main;
4874 vat_json_node_t node;
4876 vat_json_init_object (&node);
4877 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
4878 vat_json_object_add_uint (&node, "policer_index",
4879 ntohl (mp->policer_index));
4881 vat_json_print (vam->ofp, &node);
4882 vat_json_free (&node);
4884 vam->retval = ntohl (mp->retval);
4885 vam->result_ready = 1;
4888 /* Format hex dump. */
4890 format_hex_bytes (u8 * s, va_list * va)
4892 u8 *bytes = va_arg (*va, u8 *);
4893 int n_bytes = va_arg (*va, int);
4896 /* Print short or long form depending on byte count. */
4897 uword short_form = n_bytes <= 32;
4898 u32 indent = format_get_indent (s);
4903 for (i = 0; i < n_bytes; i++)
4905 if (!short_form && (i % 32) == 0)
4906 s = format (s, "%08x: ", i);
4907 s = format (s, "%02x", bytes[i]);
4908 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
4909 s = format (s, "\n%U", format_white_space, indent);
4916 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
4919 vat_main_t *vam = &vat_main;
4920 i32 retval = ntohl (mp->retval);
4923 print (vam->ofp, "classify table info :");
4924 print (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d",
4925 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
4926 ntohl (mp->miss_next_index));
4927 print (vam->ofp, "nbuckets: %d skip: %d match: %d",
4928 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
4929 ntohl (mp->match_n_vectors));
4930 print (vam->ofp, "mask: %U", format_hex_bytes, mp->mask,
4931 ntohl (mp->mask_length));
4933 vam->retval = retval;
4934 vam->result_ready = 1;
4938 vl_api_classify_table_info_reply_t_handler_json
4939 (vl_api_classify_table_info_reply_t * mp)
4941 vat_main_t *vam = &vat_main;
4942 vat_json_node_t node;
4944 i32 retval = ntohl (mp->retval);
4947 vat_json_init_object (&node);
4949 vat_json_object_add_int (&node, "sessions",
4950 ntohl (mp->active_sessions));
4951 vat_json_object_add_int (&node, "nexttbl",
4952 ntohl (mp->next_table_index));
4953 vat_json_object_add_int (&node, "nextnode",
4954 ntohl (mp->miss_next_index));
4955 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
4956 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
4957 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
4958 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
4959 ntohl (mp->mask_length), 0);
4960 vat_json_object_add_string_copy (&node, "mask", s);
4962 vat_json_print (vam->ofp, &node);
4963 vat_json_free (&node);
4965 vam->retval = ntohl (mp->retval);
4966 vam->result_ready = 1;
4970 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
4973 vat_main_t *vam = &vat_main;
4975 print (vam->ofp, "next_index: %d advance: %d opaque: %d ",
4976 ntohl (mp->hit_next_index), ntohl (mp->advance),
4977 ntohl (mp->opaque_index));
4978 print (vam->ofp, "mask: %U", format_hex_bytes, mp->match,
4979 ntohl (mp->match_length));
4983 vl_api_classify_session_details_t_handler_json
4984 (vl_api_classify_session_details_t * mp)
4986 vat_main_t *vam = &vat_main;
4987 vat_json_node_t *node = NULL;
4989 if (VAT_JSON_ARRAY != vam->json_tree.type)
4991 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4992 vat_json_init_array (&vam->json_tree);
4994 node = vat_json_array_add (&vam->json_tree);
4996 vat_json_init_object (node);
4997 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
4998 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
4999 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
5001 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
5003 vat_json_object_add_string_copy (node, "match", s);
5006 static void vl_api_pg_create_interface_reply_t_handler
5007 (vl_api_pg_create_interface_reply_t * mp)
5009 vat_main_t *vam = &vat_main;
5011 vam->retval = ntohl (mp->retval);
5012 vam->result_ready = 1;
5015 static void vl_api_pg_create_interface_reply_t_handler_json
5016 (vl_api_pg_create_interface_reply_t * mp)
5018 vat_main_t *vam = &vat_main;
5019 vat_json_node_t node;
5021 i32 retval = ntohl (mp->retval);
5024 vat_json_init_object (&node);
5026 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
5028 vat_json_print (vam->ofp, &node);
5029 vat_json_free (&node);
5031 vam->retval = ntohl (mp->retval);
5032 vam->result_ready = 1;
5035 static void vl_api_policer_classify_details_t_handler
5036 (vl_api_policer_classify_details_t * mp)
5038 vat_main_t *vam = &vat_main;
5040 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5041 ntohl (mp->table_index));
5044 static void vl_api_policer_classify_details_t_handler_json
5045 (vl_api_policer_classify_details_t * mp)
5047 vat_main_t *vam = &vat_main;
5048 vat_json_node_t *node;
5050 if (VAT_JSON_ARRAY != vam->json_tree.type)
5052 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5053 vat_json_init_array (&vam->json_tree);
5055 node = vat_json_array_add (&vam->json_tree);
5057 vat_json_init_object (node);
5058 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5059 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5062 static void vl_api_ipsec_gre_tunnel_add_del_reply_t_handler
5063 (vl_api_ipsec_gre_tunnel_add_del_reply_t * mp)
5065 vat_main_t *vam = &vat_main;
5066 i32 retval = ntohl (mp->retval);
5067 if (vam->async_mode)
5069 vam->async_errors += (retval < 0);
5073 vam->retval = retval;
5074 vam->sw_if_index = ntohl (mp->sw_if_index);
5075 vam->result_ready = 1;
5077 vam->regenerate_interface_table = 1;
5080 static void vl_api_ipsec_gre_tunnel_add_del_reply_t_handler_json
5081 (vl_api_ipsec_gre_tunnel_add_del_reply_t * mp)
5083 vat_main_t *vam = &vat_main;
5084 vat_json_node_t node;
5086 vat_json_init_object (&node);
5087 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
5088 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
5090 vat_json_print (vam->ofp, &node);
5091 vat_json_free (&node);
5093 vam->retval = ntohl (mp->retval);
5094 vam->result_ready = 1;
5097 static void vl_api_flow_classify_details_t_handler
5098 (vl_api_flow_classify_details_t * mp)
5100 vat_main_t *vam = &vat_main;
5102 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5103 ntohl (mp->table_index));
5106 static void vl_api_flow_classify_details_t_handler_json
5107 (vl_api_flow_classify_details_t * mp)
5109 vat_main_t *vam = &vat_main;
5110 vat_json_node_t *node;
5112 if (VAT_JSON_ARRAY != vam->json_tree.type)
5114 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5115 vat_json_init_array (&vam->json_tree);
5117 node = vat_json_array_add (&vam->json_tree);
5119 vat_json_init_object (node);
5120 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5121 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5124 #define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler
5125 #define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler
5126 #define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler
5127 #define vl_api_one_l2_arp_entries_get_reply_t_endian vl_noop_handler
5128 #define vl_api_one_l2_arp_entries_get_reply_t_print vl_noop_handler
5129 #define vl_api_one_l2_arp_bd_get_reply_t_endian vl_noop_handler
5130 #define vl_api_one_ndp_bd_get_reply_t_endian vl_noop_handler
5131 #define vl_api_one_ndp_bd_get_reply_t_print vl_noop_handler
5132 #define vl_api_one_ndp_entries_get_reply_t_print vl_noop_handler
5133 #define vl_api_one_ndp_entries_get_reply_t_endian vl_noop_handler
5136 * Generate boilerplate reply handlers, which
5137 * dig the return value out of the xxx_reply_t API message,
5138 * stick it into vam->retval, and set vam->result_ready
5140 * Could also do this by pointing N message decode slots at
5141 * a single function, but that could break in subtle ways.
5144 #define foreach_standard_reply_retval_handler \
5145 _(sw_interface_set_flags_reply) \
5146 _(sw_interface_add_del_address_reply) \
5147 _(sw_interface_set_rx_mode_reply) \
5148 _(sw_interface_set_rx_placement_reply) \
5149 _(sw_interface_set_table_reply) \
5150 _(sw_interface_set_mpls_enable_reply) \
5151 _(sw_interface_set_vpath_reply) \
5152 _(sw_interface_set_vxlan_bypass_reply) \
5153 _(sw_interface_set_geneve_bypass_reply) \
5154 _(sw_interface_set_vxlan_gpe_bypass_reply) \
5155 _(sw_interface_set_l2_bridge_reply) \
5156 _(bridge_domain_add_del_reply) \
5157 _(sw_interface_set_l2_xconnect_reply) \
5158 _(l2fib_add_del_reply) \
5159 _(l2fib_flush_int_reply) \
5160 _(l2fib_flush_bd_reply) \
5161 _(ip_add_del_route_reply) \
5162 _(ip_table_add_del_reply) \
5163 _(ip_mroute_add_del_reply) \
5164 _(mpls_route_add_del_reply) \
5165 _(mpls_table_add_del_reply) \
5166 _(mpls_ip_bind_unbind_reply) \
5167 _(bier_route_add_del_reply) \
5168 _(bier_table_add_del_reply) \
5169 _(proxy_arp_add_del_reply) \
5170 _(proxy_arp_intfc_enable_disable_reply) \
5171 _(sw_interface_set_unnumbered_reply) \
5172 _(ip_neighbor_add_del_reply) \
5173 _(reset_fib_reply) \
5174 _(dhcp_proxy_config_reply) \
5175 _(dhcp_proxy_set_vss_reply) \
5176 _(dhcp_client_config_reply) \
5177 _(set_ip_flow_hash_reply) \
5178 _(sw_interface_ip6_enable_disable_reply) \
5179 _(ip6nd_proxy_add_del_reply) \
5180 _(sw_interface_ip6nd_ra_prefix_reply) \
5181 _(sw_interface_ip6nd_ra_config_reply) \
5182 _(set_arp_neighbor_limit_reply) \
5183 _(l2_patch_add_del_reply) \
5184 _(sr_mpls_policy_add_reply) \
5185 _(sr_mpls_policy_mod_reply) \
5186 _(sr_mpls_policy_del_reply) \
5187 _(sr_policy_add_reply) \
5188 _(sr_policy_mod_reply) \
5189 _(sr_policy_del_reply) \
5190 _(sr_localsid_add_del_reply) \
5191 _(sr_steering_add_del_reply) \
5192 _(classify_add_del_session_reply) \
5193 _(classify_set_interface_ip_table_reply) \
5194 _(classify_set_interface_l2_tables_reply) \
5195 _(l2tpv3_set_tunnel_cookies_reply) \
5196 _(l2tpv3_interface_enable_disable_reply) \
5197 _(l2tpv3_set_lookup_key_reply) \
5198 _(l2_fib_clear_table_reply) \
5199 _(l2_interface_efp_filter_reply) \
5200 _(l2_interface_vlan_tag_rewrite_reply) \
5201 _(modify_vhost_user_if_reply) \
5202 _(delete_vhost_user_if_reply) \
5203 _(ip_probe_neighbor_reply) \
5204 _(ip_scan_neighbor_enable_disable_reply) \
5205 _(want_ip4_arp_events_reply) \
5206 _(want_ip6_nd_events_reply) \
5207 _(want_l2_macs_events_reply) \
5208 _(input_acl_set_interface_reply) \
5209 _(ipsec_spd_add_del_reply) \
5210 _(ipsec_interface_add_del_spd_reply) \
5211 _(ipsec_spd_entry_add_del_reply) \
5212 _(ipsec_sad_entry_add_del_reply) \
5213 _(ipsec_sa_set_key_reply) \
5214 _(ipsec_tunnel_if_add_del_reply) \
5215 _(ipsec_tunnel_if_set_key_reply) \
5216 _(ipsec_tunnel_if_set_sa_reply) \
5217 _(delete_loopback_reply) \
5218 _(bd_ip_mac_add_del_reply) \
5219 _(bd_ip_mac_flush_reply) \
5220 _(want_interface_events_reply) \
5221 _(cop_interface_enable_disable_reply) \
5222 _(cop_whitelist_enable_disable_reply) \
5223 _(sw_interface_clear_stats_reply) \
5224 _(ioam_enable_reply) \
5225 _(ioam_disable_reply) \
5226 _(one_add_del_locator_reply) \
5227 _(one_add_del_local_eid_reply) \
5228 _(one_add_del_remote_mapping_reply) \
5229 _(one_add_del_adjacency_reply) \
5230 _(one_add_del_map_resolver_reply) \
5231 _(one_add_del_map_server_reply) \
5232 _(one_enable_disable_reply) \
5233 _(one_rloc_probe_enable_disable_reply) \
5234 _(one_map_register_enable_disable_reply) \
5235 _(one_map_register_set_ttl_reply) \
5236 _(one_set_transport_protocol_reply) \
5237 _(one_map_register_fallback_threshold_reply) \
5238 _(one_pitr_set_locator_set_reply) \
5239 _(one_map_request_mode_reply) \
5240 _(one_add_del_map_request_itr_rlocs_reply) \
5241 _(one_eid_table_add_del_map_reply) \
5242 _(one_use_petr_reply) \
5243 _(one_stats_enable_disable_reply) \
5244 _(one_add_del_l2_arp_entry_reply) \
5245 _(one_add_del_ndp_entry_reply) \
5246 _(one_stats_flush_reply) \
5247 _(one_enable_disable_xtr_mode_reply) \
5248 _(one_enable_disable_pitr_mode_reply) \
5249 _(one_enable_disable_petr_mode_reply) \
5250 _(gpe_enable_disable_reply) \
5251 _(gpe_set_encap_mode_reply) \
5252 _(gpe_add_del_iface_reply) \
5253 _(gpe_add_del_native_fwd_rpath_reply) \
5254 _(af_packet_delete_reply) \
5255 _(policer_classify_set_interface_reply) \
5256 _(netmap_create_reply) \
5257 _(netmap_delete_reply) \
5258 _(set_ipfix_exporter_reply) \
5259 _(set_ipfix_classify_stream_reply) \
5260 _(ipfix_classify_table_add_del_reply) \
5261 _(flow_classify_set_interface_reply) \
5262 _(sw_interface_span_enable_disable_reply) \
5263 _(pg_capture_reply) \
5264 _(pg_enable_disable_reply) \
5265 _(ip_source_and_port_range_check_add_del_reply) \
5266 _(ip_source_and_port_range_check_interface_add_del_reply)\
5267 _(delete_subif_reply) \
5268 _(l2_interface_pbb_tag_rewrite_reply) \
5270 _(feature_enable_disable_reply) \
5271 _(sw_interface_tag_add_del_reply) \
5272 _(hw_interface_set_mtu_reply) \
5273 _(p2p_ethernet_add_reply) \
5274 _(p2p_ethernet_del_reply) \
5275 _(lldp_config_reply) \
5276 _(sw_interface_set_lldp_reply) \
5277 _(tcp_configure_src_addresses_reply) \
5278 _(dns_enable_disable_reply) \
5279 _(dns_name_server_add_del_reply) \
5280 _(session_rule_add_del_reply) \
5281 _(ip_container_proxy_add_del_reply) \
5282 _(output_acl_set_interface_reply) \
5283 _(qos_record_enable_disable_reply)
5286 static void vl_api_##n##_t_handler \
5287 (vl_api_##n##_t * mp) \
5289 vat_main_t * vam = &vat_main; \
5290 i32 retval = ntohl(mp->retval); \
5291 if (vam->async_mode) { \
5292 vam->async_errors += (retval < 0); \
5294 vam->retval = retval; \
5295 vam->result_ready = 1; \
5298 foreach_standard_reply_retval_handler;
5302 static void vl_api_##n##_t_handler_json \
5303 (vl_api_##n##_t * mp) \
5305 vat_main_t * vam = &vat_main; \
5306 vat_json_node_t node; \
5307 vat_json_init_object(&node); \
5308 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5309 vat_json_print(vam->ofp, &node); \
5310 vam->retval = ntohl(mp->retval); \
5311 vam->result_ready = 1; \
5313 foreach_standard_reply_retval_handler;
5317 * Table of message reply handlers, must include boilerplate handlers
5321 #define foreach_vpe_api_reply_msg \
5322 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
5323 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
5324 _(SW_INTERFACE_DETAILS, sw_interface_details) \
5325 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5326 _(CONTROL_PING_REPLY, control_ping_reply) \
5327 _(CLI_REPLY, cli_reply) \
5328 _(CLI_INBAND_REPLY, cli_inband_reply) \
5329 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5330 sw_interface_add_del_address_reply) \
5331 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
5332 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
5333 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
5334 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5335 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5336 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5337 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
5338 _(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
5339 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
5340 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5341 sw_interface_set_l2_xconnect_reply) \
5342 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5343 sw_interface_set_l2_bridge_reply) \
5344 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5345 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
5346 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
5347 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
5348 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5349 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
5350 _(L2_FLAGS_REPLY, l2_flags_reply) \
5351 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
5352 _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5353 _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5354 _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
5355 _(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \
5356 _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
5357 _(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
5358 _(BOND_CREATE_REPLY, bond_create_reply) \
5359 _(BOND_DELETE_REPLY, bond_delete_reply) \
5360 _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5361 _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5362 _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5363 _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
5364 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
5365 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
5366 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
5367 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
5368 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5369 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
5370 _(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5371 _(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
5372 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5373 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5374 proxy_arp_intfc_enable_disable_reply) \
5375 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5376 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5377 sw_interface_set_unnumbered_reply) \
5378 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
5379 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5380 _(CREATE_SUBIF_REPLY, create_subif_reply) \
5381 _(RESET_FIB_REPLY, reset_fib_reply) \
5382 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
5383 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
5384 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
5385 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5386 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5387 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5388 sw_interface_ip6_enable_disable_reply) \
5389 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5390 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
5391 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5392 sw_interface_ip6nd_ra_prefix_reply) \
5393 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5394 sw_interface_ip6nd_ra_config_reply) \
5395 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5396 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
5397 _(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5398 _(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5399 _(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
5400 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5401 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5402 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5403 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5404 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
5405 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5406 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5407 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5408 classify_set_interface_ip_table_reply) \
5409 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5410 classify_set_interface_l2_tables_reply) \
5411 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5412 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5413 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5414 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5415 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5416 l2tpv3_interface_enable_disable_reply) \
5417 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5418 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5419 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
5420 _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
5421 _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
5422 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
5423 _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
5424 _(GRE_TUNNEL_ADD_DEL_REPLY, gre_tunnel_add_del_reply) \
5425 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5426 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5427 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5428 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5429 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5430 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5431 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5432 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5433 _(SHOW_VERSION_REPLY, show_version_reply) \
5434 _(SHOW_THREADS_REPLY, show_threads_reply) \
5435 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
5436 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
5437 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5438 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
5439 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
5440 _(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
5441 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5442 _(IP4_ARP_EVENT, ip4_arp_event) \
5443 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5444 _(IP6_ND_EVENT, ip6_nd_event) \
5445 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5446 _(L2_MACS_EVENT, l2_macs_event) \
5447 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5448 _(IP_ADDRESS_DETAILS, ip_address_details) \
5449 _(IP_DETAILS, ip_details) \
5450 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5451 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
5452 _(IPSEC_SPD_ENTRY_ADD_DEL_REPLY, ipsec_spd_entry_add_del_reply) \
5453 _(IPSEC_SAD_ENTRY_ADD_DEL_REPLY, ipsec_sad_entry_add_del_reply) \
5454 _(IPSEC_SA_DETAILS, ipsec_sa_details) \
5455 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
5456 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
5457 _(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \
5458 _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
5459 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5460 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
5461 _(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
5462 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
5463 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
5464 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
5465 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5466 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5467 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5468 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5469 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5470 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5471 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
5472 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5473 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5474 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5475 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5476 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5477 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5478 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5479 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5480 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5481 one_map_register_enable_disable_reply) \
5482 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
5483 _(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5484 _(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
5485 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5486 one_map_register_fallback_threshold_reply) \
5487 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5488 one_rloc_probe_enable_disable_reply) \
5489 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
5490 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
5491 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5492 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5493 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5494 _(ONE_LOCATOR_DETAILS, one_locator_details) \
5495 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5496 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5497 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5498 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5499 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5500 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
5501 _(ONE_STATS_DETAILS, one_stats_details) \
5502 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
5503 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5504 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5505 show_one_stats_enable_disable_reply) \
5506 _(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5507 _(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5508 _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
5509 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5510 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5511 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
5512 _(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5513 _(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5514 one_enable_disable_pitr_mode_reply) \
5515 _(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5516 one_enable_disable_petr_mode_reply) \
5517 _(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5518 _(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5519 _(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
5520 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5521 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
5522 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
5523 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5524 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
5525 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
5526 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
5527 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5528 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5529 gpe_add_del_native_fwd_rpath_reply) \
5530 _(GPE_FWD_ENTRY_PATH_DETAILS, \
5531 gpe_fwd_entry_path_details) \
5532 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5533 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5534 one_add_del_map_request_itr_rlocs_reply) \
5535 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5536 one_get_map_request_itr_rlocs_reply) \
5537 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
5538 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
5539 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
5540 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5541 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5542 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5543 show_one_map_register_state_reply) \
5544 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
5545 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5546 show_one_map_register_fallback_threshold_reply) \
5547 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5548 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
5549 _(AF_PACKET_DETAILS, af_packet_details) \
5550 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5551 _(POLICER_DETAILS, policer_details) \
5552 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5553 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5554 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
5555 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5556 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5557 _(MPLS_FIB_DETAILS, mpls_fib_details) \
5558 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5559 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5560 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5561 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5562 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5563 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5564 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5565 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5566 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5567 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5568 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5569 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5570 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5571 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5572 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5573 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5574 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5575 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5576 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5577 ip_source_and_port_range_check_add_del_reply) \
5578 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5579 ip_source_and_port_range_check_interface_add_del_reply) \
5580 _(IPSEC_GRE_TUNNEL_ADD_DEL_REPLY, ipsec_gre_tunnel_add_del_reply) \
5581 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5582 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5583 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5584 _(SET_PUNT_REPLY, set_punt_reply) \
5585 _(IP_FIB_DETAILS, ip_fib_details) \
5586 _(IP6_FIB_DETAILS, ip6_fib_details) \
5587 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5588 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5589 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5590 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
5591 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5592 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5593 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5594 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5595 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5596 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
5597 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
5598 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5599 _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5600 _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
5601 _(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
5602 _(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
5603 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
5604 _(SESSION_RULES_DETAILS, session_rules_details) \
5605 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
5606 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
5607 _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
5609 #define foreach_standalone_reply_msg \
5610 _(SW_INTERFACE_EVENT, sw_interface_event)
5618 #define STR_VTR_OP_CASE(op) \
5619 case L2_VTR_ ## op: \
5623 str_vtr_op (u32 vtr_op)
5627 STR_VTR_OP_CASE (DISABLED);
5628 STR_VTR_OP_CASE (PUSH_1);
5629 STR_VTR_OP_CASE (PUSH_2);
5630 STR_VTR_OP_CASE (POP_1);
5631 STR_VTR_OP_CASE (POP_2);
5632 STR_VTR_OP_CASE (TRANSLATE_1_1);
5633 STR_VTR_OP_CASE (TRANSLATE_1_2);
5634 STR_VTR_OP_CASE (TRANSLATE_2_1);
5635 STR_VTR_OP_CASE (TRANSLATE_2_2);
5642 dump_sub_interface_table (vat_main_t * vam)
5644 const sw_interface_subif_t *sub = NULL;
5646 if (vam->json_output)
5649 ("JSON output supported only for VPE API calls and dump_stats_table");
5654 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5655 "Interface", "sw_if_index",
5656 "sub id", "dot1ad", "tags", "outer id",
5657 "inner id", "exact", "default", "outer any", "inner any");
5659 vec_foreach (sub, vam->sw_if_subif_table)
5662 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5663 sub->interface_name,
5665 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5666 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5667 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5668 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5669 if (sub->vtr_op != L2_VTR_DISABLED)
5672 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5673 "tag1: %d tag2: %d ]",
5674 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5675 sub->vtr_tag1, sub->vtr_tag2);
5683 name_sort_cmp (void *a1, void *a2)
5685 name_sort_t *n1 = a1;
5686 name_sort_t *n2 = a2;
5688 return strcmp ((char *) n1->name, (char *) n2->name);
5692 dump_interface_table (vat_main_t * vam)
5695 name_sort_t *nses = 0, *ns;
5697 if (vam->json_output)
5700 ("JSON output supported only for VPE API calls and dump_stats_table");
5705 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5707 vec_add2 (nses, ns, 1);
5708 ns->name = (u8 *)(p->key);
5709 ns->value = (u32) p->value[0];
5713 vec_sort_with_function (nses, name_sort_cmp);
5715 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5716 vec_foreach (ns, nses)
5718 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5725 dump_ip_table (vat_main_t * vam, int is_ipv6)
5727 const ip_details_t *det = NULL;
5728 const ip_address_details_t *address = NULL;
5731 print (vam->ofp, "%-12s", "sw_if_index");
5733 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5740 print (vam->ofp, "%-12d", i);
5741 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5746 vec_foreach (address, det->addr)
5750 is_ipv6 ? format_ip6_address : format_ip4_address,
5751 address->ip, address->prefix_length);
5759 dump_ipv4_table (vat_main_t * vam)
5761 if (vam->json_output)
5764 ("JSON output supported only for VPE API calls and dump_stats_table");
5768 return dump_ip_table (vam, 0);
5772 dump_ipv6_table (vat_main_t * vam)
5774 if (vam->json_output)
5777 ("JSON output supported only for VPE API calls and dump_stats_table");
5781 return dump_ip_table (vam, 1);
5785 * Pass CLI buffers directly in the CLI_INBAND API message,
5786 * instead of an additional shared memory area.
5789 exec_inband (vat_main_t * vam)
5791 vl_api_cli_inband_t *mp;
5792 unformat_input_t *i = vam->input;
5795 if (vec_len (i->buffer) == 0)
5798 if (vam->exec_mode == 0 && unformat (i, "mode"))
5803 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5810 * In order for the CLI command to work, it
5811 * must be a vector ending in \n, not a C-string ending
5814 u32 len = vec_len (vam->input->buffer);
5815 M2 (CLI_INBAND, mp, len);
5816 vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
5820 /* json responses may or may not include a useful reply... */
5821 if (vec_len (vam->cmd_reply))
5822 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
5827 exec (vat_main_t * vam)
5829 return exec_inband (vam);
5833 api_create_loopback (vat_main_t * vam)
5835 unformat_input_t *i = vam->input;
5836 vl_api_create_loopback_t *mp;
5837 vl_api_create_loopback_instance_t *mp_lbi;
5840 u8 is_specified = 0;
5841 u32 user_instance = 0;
5844 clib_memset (mac_address, 0, sizeof (mac_address));
5846 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5848 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5850 if (unformat (i, "instance %d", &user_instance))
5858 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5859 mp_lbi->is_specified = is_specified;
5861 mp_lbi->user_instance = htonl (user_instance);
5863 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5868 /* Construct the API message */
5869 M (CREATE_LOOPBACK, mp);
5871 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5880 api_delete_loopback (vat_main_t * vam)
5882 unformat_input_t *i = vam->input;
5883 vl_api_delete_loopback_t *mp;
5884 u32 sw_if_index = ~0;
5887 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5889 if (unformat (i, "sw_if_index %d", &sw_if_index))
5895 if (sw_if_index == ~0)
5897 errmsg ("missing sw_if_index");
5901 /* Construct the API message */
5902 M (DELETE_LOOPBACK, mp);
5903 mp->sw_if_index = ntohl (sw_if_index);
5911 api_want_interface_events (vat_main_t * vam)
5913 unformat_input_t *i = vam->input;
5914 vl_api_want_interface_events_t *mp;
5918 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5920 if (unformat (i, "enable"))
5922 else if (unformat (i, "disable"))
5930 errmsg ("missing enable|disable");
5934 M (WANT_INTERFACE_EVENTS, mp);
5935 mp->enable_disable = enable;
5937 vam->interface_event_display = enable;
5945 /* Note: non-static, called once to set up the initial intfc table */
5947 api_sw_interface_dump (vat_main_t * vam)
5949 vl_api_sw_interface_dump_t *mp;
5950 vl_api_control_ping_t *mp_ping;
5952 name_sort_t *nses = 0, *ns;
5953 sw_interface_subif_t *sub = NULL;
5956 /* Toss the old name table */
5958 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5960 vec_add2 (nses, ns, 1);
5961 ns->name = (u8 *)(p->key);
5962 ns->value = (u32) p->value[0];
5966 hash_free (vam->sw_if_index_by_interface_name);
5968 vec_foreach (ns, nses) vec_free (ns->name);
5972 vec_foreach (sub, vam->sw_if_subif_table)
5974 vec_free (sub->interface_name);
5976 vec_free (vam->sw_if_subif_table);
5978 /* recreate the interface name hash table */
5979 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
5982 * Ask for all interface names. Otherwise, the epic catalog of
5983 * name filters becomes ridiculously long, and vat ends up needing
5984 * to be taught about new interface types.
5986 M (SW_INTERFACE_DUMP, mp);
5989 /* Use a control ping for synchronization */
5990 MPING (CONTROL_PING, mp_ping);
5998 api_sw_interface_set_flags (vat_main_t * vam)
6000 unformat_input_t *i = vam->input;
6001 vl_api_sw_interface_set_flags_t *mp;
6003 u8 sw_if_index_set = 0;
6007 /* Parse args required to build the message */
6008 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6010 if (unformat (i, "admin-up"))
6012 else if (unformat (i, "admin-down"))
6015 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6016 sw_if_index_set = 1;
6017 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6018 sw_if_index_set = 1;
6023 if (sw_if_index_set == 0)
6025 errmsg ("missing interface name or sw_if_index");
6029 /* Construct the API message */
6030 M (SW_INTERFACE_SET_FLAGS, mp);
6031 mp->sw_if_index = ntohl (sw_if_index);
6032 mp->admin_up_down = admin_up;
6037 /* Wait for a reply, return the good/bad news... */
6043 api_sw_interface_set_rx_mode (vat_main_t * vam)
6045 unformat_input_t *i = vam->input;
6046 vl_api_sw_interface_set_rx_mode_t *mp;
6048 u8 sw_if_index_set = 0;
6050 u8 queue_id_valid = 0;
6052 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6054 /* Parse args required to build the message */
6055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6057 if (unformat (i, "queue %d", &queue_id))
6059 else if (unformat (i, "polling"))
6060 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6061 else if (unformat (i, "interrupt"))
6062 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6063 else if (unformat (i, "adaptive"))
6064 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6066 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6067 sw_if_index_set = 1;
6068 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6069 sw_if_index_set = 1;
6074 if (sw_if_index_set == 0)
6076 errmsg ("missing interface name or sw_if_index");
6079 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6081 errmsg ("missing rx-mode");
6085 /* Construct the API message */
6086 M (SW_INTERFACE_SET_RX_MODE, mp);
6087 mp->sw_if_index = ntohl (sw_if_index);
6089 mp->queue_id_valid = queue_id_valid;
6090 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6095 /* Wait for a reply, return the good/bad news... */
6101 api_sw_interface_set_rx_placement (vat_main_t * vam)
6103 unformat_input_t *i = vam->input;
6104 vl_api_sw_interface_set_rx_placement_t *mp;
6106 u8 sw_if_index_set = 0;
6109 u32 queue_id, thread_index;
6111 /* Parse args required to build the message */
6112 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6114 if (unformat (i, "queue %d", &queue_id))
6116 else if (unformat (i, "main"))
6118 else if (unformat (i, "worker %d", &thread_index))
6121 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6122 sw_if_index_set = 1;
6123 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6124 sw_if_index_set = 1;
6129 if (sw_if_index_set == 0)
6131 errmsg ("missing interface name or sw_if_index");
6137 /* Construct the API message */
6138 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6139 mp->sw_if_index = ntohl (sw_if_index);
6140 mp->worker_id = ntohl (thread_index);
6141 mp->queue_id = ntohl (queue_id);
6142 mp->is_main = is_main;
6146 /* Wait for a reply, return the good/bad news... */
6151 static void vl_api_sw_interface_rx_placement_details_t_handler
6152 (vl_api_sw_interface_rx_placement_details_t * mp)
6154 vat_main_t *vam = &vat_main;
6155 u32 worker_id = ntohl (mp->worker_id);
6158 "\n%-11d %-11s %-6d %-5d %-9s",
6159 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
6160 worker_id, ntohl (mp->queue_id),
6162 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
6165 static void vl_api_sw_interface_rx_placement_details_t_handler_json
6166 (vl_api_sw_interface_rx_placement_details_t * mp)
6168 vat_main_t *vam = &vat_main;
6169 vat_json_node_t *node = NULL;
6171 if (VAT_JSON_ARRAY != vam->json_tree.type)
6173 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6174 vat_json_init_array (&vam->json_tree);
6176 node = vat_json_array_add (&vam->json_tree);
6178 vat_json_init_object (node);
6179 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6180 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
6181 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
6182 vat_json_object_add_uint (node, "mode", mp->mode);
6186 api_sw_interface_rx_placement_dump (vat_main_t * vam)
6188 unformat_input_t *i = vam->input;
6189 vl_api_sw_interface_rx_placement_dump_t *mp;
6190 vl_api_control_ping_t *mp_ping;
6193 u8 sw_if_index_set = 0;
6195 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6197 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6199 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6206 "\n%-11s %-11s %-6s %-5s %-4s",
6207 "sw_if_index", "main/worker", "thread", "queue", "mode");
6209 /* Dump Interface rx placement */
6210 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
6212 if (sw_if_index_set)
6213 mp->sw_if_index = htonl (sw_if_index);
6215 mp->sw_if_index = ~0;
6219 /* Use a control ping for synchronization */
6220 MPING (CONTROL_PING, mp_ping);
6228 api_sw_interface_clear_stats (vat_main_t * vam)
6230 unformat_input_t *i = vam->input;
6231 vl_api_sw_interface_clear_stats_t *mp;
6233 u8 sw_if_index_set = 0;
6236 /* Parse args required to build the message */
6237 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6239 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6240 sw_if_index_set = 1;
6241 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6242 sw_if_index_set = 1;
6247 /* Construct the API message */
6248 M (SW_INTERFACE_CLEAR_STATS, mp);
6250 if (sw_if_index_set == 1)
6251 mp->sw_if_index = ntohl (sw_if_index);
6253 mp->sw_if_index = ~0;
6258 /* Wait for a reply, return the good/bad news... */
6264 api_sw_interface_add_del_address (vat_main_t * vam)
6266 unformat_input_t *i = vam->input;
6267 vl_api_sw_interface_add_del_address_t *mp;
6269 u8 sw_if_index_set = 0;
6270 u8 is_add = 1, del_all = 0;
6271 u32 address_length = 0;
6272 u8 v4_address_set = 0;
6273 u8 v6_address_set = 0;
6274 ip4_address_t v4address;
6275 ip6_address_t v6address;
6278 /* Parse args required to build the message */
6279 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6281 if (unformat (i, "del-all"))
6283 else if (unformat (i, "del"))
6286 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6287 sw_if_index_set = 1;
6288 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6289 sw_if_index_set = 1;
6290 else if (unformat (i, "%U/%d",
6291 unformat_ip4_address, &v4address, &address_length))
6293 else if (unformat (i, "%U/%d",
6294 unformat_ip6_address, &v6address, &address_length))
6300 if (sw_if_index_set == 0)
6302 errmsg ("missing interface name or sw_if_index");
6305 if (v4_address_set && v6_address_set)
6307 errmsg ("both v4 and v6 addresses set");
6310 if (!v4_address_set && !v6_address_set && !del_all)
6312 errmsg ("no addresses set");
6316 /* Construct the API message */
6317 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
6319 mp->sw_if_index = ntohl (sw_if_index);
6320 mp->is_add = is_add;
6321 mp->del_all = del_all;
6325 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6329 clib_memcpy (mp->address, &v4address, sizeof (v4address));
6331 mp->address_length = address_length;
6336 /* Wait for a reply, return good/bad news */
6342 api_sw_interface_set_mpls_enable (vat_main_t * vam)
6344 unformat_input_t *i = vam->input;
6345 vl_api_sw_interface_set_mpls_enable_t *mp;
6347 u8 sw_if_index_set = 0;
6351 /* Parse args required to build the message */
6352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6354 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6355 sw_if_index_set = 1;
6356 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6357 sw_if_index_set = 1;
6358 else if (unformat (i, "disable"))
6360 else if (unformat (i, "dis"))
6366 if (sw_if_index_set == 0)
6368 errmsg ("missing interface name or sw_if_index");
6372 /* Construct the API message */
6373 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
6375 mp->sw_if_index = ntohl (sw_if_index);
6376 mp->enable = enable;
6381 /* Wait for a reply... */
6387 api_sw_interface_set_table (vat_main_t * vam)
6389 unformat_input_t *i = vam->input;
6390 vl_api_sw_interface_set_table_t *mp;
6391 u32 sw_if_index, vrf_id = 0;
6392 u8 sw_if_index_set = 0;
6396 /* Parse args required to build the message */
6397 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6399 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6400 sw_if_index_set = 1;
6401 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6402 sw_if_index_set = 1;
6403 else if (unformat (i, "vrf %d", &vrf_id))
6405 else if (unformat (i, "ipv6"))
6411 if (sw_if_index_set == 0)
6413 errmsg ("missing interface name or sw_if_index");
6417 /* Construct the API message */
6418 M (SW_INTERFACE_SET_TABLE, mp);
6420 mp->sw_if_index = ntohl (sw_if_index);
6421 mp->is_ipv6 = is_ipv6;
6422 mp->vrf_id = ntohl (vrf_id);
6427 /* Wait for a reply... */
6432 static void vl_api_sw_interface_get_table_reply_t_handler
6433 (vl_api_sw_interface_get_table_reply_t * mp)
6435 vat_main_t *vam = &vat_main;
6437 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6439 vam->retval = ntohl (mp->retval);
6440 vam->result_ready = 1;
6444 static void vl_api_sw_interface_get_table_reply_t_handler_json
6445 (vl_api_sw_interface_get_table_reply_t * mp)
6447 vat_main_t *vam = &vat_main;
6448 vat_json_node_t node;
6450 vat_json_init_object (&node);
6451 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6452 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6454 vat_json_print (vam->ofp, &node);
6455 vat_json_free (&node);
6457 vam->retval = ntohl (mp->retval);
6458 vam->result_ready = 1;
6462 api_sw_interface_get_table (vat_main_t * vam)
6464 unformat_input_t *i = vam->input;
6465 vl_api_sw_interface_get_table_t *mp;
6467 u8 sw_if_index_set = 0;
6471 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6473 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6474 sw_if_index_set = 1;
6475 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6476 sw_if_index_set = 1;
6477 else if (unformat (i, "ipv6"))
6483 if (sw_if_index_set == 0)
6485 errmsg ("missing interface name or sw_if_index");
6489 M (SW_INTERFACE_GET_TABLE, mp);
6490 mp->sw_if_index = htonl (sw_if_index);
6491 mp->is_ipv6 = is_ipv6;
6499 api_sw_interface_set_vpath (vat_main_t * vam)
6501 unformat_input_t *i = vam->input;
6502 vl_api_sw_interface_set_vpath_t *mp;
6503 u32 sw_if_index = 0;
6504 u8 sw_if_index_set = 0;
6508 /* Parse args required to build the message */
6509 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6511 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6512 sw_if_index_set = 1;
6513 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6514 sw_if_index_set = 1;
6515 else if (unformat (i, "enable"))
6517 else if (unformat (i, "disable"))
6523 if (sw_if_index_set == 0)
6525 errmsg ("missing interface name or sw_if_index");
6529 /* Construct the API message */
6530 M (SW_INTERFACE_SET_VPATH, mp);
6532 mp->sw_if_index = ntohl (sw_if_index);
6533 mp->enable = is_enable;
6538 /* Wait for a reply... */
6544 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6546 unformat_input_t *i = vam->input;
6547 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6548 u32 sw_if_index = 0;
6549 u8 sw_if_index_set = 0;
6554 /* Parse args required to build the message */
6555 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6557 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6558 sw_if_index_set = 1;
6559 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6560 sw_if_index_set = 1;
6561 else if (unformat (i, "enable"))
6563 else if (unformat (i, "disable"))
6565 else if (unformat (i, "ip4"))
6567 else if (unformat (i, "ip6"))
6573 if (sw_if_index_set == 0)
6575 errmsg ("missing interface name or sw_if_index");
6579 /* Construct the API message */
6580 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6582 mp->sw_if_index = ntohl (sw_if_index);
6583 mp->enable = is_enable;
6584 mp->is_ipv6 = is_ipv6;
6589 /* Wait for a reply... */
6595 api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6597 unformat_input_t *i = vam->input;
6598 vl_api_sw_interface_set_geneve_bypass_t *mp;
6599 u32 sw_if_index = 0;
6600 u8 sw_if_index_set = 0;
6605 /* Parse args required to build the message */
6606 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6608 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6609 sw_if_index_set = 1;
6610 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6611 sw_if_index_set = 1;
6612 else if (unformat (i, "enable"))
6614 else if (unformat (i, "disable"))
6616 else if (unformat (i, "ip4"))
6618 else if (unformat (i, "ip6"))
6624 if (sw_if_index_set == 0)
6626 errmsg ("missing interface name or sw_if_index");
6630 /* Construct the API message */
6631 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
6633 mp->sw_if_index = ntohl (sw_if_index);
6634 mp->enable = is_enable;
6635 mp->is_ipv6 = is_ipv6;
6640 /* Wait for a reply... */
6646 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6648 unformat_input_t *i = vam->input;
6649 vl_api_sw_interface_set_l2_xconnect_t *mp;
6651 u8 rx_sw_if_index_set = 0;
6653 u8 tx_sw_if_index_set = 0;
6657 /* Parse args required to build the message */
6658 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6660 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6661 rx_sw_if_index_set = 1;
6662 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6663 tx_sw_if_index_set = 1;
6664 else if (unformat (i, "rx"))
6666 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6668 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6670 rx_sw_if_index_set = 1;
6675 else if (unformat (i, "tx"))
6677 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6679 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6681 tx_sw_if_index_set = 1;
6686 else if (unformat (i, "enable"))
6688 else if (unformat (i, "disable"))
6694 if (rx_sw_if_index_set == 0)
6696 errmsg ("missing rx interface name or rx_sw_if_index");
6700 if (enable && (tx_sw_if_index_set == 0))
6702 errmsg ("missing tx interface name or tx_sw_if_index");
6706 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
6708 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6709 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6710 mp->enable = enable;
6718 api_sw_interface_set_l2_bridge (vat_main_t * vam)
6720 unformat_input_t *i = vam->input;
6721 vl_api_sw_interface_set_l2_bridge_t *mp;
6722 vl_api_l2_port_type_t port_type;
6724 u8 rx_sw_if_index_set = 0;
6731 port_type = L2_API_PORT_TYPE_NORMAL;
6733 /* Parse args required to build the message */
6734 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6736 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6737 rx_sw_if_index_set = 1;
6738 else if (unformat (i, "bd_id %d", &bd_id))
6742 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6743 rx_sw_if_index_set = 1;
6744 else if (unformat (i, "shg %d", &shg))
6746 else if (unformat (i, "bvi"))
6747 port_type = L2_API_PORT_TYPE_BVI;
6748 else if (unformat (i, "uu-fwd"))
6749 port_type = L2_API_PORT_TYPE_UU_FWD;
6750 else if (unformat (i, "enable"))
6752 else if (unformat (i, "disable"))
6758 if (rx_sw_if_index_set == 0)
6760 errmsg ("missing rx interface name or sw_if_index");
6764 if (enable && (bd_id_set == 0))
6766 errmsg ("missing bridge domain");
6770 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
6772 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6773 mp->bd_id = ntohl (bd_id);
6775 mp->port_type = ntohl (port_type);
6776 mp->enable = enable;
6784 api_bridge_domain_dump (vat_main_t * vam)
6786 unformat_input_t *i = vam->input;
6787 vl_api_bridge_domain_dump_t *mp;
6788 vl_api_control_ping_t *mp_ping;
6792 /* Parse args required to build the message */
6793 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6795 if (unformat (i, "bd_id %d", &bd_id))
6801 M (BRIDGE_DOMAIN_DUMP, mp);
6802 mp->bd_id = ntohl (bd_id);
6805 /* Use a control ping for synchronization */
6806 MPING (CONTROL_PING, mp_ping);
6814 api_bridge_domain_add_del (vat_main_t * vam)
6816 unformat_input_t *i = vam->input;
6817 vl_api_bridge_domain_add_del_t *mp;
6820 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
6825 /* Parse args required to build the message */
6826 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6828 if (unformat (i, "bd_id %d", &bd_id))
6830 else if (unformat (i, "flood %d", &flood))
6832 else if (unformat (i, "uu-flood %d", &uu_flood))
6834 else if (unformat (i, "forward %d", &forward))
6836 else if (unformat (i, "learn %d", &learn))
6838 else if (unformat (i, "arp-term %d", &arp_term))
6840 else if (unformat (i, "mac-age %d", &mac_age))
6842 else if (unformat (i, "bd-tag %s", &bd_tag))
6844 else if (unformat (i, "del"))
6847 flood = uu_flood = forward = learn = 0;
6855 errmsg ("missing bridge domain");
6862 errmsg ("mac age must be less than 256 ");
6867 if ((bd_tag) && (vec_len (bd_tag) > 63))
6869 errmsg ("bd-tag cannot be longer than 63");
6874 M (BRIDGE_DOMAIN_ADD_DEL, mp);
6876 mp->bd_id = ntohl (bd_id);
6878 mp->uu_flood = uu_flood;
6879 mp->forward = forward;
6881 mp->arp_term = arp_term;
6882 mp->is_add = is_add;
6883 mp->mac_age = (u8) mac_age;
6886 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
6887 mp->bd_tag[vec_len (bd_tag)] = 0;
6898 api_l2fib_flush_bd (vat_main_t * vam)
6900 unformat_input_t *i = vam->input;
6901 vl_api_l2fib_flush_bd_t *mp;
6905 /* Parse args required to build the message */
6906 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6908 if (unformat (i, "bd_id %d", &bd_id));
6915 errmsg ("missing bridge domain");
6919 M (L2FIB_FLUSH_BD, mp);
6921 mp->bd_id = htonl (bd_id);
6929 api_l2fib_flush_int (vat_main_t * vam)
6931 unformat_input_t *i = vam->input;
6932 vl_api_l2fib_flush_int_t *mp;
6933 u32 sw_if_index = ~0;
6936 /* Parse args required to build the message */
6937 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6939 if (unformat (i, "sw_if_index %d", &sw_if_index));
6941 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
6946 if (sw_if_index == ~0)
6948 errmsg ("missing interface name or sw_if_index");
6952 M (L2FIB_FLUSH_INT, mp);
6954 mp->sw_if_index = ntohl (sw_if_index);
6962 api_l2fib_add_del (vat_main_t * vam)
6964 unformat_input_t *i = vam->input;
6965 vl_api_l2fib_add_del_t *mp;
6971 u32 sw_if_index = 0;
6972 u8 sw_if_index_set = 0;
6981 /* Parse args required to build the message */
6982 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6984 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
6986 else if (unformat (i, "bd_id %d", &bd_id))
6988 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6989 sw_if_index_set = 1;
6990 else if (unformat (i, "sw_if"))
6992 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6995 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6996 sw_if_index_set = 1;
7001 else if (unformat (i, "static"))
7003 else if (unformat (i, "filter"))
7008 else if (unformat (i, "bvi"))
7013 else if (unformat (i, "del"))
7015 else if (unformat (i, "count %d", &count))
7023 errmsg ("missing mac address");
7029 errmsg ("missing bridge domain");
7033 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7035 errmsg ("missing interface name or sw_if_index");
7041 /* Turn on async mode */
7042 vam->async_mode = 1;
7043 vam->async_errors = 0;
7044 before = vat_time_now (vam);
7047 for (j = 0; j < count; j++)
7049 M (L2FIB_ADD_DEL, mp);
7051 clib_memcpy (mp->mac, mac, 6);
7052 mp->bd_id = ntohl (bd_id);
7053 mp->is_add = is_add;
7054 mp->sw_if_index = ntohl (sw_if_index);
7058 mp->static_mac = static_mac;
7059 mp->filter_mac = filter_mac;
7060 mp->bvi_mac = bvi_mac;
7062 increment_mac_address (mac);
7069 vl_api_control_ping_t *mp_ping;
7072 /* Shut off async mode */
7073 vam->async_mode = 0;
7075 MPING (CONTROL_PING, mp_ping);
7078 timeout = vat_time_now (vam) + 1.0;
7079 while (vat_time_now (vam) < timeout)
7080 if (vam->result_ready == 1)
7085 if (vam->retval == -99)
7088 if (vam->async_errors > 0)
7090 errmsg ("%d asynchronous errors", vam->async_errors);
7093 vam->async_errors = 0;
7094 after = vat_time_now (vam);
7096 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7097 count, after - before, count / (after - before));
7103 /* Wait for a reply... */
7107 /* Return the good/bad news */
7108 return (vam->retval);
7112 api_bridge_domain_set_mac_age (vat_main_t * vam)
7114 unformat_input_t *i = vam->input;
7115 vl_api_bridge_domain_set_mac_age_t *mp;
7120 /* Parse args required to build the message */
7121 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7123 if (unformat (i, "bd_id %d", &bd_id));
7124 else if (unformat (i, "mac-age %d", &mac_age));
7131 errmsg ("missing bridge domain");
7137 errmsg ("mac age must be less than 256 ");
7141 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7143 mp->bd_id = htonl (bd_id);
7144 mp->mac_age = (u8) mac_age;
7152 api_l2_flags (vat_main_t * vam)
7154 unformat_input_t *i = vam->input;
7155 vl_api_l2_flags_t *mp;
7158 u8 sw_if_index_set = 0;
7162 /* Parse args required to build the message */
7163 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7165 if (unformat (i, "sw_if_index %d", &sw_if_index))
7166 sw_if_index_set = 1;
7167 else if (unformat (i, "sw_if"))
7169 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7172 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7173 sw_if_index_set = 1;
7178 else if (unformat (i, "learn"))
7180 else if (unformat (i, "forward"))
7182 else if (unformat (i, "flood"))
7184 else if (unformat (i, "uu-flood"))
7185 flags |= L2_UU_FLOOD;
7186 else if (unformat (i, "arp-term"))
7187 flags |= L2_ARP_TERM;
7188 else if (unformat (i, "off"))
7190 else if (unformat (i, "disable"))
7196 if (sw_if_index_set == 0)
7198 errmsg ("missing interface name or sw_if_index");
7204 mp->sw_if_index = ntohl (sw_if_index);
7205 mp->feature_bitmap = ntohl (flags);
7206 mp->is_set = is_set;
7214 api_bridge_flags (vat_main_t * vam)
7216 unformat_input_t *i = vam->input;
7217 vl_api_bridge_flags_t *mp;
7221 bd_flags_t flags = 0;
7224 /* Parse args required to build the message */
7225 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7227 if (unformat (i, "bd_id %d", &bd_id))
7229 else if (unformat (i, "learn"))
7230 flags |= BRIDGE_API_FLAG_LEARN;
7231 else if (unformat (i, "forward"))
7232 flags |= BRIDGE_API_FLAG_FWD;
7233 else if (unformat (i, "flood"))
7234 flags |= BRIDGE_API_FLAG_FLOOD;
7235 else if (unformat (i, "uu-flood"))
7236 flags |= BRIDGE_API_FLAG_UU_FLOOD;
7237 else if (unformat (i, "arp-term"))
7238 flags |= BRIDGE_API_FLAG_ARP_TERM;
7239 else if (unformat (i, "off"))
7241 else if (unformat (i, "disable"))
7249 errmsg ("missing bridge domain");
7253 M (BRIDGE_FLAGS, mp);
7255 mp->bd_id = ntohl (bd_id);
7256 mp->flags = ntohl (flags);
7257 mp->is_set = is_set;
7265 api_bd_ip_mac_add_del (vat_main_t * vam)
7267 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
7268 vl_api_mac_address_t mac = { 0 };
7269 unformat_input_t *i = vam->input;
7270 vl_api_bd_ip_mac_add_del_t *mp;
7282 /* Parse args required to build the message */
7283 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7285 if (unformat (i, "bd_id %d", &bd_id))
7289 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
7293 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
7297 else if (unformat (i, "del"))
7305 errmsg ("missing bridge domain");
7308 else if (ip_set == 0)
7310 errmsg ("missing IP address");
7313 else if (mac_set == 0)
7315 errmsg ("missing MAC address");
7319 M (BD_IP_MAC_ADD_DEL, mp);
7321 mp->bd_id = ntohl (bd_id);
7322 mp->is_add = is_add;
7324 clib_memcpy (&mp->ip, &ip, sizeof (ip));
7325 clib_memcpy (&mp->mac, &mac, sizeof (mac));
7333 api_bd_ip_mac_flush (vat_main_t * vam)
7335 unformat_input_t *i = vam->input;
7336 vl_api_bd_ip_mac_flush_t *mp;
7341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7343 if (unformat (i, "bd_id %d", &bd_id))
7353 errmsg ("missing bridge domain");
7357 M (BD_IP_MAC_FLUSH, mp);
7359 mp->bd_id = ntohl (bd_id);
7366 static void vl_api_bd_ip_mac_details_t_handler
7367 (vl_api_bd_ip_mac_details_t * mp)
7369 vat_main_t *vam = &vat_main;
7374 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7377 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7380 "\n%-5d %-7s %-20U %-30s",
7381 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7382 format_ethernet_address, mp->mac_address, ip);
7387 static void vl_api_bd_ip_mac_details_t_handler_json
7388 (vl_api_bd_ip_mac_details_t * mp)
7390 vat_main_t *vam = &vat_main;
7391 vat_json_node_t *node = NULL;
7393 if (VAT_JSON_ARRAY != vam->json_tree.type)
7395 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7396 vat_json_init_array (&vam->json_tree);
7398 node = vat_json_array_add (&vam->json_tree);
7400 vat_json_init_object (node);
7401 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7402 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
7403 vat_json_object_add_string_copy (node, "mac_address",
7404 format (0, "%U", format_ethernet_address,
7410 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7413 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7414 vat_json_object_add_string_copy (node, "ip_address", ip);
7419 api_bd_ip_mac_dump (vat_main_t * vam)
7421 unformat_input_t *i = vam->input;
7422 vl_api_bd_ip_mac_dump_t *mp;
7423 vl_api_control_ping_t *mp_ping;
7428 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7430 if (unformat (i, "bd_id %d", &bd_id))
7439 "\n%-5s %-7s %-20s %-30s",
7440 "bd_id", "is_ipv6", "mac_address", "ip_address");
7442 /* Dump Bridge Domain Ip to Mac entries */
7443 M (BD_IP_MAC_DUMP, mp);
7446 mp->bd_id = htonl (bd_id);
7452 /* Use a control ping for synchronization */
7453 MPING (CONTROL_PING, mp_ping);
7461 api_tap_create_v2 (vat_main_t * vam)
7463 unformat_input_t *i = vam->input;
7464 vl_api_tap_create_v2_t *mp;
7468 u8 *host_if_name = 0;
7470 u8 host_mac_addr[6];
7471 u8 host_mac_addr_set = 0;
7472 u8 *host_bridge = 0;
7473 ip4_address_t host_ip4_addr;
7474 ip4_address_t host_ip4_gw;
7475 u8 host_ip4_gw_set = 0;
7476 u32 host_ip4_prefix_len = 0;
7477 ip6_address_t host_ip6_addr;
7478 ip6_address_t host_ip6_gw;
7479 u8 host_ip6_gw_set = 0;
7480 u32 host_ip6_prefix_len = 0;
7482 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7484 clib_memset (mac_address, 0, sizeof (mac_address));
7486 /* Parse args required to build the message */
7487 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7489 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7493 else if (unformat (i, "id %u", &id))
7495 else if (unformat (i, "host-if-name %s", &host_if_name))
7497 else if (unformat (i, "host-ns %s", &host_ns))
7499 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
7501 host_mac_addr_set = 1;
7502 else if (unformat (i, "host-bridge %s", &host_bridge))
7504 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
7505 &host_ip4_addr, &host_ip4_prefix_len))
7507 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
7508 &host_ip6_addr, &host_ip6_prefix_len))
7510 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
7512 host_ip4_gw_set = 1;
7513 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
7515 host_ip6_gw_set = 1;
7516 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
7518 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
7524 if (vec_len (host_if_name) > 63)
7526 errmsg ("tap name too long. ");
7529 if (vec_len (host_ns) > 63)
7531 errmsg ("host name space too long. ");
7534 if (vec_len (host_bridge) > 63)
7536 errmsg ("host bridge name too long. ");
7539 if (host_ip4_prefix_len > 32)
7541 errmsg ("host ip4 prefix length not valid. ");
7544 if (host_ip6_prefix_len > 128)
7546 errmsg ("host ip6 prefix length not valid. ");
7549 if (!is_pow2 (rx_ring_sz))
7551 errmsg ("rx ring size must be power of 2. ");
7554 if (rx_ring_sz > 32768)
7556 errmsg ("rx ring size must be 32768 or lower. ");
7559 if (!is_pow2 (tx_ring_sz))
7561 errmsg ("tx ring size must be power of 2. ");
7564 if (tx_ring_sz > 32768)
7566 errmsg ("tx ring size must be 32768 or lower. ");
7570 /* Construct the API message */
7571 M (TAP_CREATE_V2, mp);
7573 mp->use_random_mac = random_mac;
7575 mp->id = ntohl (id);
7576 mp->host_namespace_set = host_ns != 0;
7577 mp->host_bridge_set = host_bridge != 0;
7578 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
7579 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
7580 mp->rx_ring_sz = ntohs (rx_ring_sz);
7581 mp->tx_ring_sz = ntohs (tx_ring_sz);
7583 if (random_mac == 0)
7584 clib_memcpy (mp->mac_address, mac_address, 6);
7585 if (host_mac_addr_set)
7586 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
7588 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
7590 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
7592 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
7593 if (host_ip4_prefix_len)
7594 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
7595 if (host_ip6_prefix_len)
7596 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
7597 if (host_ip4_gw_set)
7598 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
7599 if (host_ip6_gw_set)
7600 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
7603 vec_free (host_if_name);
7604 vec_free (host_bridge);
7609 /* Wait for a reply... */
7615 api_tap_delete_v2 (vat_main_t * vam)
7617 unformat_input_t *i = vam->input;
7618 vl_api_tap_delete_v2_t *mp;
7619 u32 sw_if_index = ~0;
7620 u8 sw_if_index_set = 0;
7623 /* Parse args required to build the message */
7624 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7626 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7627 sw_if_index_set = 1;
7628 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7629 sw_if_index_set = 1;
7634 if (sw_if_index_set == 0)
7636 errmsg ("missing vpp interface name. ");
7640 /* Construct the API message */
7641 M (TAP_DELETE_V2, mp);
7643 mp->sw_if_index = ntohl (sw_if_index);
7648 /* Wait for a reply... */
7654 unformat_pci_addr (unformat_input_t * input, va_list * args)
7663 addr = va_arg (*args, struct pci_addr_t *);
7666 if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
7669 addr->domain = x[0];
7672 addr->function = x[3];
7678 api_virtio_pci_create (vat_main_t * vam)
7680 unformat_input_t *i = vam->input;
7681 vl_api_virtio_pci_create_t *mp;
7685 u64 features = (u64) ~ (0ULL);
7686 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7689 clib_memset (mac_address, 0, sizeof (mac_address));
7691 /* Parse args required to build the message */
7692 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7694 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7698 else if (unformat (i, "pci-addr %U", unformat_pci_addr, &pci_addr))
7700 else if (unformat (i, "features 0x%llx", &features))
7702 else if (unformat (i, "rx-ring-size %u", &rx_ring_sz))
7704 else if (unformat (i, "tx-ring-size %u", &tx_ring_sz))
7712 errmsg ("pci address must be non zero. ");
7715 if (!is_pow2 (rx_ring_sz))
7717 errmsg ("rx ring size must be power of 2. ");
7720 if (rx_ring_sz > 32768)
7722 errmsg ("rx ring size must be 32768 or lower. ");
7725 if (!is_pow2 (tx_ring_sz))
7727 errmsg ("tx ring size must be power of 2. ");
7730 if (tx_ring_sz > 32768)
7732 errmsg ("tx ring size must be 32768 or lower. ");
7736 /* Construct the API message */
7737 M (VIRTIO_PCI_CREATE, mp);
7739 mp->use_random_mac = random_mac;
7741 mp->pci_addr = htonl (pci_addr);
7742 mp->features = clib_host_to_net_u64 (features);
7744 if (random_mac == 0)
7745 clib_memcpy (mp->mac_address, mac_address, 6);
7750 /* Wait for a reply... */
7756 api_virtio_pci_delete (vat_main_t * vam)
7758 unformat_input_t *i = vam->input;
7759 vl_api_virtio_pci_delete_t *mp;
7760 u32 sw_if_index = ~0;
7761 u8 sw_if_index_set = 0;
7764 /* Parse args required to build the message */
7765 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7767 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7768 sw_if_index_set = 1;
7769 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7770 sw_if_index_set = 1;
7775 if (sw_if_index_set == 0)
7777 errmsg ("missing vpp interface name. ");
7781 /* Construct the API message */
7782 M (VIRTIO_PCI_DELETE, mp);
7784 mp->sw_if_index = htonl (sw_if_index);
7789 /* Wait for a reply... */
7795 api_bond_create (vat_main_t * vam)
7797 unformat_input_t *i = vam->input;
7798 vl_api_bond_create_t *mp;
7807 clib_memset (mac_address, 0, sizeof (mac_address));
7810 /* Parse args required to build the message */
7811 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7813 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
7815 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
7816 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
7818 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
7821 else if (unformat (i, "id %u", &id))
7827 if (mode_is_set == 0)
7829 errmsg ("Missing bond mode. ");
7833 /* Construct the API message */
7834 M (BOND_CREATE, mp);
7836 mp->use_custom_mac = custom_mac;
7840 mp->id = htonl (id);
7843 clib_memcpy (mp->mac_address, mac_address, 6);
7848 /* Wait for a reply... */
7854 api_bond_delete (vat_main_t * vam)
7856 unformat_input_t *i = vam->input;
7857 vl_api_bond_delete_t *mp;
7858 u32 sw_if_index = ~0;
7859 u8 sw_if_index_set = 0;
7862 /* Parse args required to build the message */
7863 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7865 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7866 sw_if_index_set = 1;
7867 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7868 sw_if_index_set = 1;
7873 if (sw_if_index_set == 0)
7875 errmsg ("missing vpp interface name. ");
7879 /* Construct the API message */
7880 M (BOND_DELETE, mp);
7882 mp->sw_if_index = ntohl (sw_if_index);
7887 /* Wait for a reply... */
7893 api_bond_enslave (vat_main_t * vam)
7895 unformat_input_t *i = vam->input;
7896 vl_api_bond_enslave_t *mp;
7897 u32 bond_sw_if_index;
7901 u32 bond_sw_if_index_is_set = 0;
7903 u8 sw_if_index_is_set = 0;
7905 /* Parse args required to build the message */
7906 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7908 if (unformat (i, "sw_if_index %d", &sw_if_index))
7909 sw_if_index_is_set = 1;
7910 else if (unformat (i, "bond %u", &bond_sw_if_index))
7911 bond_sw_if_index_is_set = 1;
7912 else if (unformat (i, "passive %d", &is_passive))
7914 else if (unformat (i, "long-timeout %d", &is_long_timeout))
7920 if (bond_sw_if_index_is_set == 0)
7922 errmsg ("Missing bond sw_if_index. ");
7925 if (sw_if_index_is_set == 0)
7927 errmsg ("Missing slave sw_if_index. ");
7931 /* Construct the API message */
7932 M (BOND_ENSLAVE, mp);
7934 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
7935 mp->sw_if_index = ntohl (sw_if_index);
7936 mp->is_long_timeout = is_long_timeout;
7937 mp->is_passive = is_passive;
7942 /* Wait for a reply... */
7948 api_bond_detach_slave (vat_main_t * vam)
7950 unformat_input_t *i = vam->input;
7951 vl_api_bond_detach_slave_t *mp;
7952 u32 sw_if_index = ~0;
7953 u8 sw_if_index_set = 0;
7956 /* Parse args required to build the message */
7957 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7959 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7960 sw_if_index_set = 1;
7961 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7962 sw_if_index_set = 1;
7967 if (sw_if_index_set == 0)
7969 errmsg ("missing vpp interface name. ");
7973 /* Construct the API message */
7974 M (BOND_DETACH_SLAVE, mp);
7976 mp->sw_if_index = ntohl (sw_if_index);
7981 /* Wait for a reply... */
7987 api_ip_table_add_del (vat_main_t * vam)
7989 unformat_input_t *i = vam->input;
7990 vl_api_ip_table_add_del_t *mp;
7996 /* Parse args required to build the message */
7997 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7999 if (unformat (i, "ipv6"))
8001 else if (unformat (i, "del"))
8003 else if (unformat (i, "add"))
8005 else if (unformat (i, "table %d", &table_id))
8009 clib_warning ("parse error '%U'", format_unformat_error, i);
8016 errmsg ("missing table-ID");
8020 /* Construct the API message */
8021 M (IP_TABLE_ADD_DEL, mp);
8023 mp->table_id = ntohl (table_id);
8024 mp->is_ipv6 = is_ipv6;
8025 mp->is_add = is_add;
8030 /* Wait for a reply... */
8037 api_ip_add_del_route (vat_main_t * vam)
8039 unformat_input_t *i = vam->input;
8040 vl_api_ip_add_del_route_t *mp;
8041 u32 sw_if_index = ~0, vrf_id = 0;
8043 u8 is_local = 0, is_drop = 0;
8044 u8 is_unreach = 0, is_prohibit = 0;
8046 u32 next_hop_weight = 1;
8047 u8 is_multipath = 0;
8049 u8 address_length_set = 0;
8050 u32 next_hop_table_id = 0;
8051 u32 resolve_attempts = 0;
8052 u32 dst_address_length = 0;
8053 u8 next_hop_set = 0;
8054 ip4_address_t v4_dst_address, v4_next_hop_address;
8055 ip6_address_t v6_dst_address, v6_next_hop_address;
8059 u32 random_add_del = 0;
8060 u32 *random_vector = 0;
8062 u32 random_seed = 0xdeaddabe;
8063 u32 classify_table_index = ~0;
8065 u8 resolve_host = 0, resolve_attached = 0;
8066 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8067 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8068 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8070 clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8071 clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
8072 /* Parse args required to build the message */
8073 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8075 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8077 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8079 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8084 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8089 else if (unformat (i, "/%d", &dst_address_length))
8091 address_length_set = 1;
8094 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8095 &v4_next_hop_address))
8099 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8100 &v6_next_hop_address))
8106 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8110 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8114 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8116 else if (unformat (i, "weight %d", &next_hop_weight))
8118 else if (unformat (i, "drop"))
8122 else if (unformat (i, "null-send-unreach"))
8126 else if (unformat (i, "null-send-prohibit"))
8130 else if (unformat (i, "local"))
8134 else if (unformat (i, "classify %d", &classify_table_index))
8138 else if (unformat (i, "del"))
8140 else if (unformat (i, "add"))
8142 else if (unformat (i, "resolve-via-host"))
8144 else if (unformat (i, "resolve-via-attached"))
8145 resolve_attached = 1;
8146 else if (unformat (i, "multipath"))
8148 else if (unformat (i, "vrf %d", &vrf_id))
8150 else if (unformat (i, "count %d", &count))
8152 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8154 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8156 else if (unformat (i, "out-label %d", &next_hop_out_label))
8158 vl_api_fib_mpls_label_t fib_label = {
8159 .label = ntohl (next_hop_out_label),
8163 vec_add1 (next_hop_out_label_stack, fib_label);
8165 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8167 else if (unformat (i, "random"))
8169 else if (unformat (i, "seed %d", &random_seed))
8173 clib_warning ("parse error '%U'", format_unformat_error, i);
8178 if (!next_hop_set && !is_drop && !is_local &&
8179 !is_classify && !is_unreach && !is_prohibit &&
8180 MPLS_LABEL_INVALID == next_hop_via_label)
8183 ("next hop / local / drop / unreach / prohibit / classify not set");
8187 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8189 errmsg ("next hop and next-hop via label set");
8192 if (address_set == 0)
8194 errmsg ("missing addresses");
8198 if (address_length_set == 0)
8200 errmsg ("missing address length");
8204 /* Generate a pile of unique, random routes */
8207 u32 this_random_address;
8208 random_hash = hash_create (count, sizeof (uword));
8210 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8211 for (j = 0; j <= count; j++)
8215 this_random_address = random_u32 (&random_seed);
8216 this_random_address =
8217 clib_host_to_net_u32 (this_random_address);
8219 while (hash_get (random_hash, this_random_address));
8220 vec_add1 (random_vector, this_random_address);
8221 hash_set (random_hash, this_random_address, 1);
8223 hash_free (random_hash);
8224 v4_dst_address.as_u32 = random_vector[0];
8229 /* Turn on async mode */
8230 vam->async_mode = 1;
8231 vam->async_errors = 0;
8232 before = vat_time_now (vam);
8235 for (j = 0; j < count; j++)
8237 /* Construct the API message */
8238 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8239 vec_len (next_hop_out_label_stack));
8241 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8242 mp->table_id = ntohl (vrf_id);
8244 mp->is_add = is_add;
8245 mp->is_drop = is_drop;
8246 mp->is_unreach = is_unreach;
8247 mp->is_prohibit = is_prohibit;
8248 mp->is_ipv6 = is_ipv6;
8249 mp->is_local = is_local;
8250 mp->is_classify = is_classify;
8251 mp->is_multipath = is_multipath;
8252 mp->is_resolve_host = resolve_host;
8253 mp->is_resolve_attached = resolve_attached;
8254 mp->next_hop_weight = next_hop_weight;
8255 mp->next_hop_preference = 0;
8256 mp->dst_address_length = dst_address_length;
8257 mp->next_hop_table_id = ntohl (next_hop_table_id);
8258 mp->classify_table_index = ntohl (classify_table_index);
8259 mp->next_hop_via_label = ntohl (next_hop_via_label);
8260 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8261 if (0 != mp->next_hop_n_out_labels)
8263 memcpy (mp->next_hop_out_label_stack,
8264 next_hop_out_label_stack,
8265 (vec_len (next_hop_out_label_stack) *
8266 sizeof (vl_api_fib_mpls_label_t)));
8267 vec_free (next_hop_out_label_stack);
8272 clib_memcpy (mp->dst_address, &v6_dst_address,
8273 sizeof (v6_dst_address));
8275 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8276 sizeof (v6_next_hop_address));
8277 increment_v6_address (&v6_dst_address);
8281 clib_memcpy (mp->dst_address, &v4_dst_address,
8282 sizeof (v4_dst_address));
8284 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8285 sizeof (v4_next_hop_address));
8287 v4_dst_address.as_u32 = random_vector[j + 1];
8289 increment_v4_address (&v4_dst_address);
8293 /* If we receive SIGTERM, stop now... */
8298 /* When testing multiple add/del ops, use a control-ping to sync */
8301 vl_api_control_ping_t *mp_ping;
8305 /* Shut off async mode */
8306 vam->async_mode = 0;
8308 MPING (CONTROL_PING, mp_ping);
8311 timeout = vat_time_now (vam) + 1.0;
8312 while (vat_time_now (vam) < timeout)
8313 if (vam->result_ready == 1)
8318 if (vam->retval == -99)
8321 if (vam->async_errors > 0)
8323 errmsg ("%d asynchronous errors", vam->async_errors);
8326 vam->async_errors = 0;
8327 after = vat_time_now (vam);
8329 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8333 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8334 count, after - before, count / (after - before));
8340 /* Wait for a reply... */
8345 /* Return the good/bad news */
8346 return (vam->retval);
8350 api_ip_mroute_add_del (vat_main_t * vam)
8352 unformat_input_t *i = vam->input;
8353 vl_api_ip_mroute_add_del_t *mp;
8354 u32 sw_if_index = ~0, vrf_id = 0;
8359 u32 grp_address_length = 0;
8360 ip4_address_t v4_grp_address, v4_src_address;
8361 ip6_address_t v6_grp_address, v6_src_address;
8362 mfib_itf_flags_t iflags = 0;
8363 mfib_entry_flags_t eflags = 0;
8366 /* Parse args required to build the message */
8367 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8369 if (unformat (i, "sw_if_index %d", &sw_if_index))
8371 else if (unformat (i, "%U %U",
8372 unformat_ip4_address, &v4_src_address,
8373 unformat_ip4_address, &v4_grp_address))
8375 grp_address_length = 64;
8379 else if (unformat (i, "%U %U",
8380 unformat_ip6_address, &v6_src_address,
8381 unformat_ip6_address, &v6_grp_address))
8383 grp_address_length = 256;
8387 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8389 clib_memset (&v4_src_address, 0, sizeof (v4_src_address));
8390 grp_address_length = 32;
8394 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8396 clib_memset (&v6_src_address, 0, sizeof (v6_src_address));
8397 grp_address_length = 128;
8401 else if (unformat (i, "/%d", &grp_address_length))
8403 else if (unformat (i, "local"))
8407 else if (unformat (i, "del"))
8409 else if (unformat (i, "add"))
8411 else if (unformat (i, "vrf %d", &vrf_id))
8413 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8415 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8419 clib_warning ("parse error '%U'", format_unformat_error, i);
8424 if (address_set == 0)
8426 errmsg ("missing addresses\n");
8430 /* Construct the API message */
8431 M (IP_MROUTE_ADD_DEL, mp);
8433 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8434 mp->table_id = ntohl (vrf_id);
8436 mp->is_add = is_add;
8437 mp->is_ipv6 = is_ipv6;
8438 mp->is_local = is_local;
8439 mp->itf_flags = ntohl (iflags);
8440 mp->entry_flags = ntohl (eflags);
8441 mp->grp_address_length = grp_address_length;
8442 mp->grp_address_length = ntohs (mp->grp_address_length);
8446 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8447 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8451 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8452 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8458 /* Wait for a reply... */
8464 api_mpls_table_add_del (vat_main_t * vam)
8466 unformat_input_t *i = vam->input;
8467 vl_api_mpls_table_add_del_t *mp;
8472 /* Parse args required to build the message */
8473 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8475 if (unformat (i, "table %d", &table_id))
8477 else if (unformat (i, "del"))
8479 else if (unformat (i, "add"))
8483 clib_warning ("parse error '%U'", format_unformat_error, i);
8490 errmsg ("missing table-ID");
8494 /* Construct the API message */
8495 M (MPLS_TABLE_ADD_DEL, mp);
8497 mp->mt_table_id = ntohl (table_id);
8498 mp->mt_is_add = is_add;
8503 /* Wait for a reply... */
8510 api_mpls_route_add_del (vat_main_t * vam)
8512 unformat_input_t *i = vam->input;
8513 vl_api_mpls_route_add_del_t *mp;
8514 u32 sw_if_index = ~0, table_id = 0;
8516 u32 next_hop_weight = 1;
8517 u8 is_multipath = 0;
8518 u32 next_hop_table_id = 0;
8519 u8 next_hop_set = 0;
8520 ip4_address_t v4_next_hop_address = {
8523 ip6_address_t v6_next_hop_address = { {0} };
8527 u32 classify_table_index = ~0;
8529 u8 resolve_host = 0, resolve_attached = 0;
8530 u8 is_interface_rx = 0;
8531 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8532 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8533 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8534 mpls_label_t local_label = MPLS_LABEL_INVALID;
8536 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
8538 /* Parse args required to build the message */
8539 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8541 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8543 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8545 else if (unformat (i, "%d", &local_label))
8547 else if (unformat (i, "eos"))
8549 else if (unformat (i, "non-eos"))
8551 else if (unformat (i, "via %U", unformat_ip4_address,
8552 &v4_next_hop_address))
8555 next_hop_proto = DPO_PROTO_IP4;
8557 else if (unformat (i, "via %U", unformat_ip6_address,
8558 &v6_next_hop_address))
8561 next_hop_proto = DPO_PROTO_IP6;
8563 else if (unformat (i, "weight %d", &next_hop_weight))
8565 else if (unformat (i, "classify %d", &classify_table_index))
8569 else if (unformat (i, "del"))
8571 else if (unformat (i, "add"))
8573 else if (unformat (i, "resolve-via-host"))
8575 else if (unformat (i, "resolve-via-attached"))
8576 resolve_attached = 1;
8577 else if (unformat (i, "multipath"))
8579 else if (unformat (i, "count %d", &count))
8581 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
8584 next_hop_proto = DPO_PROTO_IP4;
8586 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
8589 next_hop_proto = DPO_PROTO_IP6;
8593 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
8597 next_hop_proto = DPO_PROTO_ETHERNET;
8598 is_interface_rx = 1;
8600 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
8603 next_hop_proto = DPO_PROTO_ETHERNET;
8604 is_interface_rx = 1;
8606 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
8608 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8610 else if (unformat (i, "out-label %d", &next_hop_out_label))
8612 vl_api_fib_mpls_label_t fib_label = {
8613 .label = ntohl (next_hop_out_label),
8617 vec_add1 (next_hop_out_label_stack, fib_label);
8621 clib_warning ("parse error '%U'", format_unformat_error, i);
8626 if (!next_hop_set && !is_classify)
8628 errmsg ("next hop / classify not set");
8632 if (MPLS_LABEL_INVALID == local_label)
8634 errmsg ("missing label");
8640 /* Turn on async mode */
8641 vam->async_mode = 1;
8642 vam->async_errors = 0;
8643 before = vat_time_now (vam);
8646 for (j = 0; j < count; j++)
8648 /* Construct the API message */
8649 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
8650 vec_len (next_hop_out_label_stack));
8652 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
8653 mp->mr_table_id = ntohl (table_id);
8655 mp->mr_is_add = is_add;
8656 mp->mr_next_hop_proto = next_hop_proto;
8657 mp->mr_is_classify = is_classify;
8658 mp->mr_is_multipath = is_multipath;
8659 mp->mr_is_resolve_host = resolve_host;
8660 mp->mr_is_resolve_attached = resolve_attached;
8661 mp->mr_is_interface_rx = is_interface_rx;
8662 mp->mr_next_hop_weight = next_hop_weight;
8663 mp->mr_next_hop_preference = 0;
8664 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
8665 mp->mr_classify_table_index = ntohl (classify_table_index);
8666 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
8667 mp->mr_label = ntohl (local_label);
8668 mp->mr_eos = is_eos;
8670 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8671 if (0 != mp->mr_next_hop_n_out_labels)
8673 memcpy (mp->mr_next_hop_out_label_stack,
8674 next_hop_out_label_stack,
8675 vec_len (next_hop_out_label_stack) *
8676 sizeof (vl_api_fib_mpls_label_t));
8677 vec_free (next_hop_out_label_stack);
8682 if (DPO_PROTO_IP4 == next_hop_proto)
8684 clib_memcpy (mp->mr_next_hop,
8685 &v4_next_hop_address,
8686 sizeof (v4_next_hop_address));
8688 else if (DPO_PROTO_IP6 == next_hop_proto)
8691 clib_memcpy (mp->mr_next_hop,
8692 &v6_next_hop_address,
8693 sizeof (v6_next_hop_address));
8700 /* If we receive SIGTERM, stop now... */
8705 /* When testing multiple add/del ops, use a control-ping to sync */
8708 vl_api_control_ping_t *mp_ping;
8712 /* Shut off async mode */
8713 vam->async_mode = 0;
8715 MPING (CONTROL_PING, mp_ping);
8718 timeout = vat_time_now (vam) + 1.0;
8719 while (vat_time_now (vam) < timeout)
8720 if (vam->result_ready == 1)
8725 if (vam->retval == -99)
8728 if (vam->async_errors > 0)
8730 errmsg ("%d asynchronous errors", vam->async_errors);
8733 vam->async_errors = 0;
8734 after = vat_time_now (vam);
8736 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8740 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8741 count, after - before, count / (after - before));
8747 /* Wait for a reply... */
8752 /* Return the good/bad news */
8753 return (vam->retval);
8757 api_mpls_ip_bind_unbind (vat_main_t * vam)
8759 unformat_input_t *i = vam->input;
8760 vl_api_mpls_ip_bind_unbind_t *mp;
8761 u32 ip_table_id = 0;
8764 ip4_address_t v4_address;
8765 ip6_address_t v6_address;
8768 mpls_label_t local_label = MPLS_LABEL_INVALID;
8771 /* Parse args required to build the message */
8772 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8774 if (unformat (i, "%U/%d", unformat_ip4_address,
8775 &v4_address, &address_length))
8780 else if (unformat (i, "%U/%d", unformat_ip6_address,
8781 &v6_address, &address_length))
8786 else if (unformat (i, "%d", &local_label))
8788 else if (unformat (i, "table-id %d", &ip_table_id))
8790 else if (unformat (i, "unbind"))
8792 else if (unformat (i, "bind"))
8796 clib_warning ("parse error '%U'", format_unformat_error, i);
8803 errmsg ("IP address not set");
8807 if (MPLS_LABEL_INVALID == local_label)
8809 errmsg ("missing label");
8813 /* Construct the API message */
8814 M (MPLS_IP_BIND_UNBIND, mp);
8816 mp->mb_is_bind = is_bind;
8817 mp->mb_is_ip4 = is_ip4;
8818 mp->mb_ip_table_id = ntohl (ip_table_id);
8819 mp->mb_mpls_table_id = 0;
8820 mp->mb_label = ntohl (local_label);
8821 mp->mb_address_length = address_length;
8824 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
8826 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
8831 /* Wait for a reply... */
8837 api_sr_mpls_policy_add (vat_main_t * vam)
8839 unformat_input_t *i = vam->input;
8840 vl_api_sr_mpls_policy_add_t *mp;
8846 u32 *segments = NULL;
8849 /* Parse args required to build the message */
8850 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8852 if (unformat (i, "bsid %d", &bsid))
8854 else if (unformat (i, "weight %d", &weight))
8856 else if (unformat (i, "spray"))
8858 else if (unformat (i, "next %d", &sid))
8861 vec_add1 (segments, htonl (sid));
8865 clib_warning ("parse error '%U'", format_unformat_error, i);
8872 errmsg ("bsid not set");
8876 if (n_segments == 0)
8878 errmsg ("no sid in segment stack");
8882 /* Construct the API message */
8883 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
8885 mp->bsid = htonl (bsid);
8886 mp->weight = htonl (weight);
8888 mp->n_segments = n_segments;
8889 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
8890 vec_free (segments);
8895 /* Wait for a reply... */
8901 api_sr_mpls_policy_del (vat_main_t * vam)
8903 unformat_input_t *i = vam->input;
8904 vl_api_sr_mpls_policy_del_t *mp;
8908 /* Parse args required to build the message */
8909 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8911 if (unformat (i, "bsid %d", &bsid))
8915 clib_warning ("parse error '%U'", format_unformat_error, i);
8922 errmsg ("bsid not set");
8926 /* Construct the API message */
8927 M (SR_MPLS_POLICY_DEL, mp);
8929 mp->bsid = htonl (bsid);
8934 /* Wait for a reply... */
8940 api_bier_table_add_del (vat_main_t * vam)
8942 unformat_input_t *i = vam->input;
8943 vl_api_bier_table_add_del_t *mp;
8945 u32 set = 0, sub_domain = 0, hdr_len = 3;
8946 mpls_label_t local_label = MPLS_LABEL_INVALID;
8949 /* Parse args required to build the message */
8950 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8952 if (unformat (i, "sub-domain %d", &sub_domain))
8954 else if (unformat (i, "set %d", &set))
8956 else if (unformat (i, "label %d", &local_label))
8958 else if (unformat (i, "hdr-len %d", &hdr_len))
8960 else if (unformat (i, "add"))
8962 else if (unformat (i, "del"))
8966 clib_warning ("parse error '%U'", format_unformat_error, i);
8971 if (MPLS_LABEL_INVALID == local_label)
8973 errmsg ("missing label\n");
8977 /* Construct the API message */
8978 M (BIER_TABLE_ADD_DEL, mp);
8980 mp->bt_is_add = is_add;
8981 mp->bt_label = ntohl (local_label);
8982 mp->bt_tbl_id.bt_set = set;
8983 mp->bt_tbl_id.bt_sub_domain = sub_domain;
8984 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
8989 /* Wait for a reply... */
8996 api_bier_route_add_del (vat_main_t * vam)
8998 unformat_input_t *i = vam->input;
8999 vl_api_bier_route_add_del_t *mp;
9001 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
9002 ip4_address_t v4_next_hop_address;
9003 ip6_address_t v6_next_hop_address;
9004 u8 next_hop_set = 0;
9005 u8 next_hop_proto_is_ip4 = 1;
9006 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9009 /* Parse args required to build the message */
9010 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9012 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
9014 next_hop_proto_is_ip4 = 1;
9017 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
9019 next_hop_proto_is_ip4 = 0;
9022 if (unformat (i, "sub-domain %d", &sub_domain))
9024 else if (unformat (i, "set %d", &set))
9026 else if (unformat (i, "hdr-len %d", &hdr_len))
9028 else if (unformat (i, "bp %d", &bp))
9030 else if (unformat (i, "add"))
9032 else if (unformat (i, "del"))
9034 else if (unformat (i, "out-label %d", &next_hop_out_label))
9038 clib_warning ("parse error '%U'", format_unformat_error, i);
9043 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9045 errmsg ("next hop / label set\n");
9050 errmsg ("bit=position not set\n");
9054 /* Construct the API message */
9055 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
9057 mp->br_is_add = is_add;
9058 mp->br_tbl_id.bt_set = set;
9059 mp->br_tbl_id.bt_sub_domain = sub_domain;
9060 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9061 mp->br_bp = ntohs (bp);
9063 mp->br_paths[0].n_labels = 1;
9064 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
9065 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9067 if (next_hop_proto_is_ip4)
9069 clib_memcpy (mp->br_paths[0].next_hop,
9070 &v4_next_hop_address, sizeof (v4_next_hop_address));
9074 clib_memcpy (mp->br_paths[0].next_hop,
9075 &v6_next_hop_address, sizeof (v6_next_hop_address));
9081 /* Wait for a reply... */
9088 api_proxy_arp_add_del (vat_main_t * vam)
9090 unformat_input_t *i = vam->input;
9091 vl_api_proxy_arp_add_del_t *mp;
9094 vl_api_ip4_address_t lo, hi;
9098 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9100 if (unformat (i, "vrf %d", &vrf_id))
9102 else if (unformat (i, "%U - %U", unformat_vl_api_ip4_address, &lo,
9103 unformat_vl_api_ip4_address, &hi))
9105 else if (unformat (i, "del"))
9109 clib_warning ("parse error '%U'", format_unformat_error, i);
9116 errmsg ("address range not set");
9120 M (PROXY_ARP_ADD_DEL, mp);
9122 mp->proxy.table_id = ntohl (vrf_id);
9123 mp->is_add = is_add;
9124 clib_memcpy (mp->proxy.low, &lo, sizeof (lo));
9125 clib_memcpy (mp->proxy.hi, &hi, sizeof (hi));
9133 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9135 unformat_input_t *i = vam->input;
9136 vl_api_proxy_arp_intfc_enable_disable_t *mp;
9139 u8 sw_if_index_set = 0;
9142 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9144 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9145 sw_if_index_set = 1;
9146 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9147 sw_if_index_set = 1;
9148 else if (unformat (i, "enable"))
9150 else if (unformat (i, "disable"))
9154 clib_warning ("parse error '%U'", format_unformat_error, i);
9159 if (sw_if_index_set == 0)
9161 errmsg ("missing interface name or sw_if_index");
9165 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
9167 mp->sw_if_index = ntohl (sw_if_index);
9168 mp->enable_disable = enable;
9176 api_mpls_tunnel_add_del (vat_main_t * vam)
9178 unformat_input_t *i = vam->input;
9179 vl_api_mpls_tunnel_add_del_t *mp;
9183 u32 sw_if_index = ~0;
9184 u32 next_hop_sw_if_index = ~0;
9185 u32 next_hop_proto_is_ip4 = 1;
9187 u32 next_hop_table_id = 0;
9188 ip4_address_t v4_next_hop_address = {
9191 ip6_address_t v6_next_hop_address = { {0} };
9192 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
9193 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
9194 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9197 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9199 if (unformat (i, "add"))
9203 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
9205 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9207 else if (unformat (i, "via %U",
9208 unformat_ip4_address, &v4_next_hop_address))
9210 next_hop_proto_is_ip4 = 1;
9212 else if (unformat (i, "via %U",
9213 unformat_ip6_address, &v6_next_hop_address))
9215 next_hop_proto_is_ip4 = 0;
9217 else if (unformat (i, "via-label %d", &next_hop_via_label))
9221 (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index))
9223 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9225 else if (unformat (i, "l2-only"))
9227 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9229 else if (unformat (i, "out-label %d", &next_hop_out_label))
9231 vl_api_fib_mpls_label_t fib_label = {
9232 .label = ntohl (next_hop_out_label),
9236 vec_add1 (next_hop_out_label_stack, fib_label);
9240 clib_warning ("parse error '%U'", format_unformat_error, i);
9245 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9246 vec_len (next_hop_out_label_stack));
9248 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9249 mp->mt_sw_if_index = ntohl (sw_if_index);
9250 mp->mt_is_add = is_add;
9251 mp->mt_l2_only = l2_only;
9252 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9253 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
9254 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
9255 mp->mt_next_hop_weight = 1;
9256 mp->mt_next_hop_preference = 0;
9258 mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
9260 if (0 != mp->mt_next_hop_n_out_labels)
9262 clib_memcpy (mp->mt_next_hop_out_label_stack,
9263 next_hop_out_label_stack,
9264 (vec_len (next_hop_out_label_stack) *
9265 sizeof (vl_api_fib_mpls_label_t)));
9266 vec_free (next_hop_out_label_stack);
9269 if (next_hop_proto_is_ip4)
9271 clib_memcpy (mp->mt_next_hop,
9272 &v4_next_hop_address, sizeof (v4_next_hop_address));
9276 clib_memcpy (mp->mt_next_hop,
9277 &v6_next_hop_address, sizeof (v6_next_hop_address));
9286 api_sw_interface_set_unnumbered (vat_main_t * vam)
9288 unformat_input_t *i = vam->input;
9289 vl_api_sw_interface_set_unnumbered_t *mp;
9291 u32 unnum_sw_index = ~0;
9293 u8 sw_if_index_set = 0;
9296 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9298 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9299 sw_if_index_set = 1;
9300 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9301 sw_if_index_set = 1;
9302 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9304 else if (unformat (i, "del"))
9308 clib_warning ("parse error '%U'", format_unformat_error, i);
9313 if (sw_if_index_set == 0)
9315 errmsg ("missing interface name or sw_if_index");
9319 M (SW_INTERFACE_SET_UNNUMBERED, mp);
9321 mp->sw_if_index = ntohl (sw_if_index);
9322 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9323 mp->is_add = is_add;
9331 api_ip_neighbor_add_del (vat_main_t * vam)
9333 vl_api_mac_address_t mac_address;
9334 unformat_input_t *i = vam->input;
9335 vl_api_ip_neighbor_add_del_t *mp;
9336 vl_api_address_t ip_address;
9338 u8 sw_if_index_set = 0;
9343 ip_neighbor_flags_t flags;
9345 flags = IP_NEIGHBOR_FLAG_NONE;
9346 clib_memset (&ip_address, 0, sizeof (ip_address));
9347 clib_memset (&mac_address, 0, sizeof (mac_address));
9348 /* Parse args required to build the message */
9349 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9351 if (unformat (i, "mac %U", unformat_vl_api_mac_address, &mac_address))
9355 else if (unformat (i, "del"))
9358 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9359 sw_if_index_set = 1;
9360 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9361 sw_if_index_set = 1;
9362 else if (unformat (i, "static"))
9363 flags |= IP_NEIGHBOR_FLAG_STATIC;
9364 else if (unformat (i, "no-fib-entry"))
9365 flags |= IP_NEIGHBOR_FLAG_NO_FIB_ENTRY;
9366 else if (unformat (i, "dst %U", unformat_vl_api_address, &ip_address))
9370 clib_warning ("parse error '%U'", format_unformat_error, i);
9375 if (sw_if_index_set == 0)
9377 errmsg ("missing interface name or sw_if_index");
9382 errmsg ("no address set");
9386 /* Construct the API message */
9387 M (IP_NEIGHBOR_ADD_DEL, mp);
9389 mp->neighbor.sw_if_index = ntohl (sw_if_index);
9390 mp->is_add = is_add;
9391 mp->neighbor.flags = htonl (flags);
9393 clib_memcpy (&mp->neighbor.mac_address, &mac_address,
9394 sizeof (mac_address));
9396 clib_memcpy (&mp->neighbor.ip_address, &ip_address, sizeof (ip_address));
9401 /* Wait for a reply, return good/bad news */
9407 api_create_vlan_subif (vat_main_t * vam)
9409 unformat_input_t *i = vam->input;
9410 vl_api_create_vlan_subif_t *mp;
9412 u8 sw_if_index_set = 0;
9417 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9419 if (unformat (i, "sw_if_index %d", &sw_if_index))
9420 sw_if_index_set = 1;
9422 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9423 sw_if_index_set = 1;
9424 else if (unformat (i, "vlan %d", &vlan_id))
9428 clib_warning ("parse error '%U'", format_unformat_error, i);
9433 if (sw_if_index_set == 0)
9435 errmsg ("missing interface name or sw_if_index");
9439 if (vlan_id_set == 0)
9441 errmsg ("missing vlan_id");
9444 M (CREATE_VLAN_SUBIF, mp);
9446 mp->sw_if_index = ntohl (sw_if_index);
9447 mp->vlan_id = ntohl (vlan_id);
9454 #define foreach_create_subif_bit \
9461 _(outer_vlan_id_any) \
9462 _(inner_vlan_id_any)
9465 api_create_subif (vat_main_t * vam)
9467 unformat_input_t *i = vam->input;
9468 vl_api_create_subif_t *mp;
9470 u8 sw_if_index_set = 0;
9477 u32 exact_match = 0;
9478 u32 default_sub = 0;
9479 u32 outer_vlan_id_any = 0;
9480 u32 inner_vlan_id_any = 0;
9482 u16 outer_vlan_id = 0;
9483 u16 inner_vlan_id = 0;
9486 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9488 if (unformat (i, "sw_if_index %d", &sw_if_index))
9489 sw_if_index_set = 1;
9491 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9492 sw_if_index_set = 1;
9493 else if (unformat (i, "sub_id %d", &sub_id))
9495 else if (unformat (i, "outer_vlan_id %d", &tmp))
9496 outer_vlan_id = tmp;
9497 else if (unformat (i, "inner_vlan_id %d", &tmp))
9498 inner_vlan_id = tmp;
9500 #define _(a) else if (unformat (i, #a)) a = 1 ;
9501 foreach_create_subif_bit
9505 clib_warning ("parse error '%U'", format_unformat_error, i);
9510 if (sw_if_index_set == 0)
9512 errmsg ("missing interface name or sw_if_index");
9516 if (sub_id_set == 0)
9518 errmsg ("missing sub_id");
9521 M (CREATE_SUBIF, mp);
9523 mp->sw_if_index = ntohl (sw_if_index);
9524 mp->sub_id = ntohl (sub_id);
9526 #define _(a) mp->a = a;
9527 foreach_create_subif_bit;
9530 mp->outer_vlan_id = ntohs (outer_vlan_id);
9531 mp->inner_vlan_id = ntohs (inner_vlan_id);
9539 api_reset_fib (vat_main_t * vam)
9541 unformat_input_t *i = vam->input;
9542 vl_api_reset_fib_t *mp;
9548 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9550 if (unformat (i, "vrf %d", &vrf_id))
9552 else if (unformat (i, "ipv6"))
9556 clib_warning ("parse error '%U'", format_unformat_error, i);
9561 if (vrf_id_set == 0)
9563 errmsg ("missing vrf id");
9569 mp->vrf_id = ntohl (vrf_id);
9570 mp->is_ipv6 = is_ipv6;
9578 api_dhcp_proxy_config (vat_main_t * vam)
9580 unformat_input_t *i = vam->input;
9581 vl_api_dhcp_proxy_config_t *mp;
9583 u32 server_vrf_id = 0;
9585 u8 v4_address_set = 0;
9586 u8 v6_address_set = 0;
9587 ip4_address_t v4address;
9588 ip6_address_t v6address;
9589 u8 v4_src_address_set = 0;
9590 u8 v6_src_address_set = 0;
9591 ip4_address_t v4srcaddress;
9592 ip6_address_t v6srcaddress;
9595 /* Parse args required to build the message */
9596 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9598 if (unformat (i, "del"))
9600 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
9602 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
9604 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
9606 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
9608 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
9609 v4_src_address_set = 1;
9610 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
9611 v6_src_address_set = 1;
9616 if (v4_address_set && v6_address_set)
9618 errmsg ("both v4 and v6 server addresses set");
9621 if (!v4_address_set && !v6_address_set)
9623 errmsg ("no server addresses set");
9627 if (v4_src_address_set && v6_src_address_set)
9629 errmsg ("both v4 and v6 src addresses set");
9632 if (!v4_src_address_set && !v6_src_address_set)
9634 errmsg ("no src addresses set");
9638 if (!(v4_src_address_set && v4_address_set) &&
9639 !(v6_src_address_set && v6_address_set))
9641 errmsg ("no matching server and src addresses set");
9645 /* Construct the API message */
9646 M (DHCP_PROXY_CONFIG, mp);
9648 mp->is_add = is_add;
9649 mp->rx_vrf_id = ntohl (rx_vrf_id);
9650 mp->server_vrf_id = ntohl (server_vrf_id);
9654 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
9655 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
9659 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
9660 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
9666 /* Wait for a reply, return good/bad news */
9671 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
9672 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
9675 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
9677 vat_main_t *vam = &vat_main;
9678 u32 i, count = mp->count;
9679 vl_api_dhcp_server_t *s;
9683 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9684 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9685 ntohl (mp->rx_vrf_id),
9686 format_ip6_address, mp->dhcp_src_address,
9687 mp->vss_type, mp->vss_vpn_ascii_id,
9688 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9691 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9692 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9693 ntohl (mp->rx_vrf_id),
9694 format_ip4_address, mp->dhcp_src_address,
9695 mp->vss_type, mp->vss_vpn_ascii_id,
9696 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9698 for (i = 0; i < count; i++)
9700 s = &mp->servers[i];
9704 " Server Table-ID %d, Server Address %U",
9705 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
9708 " Server Table-ID %d, Server Address %U",
9709 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
9713 static void vl_api_dhcp_proxy_details_t_handler_json
9714 (vl_api_dhcp_proxy_details_t * mp)
9716 vat_main_t *vam = &vat_main;
9717 vat_json_node_t *node = NULL;
9718 u32 i, count = mp->count;
9720 struct in6_addr ip6;
9721 vl_api_dhcp_server_t *s;
9723 if (VAT_JSON_ARRAY != vam->json_tree.type)
9725 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9726 vat_json_init_array (&vam->json_tree);
9728 node = vat_json_array_add (&vam->json_tree);
9730 vat_json_init_object (node);
9731 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
9732 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
9733 sizeof (mp->vss_type));
9734 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
9735 mp->vss_vpn_ascii_id);
9736 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
9737 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
9741 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
9742 vat_json_object_add_ip6 (node, "src_address", ip6);
9746 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
9747 vat_json_object_add_ip4 (node, "src_address", ip4);
9750 for (i = 0; i < count; i++)
9752 s = &mp->servers[i];
9754 vat_json_object_add_uint (node, "server-table-id",
9755 ntohl (s->server_vrf_id));
9759 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
9760 vat_json_object_add_ip4 (node, "src_address", ip4);
9764 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
9765 vat_json_object_add_ip6 (node, "server_address", ip6);
9771 api_dhcp_proxy_dump (vat_main_t * vam)
9773 unformat_input_t *i = vam->input;
9774 vl_api_control_ping_t *mp_ping;
9775 vl_api_dhcp_proxy_dump_t *mp;
9779 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9781 if (unformat (i, "ipv6"))
9785 clib_warning ("parse error '%U'", format_unformat_error, i);
9790 M (DHCP_PROXY_DUMP, mp);
9792 mp->is_ip6 = is_ipv6;
9795 /* Use a control ping for synchronization */
9796 MPING (CONTROL_PING, mp_ping);
9804 api_dhcp_proxy_set_vss (vat_main_t * vam)
9806 unformat_input_t *i = vam->input;
9807 vl_api_dhcp_proxy_set_vss_t *mp;
9811 u8 vss_type = VSS_TYPE_DEFAULT;
9812 u8 *vpn_ascii_id = 0;
9817 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9819 if (unformat (i, "tbl_id %d", &tbl_id))
9821 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
9822 vss_type = VSS_TYPE_ASCII;
9823 else if (unformat (i, "fib_id %d", &fib_id))
9824 vss_type = VSS_TYPE_VPN_ID;
9825 else if (unformat (i, "oui %d", &oui))
9826 vss_type = VSS_TYPE_VPN_ID;
9827 else if (unformat (i, "ipv6"))
9829 else if (unformat (i, "del"))
9837 errmsg ("missing tbl_id ");
9838 vec_free (vpn_ascii_id);
9842 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
9844 errmsg ("vpn_ascii_id cannot be longer than 128 ");
9845 vec_free (vpn_ascii_id);
9849 M (DHCP_PROXY_SET_VSS, mp);
9850 mp->tbl_id = ntohl (tbl_id);
9851 mp->vss_type = vss_type;
9854 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
9855 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
9857 mp->vpn_index = ntohl (fib_id);
9858 mp->oui = ntohl (oui);
9859 mp->is_ipv6 = is_ipv6;
9860 mp->is_add = is_add;
9865 vec_free (vpn_ascii_id);
9870 api_dhcp_client_config (vat_main_t * vam)
9872 unformat_input_t *i = vam->input;
9873 vl_api_dhcp_client_config_t *mp;
9875 u8 sw_if_index_set = 0;
9878 u8 disable_event = 0;
9881 /* Parse args required to build the message */
9882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9884 if (unformat (i, "del"))
9887 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9888 sw_if_index_set = 1;
9889 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9890 sw_if_index_set = 1;
9891 else if (unformat (i, "hostname %s", &hostname))
9893 else if (unformat (i, "disable_event"))
9899 if (sw_if_index_set == 0)
9901 errmsg ("missing interface name or sw_if_index");
9905 if (vec_len (hostname) > 63)
9907 errmsg ("hostname too long");
9909 vec_add1 (hostname, 0);
9911 /* Construct the API message */
9912 M (DHCP_CLIENT_CONFIG, mp);
9914 mp->is_add = is_add;
9915 mp->client.sw_if_index = htonl (sw_if_index);
9916 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
9917 vec_free (hostname);
9918 mp->client.want_dhcp_event = disable_event ? 0 : 1;
9919 mp->client.pid = htonl (getpid ());
9924 /* Wait for a reply, return good/bad news */
9930 api_set_ip_flow_hash (vat_main_t * vam)
9932 unformat_input_t *i = vam->input;
9933 vl_api_set_ip_flow_hash_t *mp;
9945 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9947 if (unformat (i, "vrf %d", &vrf_id))
9949 else if (unformat (i, "ipv6"))
9951 else if (unformat (i, "src"))
9953 else if (unformat (i, "dst"))
9955 else if (unformat (i, "sport"))
9957 else if (unformat (i, "dport"))
9959 else if (unformat (i, "proto"))
9961 else if (unformat (i, "reverse"))
9966 clib_warning ("parse error '%U'", format_unformat_error, i);
9971 if (vrf_id_set == 0)
9973 errmsg ("missing vrf id");
9977 M (SET_IP_FLOW_HASH, mp);
9983 mp->reverse = reverse;
9984 mp->vrf_id = ntohl (vrf_id);
9985 mp->is_ipv6 = is_ipv6;
9993 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
9995 unformat_input_t *i = vam->input;
9996 vl_api_sw_interface_ip6_enable_disable_t *mp;
9998 u8 sw_if_index_set = 0;
10002 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10004 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10005 sw_if_index_set = 1;
10006 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10007 sw_if_index_set = 1;
10008 else if (unformat (i, "enable"))
10010 else if (unformat (i, "disable"))
10014 clib_warning ("parse error '%U'", format_unformat_error, i);
10019 if (sw_if_index_set == 0)
10021 errmsg ("missing interface name or sw_if_index");
10025 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
10027 mp->sw_if_index = ntohl (sw_if_index);
10028 mp->enable = enable;
10036 api_ip6nd_proxy_add_del (vat_main_t * vam)
10038 unformat_input_t *i = vam->input;
10039 vl_api_ip6nd_proxy_add_del_t *mp;
10040 u32 sw_if_index = ~0;
10041 u8 v6_address_set = 0;
10042 vl_api_ip6_address_t v6address;
10046 /* Parse args required to build the message */
10047 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10049 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10051 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10053 else if (unformat (i, "%U", unformat_vl_api_ip6_address, &v6address))
10054 v6_address_set = 1;
10055 if (unformat (i, "del"))
10059 clib_warning ("parse error '%U'", format_unformat_error, i);
10064 if (sw_if_index == ~0)
10066 errmsg ("missing interface name or sw_if_index");
10069 if (!v6_address_set)
10071 errmsg ("no address set");
10075 /* Construct the API message */
10076 M (IP6ND_PROXY_ADD_DEL, mp);
10078 mp->is_del = is_del;
10079 mp->sw_if_index = ntohl (sw_if_index);
10080 clib_memcpy (mp->ip, v6address, sizeof (v6address));
10085 /* Wait for a reply, return good/bad news */
10091 api_ip6nd_proxy_dump (vat_main_t * vam)
10093 vl_api_ip6nd_proxy_dump_t *mp;
10094 vl_api_control_ping_t *mp_ping;
10097 M (IP6ND_PROXY_DUMP, mp);
10101 /* Use a control ping for synchronization */
10102 MPING (CONTROL_PING, mp_ping);
10109 static void vl_api_ip6nd_proxy_details_t_handler
10110 (vl_api_ip6nd_proxy_details_t * mp)
10112 vat_main_t *vam = &vat_main;
10114 print (vam->ofp, "host %U sw_if_index %d",
10115 format_vl_api_ip6_address, mp->ip, ntohl (mp->sw_if_index));
10118 static void vl_api_ip6nd_proxy_details_t_handler_json
10119 (vl_api_ip6nd_proxy_details_t * mp)
10121 vat_main_t *vam = &vat_main;
10122 struct in6_addr ip6;
10123 vat_json_node_t *node = NULL;
10125 if (VAT_JSON_ARRAY != vam->json_tree.type)
10127 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10128 vat_json_init_array (&vam->json_tree);
10130 node = vat_json_array_add (&vam->json_tree);
10132 vat_json_init_object (node);
10133 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10135 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
10136 vat_json_object_add_ip6 (node, "host", ip6);
10140 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10142 unformat_input_t *i = vam->input;
10143 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
10145 u8 sw_if_index_set = 0;
10146 u32 address_length = 0;
10147 u8 v6_address_set = 0;
10148 vl_api_prefix_t pfx;
10149 u8 use_default = 0;
10150 u8 no_advertise = 0;
10152 u8 no_autoconfig = 0;
10155 u32 val_lifetime = 0;
10156 u32 pref_lifetime = 0;
10159 /* Parse args required to build the message */
10160 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10162 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10163 sw_if_index_set = 1;
10164 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10165 sw_if_index_set = 1;
10166 else if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
10167 v6_address_set = 1;
10168 else if (unformat (i, "val_life %d", &val_lifetime))
10170 else if (unformat (i, "pref_life %d", &pref_lifetime))
10172 else if (unformat (i, "def"))
10174 else if (unformat (i, "noadv"))
10176 else if (unformat (i, "offl"))
10178 else if (unformat (i, "noauto"))
10180 else if (unformat (i, "nolink"))
10182 else if (unformat (i, "isno"))
10186 clib_warning ("parse error '%U'", format_unformat_error, i);
10191 if (sw_if_index_set == 0)
10193 errmsg ("missing interface name or sw_if_index");
10196 if (!v6_address_set)
10198 errmsg ("no address set");
10202 /* Construct the API message */
10203 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
10205 mp->sw_if_index = ntohl (sw_if_index);
10206 clib_memcpy (&mp->prefix, &pfx, sizeof (pfx));
10207 mp->use_default = use_default;
10208 mp->no_advertise = no_advertise;
10209 mp->off_link = off_link;
10210 mp->no_autoconfig = no_autoconfig;
10211 mp->no_onlink = no_onlink;
10213 mp->val_lifetime = ntohl (val_lifetime);
10214 mp->pref_lifetime = ntohl (pref_lifetime);
10219 /* Wait for a reply, return good/bad news */
10225 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10227 unformat_input_t *i = vam->input;
10228 vl_api_sw_interface_ip6nd_ra_config_t *mp;
10230 u8 sw_if_index_set = 0;
10235 u8 send_unicast = 0;
10238 u8 default_router = 0;
10239 u32 max_interval = 0;
10240 u32 min_interval = 0;
10242 u32 initial_count = 0;
10243 u32 initial_interval = 0;
10247 /* Parse args required to build the message */
10248 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10250 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10251 sw_if_index_set = 1;
10252 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10253 sw_if_index_set = 1;
10254 else if (unformat (i, "maxint %d", &max_interval))
10256 else if (unformat (i, "minint %d", &min_interval))
10258 else if (unformat (i, "life %d", &lifetime))
10260 else if (unformat (i, "count %d", &initial_count))
10262 else if (unformat (i, "interval %d", &initial_interval))
10264 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10266 else if (unformat (i, "managed"))
10268 else if (unformat (i, "other"))
10270 else if (unformat (i, "ll"))
10272 else if (unformat (i, "send"))
10274 else if (unformat (i, "cease"))
10276 else if (unformat (i, "isno"))
10278 else if (unformat (i, "def"))
10279 default_router = 1;
10282 clib_warning ("parse error '%U'", format_unformat_error, i);
10287 if (sw_if_index_set == 0)
10289 errmsg ("missing interface name or sw_if_index");
10293 /* Construct the API message */
10294 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
10296 mp->sw_if_index = ntohl (sw_if_index);
10297 mp->max_interval = ntohl (max_interval);
10298 mp->min_interval = ntohl (min_interval);
10299 mp->lifetime = ntohl (lifetime);
10300 mp->initial_count = ntohl (initial_count);
10301 mp->initial_interval = ntohl (initial_interval);
10302 mp->suppress = suppress;
10303 mp->managed = managed;
10305 mp->ll_option = ll_option;
10306 mp->send_unicast = send_unicast;
10309 mp->default_router = default_router;
10314 /* Wait for a reply, return good/bad news */
10320 api_set_arp_neighbor_limit (vat_main_t * vam)
10322 unformat_input_t *i = vam->input;
10323 vl_api_set_arp_neighbor_limit_t *mp;
10329 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10331 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10333 else if (unformat (i, "ipv6"))
10337 clib_warning ("parse error '%U'", format_unformat_error, i);
10342 if (limit_set == 0)
10344 errmsg ("missing limit value");
10348 M (SET_ARP_NEIGHBOR_LIMIT, mp);
10350 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10351 mp->is_ipv6 = is_ipv6;
10359 api_l2_patch_add_del (vat_main_t * vam)
10361 unformat_input_t *i = vam->input;
10362 vl_api_l2_patch_add_del_t *mp;
10363 u32 rx_sw_if_index;
10364 u8 rx_sw_if_index_set = 0;
10365 u32 tx_sw_if_index;
10366 u8 tx_sw_if_index_set = 0;
10370 /* Parse args required to build the message */
10371 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10373 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10374 rx_sw_if_index_set = 1;
10375 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10376 tx_sw_if_index_set = 1;
10377 else if (unformat (i, "rx"))
10379 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10381 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10383 rx_sw_if_index_set = 1;
10388 else if (unformat (i, "tx"))
10390 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10392 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10394 tx_sw_if_index_set = 1;
10399 else if (unformat (i, "del"))
10405 if (rx_sw_if_index_set == 0)
10407 errmsg ("missing rx interface name or rx_sw_if_index");
10411 if (tx_sw_if_index_set == 0)
10413 errmsg ("missing tx interface name or tx_sw_if_index");
10417 M (L2_PATCH_ADD_DEL, mp);
10419 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10420 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10421 mp->is_add = is_add;
10429 u8 localsid_addr[16];
10438 api_sr_localsid_add_del (vat_main_t * vam)
10440 unformat_input_t *i = vam->input;
10441 vl_api_sr_localsid_add_del_t *mp;
10444 ip6_address_t localsid;
10448 u32 fib_table = ~(u32) 0;
10449 ip6_address_t nh_addr6;
10450 ip4_address_t nh_addr4;
10451 clib_memset (&nh_addr6, 0, sizeof (ip6_address_t));
10452 clib_memset (&nh_addr4, 0, sizeof (ip4_address_t));
10454 bool nexthop_set = 0;
10458 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10460 if (unformat (i, "del"))
10462 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
10463 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10465 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
10467 else if (unformat (i, "behavior %u", &behavior));
10468 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10469 else if (unformat (i, "fib-table %u", &fib_table));
10470 else if (unformat (i, "end.psp %u", &behavior));
10475 M (SR_LOCALSID_ADD_DEL, mp);
10477 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
10480 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
10481 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
10483 mp->behavior = behavior;
10484 mp->sw_if_index = ntohl (sw_if_index);
10485 mp->fib_table = ntohl (fib_table);
10486 mp->end_psp = end_psp;
10487 mp->is_del = is_del;
10495 api_ioam_enable (vat_main_t * vam)
10497 unformat_input_t *input = vam->input;
10498 vl_api_ioam_enable_t *mp;
10500 int has_trace_option = 0;
10501 int has_pot_option = 0;
10502 int has_seqno_option = 0;
10503 int has_analyse_option = 0;
10506 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10508 if (unformat (input, "trace"))
10509 has_trace_option = 1;
10510 else if (unformat (input, "pot"))
10511 has_pot_option = 1;
10512 else if (unformat (input, "seqno"))
10513 has_seqno_option = 1;
10514 else if (unformat (input, "analyse"))
10515 has_analyse_option = 1;
10519 M (IOAM_ENABLE, mp);
10520 mp->id = htons (id);
10521 mp->seqno = has_seqno_option;
10522 mp->analyse = has_analyse_option;
10523 mp->pot_enable = has_pot_option;
10524 mp->trace_enable = has_trace_option;
10533 api_ioam_disable (vat_main_t * vam)
10535 vl_api_ioam_disable_t *mp;
10538 M (IOAM_DISABLE, mp);
10544 #define foreach_tcp_proto_field \
10548 #define foreach_udp_proto_field \
10552 #define foreach_ip4_proto_field \
10564 u16 src_port, dst_port;
10567 #if VPP_API_TEST_BUILTIN == 0
10569 unformat_tcp_mask (unformat_input_t * input, va_list * args)
10571 u8 **maskp = va_arg (*args, u8 **);
10573 u8 found_something = 0;
10576 #define _(a) u8 a=0;
10577 foreach_tcp_proto_field;
10580 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10583 #define _(a) else if (unformat (input, #a)) a=1;
10584 foreach_tcp_proto_field
10590 #define _(a) found_something += a;
10591 foreach_tcp_proto_field;
10594 if (found_something == 0)
10597 vec_validate (mask, sizeof (*tcp) - 1);
10599 tcp = (tcp_header_t *) mask;
10601 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
10602 foreach_tcp_proto_field;
10610 unformat_udp_mask (unformat_input_t * input, va_list * args)
10612 u8 **maskp = va_arg (*args, u8 **);
10614 u8 found_something = 0;
10617 #define _(a) u8 a=0;
10618 foreach_udp_proto_field;
10621 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10624 #define _(a) else if (unformat (input, #a)) a=1;
10625 foreach_udp_proto_field
10631 #define _(a) found_something += a;
10632 foreach_udp_proto_field;
10635 if (found_something == 0)
10638 vec_validate (mask, sizeof (*udp) - 1);
10640 udp = (udp_header_t *) mask;
10642 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
10643 foreach_udp_proto_field;
10651 unformat_l4_mask (unformat_input_t * input, va_list * args)
10653 u8 **maskp = va_arg (*args, u8 **);
10654 u16 src_port = 0, dst_port = 0;
10655 tcpudp_header_t *tcpudp;
10657 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10659 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
10661 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
10663 else if (unformat (input, "src_port"))
10665 else if (unformat (input, "dst_port"))
10671 if (!src_port && !dst_port)
10675 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
10677 tcpudp = (tcpudp_header_t *) mask;
10678 tcpudp->src_port = src_port;
10679 tcpudp->dst_port = dst_port;
10687 unformat_ip4_mask (unformat_input_t * input, va_list * args)
10689 u8 **maskp = va_arg (*args, u8 **);
10691 u8 found_something = 0;
10694 #define _(a) u8 a=0;
10695 foreach_ip4_proto_field;
10701 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10703 if (unformat (input, "version"))
10705 else if (unformat (input, "hdr_length"))
10707 else if (unformat (input, "src"))
10709 else if (unformat (input, "dst"))
10711 else if (unformat (input, "proto"))
10714 #define _(a) else if (unformat (input, #a)) a=1;
10715 foreach_ip4_proto_field
10721 #define _(a) found_something += a;
10722 foreach_ip4_proto_field;
10725 if (found_something == 0)
10728 vec_validate (mask, sizeof (*ip) - 1);
10730 ip = (ip4_header_t *) mask;
10732 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10733 foreach_ip4_proto_field;
10736 ip->ip_version_and_header_length = 0;
10739 ip->ip_version_and_header_length |= 0xF0;
10742 ip->ip_version_and_header_length |= 0x0F;
10748 #define foreach_ip6_proto_field \
10751 _(payload_length) \
10756 unformat_ip6_mask (unformat_input_t * input, va_list * args)
10758 u8 **maskp = va_arg (*args, u8 **);
10760 u8 found_something = 0;
10762 u32 ip_version_traffic_class_and_flow_label;
10764 #define _(a) u8 a=0;
10765 foreach_ip6_proto_field;
10768 u8 traffic_class = 0;
10771 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10773 if (unformat (input, "version"))
10775 else if (unformat (input, "traffic-class"))
10777 else if (unformat (input, "flow-label"))
10779 else if (unformat (input, "src"))
10781 else if (unformat (input, "dst"))
10783 else if (unformat (input, "proto"))
10786 #define _(a) else if (unformat (input, #a)) a=1;
10787 foreach_ip6_proto_field
10793 #define _(a) found_something += a;
10794 foreach_ip6_proto_field;
10797 if (found_something == 0)
10800 vec_validate (mask, sizeof (*ip) - 1);
10802 ip = (ip6_header_t *) mask;
10804 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10805 foreach_ip6_proto_field;
10808 ip_version_traffic_class_and_flow_label = 0;
10811 ip_version_traffic_class_and_flow_label |= 0xF0000000;
10814 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
10817 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
10819 ip->ip_version_traffic_class_and_flow_label =
10820 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
10827 unformat_l3_mask (unformat_input_t * input, va_list * args)
10829 u8 **maskp = va_arg (*args, u8 **);
10831 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10833 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
10835 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
10844 unformat_l2_mask (unformat_input_t * input, va_list * args)
10846 u8 **maskp = va_arg (*args, u8 **);
10853 u8 ignore_tag1 = 0;
10854 u8 ignore_tag2 = 0;
10861 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10863 if (unformat (input, "src"))
10865 else if (unformat (input, "dst"))
10867 else if (unformat (input, "proto"))
10869 else if (unformat (input, "tag1"))
10871 else if (unformat (input, "tag2"))
10873 else if (unformat (input, "ignore-tag1"))
10875 else if (unformat (input, "ignore-tag2"))
10877 else if (unformat (input, "cos1"))
10879 else if (unformat (input, "cos2"))
10881 else if (unformat (input, "dot1q"))
10883 else if (unformat (input, "dot1ad"))
10888 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
10889 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
10892 if (tag1 || ignore_tag1 || cos1 || dot1q)
10894 if (tag2 || ignore_tag2 || cos2 || dot1ad)
10897 vec_validate (mask, len - 1);
10900 clib_memset (mask, 0xff, 6);
10903 clib_memset (mask + 6, 0xff, 6);
10905 if (tag2 || dot1ad)
10907 /* inner vlan tag */
10916 mask[21] = mask[20] = 0xff;
10937 mask[16] = mask[17] = 0xff;
10947 mask[12] = mask[13] = 0xff;
10954 unformat_classify_mask (unformat_input_t * input, va_list * args)
10956 u8 **maskp = va_arg (*args, u8 **);
10957 u32 *skipp = va_arg (*args, u32 *);
10958 u32 *matchp = va_arg (*args, u32 *);
10966 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10968 if (unformat (input, "hex %U", unformat_hex_string, &mask))
10970 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
10972 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
10974 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
10988 if (mask || l2 || l3 || l4)
10990 if (l2 || l3 || l4)
10992 /* "With a free Ethernet header in every package" */
10994 vec_validate (l2, 13);
10998 vec_append (mask, l3);
11003 vec_append (mask, l4);
11008 /* Scan forward looking for the first significant mask octet */
11009 for (i = 0; i < vec_len (mask); i++)
11013 /* compute (skip, match) params */
11014 *skipp = i / sizeof (u32x4);
11015 vec_delete (mask, *skipp * sizeof (u32x4), 0);
11017 /* Pad mask to an even multiple of the vector size */
11018 while (vec_len (mask) % sizeof (u32x4))
11019 vec_add1 (mask, 0);
11021 match = vec_len (mask) / sizeof (u32x4);
11023 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
11025 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11026 if (*tmp || *(tmp + 1))
11031 clib_warning ("BUG: match 0");
11033 _vec_len (mask) = match * sizeof (u32x4);
11043 #endif /* VPP_API_TEST_BUILTIN */
11045 #define foreach_l2_next \
11047 _(ethernet, ETHERNET_INPUT) \
11048 _(ip4, IP4_INPUT) \
11052 unformat_l2_next_index (unformat_input_t * input, va_list * args)
11054 u32 *miss_next_indexp = va_arg (*args, u32 *);
11055 u32 next_index = 0;
11059 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11063 if (unformat (input, "%d", &tmp))
11072 *miss_next_indexp = next_index;
11076 #define foreach_ip_next \
11079 _(rewrite, REWRITE)
11082 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
11084 u32 *miss_next_indexp = va_arg (*args, u32 *);
11085 u32 next_index = 0;
11089 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11093 if (unformat (input, "%d", &tmp))
11102 *miss_next_indexp = next_index;
11106 #define foreach_acl_next \
11110 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
11112 u32 *miss_next_indexp = va_arg (*args, u32 *);
11113 u32 next_index = 0;
11117 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11121 if (unformat (input, "permit"))
11126 else if (unformat (input, "%d", &tmp))
11135 *miss_next_indexp = next_index;
11140 unformat_policer_precolor (unformat_input_t * input, va_list * args)
11142 u32 *r = va_arg (*args, u32 *);
11144 if (unformat (input, "conform-color"))
11145 *r = POLICE_CONFORM;
11146 else if (unformat (input, "exceed-color"))
11147 *r = POLICE_EXCEED;
11155 api_classify_add_del_table (vat_main_t * vam)
11157 unformat_input_t *i = vam->input;
11158 vl_api_classify_add_del_table_t *mp;
11165 u32 table_index = ~0;
11166 u32 next_table_index = ~0;
11167 u32 miss_next_index = ~0;
11168 u32 memory_size = 32 << 20;
11170 u32 current_data_flag = 0;
11171 int current_data_offset = 0;
11174 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11176 if (unformat (i, "del"))
11178 else if (unformat (i, "del-chain"))
11183 else if (unformat (i, "buckets %d", &nbuckets))
11185 else if (unformat (i, "memory_size %d", &memory_size))
11187 else if (unformat (i, "skip %d", &skip))
11189 else if (unformat (i, "match %d", &match))
11191 else if (unformat (i, "table %d", &table_index))
11193 else if (unformat (i, "mask %U", unformat_classify_mask,
11194 &mask, &skip, &match))
11196 else if (unformat (i, "next-table %d", &next_table_index))
11198 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
11201 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11204 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
11207 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
11209 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
11215 if (is_add && mask == 0)
11217 errmsg ("Mask required");
11221 if (is_add && skip == ~0)
11223 errmsg ("skip count required");
11227 if (is_add && match == ~0)
11229 errmsg ("match count required");
11233 if (!is_add && table_index == ~0)
11235 errmsg ("table index required for delete");
11239 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
11241 mp->is_add = is_add;
11242 mp->del_chain = del_chain;
11243 mp->table_index = ntohl (table_index);
11244 mp->nbuckets = ntohl (nbuckets);
11245 mp->memory_size = ntohl (memory_size);
11246 mp->skip_n_vectors = ntohl (skip);
11247 mp->match_n_vectors = ntohl (match);
11248 mp->next_table_index = ntohl (next_table_index);
11249 mp->miss_next_index = ntohl (miss_next_index);
11250 mp->current_data_flag = ntohl (current_data_flag);
11251 mp->current_data_offset = ntohl (current_data_offset);
11252 mp->mask_len = ntohl (vec_len (mask));
11253 clib_memcpy (mp->mask, mask, vec_len (mask));
11262 #if VPP_API_TEST_BUILTIN == 0
11264 unformat_l4_match (unformat_input_t * input, va_list * args)
11266 u8 **matchp = va_arg (*args, u8 **);
11268 u8 *proto_header = 0;
11274 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11276 if (unformat (input, "src_port %d", &src_port))
11278 else if (unformat (input, "dst_port %d", &dst_port))
11284 h.src_port = clib_host_to_net_u16 (src_port);
11285 h.dst_port = clib_host_to_net_u16 (dst_port);
11286 vec_validate (proto_header, sizeof (h) - 1);
11287 memcpy (proto_header, &h, sizeof (h));
11289 *matchp = proto_header;
11295 unformat_ip4_match (unformat_input_t * input, va_list * args)
11297 u8 **matchp = va_arg (*args, u8 **);
11302 int hdr_length = 0;
11303 u32 hdr_length_val;
11304 int src = 0, dst = 0;
11305 ip4_address_t src_val, dst_val;
11312 int fragment_id = 0;
11313 u32 fragment_id_val;
11319 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11321 if (unformat (input, "version %d", &version_val))
11323 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11325 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11327 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11329 else if (unformat (input, "proto %d", &proto_val))
11331 else if (unformat (input, "tos %d", &tos_val))
11333 else if (unformat (input, "length %d", &length_val))
11335 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11337 else if (unformat (input, "ttl %d", &ttl_val))
11339 else if (unformat (input, "checksum %d", &checksum_val))
11345 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11346 + ttl + checksum == 0)
11350 * Aligned because we use the real comparison functions
11352 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11354 ip = (ip4_header_t *) match;
11356 /* These are realistically matched in practice */
11358 ip->src_address.as_u32 = src_val.as_u32;
11361 ip->dst_address.as_u32 = dst_val.as_u32;
11364 ip->protocol = proto_val;
11367 /* These are not, but they're included for completeness */
11369 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11372 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11378 ip->length = clib_host_to_net_u16 (length_val);
11384 ip->checksum = clib_host_to_net_u16 (checksum_val);
11391 unformat_ip6_match (unformat_input_t * input, va_list * args)
11393 u8 **matchp = va_arg (*args, u8 **);
11398 u8 traffic_class = 0;
11399 u32 traffic_class_val = 0;
11402 int src = 0, dst = 0;
11403 ip6_address_t src_val, dst_val;
11406 int payload_length = 0;
11407 u32 payload_length_val;
11410 u32 ip_version_traffic_class_and_flow_label;
11412 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11414 if (unformat (input, "version %d", &version_val))
11416 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11418 else if (unformat (input, "flow_label %d", &flow_label_val))
11420 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11422 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11424 else if (unformat (input, "proto %d", &proto_val))
11426 else if (unformat (input, "payload_length %d", &payload_length_val))
11427 payload_length = 1;
11428 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11434 if (version + traffic_class + flow_label + src + dst + proto +
11435 payload_length + hop_limit == 0)
11439 * Aligned because we use the real comparison functions
11441 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11443 ip = (ip6_header_t *) match;
11446 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11449 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11452 ip->protocol = proto_val;
11454 ip_version_traffic_class_and_flow_label = 0;
11457 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11460 ip_version_traffic_class_and_flow_label |=
11461 (traffic_class_val & 0xFF) << 20;
11464 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11466 ip->ip_version_traffic_class_and_flow_label =
11467 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11469 if (payload_length)
11470 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11473 ip->hop_limit = hop_limit_val;
11480 unformat_l3_match (unformat_input_t * input, va_list * args)
11482 u8 **matchp = va_arg (*args, u8 **);
11484 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11486 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
11488 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
11497 unformat_vlan_tag (unformat_input_t * input, va_list * args)
11499 u8 *tagp = va_arg (*args, u8 *);
11502 if (unformat (input, "%d", &tag))
11504 tagp[0] = (tag >> 8) & 0x0F;
11505 tagp[1] = tag & 0xFF;
11513 unformat_l2_match (unformat_input_t * input, va_list * args)
11515 u8 **matchp = va_arg (*args, u8 **);
11528 u8 ignore_tag1 = 0;
11529 u8 ignore_tag2 = 0;
11535 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11537 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
11540 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
11542 else if (unformat (input, "proto %U",
11543 unformat_ethernet_type_host_byte_order, &proto_val))
11545 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
11547 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
11549 else if (unformat (input, "ignore-tag1"))
11551 else if (unformat (input, "ignore-tag2"))
11553 else if (unformat (input, "cos1 %d", &cos1_val))
11555 else if (unformat (input, "cos2 %d", &cos2_val))
11560 if ((src + dst + proto + tag1 + tag2 +
11561 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11564 if (tag1 || ignore_tag1 || cos1)
11566 if (tag2 || ignore_tag2 || cos2)
11569 vec_validate_aligned (match, len - 1, sizeof (u32x4));
11572 clib_memcpy (match, dst_val, 6);
11575 clib_memcpy (match + 6, src_val, 6);
11579 /* inner vlan tag */
11580 match[19] = tag2_val[1];
11581 match[18] = tag2_val[0];
11583 match[18] |= (cos2_val & 0x7) << 5;
11586 match[21] = proto_val & 0xff;
11587 match[20] = proto_val >> 8;
11591 match[15] = tag1_val[1];
11592 match[14] = tag1_val[0];
11595 match[14] |= (cos1_val & 0x7) << 5;
11601 match[15] = tag1_val[1];
11602 match[14] = tag1_val[0];
11605 match[17] = proto_val & 0xff;
11606 match[16] = proto_val >> 8;
11609 match[14] |= (cos1_val & 0x7) << 5;
11615 match[18] |= (cos2_val & 0x7) << 5;
11617 match[14] |= (cos1_val & 0x7) << 5;
11620 match[13] = proto_val & 0xff;
11621 match[12] = proto_val >> 8;
11629 unformat_qos_source (unformat_input_t * input, va_list * args)
11631 int *qs = va_arg (*args, int *);
11633 if (unformat (input, "ip"))
11634 *qs = QOS_SOURCE_IP;
11635 else if (unformat (input, "mpls"))
11636 *qs = QOS_SOURCE_MPLS;
11637 else if (unformat (input, "ext"))
11638 *qs = QOS_SOURCE_EXT;
11639 else if (unformat (input, "vlan"))
11640 *qs = QOS_SOURCE_VLAN;
11649 api_unformat_classify_match (unformat_input_t * input, va_list * args)
11651 u8 **matchp = va_arg (*args, u8 **);
11652 u32 skip_n_vectors = va_arg (*args, u32);
11653 u32 match_n_vectors = va_arg (*args, u32);
11660 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11662 if (unformat (input, "hex %U", unformat_hex_string, &match))
11664 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
11666 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
11668 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
11682 if (match || l2 || l3 || l4)
11684 if (l2 || l3 || l4)
11686 /* "Win a free Ethernet header in every packet" */
11688 vec_validate_aligned (l2, 13, sizeof (u32x4));
11692 vec_append_aligned (match, l3, sizeof (u32x4));
11697 vec_append_aligned (match, l4, sizeof (u32x4));
11702 /* Make sure the vector is big enough even if key is all 0's */
11703 vec_validate_aligned
11704 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
11707 /* Set size, include skipped vectors */
11708 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
11719 api_classify_add_del_session (vat_main_t * vam)
11721 unformat_input_t *i = vam->input;
11722 vl_api_classify_add_del_session_t *mp;
11724 u32 table_index = ~0;
11725 u32 hit_next_index = ~0;
11726 u32 opaque_index = ~0;
11729 u32 skip_n_vectors = 0;
11730 u32 match_n_vectors = 0;
11736 * Warning: you have to supply skip_n and match_n
11737 * because the API client cant simply look at the classify
11741 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11743 if (unformat (i, "del"))
11745 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
11748 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
11751 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
11754 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
11756 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
11758 else if (unformat (i, "opaque-index %d", &opaque_index))
11760 else if (unformat (i, "skip_n %d", &skip_n_vectors))
11762 else if (unformat (i, "match_n %d", &match_n_vectors))
11764 else if (unformat (i, "match %U", api_unformat_classify_match,
11765 &match, skip_n_vectors, match_n_vectors))
11767 else if (unformat (i, "advance %d", &advance))
11769 else if (unformat (i, "table-index %d", &table_index))
11771 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
11773 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
11775 else if (unformat (i, "action %d", &action))
11777 else if (unformat (i, "metadata %d", &metadata))
11783 if (table_index == ~0)
11785 errmsg ("Table index required");
11789 if (is_add && match == 0)
11791 errmsg ("Match value required");
11795 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
11797 mp->is_add = is_add;
11798 mp->table_index = ntohl (table_index);
11799 mp->hit_next_index = ntohl (hit_next_index);
11800 mp->opaque_index = ntohl (opaque_index);
11801 mp->advance = ntohl (advance);
11802 mp->action = action;
11803 mp->metadata = ntohl (metadata);
11804 mp->match_len = ntohl (vec_len (match));
11805 clib_memcpy (mp->match, match, vec_len (match));
11814 api_classify_set_interface_ip_table (vat_main_t * vam)
11816 unformat_input_t *i = vam->input;
11817 vl_api_classify_set_interface_ip_table_t *mp;
11819 int sw_if_index_set;
11820 u32 table_index = ~0;
11824 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11826 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11827 sw_if_index_set = 1;
11828 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11829 sw_if_index_set = 1;
11830 else if (unformat (i, "table %d", &table_index))
11834 clib_warning ("parse error '%U'", format_unformat_error, i);
11839 if (sw_if_index_set == 0)
11841 errmsg ("missing interface name or sw_if_index");
11846 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
11848 mp->sw_if_index = ntohl (sw_if_index);
11849 mp->table_index = ntohl (table_index);
11850 mp->is_ipv6 = is_ipv6;
11858 api_classify_set_interface_l2_tables (vat_main_t * vam)
11860 unformat_input_t *i = vam->input;
11861 vl_api_classify_set_interface_l2_tables_t *mp;
11863 int sw_if_index_set;
11864 u32 ip4_table_index = ~0;
11865 u32 ip6_table_index = ~0;
11866 u32 other_table_index = ~0;
11870 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11872 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11873 sw_if_index_set = 1;
11874 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11875 sw_if_index_set = 1;
11876 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11878 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11880 else if (unformat (i, "other-table %d", &other_table_index))
11882 else if (unformat (i, "is-input %d", &is_input))
11886 clib_warning ("parse error '%U'", format_unformat_error, i);
11891 if (sw_if_index_set == 0)
11893 errmsg ("missing interface name or sw_if_index");
11898 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
11900 mp->sw_if_index = ntohl (sw_if_index);
11901 mp->ip4_table_index = ntohl (ip4_table_index);
11902 mp->ip6_table_index = ntohl (ip6_table_index);
11903 mp->other_table_index = ntohl (other_table_index);
11904 mp->is_input = (u8) is_input;
11912 api_set_ipfix_exporter (vat_main_t * vam)
11914 unformat_input_t *i = vam->input;
11915 vl_api_set_ipfix_exporter_t *mp;
11916 ip4_address_t collector_address;
11917 u8 collector_address_set = 0;
11918 u32 collector_port = ~0;
11919 ip4_address_t src_address;
11920 u8 src_address_set = 0;
11923 u32 template_interval = ~0;
11924 u8 udp_checksum = 0;
11927 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11929 if (unformat (i, "collector_address %U", unformat_ip4_address,
11930 &collector_address))
11931 collector_address_set = 1;
11932 else if (unformat (i, "collector_port %d", &collector_port))
11934 else if (unformat (i, "src_address %U", unformat_ip4_address,
11936 src_address_set = 1;
11937 else if (unformat (i, "vrf_id %d", &vrf_id))
11939 else if (unformat (i, "path_mtu %d", &path_mtu))
11941 else if (unformat (i, "template_interval %d", &template_interval))
11943 else if (unformat (i, "udp_checksum"))
11949 if (collector_address_set == 0)
11951 errmsg ("collector_address required");
11955 if (src_address_set == 0)
11957 errmsg ("src_address required");
11961 M (SET_IPFIX_EXPORTER, mp);
11963 memcpy (mp->collector_address, collector_address.data,
11964 sizeof (collector_address.data));
11965 mp->collector_port = htons ((u16) collector_port);
11966 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
11967 mp->vrf_id = htonl (vrf_id);
11968 mp->path_mtu = htonl (path_mtu);
11969 mp->template_interval = htonl (template_interval);
11970 mp->udp_checksum = udp_checksum;
11978 api_set_ipfix_classify_stream (vat_main_t * vam)
11980 unformat_input_t *i = vam->input;
11981 vl_api_set_ipfix_classify_stream_t *mp;
11983 u32 src_port = UDP_DST_PORT_ipfix;
11986 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11988 if (unformat (i, "domain %d", &domain_id))
11990 else if (unformat (i, "src_port %d", &src_port))
11994 errmsg ("unknown input `%U'", format_unformat_error, i);
11999 M (SET_IPFIX_CLASSIFY_STREAM, mp);
12001 mp->domain_id = htonl (domain_id);
12002 mp->src_port = htons ((u16) src_port);
12010 api_ipfix_classify_table_add_del (vat_main_t * vam)
12012 unformat_input_t *i = vam->input;
12013 vl_api_ipfix_classify_table_add_del_t *mp;
12015 u32 classify_table_index = ~0;
12017 u8 transport_protocol = 255;
12020 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12022 if (unformat (i, "add"))
12024 else if (unformat (i, "del"))
12026 else if (unformat (i, "table %d", &classify_table_index))
12028 else if (unformat (i, "ip4"))
12030 else if (unformat (i, "ip6"))
12032 else if (unformat (i, "tcp"))
12033 transport_protocol = 6;
12034 else if (unformat (i, "udp"))
12035 transport_protocol = 17;
12038 errmsg ("unknown input `%U'", format_unformat_error, i);
12045 errmsg ("expecting: add|del");
12048 if (classify_table_index == ~0)
12050 errmsg ("classifier table not specified");
12053 if (ip_version == 0)
12055 errmsg ("IP version not specified");
12059 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
12061 mp->is_add = is_add;
12062 mp->table_id = htonl (classify_table_index);
12063 mp->ip_version = ip_version;
12064 mp->transport_protocol = transport_protocol;
12072 api_get_node_index (vat_main_t * vam)
12074 unformat_input_t *i = vam->input;
12075 vl_api_get_node_index_t *mp;
12079 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12081 if (unformat (i, "node %s", &name))
12088 errmsg ("node name required");
12091 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12093 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12097 M (GET_NODE_INDEX, mp);
12098 clib_memcpy (mp->node_name, name, vec_len (name));
12107 api_get_next_index (vat_main_t * vam)
12109 unformat_input_t *i = vam->input;
12110 vl_api_get_next_index_t *mp;
12111 u8 *node_name = 0, *next_node_name = 0;
12114 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12116 if (unformat (i, "node-name %s", &node_name))
12118 else if (unformat (i, "next-node-name %s", &next_node_name))
12122 if (node_name == 0)
12124 errmsg ("node name required");
12127 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12129 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12133 if (next_node_name == 0)
12135 errmsg ("next node name required");
12138 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12140 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12144 M (GET_NEXT_INDEX, mp);
12145 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12146 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12147 vec_free (node_name);
12148 vec_free (next_node_name);
12156 api_add_node_next (vat_main_t * vam)
12158 unformat_input_t *i = vam->input;
12159 vl_api_add_node_next_t *mp;
12164 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12166 if (unformat (i, "node %s", &name))
12168 else if (unformat (i, "next %s", &next))
12175 errmsg ("node name required");
12178 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12180 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12185 errmsg ("next node required");
12188 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12190 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12194 M (ADD_NODE_NEXT, mp);
12195 clib_memcpy (mp->node_name, name, vec_len (name));
12196 clib_memcpy (mp->next_name, next, vec_len (next));
12206 api_l2tpv3_create_tunnel (vat_main_t * vam)
12208 unformat_input_t *i = vam->input;
12209 ip6_address_t client_address, our_address;
12210 int client_address_set = 0;
12211 int our_address_set = 0;
12212 u32 local_session_id = 0;
12213 u32 remote_session_id = 0;
12214 u64 local_cookie = 0;
12215 u64 remote_cookie = 0;
12216 u8 l2_sublayer_present = 0;
12217 vl_api_l2tpv3_create_tunnel_t *mp;
12220 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12222 if (unformat (i, "client_address %U", unformat_ip6_address,
12224 client_address_set = 1;
12225 else if (unformat (i, "our_address %U", unformat_ip6_address,
12227 our_address_set = 1;
12228 else if (unformat (i, "local_session_id %d", &local_session_id))
12230 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12232 else if (unformat (i, "local_cookie %lld", &local_cookie))
12234 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12236 else if (unformat (i, "l2-sublayer-present"))
12237 l2_sublayer_present = 1;
12242 if (client_address_set == 0)
12244 errmsg ("client_address required");
12248 if (our_address_set == 0)
12250 errmsg ("our_address required");
12254 M (L2TPV3_CREATE_TUNNEL, mp);
12256 clib_memcpy (mp->client_address, client_address.as_u8,
12257 sizeof (mp->client_address));
12259 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12261 mp->local_session_id = ntohl (local_session_id);
12262 mp->remote_session_id = ntohl (remote_session_id);
12263 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12264 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12265 mp->l2_sublayer_present = l2_sublayer_present;
12274 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12276 unformat_input_t *i = vam->input;
12278 u8 sw_if_index_set = 0;
12279 u64 new_local_cookie = 0;
12280 u64 new_remote_cookie = 0;
12281 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
12284 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12286 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12287 sw_if_index_set = 1;
12288 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12289 sw_if_index_set = 1;
12290 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12292 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12298 if (sw_if_index_set == 0)
12300 errmsg ("missing interface name or sw_if_index");
12304 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
12306 mp->sw_if_index = ntohl (sw_if_index);
12307 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12308 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12316 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12318 unformat_input_t *i = vam->input;
12319 vl_api_l2tpv3_interface_enable_disable_t *mp;
12321 u8 sw_if_index_set = 0;
12322 u8 enable_disable = 1;
12325 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12327 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12328 sw_if_index_set = 1;
12329 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12330 sw_if_index_set = 1;
12331 else if (unformat (i, "enable"))
12332 enable_disable = 1;
12333 else if (unformat (i, "disable"))
12334 enable_disable = 0;
12339 if (sw_if_index_set == 0)
12341 errmsg ("missing interface name or sw_if_index");
12345 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
12347 mp->sw_if_index = ntohl (sw_if_index);
12348 mp->enable_disable = enable_disable;
12356 api_l2tpv3_set_lookup_key (vat_main_t * vam)
12358 unformat_input_t *i = vam->input;
12359 vl_api_l2tpv3_set_lookup_key_t *mp;
12363 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12365 if (unformat (i, "lookup_v6_src"))
12366 key = L2T_LOOKUP_SRC_ADDRESS;
12367 else if (unformat (i, "lookup_v6_dst"))
12368 key = L2T_LOOKUP_DST_ADDRESS;
12369 else if (unformat (i, "lookup_session_id"))
12370 key = L2T_LOOKUP_SESSION_ID;
12375 if (key == (u8) ~ 0)
12377 errmsg ("l2tp session lookup key unset");
12381 M (L2TPV3_SET_LOOKUP_KEY, mp);
12390 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12391 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12393 vat_main_t *vam = &vat_main;
12395 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12396 format_ip6_address, mp->our_address,
12397 format_ip6_address, mp->client_address,
12398 clib_net_to_host_u32 (mp->sw_if_index));
12401 " local cookies %016llx %016llx remote cookie %016llx",
12402 clib_net_to_host_u64 (mp->local_cookie[0]),
12403 clib_net_to_host_u64 (mp->local_cookie[1]),
12404 clib_net_to_host_u64 (mp->remote_cookie));
12406 print (vam->ofp, " local session-id %d remote session-id %d",
12407 clib_net_to_host_u32 (mp->local_session_id),
12408 clib_net_to_host_u32 (mp->remote_session_id));
12410 print (vam->ofp, " l2 specific sublayer %s\n",
12411 mp->l2_sublayer_present ? "preset" : "absent");
12415 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12416 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12418 vat_main_t *vam = &vat_main;
12419 vat_json_node_t *node = NULL;
12420 struct in6_addr addr;
12422 if (VAT_JSON_ARRAY != vam->json_tree.type)
12424 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12425 vat_json_init_array (&vam->json_tree);
12427 node = vat_json_array_add (&vam->json_tree);
12429 vat_json_init_object (node);
12431 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12432 vat_json_object_add_ip6 (node, "our_address", addr);
12433 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12434 vat_json_object_add_ip6 (node, "client_address", addr);
12436 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12437 vat_json_init_array (lc);
12438 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12439 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12440 vat_json_object_add_uint (node, "remote_cookie",
12441 clib_net_to_host_u64 (mp->remote_cookie));
12443 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12444 vat_json_object_add_uint (node, "local_session_id",
12445 clib_net_to_host_u32 (mp->local_session_id));
12446 vat_json_object_add_uint (node, "remote_session_id",
12447 clib_net_to_host_u32 (mp->remote_session_id));
12448 vat_json_object_add_string_copy (node, "l2_sublayer",
12449 mp->l2_sublayer_present ? (u8 *) "present"
12450 : (u8 *) "absent");
12454 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12456 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
12457 vl_api_control_ping_t *mp_ping;
12460 /* Get list of l2tpv3-tunnel interfaces */
12461 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
12464 /* Use a control ping for synchronization */
12465 MPING (CONTROL_PING, mp_ping);
12473 static void vl_api_sw_interface_tap_v2_details_t_handler
12474 (vl_api_sw_interface_tap_v2_details_t * mp)
12476 vat_main_t *vam = &vat_main;
12478 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
12479 mp->host_ip4_prefix_len);
12480 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
12481 mp->host_ip6_prefix_len);
12484 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s 0x%-08x",
12485 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
12486 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12487 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
12488 mp->host_bridge, ip4, ip6, ntohl (mp->tap_flags));
12494 static void vl_api_sw_interface_tap_v2_details_t_handler_json
12495 (vl_api_sw_interface_tap_v2_details_t * mp)
12497 vat_main_t *vam = &vat_main;
12498 vat_json_node_t *node = NULL;
12500 if (VAT_JSON_ARRAY != vam->json_tree.type)
12502 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12503 vat_json_init_array (&vam->json_tree);
12505 node = vat_json_array_add (&vam->json_tree);
12507 vat_json_init_object (node);
12508 vat_json_object_add_uint (node, "id", ntohl (mp->id));
12509 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12510 vat_json_object_add_uint (node, "tap_flags", ntohl (mp->tap_flags));
12511 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12512 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12513 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12514 vat_json_object_add_string_copy (node, "host_mac_addr",
12515 format (0, "%U", format_ethernet_address,
12516 &mp->host_mac_addr));
12517 vat_json_object_add_string_copy (node, "host_namespace",
12518 mp->host_namespace);
12519 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
12520 vat_json_object_add_string_copy (node, "host_ip4_addr",
12521 format (0, "%U/%d", format_ip4_address,
12523 mp->host_ip4_prefix_len));
12524 vat_json_object_add_string_copy (node, "host_ip6_addr",
12525 format (0, "%U/%d", format_ip6_address,
12527 mp->host_ip6_prefix_len));
12532 api_sw_interface_tap_v2_dump (vat_main_t * vam)
12534 vl_api_sw_interface_tap_v2_dump_t *mp;
12535 vl_api_control_ping_t *mp_ping;
12539 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
12540 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
12541 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
12544 /* Get list of tap interfaces */
12545 M (SW_INTERFACE_TAP_V2_DUMP, mp);
12548 /* Use a control ping for synchronization */
12549 MPING (CONTROL_PING, mp_ping);
12556 static void vl_api_sw_interface_virtio_pci_details_t_handler
12557 (vl_api_sw_interface_virtio_pci_details_t * mp)
12559 vat_main_t *vam = &vat_main;
12573 addr.as_u32 = ntohl (mp->pci_addr);
12574 u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus,
12575 addr.slot, addr.function);
12578 "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx",
12579 pci_addr, ntohl (mp->sw_if_index),
12580 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12581 format_ethernet_address, mp->mac_addr,
12582 clib_net_to_host_u64 (mp->features));
12583 vec_free (pci_addr);
12586 static void vl_api_sw_interface_virtio_pci_details_t_handler_json
12587 (vl_api_sw_interface_virtio_pci_details_t * mp)
12589 vat_main_t *vam = &vat_main;
12590 vat_json_node_t *node = NULL;
12592 if (VAT_JSON_ARRAY != vam->json_tree.type)
12594 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12595 vat_json_init_array (&vam->json_tree);
12597 node = vat_json_array_add (&vam->json_tree);
12599 vat_json_init_object (node);
12600 vat_json_object_add_uint (node, "pci-addr", ntohl (mp->pci_addr));
12601 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12602 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12603 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12604 vat_json_object_add_uint (node, "features",
12605 clib_net_to_host_u64 (mp->features));
12606 vat_json_object_add_string_copy (node, "mac_addr",
12607 format (0, "%U", format_ethernet_address,
12612 api_sw_interface_virtio_pci_dump (vat_main_t * vam)
12614 vl_api_sw_interface_virtio_pci_dump_t *mp;
12615 vl_api_control_ping_t *mp_ping;
12619 "\n%-12s %-12s %-12s %-12s %-17s %-08s",
12620 "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz",
12621 "mac_addr", "features");
12623 /* Get list of tap interfaces */
12624 M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp);
12627 /* Use a control ping for synchronization */
12628 MPING (CONTROL_PING, mp_ping);
12636 api_vxlan_offload_rx (vat_main_t * vam)
12638 unformat_input_t *line_input = vam->input;
12639 vl_api_vxlan_offload_rx_t *mp;
12640 u32 hw_if_index = ~0, rx_if_index = ~0;
12644 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12646 if (unformat (line_input, "del"))
12648 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
12651 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
12653 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
12656 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
12660 errmsg ("parse error '%U'", format_unformat_error, line_input);
12665 if (hw_if_index == ~0)
12667 errmsg ("no hw interface");
12671 if (rx_if_index == ~0)
12673 errmsg ("no rx tunnel");
12677 M (VXLAN_OFFLOAD_RX, mp);
12679 mp->hw_if_index = ntohl (hw_if_index);
12680 mp->sw_if_index = ntohl (rx_if_index);
12681 mp->enable = is_add;
12688 static uword unformat_vxlan_decap_next
12689 (unformat_input_t * input, va_list * args)
12691 u32 *result = va_arg (*args, u32 *);
12694 if (unformat (input, "l2"))
12695 *result = VXLAN_INPUT_NEXT_L2_INPUT;
12696 else if (unformat (input, "%d", &tmp))
12704 api_vxlan_add_del_tunnel (vat_main_t * vam)
12706 unformat_input_t *line_input = vam->input;
12707 vl_api_vxlan_add_del_tunnel_t *mp;
12708 ip46_address_t src, dst;
12710 u8 ipv4_set = 0, ipv6_set = 0;
12715 u32 mcast_sw_if_index = ~0;
12716 u32 encap_vrf_id = 0;
12717 u32 decap_next_index = ~0;
12721 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12722 clib_memset (&src, 0, sizeof src);
12723 clib_memset (&dst, 0, sizeof dst);
12725 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12727 if (unformat (line_input, "del"))
12729 else if (unformat (line_input, "instance %d", &instance))
12732 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12738 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12744 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
12750 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
12755 else if (unformat (line_input, "group %U %U",
12756 unformat_ip4_address, &dst.ip4,
12757 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12759 grp_set = dst_set = 1;
12762 else if (unformat (line_input, "group %U",
12763 unformat_ip4_address, &dst.ip4))
12765 grp_set = dst_set = 1;
12768 else if (unformat (line_input, "group %U %U",
12769 unformat_ip6_address, &dst.ip6,
12770 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12772 grp_set = dst_set = 1;
12775 else if (unformat (line_input, "group %U",
12776 unformat_ip6_address, &dst.ip6))
12778 grp_set = dst_set = 1;
12782 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12784 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12786 else if (unformat (line_input, "decap-next %U",
12787 unformat_vxlan_decap_next, &decap_next_index))
12789 else if (unformat (line_input, "vni %d", &vni))
12793 errmsg ("parse error '%U'", format_unformat_error, line_input);
12800 errmsg ("tunnel src address not specified");
12805 errmsg ("tunnel dst address not specified");
12809 if (grp_set && !ip46_address_is_multicast (&dst))
12811 errmsg ("tunnel group address not multicast");
12814 if (grp_set && mcast_sw_if_index == ~0)
12816 errmsg ("tunnel nonexistent multicast device");
12819 if (grp_set == 0 && ip46_address_is_multicast (&dst))
12821 errmsg ("tunnel dst address must be unicast");
12826 if (ipv4_set && ipv6_set)
12828 errmsg ("both IPv4 and IPv6 addresses specified");
12832 if ((vni == 0) || (vni >> 24))
12834 errmsg ("vni not specified or out of range");
12838 M (VXLAN_ADD_DEL_TUNNEL, mp);
12842 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
12843 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
12847 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
12848 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
12851 mp->instance = htonl (instance);
12852 mp->encap_vrf_id = ntohl (encap_vrf_id);
12853 mp->decap_next_index = ntohl (decap_next_index);
12854 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
12855 mp->vni = ntohl (vni);
12856 mp->is_add = is_add;
12857 mp->is_ipv6 = ipv6_set;
12864 static void vl_api_vxlan_tunnel_details_t_handler
12865 (vl_api_vxlan_tunnel_details_t * mp)
12867 vat_main_t *vam = &vat_main;
12868 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
12869 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
12871 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
12872 ntohl (mp->sw_if_index),
12873 ntohl (mp->instance),
12874 format_ip46_address, &src, IP46_TYPE_ANY,
12875 format_ip46_address, &dst, IP46_TYPE_ANY,
12876 ntohl (mp->encap_vrf_id),
12877 ntohl (mp->decap_next_index), ntohl (mp->vni),
12878 ntohl (mp->mcast_sw_if_index));
12881 static void vl_api_vxlan_tunnel_details_t_handler_json
12882 (vl_api_vxlan_tunnel_details_t * mp)
12884 vat_main_t *vam = &vat_main;
12885 vat_json_node_t *node = NULL;
12887 if (VAT_JSON_ARRAY != vam->json_tree.type)
12889 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12890 vat_json_init_array (&vam->json_tree);
12892 node = vat_json_array_add (&vam->json_tree);
12894 vat_json_init_object (node);
12895 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12897 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
12901 struct in6_addr ip6;
12903 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
12904 vat_json_object_add_ip6 (node, "src_address", ip6);
12905 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
12906 vat_json_object_add_ip6 (node, "dst_address", ip6);
12910 struct in_addr ip4;
12912 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
12913 vat_json_object_add_ip4 (node, "src_address", ip4);
12914 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
12915 vat_json_object_add_ip4 (node, "dst_address", ip4);
12917 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
12918 vat_json_object_add_uint (node, "decap_next_index",
12919 ntohl (mp->decap_next_index));
12920 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
12921 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
12922 vat_json_object_add_uint (node, "mcast_sw_if_index",
12923 ntohl (mp->mcast_sw_if_index));
12927 api_vxlan_tunnel_dump (vat_main_t * vam)
12929 unformat_input_t *i = vam->input;
12930 vl_api_vxlan_tunnel_dump_t *mp;
12931 vl_api_control_ping_t *mp_ping;
12933 u8 sw_if_index_set = 0;
12936 /* Parse args required to build the message */
12937 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12939 if (unformat (i, "sw_if_index %d", &sw_if_index))
12940 sw_if_index_set = 1;
12945 if (sw_if_index_set == 0)
12950 if (!vam->json_output)
12952 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
12953 "sw_if_index", "instance", "src_address", "dst_address",
12954 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
12957 /* Get list of vxlan-tunnel interfaces */
12958 M (VXLAN_TUNNEL_DUMP, mp);
12960 mp->sw_if_index = htonl (sw_if_index);
12964 /* Use a control ping for synchronization */
12965 MPING (CONTROL_PING, mp_ping);
12972 static uword unformat_geneve_decap_next
12973 (unformat_input_t * input, va_list * args)
12975 u32 *result = va_arg (*args, u32 *);
12978 if (unformat (input, "l2"))
12979 *result = GENEVE_INPUT_NEXT_L2_INPUT;
12980 else if (unformat (input, "%d", &tmp))
12988 api_geneve_add_del_tunnel (vat_main_t * vam)
12990 unformat_input_t *line_input = vam->input;
12991 vl_api_geneve_add_del_tunnel_t *mp;
12992 ip46_address_t src, dst;
12994 u8 ipv4_set = 0, ipv6_set = 0;
12998 u32 mcast_sw_if_index = ~0;
12999 u32 encap_vrf_id = 0;
13000 u32 decap_next_index = ~0;
13004 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13005 clib_memset (&src, 0, sizeof src);
13006 clib_memset (&dst, 0, sizeof dst);
13008 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13010 if (unformat (line_input, "del"))
13013 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13019 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13025 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13031 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13036 else if (unformat (line_input, "group %U %U",
13037 unformat_ip4_address, &dst.ip4,
13038 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13040 grp_set = dst_set = 1;
13043 else if (unformat (line_input, "group %U",
13044 unformat_ip4_address, &dst.ip4))
13046 grp_set = dst_set = 1;
13049 else if (unformat (line_input, "group %U %U",
13050 unformat_ip6_address, &dst.ip6,
13051 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13053 grp_set = dst_set = 1;
13056 else if (unformat (line_input, "group %U",
13057 unformat_ip6_address, &dst.ip6))
13059 grp_set = dst_set = 1;
13063 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13065 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13067 else if (unformat (line_input, "decap-next %U",
13068 unformat_geneve_decap_next, &decap_next_index))
13070 else if (unformat (line_input, "vni %d", &vni))
13074 errmsg ("parse error '%U'", format_unformat_error, line_input);
13081 errmsg ("tunnel src address not specified");
13086 errmsg ("tunnel dst address not specified");
13090 if (grp_set && !ip46_address_is_multicast (&dst))
13092 errmsg ("tunnel group address not multicast");
13095 if (grp_set && mcast_sw_if_index == ~0)
13097 errmsg ("tunnel nonexistent multicast device");
13100 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13102 errmsg ("tunnel dst address must be unicast");
13107 if (ipv4_set && ipv6_set)
13109 errmsg ("both IPv4 and IPv6 addresses specified");
13113 if ((vni == 0) || (vni >> 24))
13115 errmsg ("vni not specified or out of range");
13119 M (GENEVE_ADD_DEL_TUNNEL, mp);
13123 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13124 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13128 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13129 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13131 mp->encap_vrf_id = ntohl (encap_vrf_id);
13132 mp->decap_next_index = ntohl (decap_next_index);
13133 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13134 mp->vni = ntohl (vni);
13135 mp->is_add = is_add;
13136 mp->is_ipv6 = ipv6_set;
13143 static void vl_api_geneve_tunnel_details_t_handler
13144 (vl_api_geneve_tunnel_details_t * mp)
13146 vat_main_t *vam = &vat_main;
13147 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13148 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13150 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13151 ntohl (mp->sw_if_index),
13152 format_ip46_address, &src, IP46_TYPE_ANY,
13153 format_ip46_address, &dst, IP46_TYPE_ANY,
13154 ntohl (mp->encap_vrf_id),
13155 ntohl (mp->decap_next_index), ntohl (mp->vni),
13156 ntohl (mp->mcast_sw_if_index));
13159 static void vl_api_geneve_tunnel_details_t_handler_json
13160 (vl_api_geneve_tunnel_details_t * mp)
13162 vat_main_t *vam = &vat_main;
13163 vat_json_node_t *node = NULL;
13165 if (VAT_JSON_ARRAY != vam->json_tree.type)
13167 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13168 vat_json_init_array (&vam->json_tree);
13170 node = vat_json_array_add (&vam->json_tree);
13172 vat_json_init_object (node);
13173 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13176 struct in6_addr ip6;
13178 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13179 vat_json_object_add_ip6 (node, "src_address", ip6);
13180 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13181 vat_json_object_add_ip6 (node, "dst_address", ip6);
13185 struct in_addr ip4;
13187 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13188 vat_json_object_add_ip4 (node, "src_address", ip4);
13189 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13190 vat_json_object_add_ip4 (node, "dst_address", ip4);
13192 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13193 vat_json_object_add_uint (node, "decap_next_index",
13194 ntohl (mp->decap_next_index));
13195 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13196 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13197 vat_json_object_add_uint (node, "mcast_sw_if_index",
13198 ntohl (mp->mcast_sw_if_index));
13202 api_geneve_tunnel_dump (vat_main_t * vam)
13204 unformat_input_t *i = vam->input;
13205 vl_api_geneve_tunnel_dump_t *mp;
13206 vl_api_control_ping_t *mp_ping;
13208 u8 sw_if_index_set = 0;
13211 /* Parse args required to build the message */
13212 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13214 if (unformat (i, "sw_if_index %d", &sw_if_index))
13215 sw_if_index_set = 1;
13220 if (sw_if_index_set == 0)
13225 if (!vam->json_output)
13227 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13228 "sw_if_index", "local_address", "remote_address",
13229 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13232 /* Get list of geneve-tunnel interfaces */
13233 M (GENEVE_TUNNEL_DUMP, mp);
13235 mp->sw_if_index = htonl (sw_if_index);
13239 /* Use a control ping for synchronization */
13240 M (CONTROL_PING, mp_ping);
13248 api_gre_tunnel_add_del (vat_main_t * vam)
13250 unformat_input_t *line_input = vam->input;
13251 vl_api_address_t src = { }, dst =
13254 vl_api_gre_tunnel_add_del_t *mp;
13255 vl_api_gre_tunnel_type_t t_type;
13261 u32 outer_fib_id = 0;
13262 u32 session_id = 0;
13266 t_type = GRE_API_TUNNEL_TYPE_L3;
13268 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13270 if (unformat (line_input, "del"))
13272 else if (unformat (line_input, "instance %d", &instance))
13274 else if (unformat (line_input, "src %U", unformat_vl_api_address, &src))
13278 else if (unformat (line_input, "dst %U", unformat_vl_api_address, &dst))
13282 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13284 else if (unformat (line_input, "teb"))
13285 t_type = GRE_API_TUNNEL_TYPE_TEB;
13286 else if (unformat (line_input, "erspan %d", &session_id))
13287 t_type = GRE_API_TUNNEL_TYPE_ERSPAN;
13290 errmsg ("parse error '%U'", format_unformat_error, line_input);
13297 errmsg ("tunnel src address not specified");
13302 errmsg ("tunnel dst address not specified");
13306 M (GRE_TUNNEL_ADD_DEL, mp);
13308 clib_memcpy (&mp->tunnel.src, &src, sizeof (mp->tunnel.src));
13309 clib_memcpy (&mp->tunnel.dst, &dst, sizeof (mp->tunnel.dst));
13311 mp->tunnel.instance = htonl (instance);
13312 mp->tunnel.outer_fib_id = htonl (outer_fib_id);
13313 mp->is_add = is_add;
13314 mp->tunnel.session_id = htons ((u16) session_id);
13315 mp->tunnel.type = htonl (t_type);
13322 static void vl_api_gre_tunnel_details_t_handler
13323 (vl_api_gre_tunnel_details_t * mp)
13325 vat_main_t *vam = &vat_main;
13327 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
13328 ntohl (mp->tunnel.sw_if_index),
13329 ntohl (mp->tunnel.instance),
13330 format_vl_api_address, &mp->tunnel.src,
13331 format_vl_api_address, &mp->tunnel.dst,
13332 mp->tunnel.type, ntohl (mp->tunnel.outer_fib_id),
13333 ntohl (mp->tunnel.session_id));
13337 vat_json_object_add_address (vat_json_node_t * node,
13338 const char *str, const vl_api_address_t * addr)
13340 if (ADDRESS_IP6 == addr->af)
13342 struct in6_addr ip6;
13344 clib_memcpy (&ip6, &addr->un.ip6, sizeof (ip6));
13345 vat_json_object_add_ip6 (node, str, ip6);
13349 struct in_addr ip4;
13351 clib_memcpy (&ip4, &addr->un.ip4, sizeof (ip4));
13352 vat_json_object_add_ip4 (node, str, ip4);
13356 static void vl_api_gre_tunnel_details_t_handler_json
13357 (vl_api_gre_tunnel_details_t * mp)
13359 vat_main_t *vam = &vat_main;
13360 vat_json_node_t *node = NULL;
13361 struct in_addr ip4;
13362 struct in6_addr ip6;
13364 if (VAT_JSON_ARRAY != vam->json_tree.type)
13366 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13367 vat_json_init_array (&vam->json_tree);
13369 node = vat_json_array_add (&vam->json_tree);
13371 vat_json_init_object (node);
13372 vat_json_object_add_uint (node, "sw_if_index",
13373 ntohl (mp->tunnel.sw_if_index));
13374 vat_json_object_add_uint (node, "instance", ntohl (mp->tunnel.instance));
13376 vat_json_object_add_address (node, "src", &mp->tunnel.src);
13377 vat_json_object_add_address (node, "dst", &mp->tunnel.dst);
13378 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel.type);
13379 vat_json_object_add_uint (node, "outer_fib_id",
13380 ntohl (mp->tunnel.outer_fib_id));
13381 vat_json_object_add_uint (node, "session_id", mp->tunnel.session_id);
13385 api_gre_tunnel_dump (vat_main_t * vam)
13387 unformat_input_t *i = vam->input;
13388 vl_api_gre_tunnel_dump_t *mp;
13389 vl_api_control_ping_t *mp_ping;
13391 u8 sw_if_index_set = 0;
13394 /* Parse args required to build the message */
13395 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13397 if (unformat (i, "sw_if_index %d", &sw_if_index))
13398 sw_if_index_set = 1;
13403 if (sw_if_index_set == 0)
13408 if (!vam->json_output)
13410 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13411 "sw_if_index", "instance", "src_address", "dst_address",
13412 "tunnel_type", "outer_fib_id", "session_id");
13415 /* Get list of gre-tunnel interfaces */
13416 M (GRE_TUNNEL_DUMP, mp);
13418 mp->sw_if_index = htonl (sw_if_index);
13422 /* Use a control ping for synchronization */
13423 MPING (CONTROL_PING, mp_ping);
13431 api_l2_fib_clear_table (vat_main_t * vam)
13433 // unformat_input_t * i = vam->input;
13434 vl_api_l2_fib_clear_table_t *mp;
13437 M (L2_FIB_CLEAR_TABLE, mp);
13445 api_l2_interface_efp_filter (vat_main_t * vam)
13447 unformat_input_t *i = vam->input;
13448 vl_api_l2_interface_efp_filter_t *mp;
13451 u8 sw_if_index_set = 0;
13454 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13456 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13457 sw_if_index_set = 1;
13458 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13459 sw_if_index_set = 1;
13460 else if (unformat (i, "enable"))
13462 else if (unformat (i, "disable"))
13466 clib_warning ("parse error '%U'", format_unformat_error, i);
13471 if (sw_if_index_set == 0)
13473 errmsg ("missing sw_if_index");
13477 M (L2_INTERFACE_EFP_FILTER, mp);
13479 mp->sw_if_index = ntohl (sw_if_index);
13480 mp->enable_disable = enable;
13487 #define foreach_vtr_op \
13488 _("disable", L2_VTR_DISABLED) \
13489 _("push-1", L2_VTR_PUSH_1) \
13490 _("push-2", L2_VTR_PUSH_2) \
13491 _("pop-1", L2_VTR_POP_1) \
13492 _("pop-2", L2_VTR_POP_2) \
13493 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
13494 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
13495 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
13496 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
13499 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
13501 unformat_input_t *i = vam->input;
13502 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
13504 u8 sw_if_index_set = 0;
13507 u32 push_dot1q = 1;
13512 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13514 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13515 sw_if_index_set = 1;
13516 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13517 sw_if_index_set = 1;
13518 else if (unformat (i, "vtr_op %d", &vtr_op))
13520 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
13523 else if (unformat (i, "push_dot1q %d", &push_dot1q))
13525 else if (unformat (i, "tag1 %d", &tag1))
13527 else if (unformat (i, "tag2 %d", &tag2))
13531 clib_warning ("parse error '%U'", format_unformat_error, i);
13536 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
13538 errmsg ("missing vtr operation or sw_if_index");
13542 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
13543 mp->sw_if_index = ntohl (sw_if_index);
13544 mp->vtr_op = ntohl (vtr_op);
13545 mp->push_dot1q = ntohl (push_dot1q);
13546 mp->tag1 = ntohl (tag1);
13547 mp->tag2 = ntohl (tag2);
13555 api_create_vhost_user_if (vat_main_t * vam)
13557 unformat_input_t *i = vam->input;
13558 vl_api_create_vhost_user_if_t *mp;
13561 u8 file_name_set = 0;
13562 u32 custom_dev_instance = ~0;
13564 u8 use_custom_mac = 0;
13565 u8 disable_mrg_rxbuf = 0;
13566 u8 disable_indirect_desc = 0;
13570 /* Shut up coverity */
13571 clib_memset (hwaddr, 0, sizeof (hwaddr));
13573 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13575 if (unformat (i, "socket %s", &file_name))
13579 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13581 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
13582 use_custom_mac = 1;
13583 else if (unformat (i, "server"))
13585 else if (unformat (i, "disable_mrg_rxbuf"))
13586 disable_mrg_rxbuf = 1;
13587 else if (unformat (i, "disable_indirect_desc"))
13588 disable_indirect_desc = 1;
13589 else if (unformat (i, "tag %s", &tag))
13595 if (file_name_set == 0)
13597 errmsg ("missing socket file name");
13601 if (vec_len (file_name) > 255)
13603 errmsg ("socket file name too long");
13606 vec_add1 (file_name, 0);
13608 M (CREATE_VHOST_USER_IF, mp);
13610 mp->is_server = is_server;
13611 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
13612 mp->disable_indirect_desc = disable_indirect_desc;
13613 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13614 vec_free (file_name);
13615 if (custom_dev_instance != ~0)
13618 mp->custom_dev_instance = ntohl (custom_dev_instance);
13621 mp->use_custom_mac = use_custom_mac;
13622 clib_memcpy (mp->mac_address, hwaddr, 6);
13624 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
13633 api_modify_vhost_user_if (vat_main_t * vam)
13635 unformat_input_t *i = vam->input;
13636 vl_api_modify_vhost_user_if_t *mp;
13639 u8 file_name_set = 0;
13640 u32 custom_dev_instance = ~0;
13641 u8 sw_if_index_set = 0;
13642 u32 sw_if_index = (u32) ~ 0;
13645 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13647 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13648 sw_if_index_set = 1;
13649 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13650 sw_if_index_set = 1;
13651 else if (unformat (i, "socket %s", &file_name))
13655 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13657 else if (unformat (i, "server"))
13663 if (sw_if_index_set == 0)
13665 errmsg ("missing sw_if_index or interface name");
13669 if (file_name_set == 0)
13671 errmsg ("missing socket file name");
13675 if (vec_len (file_name) > 255)
13677 errmsg ("socket file name too long");
13680 vec_add1 (file_name, 0);
13682 M (MODIFY_VHOST_USER_IF, mp);
13684 mp->sw_if_index = ntohl (sw_if_index);
13685 mp->is_server = is_server;
13686 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13687 vec_free (file_name);
13688 if (custom_dev_instance != ~0)
13691 mp->custom_dev_instance = ntohl (custom_dev_instance);
13700 api_delete_vhost_user_if (vat_main_t * vam)
13702 unformat_input_t *i = vam->input;
13703 vl_api_delete_vhost_user_if_t *mp;
13704 u32 sw_if_index = ~0;
13705 u8 sw_if_index_set = 0;
13708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13710 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13711 sw_if_index_set = 1;
13712 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13713 sw_if_index_set = 1;
13718 if (sw_if_index_set == 0)
13720 errmsg ("missing sw_if_index or interface name");
13725 M (DELETE_VHOST_USER_IF, mp);
13727 mp->sw_if_index = ntohl (sw_if_index);
13734 static void vl_api_sw_interface_vhost_user_details_t_handler
13735 (vl_api_sw_interface_vhost_user_details_t * mp)
13737 vat_main_t *vam = &vat_main;
13739 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
13740 (char *) mp->interface_name,
13741 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
13742 clib_net_to_host_u64 (mp->features), mp->is_server,
13743 ntohl (mp->num_regions), (char *) mp->sock_filename);
13744 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
13747 static void vl_api_sw_interface_vhost_user_details_t_handler_json
13748 (vl_api_sw_interface_vhost_user_details_t * mp)
13750 vat_main_t *vam = &vat_main;
13751 vat_json_node_t *node = NULL;
13753 if (VAT_JSON_ARRAY != vam->json_tree.type)
13755 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13756 vat_json_init_array (&vam->json_tree);
13758 node = vat_json_array_add (&vam->json_tree);
13760 vat_json_init_object (node);
13761 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13762 vat_json_object_add_string_copy (node, "interface_name",
13763 mp->interface_name);
13764 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
13765 ntohl (mp->virtio_net_hdr_sz));
13766 vat_json_object_add_uint (node, "features",
13767 clib_net_to_host_u64 (mp->features));
13768 vat_json_object_add_uint (node, "is_server", mp->is_server);
13769 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
13770 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
13771 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
13775 api_sw_interface_vhost_user_dump (vat_main_t * vam)
13777 vl_api_sw_interface_vhost_user_dump_t *mp;
13778 vl_api_control_ping_t *mp_ping;
13781 "Interface name idx hdr_sz features server regions filename");
13783 /* Get list of vhost-user interfaces */
13784 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
13787 /* Use a control ping for synchronization */
13788 MPING (CONTROL_PING, mp_ping);
13796 api_show_version (vat_main_t * vam)
13798 vl_api_show_version_t *mp;
13801 M (SHOW_VERSION, mp);
13810 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
13812 unformat_input_t *line_input = vam->input;
13813 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
13814 ip4_address_t local4, remote4;
13815 ip6_address_t local6, remote6;
13817 u8 ipv4_set = 0, ipv6_set = 0;
13821 u32 mcast_sw_if_index = ~0;
13822 u32 encap_vrf_id = 0;
13823 u32 decap_vrf_id = 0;
13829 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13830 clib_memset (&local4, 0, sizeof local4);
13831 clib_memset (&remote4, 0, sizeof remote4);
13832 clib_memset (&local6, 0, sizeof local6);
13833 clib_memset (&remote6, 0, sizeof remote6);
13835 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13837 if (unformat (line_input, "del"))
13839 else if (unformat (line_input, "local %U",
13840 unformat_ip4_address, &local4))
13845 else if (unformat (line_input, "remote %U",
13846 unformat_ip4_address, &remote4))
13851 else if (unformat (line_input, "local %U",
13852 unformat_ip6_address, &local6))
13857 else if (unformat (line_input, "remote %U",
13858 unformat_ip6_address, &remote6))
13863 else if (unformat (line_input, "group %U %U",
13864 unformat_ip4_address, &remote4,
13865 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13867 grp_set = remote_set = 1;
13870 else if (unformat (line_input, "group %U",
13871 unformat_ip4_address, &remote4))
13873 grp_set = remote_set = 1;
13876 else if (unformat (line_input, "group %U %U",
13877 unformat_ip6_address, &remote6,
13878 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13880 grp_set = remote_set = 1;
13883 else if (unformat (line_input, "group %U",
13884 unformat_ip6_address, &remote6))
13886 grp_set = remote_set = 1;
13890 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13892 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13894 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
13896 else if (unformat (line_input, "vni %d", &vni))
13898 else if (unformat (line_input, "next-ip4"))
13900 else if (unformat (line_input, "next-ip6"))
13902 else if (unformat (line_input, "next-ethernet"))
13904 else if (unformat (line_input, "next-nsh"))
13908 errmsg ("parse error '%U'", format_unformat_error, line_input);
13913 if (local_set == 0)
13915 errmsg ("tunnel local address not specified");
13918 if (remote_set == 0)
13920 errmsg ("tunnel remote address not specified");
13923 if (grp_set && mcast_sw_if_index == ~0)
13925 errmsg ("tunnel nonexistent multicast device");
13928 if (ipv4_set && ipv6_set)
13930 errmsg ("both IPv4 and IPv6 addresses specified");
13936 errmsg ("vni not specified");
13940 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
13945 clib_memcpy (&mp->local, &local6, sizeof (local6));
13946 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
13950 clib_memcpy (&mp->local, &local4, sizeof (local4));
13951 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
13954 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13955 mp->encap_vrf_id = ntohl (encap_vrf_id);
13956 mp->decap_vrf_id = ntohl (decap_vrf_id);
13957 mp->protocol = protocol;
13958 mp->vni = ntohl (vni);
13959 mp->is_add = is_add;
13960 mp->is_ipv6 = ipv6_set;
13967 static void vl_api_vxlan_gpe_tunnel_details_t_handler
13968 (vl_api_vxlan_gpe_tunnel_details_t * mp)
13970 vat_main_t *vam = &vat_main;
13971 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
13972 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
13974 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
13975 ntohl (mp->sw_if_index),
13976 format_ip46_address, &local, IP46_TYPE_ANY,
13977 format_ip46_address, &remote, IP46_TYPE_ANY,
13978 ntohl (mp->vni), mp->protocol,
13979 ntohl (mp->mcast_sw_if_index),
13980 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
13984 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
13985 (vl_api_vxlan_gpe_tunnel_details_t * mp)
13987 vat_main_t *vam = &vat_main;
13988 vat_json_node_t *node = NULL;
13989 struct in_addr ip4;
13990 struct in6_addr ip6;
13992 if (VAT_JSON_ARRAY != vam->json_tree.type)
13994 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13995 vat_json_init_array (&vam->json_tree);
13997 node = vat_json_array_add (&vam->json_tree);
13999 vat_json_init_object (node);
14000 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14003 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
14004 vat_json_object_add_ip6 (node, "local", ip6);
14005 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
14006 vat_json_object_add_ip6 (node, "remote", ip6);
14010 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
14011 vat_json_object_add_ip4 (node, "local", ip4);
14012 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
14013 vat_json_object_add_ip4 (node, "remote", ip4);
14015 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
14016 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
14017 vat_json_object_add_uint (node, "mcast_sw_if_index",
14018 ntohl (mp->mcast_sw_if_index));
14019 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
14020 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
14021 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
14025 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14027 unformat_input_t *i = vam->input;
14028 vl_api_vxlan_gpe_tunnel_dump_t *mp;
14029 vl_api_control_ping_t *mp_ping;
14031 u8 sw_if_index_set = 0;
14034 /* Parse args required to build the message */
14035 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14037 if (unformat (i, "sw_if_index %d", &sw_if_index))
14038 sw_if_index_set = 1;
14043 if (sw_if_index_set == 0)
14048 if (!vam->json_output)
14050 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
14051 "sw_if_index", "local", "remote", "vni",
14052 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
14055 /* Get list of vxlan-tunnel interfaces */
14056 M (VXLAN_GPE_TUNNEL_DUMP, mp);
14058 mp->sw_if_index = htonl (sw_if_index);
14062 /* Use a control ping for synchronization */
14063 MPING (CONTROL_PING, mp_ping);
14070 static void vl_api_l2_fib_table_details_t_handler
14071 (vl_api_l2_fib_table_details_t * mp)
14073 vat_main_t *vam = &vat_main;
14075 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14077 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
14078 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14082 static void vl_api_l2_fib_table_details_t_handler_json
14083 (vl_api_l2_fib_table_details_t * mp)
14085 vat_main_t *vam = &vat_main;
14086 vat_json_node_t *node = NULL;
14088 if (VAT_JSON_ARRAY != vam->json_tree.type)
14090 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14091 vat_json_init_array (&vam->json_tree);
14093 node = vat_json_array_add (&vam->json_tree);
14095 vat_json_init_object (node);
14096 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
14097 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
14098 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14099 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14100 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14101 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14105 api_l2_fib_table_dump (vat_main_t * vam)
14107 unformat_input_t *i = vam->input;
14108 vl_api_l2_fib_table_dump_t *mp;
14109 vl_api_control_ping_t *mp_ping;
14114 /* Parse args required to build the message */
14115 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14117 if (unformat (i, "bd_id %d", &bd_id))
14123 if (bd_id_set == 0)
14125 errmsg ("missing bridge domain");
14129 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14131 /* Get list of l2 fib entries */
14132 M (L2_FIB_TABLE_DUMP, mp);
14134 mp->bd_id = ntohl (bd_id);
14137 /* Use a control ping for synchronization */
14138 MPING (CONTROL_PING, mp_ping);
14147 api_interface_name_renumber (vat_main_t * vam)
14149 unformat_input_t *line_input = vam->input;
14150 vl_api_interface_name_renumber_t *mp;
14151 u32 sw_if_index = ~0;
14152 u32 new_show_dev_instance = ~0;
14155 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14157 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14160 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14162 else if (unformat (line_input, "new_show_dev_instance %d",
14163 &new_show_dev_instance))
14169 if (sw_if_index == ~0)
14171 errmsg ("missing interface name or sw_if_index");
14175 if (new_show_dev_instance == ~0)
14177 errmsg ("missing new_show_dev_instance");
14181 M (INTERFACE_NAME_RENUMBER, mp);
14183 mp->sw_if_index = ntohl (sw_if_index);
14184 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14192 api_ip_probe_neighbor (vat_main_t * vam)
14194 unformat_input_t *i = vam->input;
14195 vl_api_ip_probe_neighbor_t *mp;
14196 vl_api_address_t dst_adr;
14202 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14204 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14206 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14208 else if (unformat (i, "address %U", unformat_vl_api_address, dst_adr))
14216 errmsg ("missing interface");
14222 errmsg ("missing addresses");
14226 M (IP_PROBE_NEIGHBOR, mp);
14228 mp->sw_if_index = ntohl (sw_if_index);
14229 clib_memcpy (&mp->dst, &dst_adr, sizeof (dst_adr));
14237 api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14239 unformat_input_t *i = vam->input;
14240 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14241 u8 mode = IP_SCAN_V46_NEIGHBORS;
14242 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14245 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14247 if (unformat (i, "ip4"))
14248 mode = IP_SCAN_V4_NEIGHBORS;
14249 else if (unformat (i, "ip6"))
14250 mode = IP_SCAN_V6_NEIGHBORS;
14251 if (unformat (i, "both"))
14252 mode = IP_SCAN_V46_NEIGHBORS;
14253 else if (unformat (i, "disable"))
14254 mode = IP_SCAN_DISABLED;
14255 else if (unformat (i, "interval %d", &interval))
14257 else if (unformat (i, "max-time %d", &time))
14259 else if (unformat (i, "max-update %d", &update))
14261 else if (unformat (i, "delay %d", &delay))
14263 else if (unformat (i, "stale %d", &stale))
14269 if (interval > 255)
14271 errmsg ("interval cannot exceed 255 minutes.");
14276 errmsg ("max-time cannot exceed 255 usec.");
14281 errmsg ("max-update cannot exceed 255.");
14286 errmsg ("delay cannot exceed 255 msec.");
14291 errmsg ("stale cannot exceed 255 minutes.");
14295 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14297 mp->scan_interval = interval;
14298 mp->max_proc_time = time;
14299 mp->max_update = update;
14300 mp->scan_int_delay = delay;
14301 mp->stale_threshold = stale;
14309 api_want_ip4_arp_events (vat_main_t * vam)
14311 unformat_input_t *line_input = vam->input;
14312 vl_api_want_ip4_arp_events_t *mp;
14313 ip4_address_t address;
14314 int address_set = 0;
14315 u32 enable_disable = 1;
14318 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14320 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14322 else if (unformat (line_input, "del"))
14323 enable_disable = 0;
14328 if (address_set == 0)
14330 errmsg ("missing addresses");
14334 M (WANT_IP4_ARP_EVENTS, mp);
14335 mp->enable_disable = enable_disable;
14336 mp->pid = htonl (getpid ());
14337 clib_memcpy (mp->ip, &address, sizeof (address));
14345 api_want_ip6_nd_events (vat_main_t * vam)
14347 unformat_input_t *line_input = vam->input;
14348 vl_api_want_ip6_nd_events_t *mp;
14349 vl_api_ip6_address_t address;
14350 int address_set = 0;
14351 u32 enable_disable = 1;
14354 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14357 (line_input, "address %U", unformat_vl_api_ip6_address, &address))
14359 else if (unformat (line_input, "del"))
14360 enable_disable = 0;
14365 if (address_set == 0)
14367 errmsg ("missing addresses");
14371 M (WANT_IP6_ND_EVENTS, mp);
14372 mp->enable_disable = enable_disable;
14373 mp->pid = htonl (getpid ());
14374 clib_memcpy (&mp->ip, &address, sizeof (address));
14382 api_want_l2_macs_events (vat_main_t * vam)
14384 unformat_input_t *line_input = vam->input;
14385 vl_api_want_l2_macs_events_t *mp;
14386 u8 enable_disable = 1;
14387 u32 scan_delay = 0;
14388 u32 max_macs_in_event = 0;
14389 u32 learn_limit = 0;
14392 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14394 if (unformat (line_input, "learn-limit %d", &learn_limit))
14396 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14398 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14400 else if (unformat (line_input, "disable"))
14401 enable_disable = 0;
14406 M (WANT_L2_MACS_EVENTS, mp);
14407 mp->enable_disable = enable_disable;
14408 mp->pid = htonl (getpid ());
14409 mp->learn_limit = htonl (learn_limit);
14410 mp->scan_delay = (u8) scan_delay;
14411 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14418 api_input_acl_set_interface (vat_main_t * vam)
14420 unformat_input_t *i = vam->input;
14421 vl_api_input_acl_set_interface_t *mp;
14423 int sw_if_index_set;
14424 u32 ip4_table_index = ~0;
14425 u32 ip6_table_index = ~0;
14426 u32 l2_table_index = ~0;
14430 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14432 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14433 sw_if_index_set = 1;
14434 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14435 sw_if_index_set = 1;
14436 else if (unformat (i, "del"))
14438 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14440 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14442 else if (unformat (i, "l2-table %d", &l2_table_index))
14446 clib_warning ("parse error '%U'", format_unformat_error, i);
14451 if (sw_if_index_set == 0)
14453 errmsg ("missing interface name or sw_if_index");
14457 M (INPUT_ACL_SET_INTERFACE, mp);
14459 mp->sw_if_index = ntohl (sw_if_index);
14460 mp->ip4_table_index = ntohl (ip4_table_index);
14461 mp->ip6_table_index = ntohl (ip6_table_index);
14462 mp->l2_table_index = ntohl (l2_table_index);
14463 mp->is_add = is_add;
14471 api_output_acl_set_interface (vat_main_t * vam)
14473 unformat_input_t *i = vam->input;
14474 vl_api_output_acl_set_interface_t *mp;
14476 int sw_if_index_set;
14477 u32 ip4_table_index = ~0;
14478 u32 ip6_table_index = ~0;
14479 u32 l2_table_index = ~0;
14483 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14485 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14486 sw_if_index_set = 1;
14487 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14488 sw_if_index_set = 1;
14489 else if (unformat (i, "del"))
14491 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14493 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14495 else if (unformat (i, "l2-table %d", &l2_table_index))
14499 clib_warning ("parse error '%U'", format_unformat_error, i);
14504 if (sw_if_index_set == 0)
14506 errmsg ("missing interface name or sw_if_index");
14510 M (OUTPUT_ACL_SET_INTERFACE, mp);
14512 mp->sw_if_index = ntohl (sw_if_index);
14513 mp->ip4_table_index = ntohl (ip4_table_index);
14514 mp->ip6_table_index = ntohl (ip6_table_index);
14515 mp->l2_table_index = ntohl (l2_table_index);
14516 mp->is_add = is_add;
14524 api_ip_address_dump (vat_main_t * vam)
14526 unformat_input_t *i = vam->input;
14527 vl_api_ip_address_dump_t *mp;
14528 vl_api_control_ping_t *mp_ping;
14529 u32 sw_if_index = ~0;
14530 u8 sw_if_index_set = 0;
14535 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14537 if (unformat (i, "sw_if_index %d", &sw_if_index))
14538 sw_if_index_set = 1;
14540 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14541 sw_if_index_set = 1;
14542 else if (unformat (i, "ipv4"))
14544 else if (unformat (i, "ipv6"))
14550 if (ipv4_set && ipv6_set)
14552 errmsg ("ipv4 and ipv6 flags cannot be both set");
14556 if ((!ipv4_set) && (!ipv6_set))
14558 errmsg ("no ipv4 nor ipv6 flag set");
14562 if (sw_if_index_set == 0)
14564 errmsg ("missing interface name or sw_if_index");
14568 vam->current_sw_if_index = sw_if_index;
14569 vam->is_ipv6 = ipv6_set;
14571 M (IP_ADDRESS_DUMP, mp);
14572 mp->sw_if_index = ntohl (sw_if_index);
14573 mp->is_ipv6 = ipv6_set;
14576 /* Use a control ping for synchronization */
14577 MPING (CONTROL_PING, mp_ping);
14585 api_ip_dump (vat_main_t * vam)
14587 vl_api_ip_dump_t *mp;
14588 vl_api_control_ping_t *mp_ping;
14589 unformat_input_t *in = vam->input;
14596 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
14598 if (unformat (in, "ipv4"))
14600 else if (unformat (in, "ipv6"))
14606 if (ipv4_set && ipv6_set)
14608 errmsg ("ipv4 and ipv6 flags cannot be both set");
14612 if ((!ipv4_set) && (!ipv6_set))
14614 errmsg ("no ipv4 nor ipv6 flag set");
14618 is_ipv6 = ipv6_set;
14619 vam->is_ipv6 = is_ipv6;
14621 /* free old data */
14622 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
14624 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
14626 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
14629 mp->is_ipv6 = ipv6_set;
14632 /* Use a control ping for synchronization */
14633 MPING (CONTROL_PING, mp_ping);
14641 api_ipsec_spd_add_del (vat_main_t * vam)
14643 unformat_input_t *i = vam->input;
14644 vl_api_ipsec_spd_add_del_t *mp;
14649 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14651 if (unformat (i, "spd_id %d", &spd_id))
14653 else if (unformat (i, "del"))
14657 clib_warning ("parse error '%U'", format_unformat_error, i);
14663 errmsg ("spd_id must be set");
14667 M (IPSEC_SPD_ADD_DEL, mp);
14669 mp->spd_id = ntohl (spd_id);
14670 mp->is_add = is_add;
14678 api_ipsec_interface_add_del_spd (vat_main_t * vam)
14680 unformat_input_t *i = vam->input;
14681 vl_api_ipsec_interface_add_del_spd_t *mp;
14683 u8 sw_if_index_set = 0;
14684 u32 spd_id = (u32) ~ 0;
14688 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14690 if (unformat (i, "del"))
14692 else if (unformat (i, "spd_id %d", &spd_id))
14695 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14696 sw_if_index_set = 1;
14697 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14698 sw_if_index_set = 1;
14701 clib_warning ("parse error '%U'", format_unformat_error, i);
14707 if (spd_id == (u32) ~ 0)
14709 errmsg ("spd_id must be set");
14713 if (sw_if_index_set == 0)
14715 errmsg ("missing interface name or sw_if_index");
14719 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
14721 mp->spd_id = ntohl (spd_id);
14722 mp->sw_if_index = ntohl (sw_if_index);
14723 mp->is_add = is_add;
14731 api_ipsec_spd_entry_add_del (vat_main_t * vam)
14733 unformat_input_t *i = vam->input;
14734 vl_api_ipsec_spd_entry_add_del_t *mp;
14735 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
14736 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
14738 u32 rport_start = 0, rport_stop = (u32) ~ 0;
14739 u32 lport_start = 0, lport_stop = (u32) ~ 0;
14740 vl_api_address_t laddr_start = { }, laddr_stop =
14749 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14751 if (unformat (i, "del"))
14753 if (unformat (i, "outbound"))
14755 if (unformat (i, "inbound"))
14757 else if (unformat (i, "spd_id %d", &spd_id))
14759 else if (unformat (i, "sa_id %d", &sa_id))
14761 else if (unformat (i, "priority %d", &priority))
14763 else if (unformat (i, "protocol %d", &protocol))
14765 else if (unformat (i, "lport_start %d", &lport_start))
14767 else if (unformat (i, "lport_stop %d", &lport_stop))
14769 else if (unformat (i, "rport_start %d", &rport_start))
14771 else if (unformat (i, "rport_stop %d", &rport_stop))
14773 else if (unformat (i, "laddr_start %U",
14774 unformat_vl_api_address, &laddr_start))
14776 else if (unformat (i, "laddr_stop %U", unformat_vl_api_address,
14779 else if (unformat (i, "raddr_start %U", unformat_vl_api_address,
14782 else if (unformat (i, "raddr_stop %U", unformat_vl_api_address,
14786 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
14788 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
14790 clib_warning ("unsupported action: 'resolve'");
14796 clib_warning ("parse error '%U'", format_unformat_error, i);
14802 M (IPSEC_SPD_ENTRY_ADD_DEL, mp);
14804 mp->is_add = is_add;
14806 mp->entry.spd_id = ntohl (spd_id);
14807 mp->entry.priority = ntohl (priority);
14808 mp->entry.is_outbound = is_outbound;
14810 clib_memcpy (&mp->entry.remote_address_start, &raddr_start,
14811 sizeof (vl_api_address_t));
14812 clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop,
14813 sizeof (vl_api_address_t));
14814 clib_memcpy (&mp->entry.local_address_start, &laddr_start,
14815 sizeof (vl_api_address_t));
14816 clib_memcpy (&mp->entry.local_address_stop, &laddr_stop,
14817 sizeof (vl_api_address_t));
14819 mp->entry.protocol = (u8) protocol;
14820 mp->entry.local_port_start = ntohs ((u16) lport_start);
14821 mp->entry.local_port_stop = ntohs ((u16) lport_stop);
14822 mp->entry.remote_port_start = ntohs ((u16) rport_start);
14823 mp->entry.remote_port_stop = ntohs ((u16) rport_stop);
14824 mp->entry.policy = (u8) policy;
14825 mp->entry.sa_id = ntohl (sa_id);
14833 api_ipsec_sad_entry_add_del (vat_main_t * vam)
14835 unformat_input_t *i = vam->input;
14836 vl_api_ipsec_sad_entry_add_del_t *mp;
14837 u32 sad_id = 0, spi = 0;
14838 u8 *ck = 0, *ik = 0;
14841 vl_api_ipsec_crypto_alg_t crypto_alg = IPSEC_API_CRYPTO_ALG_NONE;
14842 vl_api_ipsec_integ_alg_t integ_alg = IPSEC_API_INTEG_ALG_NONE;
14843 vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE;
14844 vl_api_ipsec_proto_t protocol = IPSEC_API_PROTO_AH;
14845 vl_api_address_t tun_src, tun_dst;
14848 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14850 if (unformat (i, "del"))
14852 else if (unformat (i, "sad_id %d", &sad_id))
14854 else if (unformat (i, "spi %d", &spi))
14856 else if (unformat (i, "esp"))
14857 protocol = IPSEC_API_PROTO_ESP;
14859 if (unformat (i, "tunnel_src %U", unformat_vl_api_address, &tun_src))
14861 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14862 if (ADDRESS_IP6 == tun_src.af)
14863 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
14866 if (unformat (i, "tunnel_dst %U", unformat_vl_api_address, &tun_dst))
14868 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14869 if (ADDRESS_IP6 == tun_src.af)
14870 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
14873 if (unformat (i, "crypto_alg %U",
14874 unformat_ipsec_api_crypto_alg, &crypto_alg))
14876 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
14878 else if (unformat (i, "integ_alg %U",
14879 unformat_ipsec_api_integ_alg, &integ_alg))
14881 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
14885 clib_warning ("parse error '%U'", format_unformat_error, i);
14891 M (IPSEC_SAD_ENTRY_ADD_DEL, mp);
14893 mp->is_add = is_add;
14894 mp->entry.sad_id = ntohl (sad_id);
14895 mp->entry.protocol = protocol;
14896 mp->entry.spi = ntohl (spi);
14897 mp->entry.flags = flags;
14899 mp->entry.crypto_algorithm = crypto_alg;
14900 mp->entry.integrity_algorithm = integ_alg;
14901 mp->entry.crypto_key.length = vec_len (ck);
14902 mp->entry.integrity_key.length = vec_len (ik);
14904 if (mp->entry.crypto_key.length > sizeof (mp->entry.crypto_key.data))
14905 mp->entry.crypto_key.length = sizeof (mp->entry.crypto_key.data);
14907 if (mp->entry.integrity_key.length > sizeof (mp->entry.integrity_key.data))
14908 mp->entry.integrity_key.length = sizeof (mp->entry.integrity_key.data);
14911 clib_memcpy (mp->entry.crypto_key.data, ck, mp->entry.crypto_key.length);
14913 clib_memcpy (mp->entry.integrity_key.data, ik,
14914 mp->entry.integrity_key.length);
14916 if (flags & IPSEC_API_SAD_FLAG_IS_TUNNEL)
14918 clib_memcpy (&mp->entry.tunnel_src, &tun_src,
14919 sizeof (mp->entry.tunnel_src));
14920 clib_memcpy (&mp->entry.tunnel_dst, &tun_dst,
14921 sizeof (mp->entry.tunnel_dst));
14930 api_ipsec_sa_set_key (vat_main_t * vam)
14932 unformat_input_t *i = vam->input;
14933 vl_api_ipsec_sa_set_key_t *mp;
14935 u8 *ck = 0, *ik = 0;
14938 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14940 if (unformat (i, "sa_id %d", &sa_id))
14942 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
14944 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
14948 clib_warning ("parse error '%U'", format_unformat_error, i);
14953 M (IPSEC_SA_SET_KEY, mp);
14955 mp->sa_id = ntohl (sa_id);
14956 mp->crypto_key.length = vec_len (ck);
14957 mp->integrity_key.length = vec_len (ik);
14959 if (mp->crypto_key.length > sizeof (mp->crypto_key.data))
14960 mp->crypto_key.length = sizeof (mp->crypto_key.data);
14962 if (mp->integrity_key.length > sizeof (mp->integrity_key.data))
14963 mp->integrity_key.length = sizeof (mp->integrity_key.data);
14966 clib_memcpy (mp->crypto_key.data, ck, mp->crypto_key.length);
14968 clib_memcpy (mp->integrity_key.data, ik, mp->integrity_key.length);
14976 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
14978 unformat_input_t *i = vam->input;
14979 vl_api_ipsec_tunnel_if_add_del_t *mp;
14980 u32 local_spi = 0, remote_spi = 0;
14981 u32 crypto_alg = 0, integ_alg = 0;
14982 u8 *lck = NULL, *rck = NULL;
14983 u8 *lik = NULL, *rik = NULL;
14984 vl_api_address_t local_ip = { 0 };
14985 vl_api_address_t remote_ip = { 0 };
14989 u8 anti_replay = 0;
14995 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14997 if (unformat (i, "del"))
14999 else if (unformat (i, "esn"))
15001 else if (unformat (i, "anti-replay"))
15003 else if (unformat (i, "count %d", &count))
15005 else if (unformat (i, "local_spi %d", &local_spi))
15007 else if (unformat (i, "remote_spi %d", &remote_spi))
15010 if (unformat (i, "local_ip %U", unformat_vl_api_address, &local_ip))
15013 if (unformat (i, "remote_ip %U", unformat_vl_api_address, &remote_ip))
15015 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
15018 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
15020 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
15022 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
15026 (i, "crypto_alg %U", unformat_ipsec_api_crypto_alg, &crypto_alg))
15028 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
15030 errmsg ("unsupported crypto-alg: '%U'\n",
15031 format_ipsec_crypto_alg, crypto_alg);
15037 (i, "integ_alg %U", unformat_ipsec_api_integ_alg, &integ_alg))
15039 if (integ_alg >= IPSEC_INTEG_N_ALG)
15041 errmsg ("unsupported integ-alg: '%U'\n",
15042 format_ipsec_integ_alg, integ_alg);
15046 else if (unformat (i, "instance %u", &instance))
15050 errmsg ("parse error '%U'\n", format_unformat_error, i);
15057 /* Turn on async mode */
15058 vam->async_mode = 1;
15059 vam->async_errors = 0;
15060 before = vat_time_now (vam);
15063 for (jj = 0; jj < count; jj++)
15065 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
15067 mp->is_add = is_add;
15069 mp->anti_replay = anti_replay;
15072 increment_vl_address (&remote_ip);
15074 clib_memcpy (&mp->local_ip, &local_ip, sizeof (local_ip));
15075 clib_memcpy (&mp->remote_ip, &remote_ip, sizeof (remote_ip));
15077 mp->local_spi = htonl (local_spi + jj);
15078 mp->remote_spi = htonl (remote_spi + jj);
15079 mp->crypto_alg = (u8) crypto_alg;
15081 mp->local_crypto_key_len = 0;
15084 mp->local_crypto_key_len = vec_len (lck);
15085 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15086 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15087 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15090 mp->remote_crypto_key_len = 0;
15093 mp->remote_crypto_key_len = vec_len (rck);
15094 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15095 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15096 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15099 mp->integ_alg = (u8) integ_alg;
15101 mp->local_integ_key_len = 0;
15104 mp->local_integ_key_len = vec_len (lik);
15105 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15106 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15107 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15110 mp->remote_integ_key_len = 0;
15113 mp->remote_integ_key_len = vec_len (rik);
15114 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15115 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15116 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15121 mp->renumber = renumber;
15122 mp->show_instance = ntohl (instance);
15127 /* When testing multiple add/del ops, use a control-ping to sync */
15130 vl_api_control_ping_t *mp_ping;
15134 /* Shut off async mode */
15135 vam->async_mode = 0;
15137 MPING (CONTROL_PING, mp_ping);
15140 timeout = vat_time_now (vam) + 1.0;
15141 while (vat_time_now (vam) < timeout)
15142 if (vam->result_ready == 1)
15147 if (vam->retval == -99)
15148 errmsg ("timeout");
15150 if (vam->async_errors > 0)
15152 errmsg ("%d asynchronous errors", vam->async_errors);
15155 vam->async_errors = 0;
15156 after = vat_time_now (vam);
15158 /* slim chance, but we might have eaten SIGTERM on the first iteration */
15162 print (vam->ofp, "%d tunnels in %.6f secs, %.2f tunnels/sec",
15163 count, after - before, count / (after - before));
15167 /* Wait for a reply... */
15176 vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15178 vat_main_t *vam = &vat_main;
15180 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
15181 "crypto_key %U integ_alg %u integ_key %U flags %x "
15182 "tunnel_src_addr %U tunnel_dst_addr %U "
15183 "salt %u seq_outbound %lu last_seq_inbound %lu "
15184 "replay_window %lu\n",
15185 ntohl (mp->entry.sad_id),
15186 ntohl (mp->sw_if_index),
15187 ntohl (mp->entry.spi),
15188 ntohl (mp->entry.protocol),
15189 ntohl (mp->entry.crypto_algorithm),
15190 format_hex_bytes, mp->entry.crypto_key.data,
15191 mp->entry.crypto_key.length, ntohl (mp->entry.integrity_algorithm),
15192 format_hex_bytes, mp->entry.integrity_key.data,
15193 mp->entry.integrity_key.length, ntohl (mp->entry.flags),
15194 format_vl_api_address, &mp->entry.tunnel_src, format_vl_api_address,
15195 &mp->entry.tunnel_dst, ntohl (mp->salt),
15196 clib_net_to_host_u64 (mp->seq_outbound),
15197 clib_net_to_host_u64 (mp->last_seq_inbound),
15198 clib_net_to_host_u64 (mp->replay_window));
15201 #define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15202 #define vl_api_ipsec_sa_details_t_print vl_noop_handler
15204 static void vl_api_ipsec_sa_details_t_handler_json
15205 (vl_api_ipsec_sa_details_t * mp)
15207 vat_main_t *vam = &vat_main;
15208 vat_json_node_t *node = NULL;
15209 vl_api_ipsec_sad_flags_t flags;
15211 if (VAT_JSON_ARRAY != vam->json_tree.type)
15213 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15214 vat_json_init_array (&vam->json_tree);
15216 node = vat_json_array_add (&vam->json_tree);
15218 vat_json_init_object (node);
15219 vat_json_object_add_uint (node, "sa_id", ntohl (mp->entry.sad_id));
15220 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15221 vat_json_object_add_uint (node, "spi", ntohl (mp->entry.spi));
15222 vat_json_object_add_uint (node, "proto", ntohl (mp->entry.protocol));
15223 vat_json_object_add_uint (node, "crypto_alg",
15224 ntohl (mp->entry.crypto_algorithm));
15225 vat_json_object_add_uint (node, "integ_alg",
15226 ntohl (mp->entry.integrity_algorithm));
15227 flags = ntohl (mp->entry.flags);
15228 vat_json_object_add_uint (node, "use_esn",
15229 ! !(flags & IPSEC_API_SAD_FLAG_USE_ESN));
15230 vat_json_object_add_uint (node, "use_anti_replay",
15231 ! !(flags & IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY));
15232 vat_json_object_add_uint (node, "is_tunnel",
15233 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL));
15234 vat_json_object_add_uint (node, "is_tunnel_ip6",
15235 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL_V6));
15236 vat_json_object_add_uint (node, "udp_encap",
15237 ! !(flags & IPSEC_API_SAD_FLAG_UDP_ENCAP));
15238 vat_json_object_add_bytes (node, "crypto_key", mp->entry.crypto_key.data,
15239 mp->entry.crypto_key.length);
15240 vat_json_object_add_bytes (node, "integ_key", mp->entry.integrity_key.data,
15241 mp->entry.integrity_key.length);
15242 vat_json_object_add_address (node, "src", &mp->entry.tunnel_src);
15243 vat_json_object_add_address (node, "dst", &mp->entry.tunnel_dst);
15244 vat_json_object_add_uint (node, "replay_window",
15245 clib_net_to_host_u64 (mp->replay_window));
15249 api_ipsec_sa_dump (vat_main_t * vam)
15251 unformat_input_t *i = vam->input;
15252 vl_api_ipsec_sa_dump_t *mp;
15253 vl_api_control_ping_t *mp_ping;
15257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15259 if (unformat (i, "sa_id %d", &sa_id))
15263 clib_warning ("parse error '%U'", format_unformat_error, i);
15268 M (IPSEC_SA_DUMP, mp);
15270 mp->sa_id = ntohl (sa_id);
15274 /* Use a control ping for synchronization */
15275 M (CONTROL_PING, mp_ping);
15283 api_ipsec_tunnel_if_set_key (vat_main_t * vam)
15285 unformat_input_t *i = vam->input;
15286 vl_api_ipsec_tunnel_if_set_key_t *mp;
15287 u32 sw_if_index = ~0;
15288 u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE;
15293 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15295 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15299 (i, "local crypto %U", unformat_ipsec_api_crypto_alg, &alg))
15300 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO;
15303 (i, "remote crypto %U", unformat_ipsec_api_crypto_alg, &alg))
15304 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO;
15307 (i, "local integ %U", unformat_ipsec_api_integ_alg, &alg))
15308 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG;
15311 (i, "remote integ %U", unformat_ipsec_api_integ_alg, &alg))
15312 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG;
15313 else if (unformat (i, "%U", unformat_hex_string, &key))
15317 clib_warning ("parse error '%U'", format_unformat_error, i);
15322 if (sw_if_index == ~0)
15324 errmsg ("interface must be specified");
15328 if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE)
15330 errmsg ("key type must be specified");
15336 errmsg ("algorithm must be specified");
15340 if (vec_len (key) == 0)
15342 errmsg ("key must be specified");
15346 M (IPSEC_TUNNEL_IF_SET_KEY, mp);
15348 mp->sw_if_index = htonl (sw_if_index);
15350 mp->key_type = key_type;
15351 mp->key_len = vec_len (key);
15352 clib_memcpy (mp->key, key, vec_len (key));
15361 api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15363 unformat_input_t *i = vam->input;
15364 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15365 u32 sw_if_index = ~0;
15367 u8 is_outbound = (u8) ~ 0;
15370 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15372 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15374 else if (unformat (i, "sa_id %d", &sa_id))
15376 else if (unformat (i, "outbound"))
15378 else if (unformat (i, "inbound"))
15382 clib_warning ("parse error '%U'", format_unformat_error, i);
15387 if (sw_if_index == ~0)
15389 errmsg ("interface must be specified");
15395 errmsg ("SA ID must be specified");
15399 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15401 mp->sw_if_index = htonl (sw_if_index);
15402 mp->sa_id = htonl (sa_id);
15403 mp->is_outbound = is_outbound;
15412 api_get_first_msg_id (vat_main_t * vam)
15414 vl_api_get_first_msg_id_t *mp;
15415 unformat_input_t *i = vam->input;
15420 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15422 if (unformat (i, "client %s", &name))
15430 errmsg ("missing client name");
15433 vec_add1 (name, 0);
15435 if (vec_len (name) > 63)
15437 errmsg ("client name too long");
15441 M (GET_FIRST_MSG_ID, mp);
15442 clib_memcpy (mp->name, name, vec_len (name));
15449 api_cop_interface_enable_disable (vat_main_t * vam)
15451 unformat_input_t *line_input = vam->input;
15452 vl_api_cop_interface_enable_disable_t *mp;
15453 u32 sw_if_index = ~0;
15454 u8 enable_disable = 1;
15457 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15459 if (unformat (line_input, "disable"))
15460 enable_disable = 0;
15461 if (unformat (line_input, "enable"))
15462 enable_disable = 1;
15463 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15464 vam, &sw_if_index))
15466 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15472 if (sw_if_index == ~0)
15474 errmsg ("missing interface name or sw_if_index");
15478 /* Construct the API message */
15479 M (COP_INTERFACE_ENABLE_DISABLE, mp);
15480 mp->sw_if_index = ntohl (sw_if_index);
15481 mp->enable_disable = enable_disable;
15485 /* Wait for the reply */
15491 api_cop_whitelist_enable_disable (vat_main_t * vam)
15493 unformat_input_t *line_input = vam->input;
15494 vl_api_cop_whitelist_enable_disable_t *mp;
15495 u32 sw_if_index = ~0;
15496 u8 ip4 = 0, ip6 = 0, default_cop = 0;
15500 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15502 if (unformat (line_input, "ip4"))
15504 else if (unformat (line_input, "ip6"))
15506 else if (unformat (line_input, "default"))
15508 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15509 vam, &sw_if_index))
15511 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15513 else if (unformat (line_input, "fib-id %d", &fib_id))
15519 if (sw_if_index == ~0)
15521 errmsg ("missing interface name or sw_if_index");
15525 /* Construct the API message */
15526 M (COP_WHITELIST_ENABLE_DISABLE, mp);
15527 mp->sw_if_index = ntohl (sw_if_index);
15528 mp->fib_id = ntohl (fib_id);
15531 mp->default_cop = default_cop;
15535 /* Wait for the reply */
15541 api_get_node_graph (vat_main_t * vam)
15543 vl_api_get_node_graph_t *mp;
15546 M (GET_NODE_GRAPH, mp);
15550 /* Wait for the reply */
15556 /** Used for parsing LISP eids */
15557 typedef CLIB_PACKED(struct{
15558 u8 addr[16]; /**< eid address */
15559 u32 len; /**< prefix length if IP */
15560 u8 type; /**< type of eid */
15565 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
15567 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
15569 clib_memset (a, 0, sizeof (a[0]));
15571 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
15573 a->type = 0; /* ipv4 type */
15575 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
15577 a->type = 1; /* ipv6 type */
15579 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
15581 a->type = 2; /* mac type */
15583 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
15585 a->type = 3; /* NSH type */
15586 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
15587 nsh->spi = clib_host_to_net_u32 (nsh->spi);
15594 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
15603 lisp_eid_size_vat (u8 type)
15620 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
15622 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
15626 api_one_add_del_locator_set (vat_main_t * vam)
15628 unformat_input_t *input = vam->input;
15629 vl_api_one_add_del_locator_set_t *mp;
15631 u8 *locator_set_name = NULL;
15632 u8 locator_set_name_set = 0;
15633 vl_api_local_locator_t locator, *locators = 0;
15634 u32 sw_if_index, priority, weight;
15638 /* Parse args required to build the message */
15639 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15641 if (unformat (input, "del"))
15645 else if (unformat (input, "locator-set %s", &locator_set_name))
15647 locator_set_name_set = 1;
15649 else if (unformat (input, "sw_if_index %u p %u w %u",
15650 &sw_if_index, &priority, &weight))
15652 locator.sw_if_index = htonl (sw_if_index);
15653 locator.priority = priority;
15654 locator.weight = weight;
15655 vec_add1 (locators, locator);
15659 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
15660 &sw_if_index, &priority, &weight))
15662 locator.sw_if_index = htonl (sw_if_index);
15663 locator.priority = priority;
15664 locator.weight = weight;
15665 vec_add1 (locators, locator);
15671 if (locator_set_name_set == 0)
15673 errmsg ("missing locator-set name");
15674 vec_free (locators);
15678 if (vec_len (locator_set_name) > 64)
15680 errmsg ("locator-set name too long");
15681 vec_free (locator_set_name);
15682 vec_free (locators);
15685 vec_add1 (locator_set_name, 0);
15687 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
15689 /* Construct the API message */
15690 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
15692 mp->is_add = is_add;
15693 clib_memcpy (mp->locator_set_name, locator_set_name,
15694 vec_len (locator_set_name));
15695 vec_free (locator_set_name);
15697 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
15699 clib_memcpy (mp->locators, locators, data_len);
15700 vec_free (locators);
15705 /* Wait for a reply... */
15710 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
15713 api_one_add_del_locator (vat_main_t * vam)
15715 unformat_input_t *input = vam->input;
15716 vl_api_one_add_del_locator_t *mp;
15717 u32 tmp_if_index = ~0;
15718 u32 sw_if_index = ~0;
15719 u8 sw_if_index_set = 0;
15720 u8 sw_if_index_if_name_set = 0;
15722 u8 priority_set = 0;
15726 u8 *locator_set_name = NULL;
15727 u8 locator_set_name_set = 0;
15730 /* Parse args required to build the message */
15731 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15733 if (unformat (input, "del"))
15737 else if (unformat (input, "locator-set %s", &locator_set_name))
15739 locator_set_name_set = 1;
15741 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
15744 sw_if_index_if_name_set = 1;
15745 sw_if_index = tmp_if_index;
15747 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
15749 sw_if_index_set = 1;
15750 sw_if_index = tmp_if_index;
15752 else if (unformat (input, "p %d", &priority))
15756 else if (unformat (input, "w %d", &weight))
15764 if (locator_set_name_set == 0)
15766 errmsg ("missing locator-set name");
15770 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
15772 errmsg ("missing sw_if_index");
15773 vec_free (locator_set_name);
15777 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
15779 errmsg ("cannot use both params interface name and sw_if_index");
15780 vec_free (locator_set_name);
15784 if (priority_set == 0)
15786 errmsg ("missing locator-set priority");
15787 vec_free (locator_set_name);
15791 if (weight_set == 0)
15793 errmsg ("missing locator-set weight");
15794 vec_free (locator_set_name);
15798 if (vec_len (locator_set_name) > 64)
15800 errmsg ("locator-set name too long");
15801 vec_free (locator_set_name);
15804 vec_add1 (locator_set_name, 0);
15806 /* Construct the API message */
15807 M (ONE_ADD_DEL_LOCATOR, mp);
15809 mp->is_add = is_add;
15810 mp->sw_if_index = ntohl (sw_if_index);
15811 mp->priority = priority;
15812 mp->weight = weight;
15813 clib_memcpy (mp->locator_set_name, locator_set_name,
15814 vec_len (locator_set_name));
15815 vec_free (locator_set_name);
15820 /* Wait for a reply... */
15825 #define api_lisp_add_del_locator api_one_add_del_locator
15828 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
15830 u32 *key_id = va_arg (*args, u32 *);
15833 if (unformat (input, "%s", &s))
15835 if (!strcmp ((char *) s, "sha1"))
15836 key_id[0] = HMAC_SHA_1_96;
15837 else if (!strcmp ((char *) s, "sha256"))
15838 key_id[0] = HMAC_SHA_256_128;
15841 clib_warning ("invalid key_id: '%s'", s);
15842 key_id[0] = HMAC_NO_KEY;
15853 api_one_add_del_local_eid (vat_main_t * vam)
15855 unformat_input_t *input = vam->input;
15856 vl_api_one_add_del_local_eid_t *mp;
15859 lisp_eid_vat_t _eid, *eid = &_eid;
15860 u8 *locator_set_name = 0;
15861 u8 locator_set_name_set = 0;
15867 /* Parse args required to build the message */
15868 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15870 if (unformat (input, "del"))
15874 else if (unformat (input, "vni %d", &vni))
15878 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
15882 else if (unformat (input, "locator-set %s", &locator_set_name))
15884 locator_set_name_set = 1;
15886 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
15888 else if (unformat (input, "secret-key %_%v%_", &key))
15894 if (locator_set_name_set == 0)
15896 errmsg ("missing locator-set name");
15902 errmsg ("EID address not set!");
15903 vec_free (locator_set_name);
15907 if (key && (0 == key_id))
15909 errmsg ("invalid key_id!");
15913 if (vec_len (key) > 64)
15915 errmsg ("key too long");
15920 if (vec_len (locator_set_name) > 64)
15922 errmsg ("locator-set name too long");
15923 vec_free (locator_set_name);
15926 vec_add1 (locator_set_name, 0);
15928 /* Construct the API message */
15929 M (ONE_ADD_DEL_LOCAL_EID, mp);
15931 mp->is_add = is_add;
15932 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
15933 mp->eid_type = eid->type;
15934 mp->prefix_len = eid->len;
15935 mp->vni = clib_host_to_net_u32 (vni);
15936 mp->key_id = clib_host_to_net_u16 (key_id);
15937 clib_memcpy (mp->locator_set_name, locator_set_name,
15938 vec_len (locator_set_name));
15939 clib_memcpy (mp->key, key, vec_len (key));
15941 vec_free (locator_set_name);
15947 /* Wait for a reply... */
15952 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
15955 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
15957 u32 dp_table = 0, vni = 0;;
15958 unformat_input_t *input = vam->input;
15959 vl_api_gpe_add_del_fwd_entry_t *mp;
15961 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
15962 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
15963 u8 rmt_eid_set = 0, lcl_eid_set = 0;
15964 u32 action = ~0, w;
15965 ip4_address_t rmt_rloc4, lcl_rloc4;
15966 ip6_address_t rmt_rloc6, lcl_rloc6;
15967 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
15970 clib_memset (&rloc, 0, sizeof (rloc));
15972 /* Parse args required to build the message */
15973 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15975 if (unformat (input, "del"))
15977 else if (unformat (input, "add"))
15979 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
15983 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
15987 else if (unformat (input, "vrf %d", &dp_table))
15989 else if (unformat (input, "bd %d", &dp_table))
15991 else if (unformat (input, "vni %d", &vni))
15993 else if (unformat (input, "w %d", &w))
15997 errmsg ("No RLOC configured for setting priority/weight!");
16000 curr_rloc->weight = w;
16002 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
16003 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
16007 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
16009 vec_add1 (lcl_locs, rloc);
16011 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
16012 vec_add1 (rmt_locs, rloc);
16013 /* weight saved in rmt loc */
16014 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16016 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
16017 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
16020 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
16022 vec_add1 (lcl_locs, rloc);
16024 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
16025 vec_add1 (rmt_locs, rloc);
16026 /* weight saved in rmt loc */
16027 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16029 else if (unformat (input, "action %d", &action))
16035 clib_warning ("parse error '%U'", format_unformat_error, input);
16042 errmsg ("remote eid addresses not set");
16046 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
16048 errmsg ("eid types don't match");
16052 if (0 == rmt_locs && (u32) ~ 0 == action)
16054 errmsg ("action not set for negative mapping");
16058 /* Construct the API message */
16059 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
16060 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
16062 mp->is_add = is_add;
16063 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
16064 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
16065 mp->eid_type = rmt_eid->type;
16066 mp->dp_table = clib_host_to_net_u32 (dp_table);
16067 mp->vni = clib_host_to_net_u32 (vni);
16068 mp->rmt_len = rmt_eid->len;
16069 mp->lcl_len = lcl_eid->len;
16070 mp->action = action;
16072 if (0 != rmt_locs && 0 != lcl_locs)
16074 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
16075 clib_memcpy (mp->locs, lcl_locs,
16076 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
16078 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
16079 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
16080 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
16082 vec_free (lcl_locs);
16083 vec_free (rmt_locs);
16088 /* Wait for a reply... */
16094 api_one_add_del_map_server (vat_main_t * vam)
16096 unformat_input_t *input = vam->input;
16097 vl_api_one_add_del_map_server_t *mp;
16101 ip4_address_t ipv4;
16102 ip6_address_t ipv6;
16105 /* Parse args required to build the message */
16106 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16108 if (unformat (input, "del"))
16112 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16116 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16124 if (ipv4_set && ipv6_set)
16126 errmsg ("both eid v4 and v6 addresses set");
16130 if (!ipv4_set && !ipv6_set)
16132 errmsg ("eid addresses not set");
16136 /* Construct the API message */
16137 M (ONE_ADD_DEL_MAP_SERVER, mp);
16139 mp->is_add = is_add;
16143 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16148 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16154 /* Wait for a reply... */
16159 #define api_lisp_add_del_map_server api_one_add_del_map_server
16162 api_one_add_del_map_resolver (vat_main_t * vam)
16164 unformat_input_t *input = vam->input;
16165 vl_api_one_add_del_map_resolver_t *mp;
16169 ip4_address_t ipv4;
16170 ip6_address_t ipv6;
16173 /* Parse args required to build the message */
16174 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16176 if (unformat (input, "del"))
16180 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16184 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16192 if (ipv4_set && ipv6_set)
16194 errmsg ("both eid v4 and v6 addresses set");
16198 if (!ipv4_set && !ipv6_set)
16200 errmsg ("eid addresses not set");
16204 /* Construct the API message */
16205 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
16207 mp->is_add = is_add;
16211 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16216 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16222 /* Wait for a reply... */
16227 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
16230 api_lisp_gpe_enable_disable (vat_main_t * vam)
16232 unformat_input_t *input = vam->input;
16233 vl_api_gpe_enable_disable_t *mp;
16238 /* Parse args required to build the message */
16239 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16241 if (unformat (input, "enable"))
16246 else if (unformat (input, "disable"))
16257 errmsg ("Value not set");
16261 /* Construct the API message */
16262 M (GPE_ENABLE_DISABLE, mp);
16269 /* Wait for a reply... */
16275 api_one_rloc_probe_enable_disable (vat_main_t * vam)
16277 unformat_input_t *input = vam->input;
16278 vl_api_one_rloc_probe_enable_disable_t *mp;
16283 /* Parse args required to build the message */
16284 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16286 if (unformat (input, "enable"))
16291 else if (unformat (input, "disable"))
16299 errmsg ("Value not set");
16303 /* Construct the API message */
16304 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
16306 mp->is_enabled = is_en;
16311 /* Wait for a reply... */
16316 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
16319 api_one_map_register_enable_disable (vat_main_t * vam)
16321 unformat_input_t *input = vam->input;
16322 vl_api_one_map_register_enable_disable_t *mp;
16327 /* Parse args required to build the message */
16328 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16330 if (unformat (input, "enable"))
16335 else if (unformat (input, "disable"))
16343 errmsg ("Value not set");
16347 /* Construct the API message */
16348 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
16350 mp->is_enabled = is_en;
16355 /* Wait for a reply... */
16360 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
16363 api_one_enable_disable (vat_main_t * vam)
16365 unformat_input_t *input = vam->input;
16366 vl_api_one_enable_disable_t *mp;
16371 /* Parse args required to build the message */
16372 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16374 if (unformat (input, "enable"))
16379 else if (unformat (input, "disable"))
16389 errmsg ("Value not set");
16393 /* Construct the API message */
16394 M (ONE_ENABLE_DISABLE, mp);
16401 /* Wait for a reply... */
16406 #define api_lisp_enable_disable api_one_enable_disable
16409 api_one_enable_disable_xtr_mode (vat_main_t * vam)
16411 unformat_input_t *input = vam->input;
16412 vl_api_one_enable_disable_xtr_mode_t *mp;
16417 /* Parse args required to build the message */
16418 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16420 if (unformat (input, "enable"))
16425 else if (unformat (input, "disable"))
16435 errmsg ("Value not set");
16439 /* Construct the API message */
16440 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
16447 /* Wait for a reply... */
16453 api_one_show_xtr_mode (vat_main_t * vam)
16455 vl_api_one_show_xtr_mode_t *mp;
16458 /* Construct the API message */
16459 M (ONE_SHOW_XTR_MODE, mp);
16464 /* Wait for a reply... */
16470 api_one_enable_disable_pitr_mode (vat_main_t * vam)
16472 unformat_input_t *input = vam->input;
16473 vl_api_one_enable_disable_pitr_mode_t *mp;
16478 /* Parse args required to build the message */
16479 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16481 if (unformat (input, "enable"))
16486 else if (unformat (input, "disable"))
16496 errmsg ("Value not set");
16500 /* Construct the API message */
16501 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
16508 /* Wait for a reply... */
16514 api_one_show_pitr_mode (vat_main_t * vam)
16516 vl_api_one_show_pitr_mode_t *mp;
16519 /* Construct the API message */
16520 M (ONE_SHOW_PITR_MODE, mp);
16525 /* Wait for a reply... */
16531 api_one_enable_disable_petr_mode (vat_main_t * vam)
16533 unformat_input_t *input = vam->input;
16534 vl_api_one_enable_disable_petr_mode_t *mp;
16539 /* Parse args required to build the message */
16540 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16542 if (unformat (input, "enable"))
16547 else if (unformat (input, "disable"))
16557 errmsg ("Value not set");
16561 /* Construct the API message */
16562 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
16569 /* Wait for a reply... */
16575 api_one_show_petr_mode (vat_main_t * vam)
16577 vl_api_one_show_petr_mode_t *mp;
16580 /* Construct the API message */
16581 M (ONE_SHOW_PETR_MODE, mp);
16586 /* Wait for a reply... */
16592 api_show_one_map_register_state (vat_main_t * vam)
16594 vl_api_show_one_map_register_state_t *mp;
16597 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
16602 /* wait for reply */
16607 #define api_show_lisp_map_register_state api_show_one_map_register_state
16610 api_show_one_rloc_probe_state (vat_main_t * vam)
16612 vl_api_show_one_rloc_probe_state_t *mp;
16615 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
16620 /* wait for reply */
16625 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
16628 api_one_add_del_ndp_entry (vat_main_t * vam)
16630 vl_api_one_add_del_ndp_entry_t *mp;
16631 unformat_input_t *input = vam->input;
16636 u8 mac[6] = { 0, };
16637 u8 ip6[16] = { 0, };
16641 /* Parse args required to build the message */
16642 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16644 if (unformat (input, "del"))
16646 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16648 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
16650 else if (unformat (input, "bd %d", &bd))
16654 errmsg ("parse error '%U'", format_unformat_error, input);
16659 if (!bd_set || !ip_set || (!mac_set && is_add))
16661 errmsg ("Missing BD, IP or MAC!");
16665 M (ONE_ADD_DEL_NDP_ENTRY, mp);
16666 mp->is_add = is_add;
16667 clib_memcpy (mp->mac, mac, 6);
16668 mp->bd = clib_host_to_net_u32 (bd);
16669 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
16674 /* wait for reply */
16680 api_one_add_del_l2_arp_entry (vat_main_t * vam)
16682 vl_api_one_add_del_l2_arp_entry_t *mp;
16683 unformat_input_t *input = vam->input;
16688 u8 mac[6] = { 0, };
16689 u32 ip4 = 0, bd = ~0;
16692 /* Parse args required to build the message */
16693 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16695 if (unformat (input, "del"))
16697 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16699 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
16701 else if (unformat (input, "bd %d", &bd))
16705 errmsg ("parse error '%U'", format_unformat_error, input);
16710 if (!bd_set || !ip_set || (!mac_set && is_add))
16712 errmsg ("Missing BD, IP or MAC!");
16716 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
16717 mp->is_add = is_add;
16718 clib_memcpy (mp->mac, mac, 6);
16719 mp->bd = clib_host_to_net_u32 (bd);
16725 /* wait for reply */
16731 api_one_ndp_bd_get (vat_main_t * vam)
16733 vl_api_one_ndp_bd_get_t *mp;
16736 M (ONE_NDP_BD_GET, mp);
16741 /* wait for reply */
16747 api_one_ndp_entries_get (vat_main_t * vam)
16749 vl_api_one_ndp_entries_get_t *mp;
16750 unformat_input_t *input = vam->input;
16755 /* Parse args required to build the message */
16756 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16758 if (unformat (input, "bd %d", &bd))
16762 errmsg ("parse error '%U'", format_unformat_error, input);
16769 errmsg ("Expected bridge domain!");
16773 M (ONE_NDP_ENTRIES_GET, mp);
16774 mp->bd = clib_host_to_net_u32 (bd);
16779 /* wait for reply */
16785 api_one_l2_arp_bd_get (vat_main_t * vam)
16787 vl_api_one_l2_arp_bd_get_t *mp;
16790 M (ONE_L2_ARP_BD_GET, mp);
16795 /* wait for reply */
16801 api_one_l2_arp_entries_get (vat_main_t * vam)
16803 vl_api_one_l2_arp_entries_get_t *mp;
16804 unformat_input_t *input = vam->input;
16809 /* Parse args required to build the message */
16810 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16812 if (unformat (input, "bd %d", &bd))
16816 errmsg ("parse error '%U'", format_unformat_error, input);
16823 errmsg ("Expected bridge domain!");
16827 M (ONE_L2_ARP_ENTRIES_GET, mp);
16828 mp->bd = clib_host_to_net_u32 (bd);
16833 /* wait for reply */
16839 api_one_stats_enable_disable (vat_main_t * vam)
16841 vl_api_one_stats_enable_disable_t *mp;
16842 unformat_input_t *input = vam->input;
16847 /* Parse args required to build the message */
16848 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16850 if (unformat (input, "enable"))
16855 else if (unformat (input, "disable"))
16865 errmsg ("Value not set");
16869 M (ONE_STATS_ENABLE_DISABLE, mp);
16875 /* wait for reply */
16881 api_show_one_stats_enable_disable (vat_main_t * vam)
16883 vl_api_show_one_stats_enable_disable_t *mp;
16886 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
16891 /* wait for reply */
16897 api_show_one_map_request_mode (vat_main_t * vam)
16899 vl_api_show_one_map_request_mode_t *mp;
16902 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
16907 /* wait for reply */
16912 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
16915 api_one_map_request_mode (vat_main_t * vam)
16917 unformat_input_t *input = vam->input;
16918 vl_api_one_map_request_mode_t *mp;
16922 /* Parse args required to build the message */
16923 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16925 if (unformat (input, "dst-only"))
16927 else if (unformat (input, "src-dst"))
16931 errmsg ("parse error '%U'", format_unformat_error, input);
16936 M (ONE_MAP_REQUEST_MODE, mp);
16943 /* wait for reply */
16948 #define api_lisp_map_request_mode api_one_map_request_mode
16951 * Enable/disable ONE proxy ITR.
16953 * @param vam vpp API test context
16954 * @return return code
16957 api_one_pitr_set_locator_set (vat_main_t * vam)
16959 u8 ls_name_set = 0;
16960 unformat_input_t *input = vam->input;
16961 vl_api_one_pitr_set_locator_set_t *mp;
16966 /* Parse args required to build the message */
16967 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16969 if (unformat (input, "del"))
16971 else if (unformat (input, "locator-set %s", &ls_name))
16975 errmsg ("parse error '%U'", format_unformat_error, input);
16982 errmsg ("locator-set name not set!");
16986 M (ONE_PITR_SET_LOCATOR_SET, mp);
16988 mp->is_add = is_add;
16989 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
16990 vec_free (ls_name);
16995 /* wait for reply */
17000 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
17003 api_one_nsh_set_locator_set (vat_main_t * vam)
17005 u8 ls_name_set = 0;
17006 unformat_input_t *input = vam->input;
17007 vl_api_one_nsh_set_locator_set_t *mp;
17012 /* Parse args required to build the message */
17013 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17015 if (unformat (input, "del"))
17017 else if (unformat (input, "ls %s", &ls_name))
17021 errmsg ("parse error '%U'", format_unformat_error, input);
17026 if (!ls_name_set && is_add)
17028 errmsg ("locator-set name not set!");
17032 M (ONE_NSH_SET_LOCATOR_SET, mp);
17034 mp->is_add = is_add;
17035 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17036 vec_free (ls_name);
17041 /* wait for reply */
17047 api_show_one_pitr (vat_main_t * vam)
17049 vl_api_show_one_pitr_t *mp;
17052 if (!vam->json_output)
17054 print (vam->ofp, "%=20s", "lisp status:");
17057 M (SHOW_ONE_PITR, mp);
17061 /* Wait for a reply... */
17066 #define api_show_lisp_pitr api_show_one_pitr
17069 api_one_use_petr (vat_main_t * vam)
17071 unformat_input_t *input = vam->input;
17072 vl_api_one_use_petr_t *mp;
17077 clib_memset (&ip, 0, sizeof (ip));
17079 /* Parse args required to build the message */
17080 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17082 if (unformat (input, "disable"))
17085 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
17088 ip_addr_version (&ip) = IP4;
17091 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
17094 ip_addr_version (&ip) = IP6;
17098 errmsg ("parse error '%U'", format_unformat_error, input);
17103 M (ONE_USE_PETR, mp);
17105 mp->is_add = is_add;
17108 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
17110 clib_memcpy (mp->address, &ip, 4);
17112 clib_memcpy (mp->address, &ip, 16);
17118 /* wait for reply */
17123 #define api_lisp_use_petr api_one_use_petr
17126 api_show_one_nsh_mapping (vat_main_t * vam)
17128 vl_api_show_one_use_petr_t *mp;
17131 if (!vam->json_output)
17133 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
17136 M (SHOW_ONE_NSH_MAPPING, mp);
17140 /* Wait for a reply... */
17146 api_show_one_use_petr (vat_main_t * vam)
17148 vl_api_show_one_use_petr_t *mp;
17151 if (!vam->json_output)
17153 print (vam->ofp, "%=20s", "Proxy-ETR status:");
17156 M (SHOW_ONE_USE_PETR, mp);
17160 /* Wait for a reply... */
17165 #define api_show_lisp_use_petr api_show_one_use_petr
17168 * Add/delete mapping between vni and vrf
17171 api_one_eid_table_add_del_map (vat_main_t * vam)
17173 unformat_input_t *input = vam->input;
17174 vl_api_one_eid_table_add_del_map_t *mp;
17175 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
17176 u32 vni, vrf, bd_index;
17179 /* Parse args required to build the message */
17180 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17182 if (unformat (input, "del"))
17184 else if (unformat (input, "vrf %d", &vrf))
17186 else if (unformat (input, "bd_index %d", &bd_index))
17188 else if (unformat (input, "vni %d", &vni))
17194 if (!vni_set || (!vrf_set && !bd_index_set))
17196 errmsg ("missing arguments!");
17200 if (vrf_set && bd_index_set)
17202 errmsg ("error: both vrf and bd entered!");
17206 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
17208 mp->is_add = is_add;
17209 mp->vni = htonl (vni);
17210 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
17211 mp->is_l2 = bd_index_set;
17216 /* wait for reply */
17221 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
17224 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
17226 u32 *action = va_arg (*args, u32 *);
17229 if (unformat (input, "%s", &s))
17231 if (!strcmp ((char *) s, "no-action"))
17233 else if (!strcmp ((char *) s, "natively-forward"))
17235 else if (!strcmp ((char *) s, "send-map-request"))
17237 else if (!strcmp ((char *) s, "drop"))
17241 clib_warning ("invalid action: '%s'", s);
17253 * Add/del remote mapping to/from ONE control plane
17255 * @param vam vpp API test context
17256 * @return return code
17259 api_one_add_del_remote_mapping (vat_main_t * vam)
17261 unformat_input_t *input = vam->input;
17262 vl_api_one_add_del_remote_mapping_t *mp;
17264 lisp_eid_vat_t _eid, *eid = &_eid;
17265 lisp_eid_vat_t _seid, *seid = &_seid;
17266 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
17267 u32 action = ~0, p, w, data_len;
17268 ip4_address_t rloc4;
17269 ip6_address_t rloc6;
17270 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
17273 clib_memset (&rloc, 0, sizeof (rloc));
17275 /* Parse args required to build the message */
17276 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17278 if (unformat (input, "del-all"))
17282 else if (unformat (input, "del"))
17286 else if (unformat (input, "add"))
17290 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
17294 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
17298 else if (unformat (input, "vni %d", &vni))
17302 else if (unformat (input, "p %d w %d", &p, &w))
17306 errmsg ("No RLOC configured for setting priority/weight!");
17309 curr_rloc->priority = p;
17310 curr_rloc->weight = w;
17312 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
17315 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
17316 vec_add1 (rlocs, rloc);
17317 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17319 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
17322 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
17323 vec_add1 (rlocs, rloc);
17324 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17326 else if (unformat (input, "action %U",
17327 unformat_negative_mapping_action, &action))
17333 clib_warning ("parse error '%U'", format_unformat_error, input);
17340 errmsg ("missing params!");
17344 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
17346 errmsg ("no action set for negative map-reply!");
17350 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
17352 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
17353 mp->is_add = is_add;
17354 mp->vni = htonl (vni);
17355 mp->action = (u8) action;
17356 mp->is_src_dst = seid_set;
17357 mp->eid_len = eid->len;
17358 mp->seid_len = seid->len;
17359 mp->del_all = del_all;
17360 mp->eid_type = eid->type;
17361 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
17362 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
17364 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
17365 clib_memcpy (mp->rlocs, rlocs, data_len);
17371 /* Wait for a reply... */
17376 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
17379 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
17380 * forwarding entries in data-plane accordingly.
17382 * @param vam vpp API test context
17383 * @return return code
17386 api_one_add_del_adjacency (vat_main_t * vam)
17388 unformat_input_t *input = vam->input;
17389 vl_api_one_add_del_adjacency_t *mp;
17391 ip4_address_t leid4, reid4;
17392 ip6_address_t leid6, reid6;
17393 u8 reid_mac[6] = { 0 };
17394 u8 leid_mac[6] = { 0 };
17395 u8 reid_type, leid_type;
17396 u32 leid_len = 0, reid_len = 0, len;
17400 leid_type = reid_type = (u8) ~ 0;
17402 /* Parse args required to build the message */
17403 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17405 if (unformat (input, "del"))
17409 else if (unformat (input, "add"))
17413 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
17416 reid_type = 0; /* ipv4 */
17419 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
17422 reid_type = 1; /* ipv6 */
17425 else if (unformat (input, "reid %U", unformat_ethernet_address,
17428 reid_type = 2; /* mac */
17430 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
17433 leid_type = 0; /* ipv4 */
17436 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
17439 leid_type = 1; /* ipv6 */
17442 else if (unformat (input, "leid %U", unformat_ethernet_address,
17445 leid_type = 2; /* mac */
17447 else if (unformat (input, "vni %d", &vni))
17453 errmsg ("parse error '%U'", format_unformat_error, input);
17458 if ((u8) ~ 0 == reid_type)
17460 errmsg ("missing params!");
17464 if (leid_type != reid_type)
17466 errmsg ("remote and local EIDs are of different types!");
17470 M (ONE_ADD_DEL_ADJACENCY, mp);
17471 mp->is_add = is_add;
17472 mp->vni = htonl (vni);
17473 mp->leid_len = leid_len;
17474 mp->reid_len = reid_len;
17475 mp->eid_type = reid_type;
17477 switch (mp->eid_type)
17480 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
17481 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
17484 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
17485 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
17488 clib_memcpy (mp->leid, leid_mac, 6);
17489 clib_memcpy (mp->reid, reid_mac, 6);
17492 errmsg ("unknown EID type %d!", mp->eid_type);
17499 /* Wait for a reply... */
17504 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
17507 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
17509 u32 *mode = va_arg (*args, u32 *);
17511 if (unformat (input, "lisp"))
17513 else if (unformat (input, "vxlan"))
17522 api_gpe_get_encap_mode (vat_main_t * vam)
17524 vl_api_gpe_get_encap_mode_t *mp;
17527 /* Construct the API message */
17528 M (GPE_GET_ENCAP_MODE, mp);
17533 /* Wait for a reply... */
17539 api_gpe_set_encap_mode (vat_main_t * vam)
17541 unformat_input_t *input = vam->input;
17542 vl_api_gpe_set_encap_mode_t *mp;
17546 /* Parse args required to build the message */
17547 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17549 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
17555 /* Construct the API message */
17556 M (GPE_SET_ENCAP_MODE, mp);
17563 /* Wait for a reply... */
17569 api_lisp_gpe_add_del_iface (vat_main_t * vam)
17571 unformat_input_t *input = vam->input;
17572 vl_api_gpe_add_del_iface_t *mp;
17573 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
17574 u32 dp_table = 0, vni = 0;
17577 /* Parse args required to build the message */
17578 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17580 if (unformat (input, "up"))
17585 else if (unformat (input, "down"))
17590 else if (unformat (input, "table_id %d", &dp_table))
17594 else if (unformat (input, "bd_id %d", &dp_table))
17599 else if (unformat (input, "vni %d", &vni))
17607 if (action_set == 0)
17609 errmsg ("Action not set");
17612 if (dp_table_set == 0 || vni_set == 0)
17614 errmsg ("vni and dp_table must be set");
17618 /* Construct the API message */
17619 M (GPE_ADD_DEL_IFACE, mp);
17621 mp->is_add = is_add;
17622 mp->dp_table = clib_host_to_net_u32 (dp_table);
17624 mp->vni = clib_host_to_net_u32 (vni);
17629 /* Wait for a reply... */
17635 api_one_map_register_fallback_threshold (vat_main_t * vam)
17637 unformat_input_t *input = vam->input;
17638 vl_api_one_map_register_fallback_threshold_t *mp;
17643 /* Parse args required to build the message */
17644 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17646 if (unformat (input, "%u", &value))
17650 clib_warning ("parse error '%U'", format_unformat_error, input);
17657 errmsg ("fallback threshold value is missing!");
17661 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17662 mp->value = clib_host_to_net_u32 (value);
17667 /* Wait for a reply... */
17673 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
17675 vl_api_show_one_map_register_fallback_threshold_t *mp;
17678 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17683 /* Wait for a reply... */
17689 unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
17691 u32 *proto = va_arg (*args, u32 *);
17693 if (unformat (input, "udp"))
17695 else if (unformat (input, "api"))
17704 api_one_set_transport_protocol (vat_main_t * vam)
17706 unformat_input_t *input = vam->input;
17707 vl_api_one_set_transport_protocol_t *mp;
17712 /* Parse args required to build the message */
17713 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17715 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
17719 clib_warning ("parse error '%U'", format_unformat_error, input);
17726 errmsg ("Transport protocol missing!");
17730 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
17731 mp->protocol = (u8) protocol;
17736 /* Wait for a reply... */
17742 api_one_get_transport_protocol (vat_main_t * vam)
17744 vl_api_one_get_transport_protocol_t *mp;
17747 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
17752 /* Wait for a reply... */
17758 api_one_map_register_set_ttl (vat_main_t * vam)
17760 unformat_input_t *input = vam->input;
17761 vl_api_one_map_register_set_ttl_t *mp;
17766 /* Parse args required to build the message */
17767 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17769 if (unformat (input, "%u", &ttl))
17773 clib_warning ("parse error '%U'", format_unformat_error, input);
17780 errmsg ("TTL value missing!");
17784 M (ONE_MAP_REGISTER_SET_TTL, mp);
17785 mp->ttl = clib_host_to_net_u32 (ttl);
17790 /* Wait for a reply... */
17796 api_show_one_map_register_ttl (vat_main_t * vam)
17798 vl_api_show_one_map_register_ttl_t *mp;
17801 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
17806 /* Wait for a reply... */
17812 * Add/del map request itr rlocs from ONE control plane and updates
17814 * @param vam vpp API test context
17815 * @return return code
17818 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
17820 unformat_input_t *input = vam->input;
17821 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
17822 u8 *locator_set_name = 0;
17823 u8 locator_set_name_set = 0;
17827 /* Parse args required to build the message */
17828 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17830 if (unformat (input, "del"))
17834 else if (unformat (input, "%_%v%_", &locator_set_name))
17836 locator_set_name_set = 1;
17840 clib_warning ("parse error '%U'", format_unformat_error, input);
17845 if (is_add && !locator_set_name_set)
17847 errmsg ("itr-rloc is not set!");
17851 if (is_add && vec_len (locator_set_name) > 64)
17853 errmsg ("itr-rloc locator-set name too long");
17854 vec_free (locator_set_name);
17858 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
17859 mp->is_add = is_add;
17862 clib_memcpy (mp->locator_set_name, locator_set_name,
17863 vec_len (locator_set_name));
17867 clib_memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
17869 vec_free (locator_set_name);
17874 /* Wait for a reply... */
17879 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
17882 api_one_locator_dump (vat_main_t * vam)
17884 unformat_input_t *input = vam->input;
17885 vl_api_one_locator_dump_t *mp;
17886 vl_api_control_ping_t *mp_ping;
17887 u8 is_index_set = 0, is_name_set = 0;
17892 /* Parse args required to build the message */
17893 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17895 if (unformat (input, "ls_name %_%v%_", &ls_name))
17899 else if (unformat (input, "ls_index %d", &ls_index))
17905 errmsg ("parse error '%U'", format_unformat_error, input);
17910 if (!is_index_set && !is_name_set)
17912 errmsg ("error: expected one of index or name!");
17916 if (is_index_set && is_name_set)
17918 errmsg ("error: only one param expected!");
17922 if (vec_len (ls_name) > 62)
17924 errmsg ("error: locator set name too long!");
17928 if (!vam->json_output)
17930 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
17933 M (ONE_LOCATOR_DUMP, mp);
17934 mp->is_index_set = is_index_set;
17937 mp->ls_index = clib_host_to_net_u32 (ls_index);
17940 vec_add1 (ls_name, 0);
17941 strncpy ((char *) mp->ls_name, (char *) ls_name,
17942 sizeof (mp->ls_name) - 1);
17948 /* Use a control ping for synchronization */
17949 MPING (CONTROL_PING, mp_ping);
17952 /* Wait for a reply... */
17957 #define api_lisp_locator_dump api_one_locator_dump
17960 api_one_locator_set_dump (vat_main_t * vam)
17962 vl_api_one_locator_set_dump_t *mp;
17963 vl_api_control_ping_t *mp_ping;
17964 unformat_input_t *input = vam->input;
17968 /* Parse args required to build the message */
17969 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17971 if (unformat (input, "local"))
17975 else if (unformat (input, "remote"))
17981 errmsg ("parse error '%U'", format_unformat_error, input);
17986 if (!vam->json_output)
17988 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
17991 M (ONE_LOCATOR_SET_DUMP, mp);
17993 mp->filter = filter;
17998 /* Use a control ping for synchronization */
17999 MPING (CONTROL_PING, mp_ping);
18002 /* Wait for a reply... */
18007 #define api_lisp_locator_set_dump api_one_locator_set_dump
18010 api_one_eid_table_map_dump (vat_main_t * vam)
18014 unformat_input_t *input = vam->input;
18015 vl_api_one_eid_table_map_dump_t *mp;
18016 vl_api_control_ping_t *mp_ping;
18019 /* Parse args required to build the message */
18020 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18022 if (unformat (input, "l2"))
18027 else if (unformat (input, "l3"))
18034 errmsg ("parse error '%U'", format_unformat_error, input);
18041 errmsg ("expected one of 'l2' or 'l3' parameter!");
18045 if (!vam->json_output)
18047 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
18050 M (ONE_EID_TABLE_MAP_DUMP, mp);
18056 /* Use a control ping for synchronization */
18057 MPING (CONTROL_PING, mp_ping);
18060 /* Wait for a reply... */
18065 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
18068 api_one_eid_table_vni_dump (vat_main_t * vam)
18070 vl_api_one_eid_table_vni_dump_t *mp;
18071 vl_api_control_ping_t *mp_ping;
18074 if (!vam->json_output)
18076 print (vam->ofp, "VNI");
18079 M (ONE_EID_TABLE_VNI_DUMP, mp);
18084 /* Use a control ping for synchronization */
18085 MPING (CONTROL_PING, mp_ping);
18088 /* Wait for a reply... */
18093 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
18096 api_one_eid_table_dump (vat_main_t * vam)
18098 unformat_input_t *i = vam->input;
18099 vl_api_one_eid_table_dump_t *mp;
18100 vl_api_control_ping_t *mp_ping;
18101 struct in_addr ip4;
18102 struct in6_addr ip6;
18104 u8 eid_type = ~0, eid_set = 0;
18105 u32 prefix_length = ~0, t, vni = 0;
18108 lisp_nsh_api_t nsh;
18110 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18112 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
18118 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
18124 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
18129 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
18134 else if (unformat (i, "vni %d", &t))
18138 else if (unformat (i, "local"))
18142 else if (unformat (i, "remote"))
18148 errmsg ("parse error '%U'", format_unformat_error, i);
18153 if (!vam->json_output)
18155 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
18156 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
18159 M (ONE_EID_TABLE_DUMP, mp);
18161 mp->filter = filter;
18165 mp->vni = htonl (vni);
18166 mp->eid_type = eid_type;
18170 mp->prefix_length = prefix_length;
18171 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
18174 mp->prefix_length = prefix_length;
18175 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
18178 clib_memcpy (mp->eid, mac, sizeof (mac));
18181 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
18184 errmsg ("unknown EID type %d!", eid_type);
18192 /* Use a control ping for synchronization */
18193 MPING (CONTROL_PING, mp_ping);
18196 /* Wait for a reply... */
18201 #define api_lisp_eid_table_dump api_one_eid_table_dump
18204 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
18206 unformat_input_t *i = vam->input;
18207 vl_api_gpe_fwd_entries_get_t *mp;
18212 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18214 if (unformat (i, "vni %d", &vni))
18220 errmsg ("parse error '%U'", format_unformat_error, i);
18227 errmsg ("vni not set!");
18231 if (!vam->json_output)
18233 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
18237 M (GPE_FWD_ENTRIES_GET, mp);
18238 mp->vni = clib_host_to_net_u32 (vni);
18243 /* Wait for a reply... */
18248 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
18249 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
18250 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
18251 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
18252 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
18253 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
18254 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
18255 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
18258 api_one_adjacencies_get (vat_main_t * vam)
18260 unformat_input_t *i = vam->input;
18261 vl_api_one_adjacencies_get_t *mp;
18266 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18268 if (unformat (i, "vni %d", &vni))
18274 errmsg ("parse error '%U'", format_unformat_error, i);
18281 errmsg ("vni not set!");
18285 if (!vam->json_output)
18287 print (vam->ofp, "%s %40s", "leid", "reid");
18290 M (ONE_ADJACENCIES_GET, mp);
18291 mp->vni = clib_host_to_net_u32 (vni);
18296 /* Wait for a reply... */
18301 #define api_lisp_adjacencies_get api_one_adjacencies_get
18304 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
18306 unformat_input_t *i = vam->input;
18307 vl_api_gpe_native_fwd_rpaths_get_t *mp;
18309 u8 ip_family_set = 0, is_ip4 = 1;
18311 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18313 if (unformat (i, "ip4"))
18318 else if (unformat (i, "ip6"))
18325 errmsg ("parse error '%U'", format_unformat_error, i);
18330 if (!ip_family_set)
18332 errmsg ("ip family not set!");
18336 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
18337 mp->is_ip4 = is_ip4;
18342 /* Wait for a reply... */
18348 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
18350 vl_api_gpe_fwd_entry_vnis_get_t *mp;
18353 if (!vam->json_output)
18355 print (vam->ofp, "VNIs");
18358 M (GPE_FWD_ENTRY_VNIS_GET, mp);
18363 /* Wait for a reply... */
18369 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
18371 unformat_input_t *i = vam->input;
18372 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
18374 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
18375 struct in_addr ip4;
18376 struct in6_addr ip6;
18377 u32 table_id = 0, nh_sw_if_index = ~0;
18379 clib_memset (&ip4, 0, sizeof (ip4));
18380 clib_memset (&ip6, 0, sizeof (ip6));
18382 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18384 if (unformat (i, "del"))
18386 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
18387 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18392 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
18393 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18398 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
18402 nh_sw_if_index = ~0;
18404 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
18408 nh_sw_if_index = ~0;
18410 else if (unformat (i, "table %d", &table_id))
18414 errmsg ("parse error '%U'", format_unformat_error, i);
18421 errmsg ("nh addr not set!");
18425 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
18426 mp->is_add = is_add;
18427 mp->table_id = clib_host_to_net_u32 (table_id);
18428 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
18429 mp->is_ip4 = is_ip4;
18431 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
18433 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
18438 /* Wait for a reply... */
18444 api_one_map_server_dump (vat_main_t * vam)
18446 vl_api_one_map_server_dump_t *mp;
18447 vl_api_control_ping_t *mp_ping;
18450 if (!vam->json_output)
18452 print (vam->ofp, "%=20s", "Map server");
18455 M (ONE_MAP_SERVER_DUMP, mp);
18459 /* Use a control ping for synchronization */
18460 MPING (CONTROL_PING, mp_ping);
18463 /* Wait for a reply... */
18468 #define api_lisp_map_server_dump api_one_map_server_dump
18471 api_one_map_resolver_dump (vat_main_t * vam)
18473 vl_api_one_map_resolver_dump_t *mp;
18474 vl_api_control_ping_t *mp_ping;
18477 if (!vam->json_output)
18479 print (vam->ofp, "%=20s", "Map resolver");
18482 M (ONE_MAP_RESOLVER_DUMP, mp);
18486 /* Use a control ping for synchronization */
18487 MPING (CONTROL_PING, mp_ping);
18490 /* Wait for a reply... */
18495 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
18498 api_one_stats_flush (vat_main_t * vam)
18500 vl_api_one_stats_flush_t *mp;
18503 M (ONE_STATS_FLUSH, mp);
18510 api_one_stats_dump (vat_main_t * vam)
18512 vl_api_one_stats_dump_t *mp;
18513 vl_api_control_ping_t *mp_ping;
18516 M (ONE_STATS_DUMP, mp);
18520 /* Use a control ping for synchronization */
18521 MPING (CONTROL_PING, mp_ping);
18524 /* Wait for a reply... */
18530 api_show_one_status (vat_main_t * vam)
18532 vl_api_show_one_status_t *mp;
18535 if (!vam->json_output)
18537 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
18540 M (SHOW_ONE_STATUS, mp);
18543 /* Wait for a reply... */
18548 #define api_show_lisp_status api_show_one_status
18551 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
18553 vl_api_gpe_fwd_entry_path_dump_t *mp;
18554 vl_api_control_ping_t *mp_ping;
18555 unformat_input_t *i = vam->input;
18556 u32 fwd_entry_index = ~0;
18559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18561 if (unformat (i, "index %d", &fwd_entry_index))
18567 if (~0 == fwd_entry_index)
18569 errmsg ("no index specified!");
18573 if (!vam->json_output)
18575 print (vam->ofp, "first line");
18578 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
18582 /* Use a control ping for synchronization */
18583 MPING (CONTROL_PING, mp_ping);
18586 /* Wait for a reply... */
18592 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
18594 vl_api_one_get_map_request_itr_rlocs_t *mp;
18597 if (!vam->json_output)
18599 print (vam->ofp, "%=20s", "itr-rlocs:");
18602 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
18605 /* Wait for a reply... */
18610 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
18613 api_af_packet_create (vat_main_t * vam)
18615 unformat_input_t *i = vam->input;
18616 vl_api_af_packet_create_t *mp;
18617 u8 *host_if_name = 0;
18619 u8 random_hw_addr = 1;
18622 clib_memset (hw_addr, 0, sizeof (hw_addr));
18624 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18626 if (unformat (i, "name %s", &host_if_name))
18627 vec_add1 (host_if_name, 0);
18628 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
18629 random_hw_addr = 0;
18634 if (!vec_len (host_if_name))
18636 errmsg ("host-interface name must be specified");
18640 if (vec_len (host_if_name) > 64)
18642 errmsg ("host-interface name too long");
18646 M (AF_PACKET_CREATE, mp);
18648 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18649 clib_memcpy (mp->hw_addr, hw_addr, 6);
18650 mp->use_random_hw_addr = random_hw_addr;
18651 vec_free (host_if_name);
18659 fprintf (vam->ofp ? vam->ofp : stderr,
18660 " new sw_if_index = %d\n", vam->sw_if_index);
18667 api_af_packet_delete (vat_main_t * vam)
18669 unformat_input_t *i = vam->input;
18670 vl_api_af_packet_delete_t *mp;
18671 u8 *host_if_name = 0;
18674 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18676 if (unformat (i, "name %s", &host_if_name))
18677 vec_add1 (host_if_name, 0);
18682 if (!vec_len (host_if_name))
18684 errmsg ("host-interface name must be specified");
18688 if (vec_len (host_if_name) > 64)
18690 errmsg ("host-interface name too long");
18694 M (AF_PACKET_DELETE, mp);
18696 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18697 vec_free (host_if_name);
18704 static void vl_api_af_packet_details_t_handler
18705 (vl_api_af_packet_details_t * mp)
18707 vat_main_t *vam = &vat_main;
18709 print (vam->ofp, "%-16s %d",
18710 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
18713 static void vl_api_af_packet_details_t_handler_json
18714 (vl_api_af_packet_details_t * mp)
18716 vat_main_t *vam = &vat_main;
18717 vat_json_node_t *node = NULL;
18719 if (VAT_JSON_ARRAY != vam->json_tree.type)
18721 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18722 vat_json_init_array (&vam->json_tree);
18724 node = vat_json_array_add (&vam->json_tree);
18726 vat_json_init_object (node);
18727 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
18728 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
18732 api_af_packet_dump (vat_main_t * vam)
18734 vl_api_af_packet_dump_t *mp;
18735 vl_api_control_ping_t *mp_ping;
18738 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
18739 /* Get list of tap interfaces */
18740 M (AF_PACKET_DUMP, mp);
18743 /* Use a control ping for synchronization */
18744 MPING (CONTROL_PING, mp_ping);
18752 api_policer_add_del (vat_main_t * vam)
18754 unformat_input_t *i = vam->input;
18755 vl_api_policer_add_del_t *mp;
18765 u8 color_aware = 0;
18766 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
18769 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
18770 conform_action.dscp = 0;
18771 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
18772 exceed_action.dscp = 0;
18773 violate_action.action_type = SSE2_QOS_ACTION_DROP;
18774 violate_action.dscp = 0;
18776 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18778 if (unformat (i, "del"))
18780 else if (unformat (i, "name %s", &name))
18781 vec_add1 (name, 0);
18782 else if (unformat (i, "cir %u", &cir))
18784 else if (unformat (i, "eir %u", &eir))
18786 else if (unformat (i, "cb %u", &cb))
18788 else if (unformat (i, "eb %u", &eb))
18790 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
18793 else if (unformat (i, "round_type %U", unformat_policer_round_type,
18796 else if (unformat (i, "type %U", unformat_policer_type, &type))
18798 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
18801 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
18804 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
18807 else if (unformat (i, "color-aware"))
18813 if (!vec_len (name))
18815 errmsg ("policer name must be specified");
18819 if (vec_len (name) > 64)
18821 errmsg ("policer name too long");
18825 M (POLICER_ADD_DEL, mp);
18827 clib_memcpy (mp->name, name, vec_len (name));
18829 mp->is_add = is_add;
18830 mp->cir = ntohl (cir);
18831 mp->eir = ntohl (eir);
18832 mp->cb = clib_net_to_host_u64 (cb);
18833 mp->eb = clib_net_to_host_u64 (eb);
18834 mp->rate_type = rate_type;
18835 mp->round_type = round_type;
18837 mp->conform_action_type = conform_action.action_type;
18838 mp->conform_dscp = conform_action.dscp;
18839 mp->exceed_action_type = exceed_action.action_type;
18840 mp->exceed_dscp = exceed_action.dscp;
18841 mp->violate_action_type = violate_action.action_type;
18842 mp->violate_dscp = violate_action.dscp;
18843 mp->color_aware = color_aware;
18851 api_policer_dump (vat_main_t * vam)
18853 unformat_input_t *i = vam->input;
18854 vl_api_policer_dump_t *mp;
18855 vl_api_control_ping_t *mp_ping;
18856 u8 *match_name = 0;
18857 u8 match_name_valid = 0;
18860 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18862 if (unformat (i, "name %s", &match_name))
18864 vec_add1 (match_name, 0);
18865 match_name_valid = 1;
18871 M (POLICER_DUMP, mp);
18872 mp->match_name_valid = match_name_valid;
18873 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
18874 vec_free (match_name);
18878 /* Use a control ping for synchronization */
18879 MPING (CONTROL_PING, mp_ping);
18882 /* Wait for a reply... */
18888 api_policer_classify_set_interface (vat_main_t * vam)
18890 unformat_input_t *i = vam->input;
18891 vl_api_policer_classify_set_interface_t *mp;
18893 int sw_if_index_set;
18894 u32 ip4_table_index = ~0;
18895 u32 ip6_table_index = ~0;
18896 u32 l2_table_index = ~0;
18900 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18902 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
18903 sw_if_index_set = 1;
18904 else if (unformat (i, "sw_if_index %d", &sw_if_index))
18905 sw_if_index_set = 1;
18906 else if (unformat (i, "del"))
18908 else if (unformat (i, "ip4-table %d", &ip4_table_index))
18910 else if (unformat (i, "ip6-table %d", &ip6_table_index))
18912 else if (unformat (i, "l2-table %d", &l2_table_index))
18916 clib_warning ("parse error '%U'", format_unformat_error, i);
18921 if (sw_if_index_set == 0)
18923 errmsg ("missing interface name or sw_if_index");
18927 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
18929 mp->sw_if_index = ntohl (sw_if_index);
18930 mp->ip4_table_index = ntohl (ip4_table_index);
18931 mp->ip6_table_index = ntohl (ip6_table_index);
18932 mp->l2_table_index = ntohl (l2_table_index);
18933 mp->is_add = is_add;
18941 api_policer_classify_dump (vat_main_t * vam)
18943 unformat_input_t *i = vam->input;
18944 vl_api_policer_classify_dump_t *mp;
18945 vl_api_control_ping_t *mp_ping;
18946 u8 type = POLICER_CLASSIFY_N_TABLES;
18949 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
18953 errmsg ("classify table type must be specified");
18957 if (!vam->json_output)
18959 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
18962 M (POLICER_CLASSIFY_DUMP, mp);
18967 /* Use a control ping for synchronization */
18968 MPING (CONTROL_PING, mp_ping);
18971 /* Wait for a reply... */
18977 api_netmap_create (vat_main_t * vam)
18979 unformat_input_t *i = vam->input;
18980 vl_api_netmap_create_t *mp;
18983 u8 random_hw_addr = 1;
18988 clib_memset (hw_addr, 0, sizeof (hw_addr));
18990 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18992 if (unformat (i, "name %s", &if_name))
18993 vec_add1 (if_name, 0);
18994 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
18995 random_hw_addr = 0;
18996 else if (unformat (i, "pipe"))
18998 else if (unformat (i, "master"))
19000 else if (unformat (i, "slave"))
19006 if (!vec_len (if_name))
19008 errmsg ("interface name must be specified");
19012 if (vec_len (if_name) > 64)
19014 errmsg ("interface name too long");
19018 M (NETMAP_CREATE, mp);
19020 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19021 clib_memcpy (mp->hw_addr, hw_addr, 6);
19022 mp->use_random_hw_addr = random_hw_addr;
19023 mp->is_pipe = is_pipe;
19024 mp->is_master = is_master;
19025 vec_free (if_name);
19033 api_netmap_delete (vat_main_t * vam)
19035 unformat_input_t *i = vam->input;
19036 vl_api_netmap_delete_t *mp;
19040 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19042 if (unformat (i, "name %s", &if_name))
19043 vec_add1 (if_name, 0);
19048 if (!vec_len (if_name))
19050 errmsg ("interface name must be specified");
19054 if (vec_len (if_name) > 64)
19056 errmsg ("interface name too long");
19060 M (NETMAP_DELETE, mp);
19062 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19063 vec_free (if_name);
19071 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
19073 if (fp->afi == IP46_TYPE_IP6)
19075 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19076 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19077 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19078 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19079 format_ip6_address, fp->next_hop);
19080 else if (fp->afi == IP46_TYPE_IP4)
19082 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19083 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19084 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
19085 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19086 format_ip4_address, fp->next_hop);
19090 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
19091 vl_api_fib_path_t * fp)
19093 struct in_addr ip4;
19094 struct in6_addr ip6;
19096 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19097 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19098 vat_json_object_add_uint (node, "is_local", fp->is_local);
19099 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19100 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19101 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19102 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19103 if (fp->afi == IP46_TYPE_IP4)
19105 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19106 vat_json_object_add_ip4 (node, "next_hop", ip4);
19108 else if (fp->afi == IP46_TYPE_IP6)
19110 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19111 vat_json_object_add_ip6 (node, "next_hop", ip6);
19116 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
19118 vat_main_t *vam = &vat_main;
19119 int count = ntohl (mp->mt_count);
19120 vl_api_fib_path_t *fp;
19123 print (vam->ofp, "[%d]: sw_if_index %d via:",
19124 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
19126 for (i = 0; i < count; i++)
19128 vl_api_mpls_fib_path_print (vam, fp);
19132 print (vam->ofp, "");
19135 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
19136 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
19139 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
19141 vat_main_t *vam = &vat_main;
19142 vat_json_node_t *node = NULL;
19143 int count = ntohl (mp->mt_count);
19144 vl_api_fib_path_t *fp;
19147 if (VAT_JSON_ARRAY != vam->json_tree.type)
19149 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19150 vat_json_init_array (&vam->json_tree);
19152 node = vat_json_array_add (&vam->json_tree);
19154 vat_json_init_object (node);
19155 vat_json_object_add_uint (node, "tunnel_index",
19156 ntohl (mp->mt_tunnel_index));
19157 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
19159 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
19162 for (i = 0; i < count; i++)
19164 vl_api_mpls_fib_path_json_print (node, fp);
19170 api_mpls_tunnel_dump (vat_main_t * vam)
19172 vl_api_mpls_tunnel_dump_t *mp;
19173 vl_api_control_ping_t *mp_ping;
19174 u32 sw_if_index = ~0;
19177 /* Parse args required to build the message */
19178 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
19180 if (unformat (vam->input, "sw_if_index %d", &sw_if_index))
19184 print (vam->ofp, " sw_if_index %d", sw_if_index);
19186 M (MPLS_TUNNEL_DUMP, mp);
19187 mp->sw_if_index = htonl (sw_if_index);
19190 /* Use a control ping for synchronization */
19191 MPING (CONTROL_PING, mp_ping);
19198 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
19199 #define vl_api_mpls_fib_details_t_print vl_noop_handler
19203 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
19205 vat_main_t *vam = &vat_main;
19206 int count = ntohl (mp->count);
19207 vl_api_fib_path_t *fp;
19211 "table-id %d, label %u, ess_bit %u",
19212 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
19214 for (i = 0; i < count; i++)
19216 vl_api_mpls_fib_path_print (vam, fp);
19221 static void vl_api_mpls_fib_details_t_handler_json
19222 (vl_api_mpls_fib_details_t * mp)
19224 vat_main_t *vam = &vat_main;
19225 int count = ntohl (mp->count);
19226 vat_json_node_t *node = NULL;
19227 vl_api_fib_path_t *fp;
19230 if (VAT_JSON_ARRAY != vam->json_tree.type)
19232 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19233 vat_json_init_array (&vam->json_tree);
19235 node = vat_json_array_add (&vam->json_tree);
19237 vat_json_init_object (node);
19238 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19239 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
19240 vat_json_object_add_uint (node, "label", ntohl (mp->label));
19241 vat_json_object_add_uint (node, "path_count", count);
19243 for (i = 0; i < count; i++)
19245 vl_api_mpls_fib_path_json_print (node, fp);
19251 api_mpls_fib_dump (vat_main_t * vam)
19253 vl_api_mpls_fib_dump_t *mp;
19254 vl_api_control_ping_t *mp_ping;
19257 M (MPLS_FIB_DUMP, mp);
19260 /* Use a control ping for synchronization */
19261 MPING (CONTROL_PING, mp_ping);
19268 #define vl_api_ip_fib_details_t_endian vl_noop_handler
19269 #define vl_api_ip_fib_details_t_print vl_noop_handler
19272 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
19274 vat_main_t *vam = &vat_main;
19275 int count = ntohl (mp->count);
19276 vl_api_fib_path_t *fp;
19280 "table-id %d, prefix %U/%d stats-index %d",
19281 ntohl (mp->table_id), format_ip4_address, mp->address,
19282 mp->address_length, ntohl (mp->stats_index));
19284 for (i = 0; i < count; i++)
19286 if (fp->afi == IP46_TYPE_IP6)
19288 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19289 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19290 "next_hop_table %d",
19291 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19292 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19293 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
19294 else if (fp->afi == IP46_TYPE_IP4)
19296 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19297 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19298 "next_hop_table %d",
19299 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19300 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19301 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
19306 static void vl_api_ip_fib_details_t_handler_json
19307 (vl_api_ip_fib_details_t * mp)
19309 vat_main_t *vam = &vat_main;
19310 int count = ntohl (mp->count);
19311 vat_json_node_t *node = NULL;
19312 struct in_addr ip4;
19313 struct in6_addr ip6;
19314 vl_api_fib_path_t *fp;
19317 if (VAT_JSON_ARRAY != vam->json_tree.type)
19319 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19320 vat_json_init_array (&vam->json_tree);
19322 node = vat_json_array_add (&vam->json_tree);
19324 vat_json_init_object (node);
19325 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19326 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
19327 vat_json_object_add_ip4 (node, "prefix", ip4);
19328 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19329 vat_json_object_add_uint (node, "path_count", count);
19331 for (i = 0; i < count; i++)
19333 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19334 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19335 vat_json_object_add_uint (node, "is_local", fp->is_local);
19336 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19337 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19338 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19339 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19340 if (fp->afi == IP46_TYPE_IP4)
19342 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19343 vat_json_object_add_ip4 (node, "next_hop", ip4);
19345 else if (fp->afi == IP46_TYPE_IP6)
19347 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19348 vat_json_object_add_ip6 (node, "next_hop", ip6);
19354 api_ip_fib_dump (vat_main_t * vam)
19356 vl_api_ip_fib_dump_t *mp;
19357 vl_api_control_ping_t *mp_ping;
19360 M (IP_FIB_DUMP, mp);
19363 /* Use a control ping for synchronization */
19364 MPING (CONTROL_PING, mp_ping);
19372 api_ip_mfib_dump (vat_main_t * vam)
19374 vl_api_ip_mfib_dump_t *mp;
19375 vl_api_control_ping_t *mp_ping;
19378 M (IP_MFIB_DUMP, mp);
19381 /* Use a control ping for synchronization */
19382 MPING (CONTROL_PING, mp_ping);
19389 static void vl_api_ip_neighbor_details_t_handler
19390 (vl_api_ip_neighbor_details_t * mp)
19392 vat_main_t *vam = &vat_main;
19394 print (vam->ofp, "%c %U %U",
19395 (ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ? 'S' : 'D',
19396 format_vl_api_mac_address, &mp->neighbor.mac_address,
19397 format_vl_api_address, &mp->neighbor.ip_address);
19400 static void vl_api_ip_neighbor_details_t_handler_json
19401 (vl_api_ip_neighbor_details_t * mp)
19404 vat_main_t *vam = &vat_main;
19405 vat_json_node_t *node;
19407 if (VAT_JSON_ARRAY != vam->json_tree.type)
19409 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19410 vat_json_init_array (&vam->json_tree);
19412 node = vat_json_array_add (&vam->json_tree);
19414 vat_json_init_object (node);
19415 vat_json_object_add_string_copy
19417 ((ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ?
19418 (u8 *) "static" : (u8 *) "dynamic"));
19420 vat_json_object_add_string_copy (node, "link_layer",
19421 format (0, "%U", format_vl_api_mac_address,
19422 &mp->neighbor.mac_address));
19423 vat_json_object_add_address (node, "ip", &mp->neighbor.ip_address);
19427 api_ip_neighbor_dump (vat_main_t * vam)
19429 unformat_input_t *i = vam->input;
19430 vl_api_ip_neighbor_dump_t *mp;
19431 vl_api_control_ping_t *mp_ping;
19433 u32 sw_if_index = ~0;
19436 /* Parse args required to build the message */
19437 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19439 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19441 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19443 else if (unformat (i, "ip6"))
19449 if (sw_if_index == ~0)
19451 errmsg ("missing interface name or sw_if_index");
19455 M (IP_NEIGHBOR_DUMP, mp);
19456 mp->is_ipv6 = (u8) is_ipv6;
19457 mp->sw_if_index = ntohl (sw_if_index);
19460 /* Use a control ping for synchronization */
19461 MPING (CONTROL_PING, mp_ping);
19468 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
19469 #define vl_api_ip6_fib_details_t_print vl_noop_handler
19472 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
19474 vat_main_t *vam = &vat_main;
19475 int count = ntohl (mp->count);
19476 vl_api_fib_path_t *fp;
19480 "table-id %d, prefix %U/%d stats-index %d",
19481 ntohl (mp->table_id), format_ip6_address, mp->address,
19482 mp->address_length, ntohl (mp->stats_index));
19484 for (i = 0; i < count; i++)
19486 if (fp->afi == IP46_TYPE_IP6)
19488 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19489 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19490 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19491 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19492 format_ip6_address, fp->next_hop);
19493 else if (fp->afi == IP46_TYPE_IP4)
19495 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19496 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19497 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19498 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19499 format_ip4_address, fp->next_hop);
19504 static void vl_api_ip6_fib_details_t_handler_json
19505 (vl_api_ip6_fib_details_t * mp)
19507 vat_main_t *vam = &vat_main;
19508 int count = ntohl (mp->count);
19509 vat_json_node_t *node = NULL;
19510 struct in_addr ip4;
19511 struct in6_addr ip6;
19512 vl_api_fib_path_t *fp;
19515 if (VAT_JSON_ARRAY != vam->json_tree.type)
19517 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19518 vat_json_init_array (&vam->json_tree);
19520 node = vat_json_array_add (&vam->json_tree);
19522 vat_json_init_object (node);
19523 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19524 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
19525 vat_json_object_add_ip6 (node, "prefix", ip6);
19526 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19527 vat_json_object_add_uint (node, "path_count", count);
19529 for (i = 0; i < count; i++)
19531 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19532 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19533 vat_json_object_add_uint (node, "is_local", fp->is_local);
19534 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19535 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19536 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19537 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19538 if (fp->afi == IP46_TYPE_IP4)
19540 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19541 vat_json_object_add_ip4 (node, "next_hop", ip4);
19543 else if (fp->afi == IP46_TYPE_IP6)
19545 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19546 vat_json_object_add_ip6 (node, "next_hop", ip6);
19552 api_ip6_fib_dump (vat_main_t * vam)
19554 vl_api_ip6_fib_dump_t *mp;
19555 vl_api_control_ping_t *mp_ping;
19558 M (IP6_FIB_DUMP, mp);
19561 /* Use a control ping for synchronization */
19562 MPING (CONTROL_PING, mp_ping);
19570 api_ip6_mfib_dump (vat_main_t * vam)
19572 vl_api_ip6_mfib_dump_t *mp;
19573 vl_api_control_ping_t *mp_ping;
19576 M (IP6_MFIB_DUMP, mp);
19579 /* Use a control ping for synchronization */
19580 MPING (CONTROL_PING, mp_ping);
19588 api_classify_table_ids (vat_main_t * vam)
19590 vl_api_classify_table_ids_t *mp;
19593 /* Construct the API message */
19594 M (CLASSIFY_TABLE_IDS, mp);
19603 api_classify_table_by_interface (vat_main_t * vam)
19605 unformat_input_t *input = vam->input;
19606 vl_api_classify_table_by_interface_t *mp;
19608 u32 sw_if_index = ~0;
19610 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19612 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19614 else if (unformat (input, "sw_if_index %d", &sw_if_index))
19619 if (sw_if_index == ~0)
19621 errmsg ("missing interface name or sw_if_index");
19625 /* Construct the API message */
19626 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
19628 mp->sw_if_index = ntohl (sw_if_index);
19636 api_classify_table_info (vat_main_t * vam)
19638 unformat_input_t *input = vam->input;
19639 vl_api_classify_table_info_t *mp;
19643 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19645 if (unformat (input, "table_id %d", &table_id))
19650 if (table_id == ~0)
19652 errmsg ("missing table id");
19656 /* Construct the API message */
19657 M (CLASSIFY_TABLE_INFO, mp);
19659 mp->table_id = ntohl (table_id);
19667 api_classify_session_dump (vat_main_t * vam)
19669 unformat_input_t *input = vam->input;
19670 vl_api_classify_session_dump_t *mp;
19671 vl_api_control_ping_t *mp_ping;
19675 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19677 if (unformat (input, "table_id %d", &table_id))
19682 if (table_id == ~0)
19684 errmsg ("missing table id");
19688 /* Construct the API message */
19689 M (CLASSIFY_SESSION_DUMP, mp);
19691 mp->table_id = ntohl (table_id);
19694 /* Use a control ping for synchronization */
19695 MPING (CONTROL_PING, mp_ping);
19703 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
19705 vat_main_t *vam = &vat_main;
19707 print (vam->ofp, "collector_address %U, collector_port %d, "
19708 "src_address %U, vrf_id %d, path_mtu %u, "
19709 "template_interval %u, udp_checksum %d",
19710 format_ip4_address, mp->collector_address,
19711 ntohs (mp->collector_port),
19712 format_ip4_address, mp->src_address,
19713 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
19714 ntohl (mp->template_interval), mp->udp_checksum);
19717 vam->result_ready = 1;
19721 vl_api_ipfix_exporter_details_t_handler_json
19722 (vl_api_ipfix_exporter_details_t * mp)
19724 vat_main_t *vam = &vat_main;
19725 vat_json_node_t node;
19726 struct in_addr collector_address;
19727 struct in_addr src_address;
19729 vat_json_init_object (&node);
19730 clib_memcpy (&collector_address, &mp->collector_address,
19731 sizeof (collector_address));
19732 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
19733 vat_json_object_add_uint (&node, "collector_port",
19734 ntohs (mp->collector_port));
19735 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
19736 vat_json_object_add_ip4 (&node, "src_address", src_address);
19737 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
19738 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
19739 vat_json_object_add_uint (&node, "template_interval",
19740 ntohl (mp->template_interval));
19741 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
19743 vat_json_print (vam->ofp, &node);
19744 vat_json_free (&node);
19746 vam->result_ready = 1;
19750 api_ipfix_exporter_dump (vat_main_t * vam)
19752 vl_api_ipfix_exporter_dump_t *mp;
19755 /* Construct the API message */
19756 M (IPFIX_EXPORTER_DUMP, mp);
19765 api_ipfix_classify_stream_dump (vat_main_t * vam)
19767 vl_api_ipfix_classify_stream_dump_t *mp;
19770 /* Construct the API message */
19771 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
19782 vl_api_ipfix_classify_stream_details_t_handler
19783 (vl_api_ipfix_classify_stream_details_t * mp)
19785 vat_main_t *vam = &vat_main;
19786 print (vam->ofp, "domain_id %d, src_port %d",
19787 ntohl (mp->domain_id), ntohs (mp->src_port));
19789 vam->result_ready = 1;
19793 vl_api_ipfix_classify_stream_details_t_handler_json
19794 (vl_api_ipfix_classify_stream_details_t * mp)
19796 vat_main_t *vam = &vat_main;
19797 vat_json_node_t node;
19799 vat_json_init_object (&node);
19800 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
19801 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
19803 vat_json_print (vam->ofp, &node);
19804 vat_json_free (&node);
19806 vam->result_ready = 1;
19810 api_ipfix_classify_table_dump (vat_main_t * vam)
19812 vl_api_ipfix_classify_table_dump_t *mp;
19813 vl_api_control_ping_t *mp_ping;
19816 if (!vam->json_output)
19818 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
19819 "transport_protocol");
19822 /* Construct the API message */
19823 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
19828 /* Use a control ping for synchronization */
19829 MPING (CONTROL_PING, mp_ping);
19837 vl_api_ipfix_classify_table_details_t_handler
19838 (vl_api_ipfix_classify_table_details_t * mp)
19840 vat_main_t *vam = &vat_main;
19841 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
19842 mp->transport_protocol);
19846 vl_api_ipfix_classify_table_details_t_handler_json
19847 (vl_api_ipfix_classify_table_details_t * mp)
19849 vat_json_node_t *node = NULL;
19850 vat_main_t *vam = &vat_main;
19852 if (VAT_JSON_ARRAY != vam->json_tree.type)
19854 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19855 vat_json_init_array (&vam->json_tree);
19858 node = vat_json_array_add (&vam->json_tree);
19859 vat_json_init_object (node);
19861 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
19862 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
19863 vat_json_object_add_uint (node, "transport_protocol",
19864 mp->transport_protocol);
19868 api_sw_interface_span_enable_disable (vat_main_t * vam)
19870 unformat_input_t *i = vam->input;
19871 vl_api_sw_interface_span_enable_disable_t *mp;
19872 u32 src_sw_if_index = ~0;
19873 u32 dst_sw_if_index = ~0;
19878 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19881 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
19883 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
19887 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
19889 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
19891 else if (unformat (i, "disable"))
19893 else if (unformat (i, "rx"))
19895 else if (unformat (i, "tx"))
19897 else if (unformat (i, "both"))
19899 else if (unformat (i, "l2"))
19905 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
19907 mp->sw_if_index_from = htonl (src_sw_if_index);
19908 mp->sw_if_index_to = htonl (dst_sw_if_index);
19918 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
19921 vat_main_t *vam = &vat_main;
19922 u8 *sw_if_from_name = 0;
19923 u8 *sw_if_to_name = 0;
19924 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19925 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19926 char *states[] = { "none", "rx", "tx", "both" };
19930 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19932 if ((u32) p->value[0] == sw_if_index_from)
19934 sw_if_from_name = (u8 *)(p->key);
19938 if ((u32) p->value[0] == sw_if_index_to)
19940 sw_if_to_name = (u8 *)(p->key);
19941 if (sw_if_from_name)
19946 print (vam->ofp, "%20s => %20s (%s) %s",
19947 sw_if_from_name, sw_if_to_name, states[mp->state],
19948 mp->is_l2 ? "l2" : "device");
19952 vl_api_sw_interface_span_details_t_handler_json
19953 (vl_api_sw_interface_span_details_t * mp)
19955 vat_main_t *vam = &vat_main;
19956 vat_json_node_t *node = NULL;
19957 u8 *sw_if_from_name = 0;
19958 u8 *sw_if_to_name = 0;
19959 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19960 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19964 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19966 if ((u32) p->value[0] == sw_if_index_from)
19968 sw_if_from_name = (u8 *)(p->key);
19972 if ((u32) p->value[0] == sw_if_index_to)
19974 sw_if_to_name = (u8 *)(p->key);
19975 if (sw_if_from_name)
19981 if (VAT_JSON_ARRAY != vam->json_tree.type)
19983 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19984 vat_json_init_array (&vam->json_tree);
19986 node = vat_json_array_add (&vam->json_tree);
19988 vat_json_init_object (node);
19989 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
19990 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
19991 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
19992 if (0 != sw_if_to_name)
19994 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
19996 vat_json_object_add_uint (node, "state", mp->state);
19997 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
20001 api_sw_interface_span_dump (vat_main_t * vam)
20003 unformat_input_t *input = vam->input;
20004 vl_api_sw_interface_span_dump_t *mp;
20005 vl_api_control_ping_t *mp_ping;
20009 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20011 if (unformat (input, "l2"))
20017 M (SW_INTERFACE_SPAN_DUMP, mp);
20021 /* Use a control ping for synchronization */
20022 MPING (CONTROL_PING, mp_ping);
20030 api_pg_create_interface (vat_main_t * vam)
20032 unformat_input_t *input = vam->input;
20033 vl_api_pg_create_interface_t *mp;
20037 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20039 if (unformat (input, "if_id %d", &if_id))
20046 errmsg ("missing pg interface index");
20050 /* Construct the API message */
20051 M (PG_CREATE_INTERFACE, mp);
20053 mp->interface_id = ntohl (if_id);
20061 api_pg_capture (vat_main_t * vam)
20063 unformat_input_t *input = vam->input;
20064 vl_api_pg_capture_t *mp;
20069 u8 pcap_file_set = 0;
20072 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20074 if (unformat (input, "if_id %d", &if_id))
20076 else if (unformat (input, "pcap %s", &pcap_file))
20078 else if (unformat (input, "count %d", &count))
20080 else if (unformat (input, "disable"))
20087 errmsg ("missing pg interface index");
20090 if (pcap_file_set > 0)
20092 if (vec_len (pcap_file) > 255)
20094 errmsg ("pcap file name is too long");
20099 u32 name_len = vec_len (pcap_file);
20100 /* Construct the API message */
20101 M (PG_CAPTURE, mp);
20103 mp->interface_id = ntohl (if_id);
20104 mp->is_enabled = enable;
20105 mp->count = ntohl (count);
20106 mp->pcap_name_length = ntohl (name_len);
20107 if (pcap_file_set != 0)
20109 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
20111 vec_free (pcap_file);
20119 api_pg_enable_disable (vat_main_t * vam)
20121 unformat_input_t *input = vam->input;
20122 vl_api_pg_enable_disable_t *mp;
20125 u8 stream_name_set = 0;
20126 u8 *stream_name = 0;
20128 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20130 if (unformat (input, "stream %s", &stream_name))
20131 stream_name_set = 1;
20132 else if (unformat (input, "disable"))
20138 if (stream_name_set > 0)
20140 if (vec_len (stream_name) > 255)
20142 errmsg ("stream name too long");
20147 u32 name_len = vec_len (stream_name);
20148 /* Construct the API message */
20149 M (PG_ENABLE_DISABLE, mp);
20151 mp->is_enabled = enable;
20152 if (stream_name_set != 0)
20154 mp->stream_name_length = ntohl (name_len);
20155 clib_memcpy (mp->stream_name, stream_name, name_len);
20157 vec_free (stream_name);
20165 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
20167 unformat_input_t *input = vam->input;
20168 vl_api_ip_source_and_port_range_check_add_del_t *mp;
20170 u16 *low_ports = 0;
20171 u16 *high_ports = 0;
20174 vl_api_prefix_t prefix;
20182 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20184 if (unformat (input, "%U", unformat_vl_api_prefix, &prefix))
20186 else if (unformat (input, "vrf %d", &vrf_id))
20188 else if (unformat (input, "del"))
20190 else if (unformat (input, "port %d", &tmp))
20192 if (tmp == 0 || tmp > 65535)
20194 errmsg ("port %d out of range", tmp);
20198 this_hi = this_low + 1;
20199 vec_add1 (low_ports, this_low);
20200 vec_add1 (high_ports, this_hi);
20202 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
20204 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
20206 errmsg ("incorrect range parameters");
20210 /* Note: in debug CLI +1 is added to high before
20211 passing to real fn that does "the work"
20212 (ip_source_and_port_range_check_add_del).
20213 This fn is a wrapper around the binary API fn a
20214 control plane will call, which expects this increment
20215 to have occurred. Hence letting the binary API control
20216 plane fn do the increment for consistency between VAT
20217 and other control planes.
20220 vec_add1 (low_ports, this_low);
20221 vec_add1 (high_ports, this_hi);
20227 if (prefix_set == 0)
20229 errmsg ("<address>/<mask> not specified");
20235 errmsg ("VRF ID required, not specified");
20242 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20246 if (vec_len (low_ports) == 0)
20248 errmsg ("At least one port or port range required");
20252 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
20254 mp->is_add = is_add;
20256 clib_memcpy (&mp->prefix, &prefix, sizeof (prefix));
20258 mp->number_of_ranges = vec_len (low_ports);
20260 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
20261 vec_free (low_ports);
20263 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
20264 vec_free (high_ports);
20266 mp->vrf_id = ntohl (vrf_id);
20274 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
20276 unformat_input_t *input = vam->input;
20277 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
20278 u32 sw_if_index = ~0;
20280 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
20281 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
20285 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20287 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20289 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20291 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
20293 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
20295 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
20297 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
20299 else if (unformat (input, "del"))
20305 if (sw_if_index == ~0)
20307 errmsg ("Interface required but not specified");
20313 errmsg ("VRF ID required but not specified");
20317 if (tcp_out_vrf_id == 0
20318 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
20321 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20325 /* Construct the API message */
20326 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
20328 mp->sw_if_index = ntohl (sw_if_index);
20329 mp->is_add = is_add;
20330 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
20331 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
20332 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
20333 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
20338 /* Wait for a reply... */
20344 api_ipsec_gre_tunnel_add_del (vat_main_t * vam)
20346 unformat_input_t *i = vam->input;
20347 vl_api_ipsec_gre_tunnel_add_del_t *mp;
20348 u32 local_sa_id = 0;
20349 u32 remote_sa_id = 0;
20350 vl_api_ip4_address_t src_address;
20351 vl_api_ip4_address_t dst_address;
20355 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20357 if (unformat (i, "local_sa %d", &local_sa_id))
20359 else if (unformat (i, "remote_sa %d", &remote_sa_id))
20362 if (unformat (i, "src %U", unformat_vl_api_ip4_address, &src_address))
20365 if (unformat (i, "dst %U", unformat_vl_api_ip4_address, &dst_address))
20367 else if (unformat (i, "del"))
20371 clib_warning ("parse error '%U'", format_unformat_error, i);
20376 M (IPSEC_GRE_TUNNEL_ADD_DEL, mp);
20378 mp->tunnel.local_sa_id = ntohl (local_sa_id);
20379 mp->tunnel.remote_sa_id = ntohl (remote_sa_id);
20380 clib_memcpy (mp->tunnel.src, &src_address, sizeof (src_address));
20381 clib_memcpy (mp->tunnel.dst, &dst_address, sizeof (dst_address));
20382 mp->is_add = is_add;
20390 api_set_punt (vat_main_t * vam)
20392 unformat_input_t *i = vam->input;
20393 vl_api_set_punt_t *mp;
20400 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20402 if (unformat (i, "ip %d", &ipv))
20404 else if (unformat (i, "protocol %d", &protocol))
20406 else if (unformat (i, "port %d", &port))
20408 else if (unformat (i, "del"))
20412 clib_warning ("parse error '%U'", format_unformat_error, i);
20419 mp->is_add = (u8) is_add;
20420 mp->punt.ipv = (u8) ipv;
20421 mp->punt.l4_protocol = (u8) protocol;
20422 mp->punt.l4_port = htons ((u16) port);
20429 static void vl_api_ipsec_gre_tunnel_details_t_handler
20430 (vl_api_ipsec_gre_tunnel_details_t * mp)
20432 vat_main_t *vam = &vat_main;
20434 print (vam->ofp, "%11d%15U%15U%14d%14d",
20435 ntohl (mp->tunnel.sw_if_index),
20436 format_vl_api_ip4_address, mp->tunnel.src,
20437 format_vl_api_ip4_address, mp->tunnel.dst,
20438 ntohl (mp->tunnel.local_sa_id), ntohl (mp->tunnel.remote_sa_id));
20442 vat_json_object_add_vl_api_ip4 (vat_json_node_t * node,
20444 const vl_api_ip4_address_t addr)
20446 struct in_addr ip4;
20448 clib_memcpy (&ip4, addr, sizeof (ip4));
20449 vat_json_object_add_ip4 (node, name, ip4);
20452 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
20453 (vl_api_ipsec_gre_tunnel_details_t * mp)
20455 vat_main_t *vam = &vat_main;
20456 vat_json_node_t *node = NULL;
20457 struct in_addr ip4;
20459 if (VAT_JSON_ARRAY != vam->json_tree.type)
20461 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20462 vat_json_init_array (&vam->json_tree);
20464 node = vat_json_array_add (&vam->json_tree);
20466 vat_json_init_object (node);
20467 vat_json_object_add_uint (node, "sw_if_index",
20468 ntohl (mp->tunnel.sw_if_index));
20469 vat_json_object_add_vl_api_ip4 (node, "src", mp->tunnel.src);
20470 vat_json_object_add_vl_api_ip4 (node, "src", mp->tunnel.dst);
20471 vat_json_object_add_uint (node, "local_sa_id",
20472 ntohl (mp->tunnel.local_sa_id));
20473 vat_json_object_add_uint (node, "remote_sa_id",
20474 ntohl (mp->tunnel.remote_sa_id));
20478 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
20480 unformat_input_t *i = vam->input;
20481 vl_api_ipsec_gre_tunnel_dump_t *mp;
20482 vl_api_control_ping_t *mp_ping;
20484 u8 sw_if_index_set = 0;
20487 /* Parse args required to build the message */
20488 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20490 if (unformat (i, "sw_if_index %d", &sw_if_index))
20491 sw_if_index_set = 1;
20496 if (sw_if_index_set == 0)
20501 if (!vam->json_output)
20503 print (vam->ofp, "%11s%15s%15s%14s%14s",
20504 "sw_if_index", "src_address", "dst_address",
20505 "local_sa_id", "remote_sa_id");
20508 /* Get list of gre-tunnel interfaces */
20509 M (IPSEC_GRE_TUNNEL_DUMP, mp);
20511 mp->sw_if_index = htonl (sw_if_index);
20515 /* Use a control ping for synchronization */
20516 MPING (CONTROL_PING, mp_ping);
20524 api_delete_subif (vat_main_t * vam)
20526 unformat_input_t *i = vam->input;
20527 vl_api_delete_subif_t *mp;
20528 u32 sw_if_index = ~0;
20531 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20533 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20535 if (unformat (i, "sw_if_index %d", &sw_if_index))
20541 if (sw_if_index == ~0)
20543 errmsg ("missing sw_if_index");
20547 /* Construct the API message */
20548 M (DELETE_SUBIF, mp);
20549 mp->sw_if_index = ntohl (sw_if_index);
20556 #define foreach_pbb_vtr_op \
20557 _("disable", L2_VTR_DISABLED) \
20558 _("pop", L2_VTR_POP_2) \
20559 _("push", L2_VTR_PUSH_2)
20562 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
20564 unformat_input_t *i = vam->input;
20565 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
20566 u32 sw_if_index = ~0, vtr_op = ~0;
20567 u16 outer_tag = ~0;
20568 u8 dmac[6], smac[6];
20569 u8 dmac_set = 0, smac_set = 0;
20575 /* Shut up coverity */
20576 clib_memset (dmac, 0, sizeof (dmac));
20577 clib_memset (smac, 0, sizeof (smac));
20579 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20581 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20583 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20585 else if (unformat (i, "vtr_op %d", &vtr_op))
20587 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
20590 else if (unformat (i, "translate_pbb_stag"))
20592 if (unformat (i, "%d", &tmp))
20594 vtr_op = L2_VTR_TRANSLATE_2_1;
20600 ("translate_pbb_stag operation requires outer tag definition");
20604 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
20606 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
20608 else if (unformat (i, "sid %d", &sid))
20610 else if (unformat (i, "vlanid %d", &tmp))
20614 clib_warning ("parse error '%U'", format_unformat_error, i);
20619 if ((sw_if_index == ~0) || (vtr_op == ~0))
20621 errmsg ("missing sw_if_index or vtr operation");
20624 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
20625 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
20628 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
20632 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
20633 mp->sw_if_index = ntohl (sw_if_index);
20634 mp->vtr_op = ntohl (vtr_op);
20635 mp->outer_tag = ntohs (outer_tag);
20636 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
20637 clib_memcpy (mp->b_smac, smac, sizeof (smac));
20638 mp->b_vlanid = ntohs (vlanid);
20639 mp->i_sid = ntohl (sid);
20647 api_flow_classify_set_interface (vat_main_t * vam)
20649 unformat_input_t *i = vam->input;
20650 vl_api_flow_classify_set_interface_t *mp;
20652 int sw_if_index_set;
20653 u32 ip4_table_index = ~0;
20654 u32 ip6_table_index = ~0;
20658 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20660 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20661 sw_if_index_set = 1;
20662 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20663 sw_if_index_set = 1;
20664 else if (unformat (i, "del"))
20666 else if (unformat (i, "ip4-table %d", &ip4_table_index))
20668 else if (unformat (i, "ip6-table %d", &ip6_table_index))
20672 clib_warning ("parse error '%U'", format_unformat_error, i);
20677 if (sw_if_index_set == 0)
20679 errmsg ("missing interface name or sw_if_index");
20683 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
20685 mp->sw_if_index = ntohl (sw_if_index);
20686 mp->ip4_table_index = ntohl (ip4_table_index);
20687 mp->ip6_table_index = ntohl (ip6_table_index);
20688 mp->is_add = is_add;
20696 api_flow_classify_dump (vat_main_t * vam)
20698 unformat_input_t *i = vam->input;
20699 vl_api_flow_classify_dump_t *mp;
20700 vl_api_control_ping_t *mp_ping;
20701 u8 type = FLOW_CLASSIFY_N_TABLES;
20704 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
20708 errmsg ("classify table type must be specified");
20712 if (!vam->json_output)
20714 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
20717 M (FLOW_CLASSIFY_DUMP, mp);
20722 /* Use a control ping for synchronization */
20723 MPING (CONTROL_PING, mp_ping);
20726 /* Wait for a reply... */
20732 api_feature_enable_disable (vat_main_t * vam)
20734 unformat_input_t *i = vam->input;
20735 vl_api_feature_enable_disable_t *mp;
20737 u8 *feature_name = 0;
20738 u32 sw_if_index = ~0;
20742 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20744 if (unformat (i, "arc_name %s", &arc_name))
20746 else if (unformat (i, "feature_name %s", &feature_name))
20749 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20751 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20753 else if (unformat (i, "disable"))
20761 errmsg ("missing arc name");
20764 if (vec_len (arc_name) > 63)
20766 errmsg ("arc name too long");
20769 if (feature_name == 0)
20771 errmsg ("missing feature name");
20774 if (vec_len (feature_name) > 63)
20776 errmsg ("feature name too long");
20779 if (sw_if_index == ~0)
20781 errmsg ("missing interface name or sw_if_index");
20785 /* Construct the API message */
20786 M (FEATURE_ENABLE_DISABLE, mp);
20787 mp->sw_if_index = ntohl (sw_if_index);
20788 mp->enable = enable;
20789 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
20790 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
20791 vec_free (arc_name);
20792 vec_free (feature_name);
20800 api_sw_interface_tag_add_del (vat_main_t * vam)
20802 unformat_input_t *i = vam->input;
20803 vl_api_sw_interface_tag_add_del_t *mp;
20804 u32 sw_if_index = ~0;
20809 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20811 if (unformat (i, "tag %s", &tag))
20813 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20815 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20817 else if (unformat (i, "del"))
20823 if (sw_if_index == ~0)
20825 errmsg ("missing interface name or sw_if_index");
20829 if (enable && (tag == 0))
20831 errmsg ("no tag specified");
20835 /* Construct the API message */
20836 M (SW_INTERFACE_TAG_ADD_DEL, mp);
20837 mp->sw_if_index = ntohl (sw_if_index);
20838 mp->is_add = enable;
20840 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
20848 static void vl_api_l2_xconnect_details_t_handler
20849 (vl_api_l2_xconnect_details_t * mp)
20851 vat_main_t *vam = &vat_main;
20853 print (vam->ofp, "%15d%15d",
20854 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
20857 static void vl_api_l2_xconnect_details_t_handler_json
20858 (vl_api_l2_xconnect_details_t * mp)
20860 vat_main_t *vam = &vat_main;
20861 vat_json_node_t *node = NULL;
20863 if (VAT_JSON_ARRAY != vam->json_tree.type)
20865 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20866 vat_json_init_array (&vam->json_tree);
20868 node = vat_json_array_add (&vam->json_tree);
20870 vat_json_init_object (node);
20871 vat_json_object_add_uint (node, "rx_sw_if_index",
20872 ntohl (mp->rx_sw_if_index));
20873 vat_json_object_add_uint (node, "tx_sw_if_index",
20874 ntohl (mp->tx_sw_if_index));
20878 api_l2_xconnect_dump (vat_main_t * vam)
20880 vl_api_l2_xconnect_dump_t *mp;
20881 vl_api_control_ping_t *mp_ping;
20884 if (!vam->json_output)
20886 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
20889 M (L2_XCONNECT_DUMP, mp);
20893 /* Use a control ping for synchronization */
20894 MPING (CONTROL_PING, mp_ping);
20902 api_hw_interface_set_mtu (vat_main_t * vam)
20904 unformat_input_t *i = vam->input;
20905 vl_api_hw_interface_set_mtu_t *mp;
20906 u32 sw_if_index = ~0;
20910 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20912 if (unformat (i, "mtu %d", &mtu))
20914 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20916 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20922 if (sw_if_index == ~0)
20924 errmsg ("missing interface name or sw_if_index");
20930 errmsg ("no mtu specified");
20934 /* Construct the API message */
20935 M (HW_INTERFACE_SET_MTU, mp);
20936 mp->sw_if_index = ntohl (sw_if_index);
20937 mp->mtu = ntohs ((u16) mtu);
20945 api_p2p_ethernet_add (vat_main_t * vam)
20947 unformat_input_t *i = vam->input;
20948 vl_api_p2p_ethernet_add_t *mp;
20949 u32 parent_if_index = ~0;
20955 clib_memset (remote_mac, 0, sizeof (remote_mac));
20956 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20958 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
20960 else if (unformat (i, "sw_if_index %d", &parent_if_index))
20964 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
20966 else if (unformat (i, "sub_id %d", &sub_id))
20970 clib_warning ("parse error '%U'", format_unformat_error, i);
20975 if (parent_if_index == ~0)
20977 errmsg ("missing interface name or sw_if_index");
20982 errmsg ("missing remote mac address");
20987 errmsg ("missing sub-interface id");
20991 M (P2P_ETHERNET_ADD, mp);
20992 mp->parent_if_index = ntohl (parent_if_index);
20993 mp->subif_id = ntohl (sub_id);
20994 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21002 api_p2p_ethernet_del (vat_main_t * vam)
21004 unformat_input_t *i = vam->input;
21005 vl_api_p2p_ethernet_del_t *mp;
21006 u32 parent_if_index = ~0;
21011 clib_memset (remote_mac, 0, sizeof (remote_mac));
21012 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21014 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21016 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21020 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21024 clib_warning ("parse error '%U'", format_unformat_error, i);
21029 if (parent_if_index == ~0)
21031 errmsg ("missing interface name or sw_if_index");
21036 errmsg ("missing remote mac address");
21040 M (P2P_ETHERNET_DEL, mp);
21041 mp->parent_if_index = ntohl (parent_if_index);
21042 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21050 api_lldp_config (vat_main_t * vam)
21052 unformat_input_t *i = vam->input;
21053 vl_api_lldp_config_t *mp;
21055 int tx_interval = 0;
21056 u8 *sys_name = NULL;
21059 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21061 if (unformat (i, "system-name %s", &sys_name))
21063 else if (unformat (i, "tx-hold %d", &tx_hold))
21065 else if (unformat (i, "tx-interval %d", &tx_interval))
21069 clib_warning ("parse error '%U'", format_unformat_error, i);
21074 vec_add1 (sys_name, 0);
21076 M (LLDP_CONFIG, mp);
21077 mp->tx_hold = htonl (tx_hold);
21078 mp->tx_interval = htonl (tx_interval);
21079 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
21080 vec_free (sys_name);
21088 api_sw_interface_set_lldp (vat_main_t * vam)
21090 unformat_input_t *i = vam->input;
21091 vl_api_sw_interface_set_lldp_t *mp;
21092 u32 sw_if_index = ~0;
21094 u8 *port_desc = NULL, *mgmt_oid = NULL;
21095 ip4_address_t ip4_addr;
21096 ip6_address_t ip6_addr;
21099 clib_memset (&ip4_addr, 0, sizeof (ip4_addr));
21100 clib_memset (&ip6_addr, 0, sizeof (ip6_addr));
21102 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21104 if (unformat (i, "disable"))
21107 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21109 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21111 else if (unformat (i, "port-desc %s", &port_desc))
21113 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
21115 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
21117 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
21123 if (sw_if_index == ~0)
21125 errmsg ("missing interface name or sw_if_index");
21129 /* Construct the API message */
21130 vec_add1 (port_desc, 0);
21131 vec_add1 (mgmt_oid, 0);
21132 M (SW_INTERFACE_SET_LLDP, mp);
21133 mp->sw_if_index = ntohl (sw_if_index);
21134 mp->enable = enable;
21135 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
21136 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
21137 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
21138 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
21139 vec_free (port_desc);
21140 vec_free (mgmt_oid);
21148 api_tcp_configure_src_addresses (vat_main_t * vam)
21150 vl_api_tcp_configure_src_addresses_t *mp;
21151 unformat_input_t *i = vam->input;
21152 ip4_address_t v4first, v4last;
21153 ip6_address_t v6first, v6last;
21158 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21160 if (unformat (i, "%U - %U",
21161 unformat_ip4_address, &v4first,
21162 unformat_ip4_address, &v4last))
21166 errmsg ("one range per message (range already set)");
21171 else if (unformat (i, "%U - %U",
21172 unformat_ip6_address, &v6first,
21173 unformat_ip6_address, &v6last))
21177 errmsg ("one range per message (range already set)");
21182 else if (unformat (i, "vrf %d", &vrf_id))
21188 if (range_set == 0)
21190 errmsg ("address range not set");
21194 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
21195 mp->vrf_id = ntohl (vrf_id);
21197 if (range_set == 2)
21200 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
21201 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
21206 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
21207 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
21214 static void vl_api_app_namespace_add_del_reply_t_handler
21215 (vl_api_app_namespace_add_del_reply_t * mp)
21217 vat_main_t *vam = &vat_main;
21218 i32 retval = ntohl (mp->retval);
21219 if (vam->async_mode)
21221 vam->async_errors += (retval < 0);
21225 vam->retval = retval;
21227 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
21228 vam->result_ready = 1;
21232 static void vl_api_app_namespace_add_del_reply_t_handler_json
21233 (vl_api_app_namespace_add_del_reply_t * mp)
21235 vat_main_t *vam = &vat_main;
21236 vat_json_node_t node;
21238 vat_json_init_object (&node);
21239 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
21240 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
21242 vat_json_print (vam->ofp, &node);
21243 vat_json_free (&node);
21245 vam->retval = ntohl (mp->retval);
21246 vam->result_ready = 1;
21250 api_app_namespace_add_del (vat_main_t * vam)
21252 vl_api_app_namespace_add_del_t *mp;
21253 unformat_input_t *i = vam->input;
21254 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
21255 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
21259 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21261 if (unformat (i, "id %_%v%_", &ns_id))
21263 else if (unformat (i, "secret %lu", &secret))
21265 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21266 sw_if_index_set = 1;
21267 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
21269 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
21274 if (!ns_id || !secret_set || !sw_if_index_set)
21276 errmsg ("namespace id, secret and sw_if_index must be set");
21279 if (vec_len (ns_id) > 64)
21281 errmsg ("namespace id too long");
21284 M (APP_NAMESPACE_ADD_DEL, mp);
21286 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
21287 mp->namespace_id_len = vec_len (ns_id);
21288 mp->secret = clib_host_to_net_u64 (secret);
21289 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
21290 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
21291 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
21299 api_sock_init_shm (vat_main_t * vam)
21301 #if VPP_API_TEST_BUILTIN == 0
21302 unformat_input_t *i = vam->input;
21303 vl_api_shm_elem_config_t *config = 0;
21304 u64 size = 64 << 20;
21307 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21309 if (unformat (i, "size %U", unformat_memory_size, &size))
21316 * Canned custom ring allocator config.
21317 * Should probably parse all of this
21319 vec_validate (config, 6);
21320 config[0].type = VL_API_VLIB_RING;
21321 config[0].size = 256;
21322 config[0].count = 32;
21324 config[1].type = VL_API_VLIB_RING;
21325 config[1].size = 1024;
21326 config[1].count = 16;
21328 config[2].type = VL_API_VLIB_RING;
21329 config[2].size = 4096;
21330 config[2].count = 2;
21332 config[3].type = VL_API_CLIENT_RING;
21333 config[3].size = 256;
21334 config[3].count = 32;
21336 config[4].type = VL_API_CLIENT_RING;
21337 config[4].size = 1024;
21338 config[4].count = 16;
21340 config[5].type = VL_API_CLIENT_RING;
21341 config[5].size = 4096;
21342 config[5].count = 2;
21344 config[6].type = VL_API_QUEUE;
21345 config[6].count = 128;
21346 config[6].size = sizeof (uword);
21348 rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ );
21350 vam->client_index_invalid = 1;
21358 api_dns_enable_disable (vat_main_t * vam)
21360 unformat_input_t *line_input = vam->input;
21361 vl_api_dns_enable_disable_t *mp;
21362 u8 enable_disable = 1;
21365 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21367 if (unformat (line_input, "disable"))
21368 enable_disable = 0;
21369 if (unformat (line_input, "enable"))
21370 enable_disable = 1;
21375 /* Construct the API message */
21376 M (DNS_ENABLE_DISABLE, mp);
21377 mp->enable = enable_disable;
21381 /* Wait for the reply */
21387 api_dns_resolve_name (vat_main_t * vam)
21389 unformat_input_t *line_input = vam->input;
21390 vl_api_dns_resolve_name_t *mp;
21394 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21396 if (unformat (line_input, "%s", &name))
21402 if (vec_len (name) > 127)
21404 errmsg ("name too long");
21408 /* Construct the API message */
21409 M (DNS_RESOLVE_NAME, mp);
21410 memcpy (mp->name, name, vec_len (name));
21415 /* Wait for the reply */
21421 api_dns_resolve_ip (vat_main_t * vam)
21423 unformat_input_t *line_input = vam->input;
21424 vl_api_dns_resolve_ip_t *mp;
21426 ip4_address_t addr4;
21427 ip6_address_t addr6;
21430 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21432 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
21434 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
21442 errmsg ("missing address");
21446 /* Construct the API message */
21447 M (DNS_RESOLVE_IP, mp);
21448 mp->is_ip6 = is_ip6;
21450 memcpy (mp->address, &addr6, sizeof (addr6));
21452 memcpy (mp->address, &addr4, sizeof (addr4));
21456 /* Wait for the reply */
21462 api_dns_name_server_add_del (vat_main_t * vam)
21464 unformat_input_t *i = vam->input;
21465 vl_api_dns_name_server_add_del_t *mp;
21467 ip6_address_t ip6_server;
21468 ip4_address_t ip4_server;
21473 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21475 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
21477 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
21479 else if (unformat (i, "del"))
21483 clib_warning ("parse error '%U'", format_unformat_error, i);
21488 if (ip4_set && ip6_set)
21490 errmsg ("Only one server address allowed per message");
21493 if ((ip4_set + ip6_set) == 0)
21495 errmsg ("Server address required");
21499 /* Construct the API message */
21500 M (DNS_NAME_SERVER_ADD_DEL, mp);
21504 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
21509 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
21513 mp->is_add = is_add;
21518 /* Wait for a reply, return good/bad news */
21524 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
21526 vat_main_t *vam = &vat_main;
21531 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
21532 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21533 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
21534 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
21535 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21536 clib_net_to_host_u32 (mp->action_index), mp->tag);
21541 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
21542 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21543 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
21544 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
21545 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21546 clib_net_to_host_u32 (mp->action_index), mp->tag);
21551 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
21554 vat_main_t *vam = &vat_main;
21555 vat_json_node_t *node = NULL;
21556 struct in6_addr ip6;
21557 struct in_addr ip4;
21559 if (VAT_JSON_ARRAY != vam->json_tree.type)
21561 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21562 vat_json_init_array (&vam->json_tree);
21564 node = vat_json_array_add (&vam->json_tree);
21565 vat_json_init_object (node);
21567 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
21568 vat_json_object_add_uint (node, "appns_index",
21569 clib_net_to_host_u32 (mp->appns_index));
21570 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
21571 vat_json_object_add_uint (node, "scope", mp->scope);
21572 vat_json_object_add_uint (node, "action_index",
21573 clib_net_to_host_u32 (mp->action_index));
21574 vat_json_object_add_uint (node, "lcl_port",
21575 clib_net_to_host_u16 (mp->lcl_port));
21576 vat_json_object_add_uint (node, "rmt_port",
21577 clib_net_to_host_u16 (mp->rmt_port));
21578 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
21579 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
21580 vat_json_object_add_string_copy (node, "tag", mp->tag);
21583 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
21584 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
21585 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
21586 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
21590 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
21591 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
21592 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
21593 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
21598 api_session_rule_add_del (vat_main_t * vam)
21600 vl_api_session_rule_add_del_t *mp;
21601 unformat_input_t *i = vam->input;
21602 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
21603 u32 appns_index = 0, scope = 0;
21604 ip4_address_t lcl_ip4, rmt_ip4;
21605 ip6_address_t lcl_ip6, rmt_ip6;
21606 u8 is_ip4 = 1, conn_set = 0;
21607 u8 is_add = 1, *tag = 0;
21610 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21612 if (unformat (i, "del"))
21614 else if (unformat (i, "add"))
21616 else if (unformat (i, "proto tcp"))
21618 else if (unformat (i, "proto udp"))
21620 else if (unformat (i, "appns %d", &appns_index))
21622 else if (unformat (i, "scope %d", &scope))
21624 else if (unformat (i, "tag %_%v%_", &tag))
21628 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
21629 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
21637 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
21638 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
21644 else if (unformat (i, "action %d", &action))
21649 if (proto == ~0 || !conn_set || action == ~0)
21651 errmsg ("transport proto, connection and action must be set");
21657 errmsg ("scope should be 0-3");
21661 M (SESSION_RULE_ADD_DEL, mp);
21663 mp->is_ip4 = is_ip4;
21664 mp->transport_proto = proto;
21665 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
21666 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
21667 mp->lcl_plen = lcl_plen;
21668 mp->rmt_plen = rmt_plen;
21669 mp->action_index = clib_host_to_net_u32 (action);
21670 mp->appns_index = clib_host_to_net_u32 (appns_index);
21672 mp->is_add = is_add;
21675 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
21676 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
21680 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
21681 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
21685 clib_memcpy (mp->tag, tag, vec_len (tag));
21695 api_session_rules_dump (vat_main_t * vam)
21697 vl_api_session_rules_dump_t *mp;
21698 vl_api_control_ping_t *mp_ping;
21701 if (!vam->json_output)
21703 print (vam->ofp, "%=20s", "Session Rules");
21706 M (SESSION_RULES_DUMP, mp);
21710 /* Use a control ping for synchronization */
21711 MPING (CONTROL_PING, mp_ping);
21714 /* Wait for a reply... */
21720 api_ip_container_proxy_add_del (vat_main_t * vam)
21722 vl_api_ip_container_proxy_add_del_t *mp;
21723 unformat_input_t *i = vam->input;
21724 u32 sw_if_index = ~0;
21725 vl_api_prefix_t pfx = { };
21729 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21731 if (unformat (i, "del"))
21733 else if (unformat (i, "add"))
21735 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
21737 else if (unformat (i, "sw_if_index %u", &sw_if_index))
21742 if (sw_if_index == ~0 || pfx.address_length == 0)
21744 errmsg ("address and sw_if_index must be set");
21748 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
21750 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
21751 mp->is_add = is_add;
21752 clib_memcpy (&mp->pfx, &pfx, sizeof (pfx));
21760 api_qos_record_enable_disable (vat_main_t * vam)
21762 unformat_input_t *i = vam->input;
21763 vl_api_qos_record_enable_disable_t *mp;
21764 u32 sw_if_index, qs = 0xff;
21765 u8 sw_if_index_set = 0;
21769 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21771 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21772 sw_if_index_set = 1;
21773 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21774 sw_if_index_set = 1;
21775 else if (unformat (i, "%U", unformat_qos_source, &qs))
21777 else if (unformat (i, "disable"))
21781 clib_warning ("parse error '%U'", format_unformat_error, i);
21786 if (sw_if_index_set == 0)
21788 errmsg ("missing interface name or sw_if_index");
21793 errmsg ("input location must be specified");
21797 M (QOS_RECORD_ENABLE_DISABLE, mp);
21799 mp->sw_if_index = ntohl (sw_if_index);
21800 mp->input_source = qs;
21801 mp->enable = enable;
21810 q_or_quit (vat_main_t * vam)
21812 #if VPP_API_TEST_BUILTIN == 0
21813 longjmp (vam->jump_buf, 1);
21815 return 0; /* not so much */
21819 q (vat_main_t * vam)
21821 return q_or_quit (vam);
21825 quit (vat_main_t * vam)
21827 return q_or_quit (vam);
21831 comment (vat_main_t * vam)
21837 statseg (vat_main_t * vam)
21839 ssvm_private_t *ssvmp = &vam->stat_segment;
21840 ssvm_shared_header_t *shared_header = ssvmp->sh;
21841 vlib_counter_t **counters;
21842 u64 thread0_index1_packets;
21843 u64 thread0_index1_bytes;
21844 f64 vector_rate, input_rate;
21847 uword *counter_vector_by_name;
21848 if (vam->stat_segment_lockp == 0)
21850 errmsg ("Stat segment not mapped...");
21854 /* look up "/if/rx for sw_if_index 1 as a test */
21856 clib_spinlock_lock (vam->stat_segment_lockp);
21858 counter_vector_by_name = (uword *) shared_header->opaque[1];
21860 p = hash_get_mem (counter_vector_by_name, "/if/rx");
21863 clib_spinlock_unlock (vam->stat_segment_lockp);
21864 errmsg ("/if/tx not found?");
21868 /* Fish per-thread vector of combined counters from shared memory */
21869 counters = (vlib_counter_t **) p[0];
21871 if (vec_len (counters[0]) < 2)
21873 clib_spinlock_unlock (vam->stat_segment_lockp);
21874 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
21878 /* Read thread 0 sw_if_index 1 counter */
21879 thread0_index1_packets = counters[0][1].packets;
21880 thread0_index1_bytes = counters[0][1].bytes;
21882 p = hash_get_mem (counter_vector_by_name, "vector_rate");
21885 clib_spinlock_unlock (vam->stat_segment_lockp);
21886 errmsg ("vector_rate not found?");
21890 vector_rate = *(f64 *) (p[0]);
21891 p = hash_get_mem (counter_vector_by_name, "input_rate");
21894 clib_spinlock_unlock (vam->stat_segment_lockp);
21895 errmsg ("input_rate not found?");
21898 input_rate = *(f64 *) (p[0]);
21900 clib_spinlock_unlock (vam->stat_segment_lockp);
21902 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
21903 vector_rate, input_rate);
21904 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
21905 thread0_index1_packets, thread0_index1_bytes);
21911 cmd_cmp (void *a1, void *a2)
21916 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
21920 help (vat_main_t * vam)
21925 unformat_input_t *i = vam->input;
21928 if (unformat (i, "%s", &name))
21932 vec_add1 (name, 0);
21934 hs = hash_get_mem (vam->help_by_name, name);
21936 print (vam->ofp, "usage: %s %s", name, hs[0]);
21938 print (vam->ofp, "No such msg / command '%s'", name);
21943 print (vam->ofp, "Help is available for the following:");
21946 hash_foreach_pair (p, vam->function_by_name,
21948 vec_add1 (cmds, (u8 *)(p->key));
21952 vec_sort_with_function (cmds, cmd_cmp);
21954 for (j = 0; j < vec_len (cmds); j++)
21955 print (vam->ofp, "%s", cmds[j]);
21962 set (vat_main_t * vam)
21964 u8 *name = 0, *value = 0;
21965 unformat_input_t *i = vam->input;
21967 if (unformat (i, "%s", &name))
21969 /* The input buffer is a vector, not a string. */
21970 value = vec_dup (i->buffer);
21971 vec_delete (value, i->index, 0);
21972 /* Almost certainly has a trailing newline */
21973 if (value[vec_len (value) - 1] == '\n')
21974 value[vec_len (value) - 1] = 0;
21975 /* Make sure it's a proper string, one way or the other */
21976 vec_add1 (value, 0);
21977 (void) clib_macro_set_value (&vam->macro_main,
21978 (char *) name, (char *) value);
21981 errmsg ("usage: set <name> <value>");
21989 unset (vat_main_t * vam)
21993 if (unformat (vam->input, "%s", &name))
21994 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
21995 errmsg ("unset: %s wasn't set", name);
22008 macro_sort_cmp (void *a1, void *a2)
22010 macro_sort_t *s1 = a1;
22011 macro_sort_t *s2 = a2;
22013 return strcmp ((char *) (s1->name), (char *) (s2->name));
22017 dump_macro_table (vat_main_t * vam)
22019 macro_sort_t *sort_me = 0, *sm;
22024 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
22026 vec_add2 (sort_me, sm, 1);
22027 sm->name = (u8 *)(p->key);
22028 sm->value = (u8 *) (p->value[0]);
22032 vec_sort_with_function (sort_me, macro_sort_cmp);
22034 if (vec_len (sort_me))
22035 print (vam->ofp, "%-15s%s", "Name", "Value");
22037 print (vam->ofp, "The macro table is empty...");
22039 for (i = 0; i < vec_len (sort_me); i++)
22040 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
22045 dump_node_table (vat_main_t * vam)
22048 vlib_node_t *node, *next_node;
22050 if (vec_len (vam->graph_nodes) == 0)
22052 print (vam->ofp, "Node table empty, issue get_node_graph...");
22056 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
22058 node = vam->graph_nodes[0][i];
22059 print (vam->ofp, "[%d] %s", i, node->name);
22060 for (j = 0; j < vec_len (node->next_nodes); j++)
22062 if (node->next_nodes[j] != ~0)
22064 next_node = vam->graph_nodes[0][node->next_nodes[j]];
22065 print (vam->ofp, " [%d] %s", j, next_node->name);
22073 value_sort_cmp (void *a1, void *a2)
22075 name_sort_t *n1 = a1;
22076 name_sort_t *n2 = a2;
22078 if (n1->value < n2->value)
22080 if (n1->value > n2->value)
22087 dump_msg_api_table (vat_main_t * vam)
22089 api_main_t *am = &api_main;
22090 name_sort_t *nses = 0, *ns;
22095 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
22097 vec_add2 (nses, ns, 1);
22098 ns->name = (u8 *)(hp->key);
22099 ns->value = (u32) hp->value[0];
22103 vec_sort_with_function (nses, value_sort_cmp);
22105 for (i = 0; i < vec_len (nses); i++)
22106 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
22112 get_msg_id (vat_main_t * vam)
22117 if (unformat (vam->input, "%s", &name_and_crc))
22119 message_index = vl_msg_api_get_msg_index (name_and_crc);
22120 if (message_index == ~0)
22122 print (vam->ofp, " '%s' not found", name_and_crc);
22125 print (vam->ofp, " '%s' has message index %d",
22126 name_and_crc, message_index);
22129 errmsg ("name_and_crc required...");
22134 search_node_table (vat_main_t * vam)
22136 unformat_input_t *line_input = vam->input;
22139 vlib_node_t *node, *next_node;
22142 if (vam->graph_node_index_by_name == 0)
22144 print (vam->ofp, "Node table empty, issue get_node_graph...");
22148 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22150 if (unformat (line_input, "%s", &node_to_find))
22152 vec_add1 (node_to_find, 0);
22153 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
22156 print (vam->ofp, "%s not found...", node_to_find);
22159 node = vam->graph_nodes[0][p[0]];
22160 print (vam->ofp, "[%d] %s", p[0], node->name);
22161 for (j = 0; j < vec_len (node->next_nodes); j++)
22163 if (node->next_nodes[j] != ~0)
22165 next_node = vam->graph_nodes[0][node->next_nodes[j]];
22166 print (vam->ofp, " [%d] %s", j, next_node->name);
22173 clib_warning ("parse error '%U'", format_unformat_error,
22179 vec_free (node_to_find);
22188 script (vat_main_t * vam)
22190 #if (VPP_API_TEST_BUILTIN==0)
22192 char *save_current_file;
22193 unformat_input_t save_input;
22194 jmp_buf save_jump_buf;
22195 u32 save_line_number;
22197 FILE *new_fp, *save_ifp;
22199 if (unformat (vam->input, "%s", &s))
22201 new_fp = fopen ((char *) s, "r");
22204 errmsg ("Couldn't open script file %s", s);
22211 errmsg ("Missing script name");
22215 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
22216 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
22217 save_ifp = vam->ifp;
22218 save_line_number = vam->input_line_number;
22219 save_current_file = (char *) vam->current_file;
22221 vam->input_line_number = 0;
22223 vam->current_file = s;
22226 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
22227 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
22228 vam->ifp = save_ifp;
22229 vam->input_line_number = save_line_number;
22230 vam->current_file = (u8 *) save_current_file;
22235 clib_warning ("use the exec command...");
22241 echo (vat_main_t * vam)
22243 print (vam->ofp, "%v", vam->input->buffer);
22247 /* List of API message constructors, CLI names map to api_xxx */
22248 #define foreach_vpe_api_msg \
22249 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
22250 _(sw_interface_dump,"") \
22251 _(sw_interface_set_flags, \
22252 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
22253 _(sw_interface_add_del_address, \
22254 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
22255 _(sw_interface_set_rx_mode, \
22256 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
22257 _(sw_interface_set_rx_placement, \
22258 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
22259 _(sw_interface_rx_placement_dump, \
22260 "[<intfc> | sw_if_index <id>]") \
22261 _(sw_interface_set_table, \
22262 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
22263 _(sw_interface_set_mpls_enable, \
22264 "<intfc> | sw_if_index [disable | dis]") \
22265 _(sw_interface_set_vpath, \
22266 "<intfc> | sw_if_index <id> enable | disable") \
22267 _(sw_interface_set_vxlan_bypass, \
22268 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
22269 _(sw_interface_set_geneve_bypass, \
22270 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
22271 _(sw_interface_set_l2_xconnect, \
22272 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22273 "enable | disable") \
22274 _(sw_interface_set_l2_bridge, \
22275 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
22276 "[shg <split-horizon-group>] [bvi]\n" \
22277 "enable | disable") \
22278 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
22279 _(bridge_domain_add_del, \
22280 "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") \
22281 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
22283 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
22284 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
22285 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
22287 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
22289 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
22291 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
22293 "<vpp-if-name> | sw_if_index <id>") \
22294 _(sw_interface_tap_v2_dump, "") \
22295 _(virtio_pci_create, \
22296 "pci-addr <pci-address> [use_random_mac | hw-addr <mac-addr>] [tx-ring-size <num> [rx-ring-size <num>] [features <hex-value>]") \
22297 _(virtio_pci_delete, \
22298 "<vpp-if-name> | sw_if_index <id>") \
22299 _(sw_interface_virtio_pci_dump, "") \
22301 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
22302 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \
22305 "<vpp-if-name> | sw_if_index <id>") \
22307 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
22308 _(bond_detach_slave, \
22309 "sw_if_index <n>") \
22310 _(sw_interface_bond_dump, "") \
22311 _(sw_interface_slave_dump, \
22312 "<vpp-if-name> | sw_if_index <id>") \
22313 _(ip_table_add_del, \
22314 "table <n> [ipv6] [add | del]\n") \
22315 _(ip_add_del_route, \
22316 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
22317 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
22318 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
22319 "[multipath] [count <n>] [del]") \
22320 _(ip_mroute_add_del, \
22321 "<src> <grp>/<mask> [table-id <n>]\n" \
22322 "[<intfc> | sw_if_index <id>] [local] [del]") \
22323 _(mpls_table_add_del, \
22324 "table <n> [add | del]\n") \
22325 _(mpls_route_add_del, \
22326 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
22327 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
22328 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
22329 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
22330 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
22331 "[count <n>] [del]") \
22332 _(mpls_ip_bind_unbind, \
22333 "<label> <addr/len>") \
22334 _(mpls_tunnel_add_del, \
22335 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
22336 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
22337 "[l2-only] [out-label <n>]") \
22338 _(sr_mpls_policy_add, \
22339 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
22340 _(sr_mpls_policy_del, \
22342 _(bier_table_add_del, \
22343 "<label> <sub-domain> <set> <bsl> [del]") \
22344 _(bier_route_add_del, \
22345 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
22346 "[<intfc> | sw_if_index <id>]" \
22347 "[weight <n>] [del] [multipath]") \
22348 _(proxy_arp_add_del, \
22349 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
22350 _(proxy_arp_intfc_enable_disable, \
22351 "<intfc> | sw_if_index <id> enable | disable") \
22352 _(sw_interface_set_unnumbered, \
22353 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
22354 _(ip_neighbor_add_del, \
22355 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
22356 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
22357 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
22358 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
22359 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
22360 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
22361 "[outer_vlan_id_any][inner_vlan_id_any]") \
22362 _(reset_fib, "vrf <n> [ipv6]") \
22363 _(dhcp_proxy_config, \
22364 "svr <v46-address> src <v46-address>\n" \
22365 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
22366 _(dhcp_proxy_set_vss, \
22367 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
22368 _(dhcp_proxy_dump, "ip6") \
22369 _(dhcp_client_config, \
22370 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
22371 _(set_ip_flow_hash, \
22372 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
22373 _(sw_interface_ip6_enable_disable, \
22374 "<intfc> | sw_if_index <id> enable | disable") \
22375 _(ip6nd_proxy_add_del, \
22376 "<intfc> | sw_if_index <id> <ip6-address>") \
22377 _(ip6nd_proxy_dump, "") \
22378 _(sw_interface_ip6nd_ra_prefix, \
22379 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
22380 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
22381 "[nolink] [isno]") \
22382 _(sw_interface_ip6nd_ra_config, \
22383 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
22384 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
22385 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
22386 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
22387 _(l2_patch_add_del, \
22388 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22389 "enable | disable") \
22390 _(sr_localsid_add_del, \
22391 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
22392 "fib-table <num> (end.psp) sw_if_index <num>") \
22393 _(classify_add_del_table, \
22394 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
22395 " [del] [del-chain] mask <mask-value>\n" \
22396 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
22397 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
22398 _(classify_add_del_session, \
22399 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
22400 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
22401 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
22402 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
22403 _(classify_set_interface_ip_table, \
22404 "<intfc> | sw_if_index <nn> table <nn>") \
22405 _(classify_set_interface_l2_tables, \
22406 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22407 " [other-table <nn>]") \
22408 _(get_node_index, "node <node-name") \
22409 _(add_node_next, "node <node-name> next <next-node-name>") \
22410 _(l2tpv3_create_tunnel, \
22411 "client_address <ip6-addr> our_address <ip6-addr>\n" \
22412 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
22413 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
22414 _(l2tpv3_set_tunnel_cookies, \
22415 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
22416 "[new_remote_cookie <nn>]\n") \
22417 _(l2tpv3_interface_enable_disable, \
22418 "<intfc> | sw_if_index <nn> enable | disable") \
22419 _(l2tpv3_set_lookup_key, \
22420 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
22421 _(sw_if_l2tpv3_tunnel_dump, "") \
22422 _(vxlan_offload_rx, \
22423 "hw { <interface name> | hw_if_index <nn>} " \
22424 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
22425 _(vxlan_add_del_tunnel, \
22426 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
22427 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
22428 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
22429 _(geneve_add_del_tunnel, \
22430 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
22431 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22432 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
22433 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22434 _(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22435 _(gre_tunnel_add_del, \
22436 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
22437 "[teb | erspan <session-id>] [del]") \
22438 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22439 _(l2_fib_clear_table, "") \
22440 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
22441 _(l2_interface_vlan_tag_rewrite, \
22442 "<intfc> | sw_if_index <nn> \n" \
22443 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
22444 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
22445 _(create_vhost_user_if, \
22446 "socket <filename> [server] [renumber <dev_instance>] " \
22447 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
22448 "[mac <mac_address>]") \
22449 _(modify_vhost_user_if, \
22450 "<intfc> | sw_if_index <nn> socket <filename>\n" \
22451 "[server] [renumber <dev_instance>]") \
22452 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
22453 _(sw_interface_vhost_user_dump, "") \
22454 _(show_version, "") \
22455 _(show_threads, "") \
22456 _(vxlan_gpe_add_del_tunnel, \
22457 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
22458 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22459 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
22460 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
22461 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22462 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
22463 _(interface_name_renumber, \
22464 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
22465 _(input_acl_set_interface, \
22466 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22467 " [l2-table <nn>] [del]") \
22468 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
22469 _(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
22470 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
22471 _(want_ip4_arp_events, "address <ip4-address> [del]") \
22472 _(want_ip6_nd_events, "address <ip6-address> [del]") \
22473 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
22474 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
22475 _(ip_dump, "ipv4 | ipv6") \
22476 _(ipsec_spd_add_del, "spd_id <n> [del]") \
22477 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
22479 _(ipsec_sad_entry_add_del, "sad_id <n> spi <n> crypto_alg <alg>\n" \
22480 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
22481 " integ_alg <alg> integ_key <hex>") \
22482 _(ipsec_spd_entry_add_del, "spd_id <n> priority <n> action <action>\n" \
22483 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
22484 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
22485 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
22486 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
22487 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
22488 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
22489 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
22490 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
22491 " [instance <n>]") \
22492 _(ipsec_sa_dump, "[sa_id <n>]") \
22493 _(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
22494 " <alg> <hex>\n") \
22495 _(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
22496 _(delete_loopback,"sw_if_index <nn>") \
22497 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
22498 _(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
22499 _(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
22500 _(want_interface_events, "enable|disable") \
22501 _(get_first_msg_id, "client <name>") \
22502 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
22503 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
22504 "fib-id <nn> [ip4][ip6][default]") \
22505 _(get_node_graph, " ") \
22506 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
22507 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
22508 _(ioam_disable, "") \
22509 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
22510 " sw_if_index <sw_if_index> p <priority> " \
22511 "w <weight>] [del]") \
22512 _(one_add_del_locator, "locator-set <locator_name> " \
22513 "iface <intf> | sw_if_index <sw_if_index> " \
22514 "p <priority> w <weight> [del]") \
22515 _(one_add_del_local_eid,"vni <vni> eid " \
22516 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22517 "locator-set <locator_name> [del]" \
22518 "[key-id sha1|sha256 secret-key <secret-key>]")\
22519 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
22520 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
22521 _(one_enable_disable, "enable|disable") \
22522 _(one_map_register_enable_disable, "enable|disable") \
22523 _(one_map_register_fallback_threshold, "<value>") \
22524 _(one_rloc_probe_enable_disable, "enable|disable") \
22525 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22527 "rloc <locator> p <prio> " \
22528 "w <weight> [rloc <loc> ... ] " \
22529 "action <action> [del-all]") \
22530 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22532 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
22533 _(one_use_petr, "ip-address> | disable") \
22534 _(one_map_request_mode, "src-dst|dst-only") \
22535 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22536 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22537 _(one_locator_set_dump, "[local | remote]") \
22538 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
22539 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22540 "[local] | [remote]") \
22541 _(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
22542 _(one_ndp_bd_get, "") \
22543 _(one_ndp_entries_get, "bd <bridge-domain>") \
22544 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
22545 _(one_l2_arp_bd_get, "") \
22546 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
22547 _(one_stats_enable_disable, "enable|disable") \
22548 _(show_one_stats_enable_disable, "") \
22549 _(one_eid_table_vni_dump, "") \
22550 _(one_eid_table_map_dump, "l2|l3") \
22551 _(one_map_resolver_dump, "") \
22552 _(one_map_server_dump, "") \
22553 _(one_adjacencies_get, "vni <vni>") \
22554 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
22555 _(show_one_rloc_probe_state, "") \
22556 _(show_one_map_register_state, "") \
22557 _(show_one_status, "") \
22558 _(one_stats_dump, "") \
22559 _(one_stats_flush, "") \
22560 _(one_get_map_request_itr_rlocs, "") \
22561 _(one_map_register_set_ttl, "<ttl>") \
22562 _(one_set_transport_protocol, "udp|api") \
22563 _(one_get_transport_protocol, "") \
22564 _(one_enable_disable_xtr_mode, "enable|disable") \
22565 _(one_show_xtr_mode, "") \
22566 _(one_enable_disable_pitr_mode, "enable|disable") \
22567 _(one_show_pitr_mode, "") \
22568 _(one_enable_disable_petr_mode, "enable|disable") \
22569 _(one_show_petr_mode, "") \
22570 _(show_one_nsh_mapping, "") \
22571 _(show_one_pitr, "") \
22572 _(show_one_use_petr, "") \
22573 _(show_one_map_request_mode, "") \
22574 _(show_one_map_register_ttl, "") \
22575 _(show_one_map_register_fallback_threshold, "") \
22576 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
22577 " sw_if_index <sw_if_index> p <priority> " \
22578 "w <weight>] [del]") \
22579 _(lisp_add_del_locator, "locator-set <locator_name> " \
22580 "iface <intf> | sw_if_index <sw_if_index> " \
22581 "p <priority> w <weight> [del]") \
22582 _(lisp_add_del_local_eid,"vni <vni> eid " \
22583 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22584 "locator-set <locator_name> [del]" \
22585 "[key-id sha1|sha256 secret-key <secret-key>]") \
22586 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
22587 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
22588 _(lisp_enable_disable, "enable|disable") \
22589 _(lisp_map_register_enable_disable, "enable|disable") \
22590 _(lisp_rloc_probe_enable_disable, "enable|disable") \
22591 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22593 "rloc <locator> p <prio> " \
22594 "w <weight> [rloc <loc> ... ] " \
22595 "action <action> [del-all]") \
22596 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22598 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
22599 _(lisp_use_petr, "<ip-address> | disable") \
22600 _(lisp_map_request_mode, "src-dst|dst-only") \
22601 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22602 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22603 _(lisp_locator_set_dump, "[local | remote]") \
22604 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
22605 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22606 "[local] | [remote]") \
22607 _(lisp_eid_table_vni_dump, "") \
22608 _(lisp_eid_table_map_dump, "l2|l3") \
22609 _(lisp_map_resolver_dump, "") \
22610 _(lisp_map_server_dump, "") \
22611 _(lisp_adjacencies_get, "vni <vni>") \
22612 _(gpe_fwd_entry_vnis_get, "") \
22613 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
22614 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
22615 "[table <table-id>]") \
22616 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
22617 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
22618 _(gpe_set_encap_mode, "lisp|vxlan") \
22619 _(gpe_get_encap_mode, "") \
22620 _(lisp_gpe_add_del_iface, "up|down") \
22621 _(lisp_gpe_enable_disable, "enable|disable") \
22622 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
22623 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
22624 _(show_lisp_rloc_probe_state, "") \
22625 _(show_lisp_map_register_state, "") \
22626 _(show_lisp_status, "") \
22627 _(lisp_get_map_request_itr_rlocs, "") \
22628 _(show_lisp_pitr, "") \
22629 _(show_lisp_use_petr, "") \
22630 _(show_lisp_map_request_mode, "") \
22631 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
22632 _(af_packet_delete, "name <host interface name>") \
22633 _(af_packet_dump, "") \
22634 _(policer_add_del, "name <policer name> <params> [del]") \
22635 _(policer_dump, "[name <policer name>]") \
22636 _(policer_classify_set_interface, \
22637 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22638 " [l2-table <nn>] [del]") \
22639 _(policer_classify_dump, "type [ip4|ip6|l2]") \
22640 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
22641 "[master|slave]") \
22642 _(netmap_delete, "name <interface name>") \
22643 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
22644 _(mpls_fib_dump, "") \
22645 _(classify_table_ids, "") \
22646 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
22647 _(classify_table_info, "table_id <nn>") \
22648 _(classify_session_dump, "table_id <nn>") \
22649 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
22650 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
22651 "[template_interval <nn>] [udp_checksum]") \
22652 _(ipfix_exporter_dump, "") \
22653 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
22654 _(ipfix_classify_stream_dump, "") \
22655 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
22656 _(ipfix_classify_table_dump, "") \
22657 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
22658 _(sw_interface_span_dump, "[l2]") \
22659 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
22660 _(pg_create_interface, "if_id <nn>") \
22661 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
22662 _(pg_enable_disable, "[stream <id>] disable") \
22663 _(ip_source_and_port_range_check_add_del, \
22664 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
22665 _(ip_source_and_port_range_check_interface_add_del, \
22666 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
22667 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
22668 _(ipsec_gre_tunnel_add_del, \
22669 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
22670 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
22671 _(delete_subif,"<intfc> | sw_if_index <nn>") \
22672 _(l2_interface_pbb_tag_rewrite, \
22673 "<intfc> | sw_if_index <nn> \n" \
22674 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
22675 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
22676 _(set_punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
22677 _(flow_classify_set_interface, \
22678 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
22679 _(flow_classify_dump, "type [ip4|ip6]") \
22680 _(ip_fib_dump, "") \
22681 _(ip_mfib_dump, "") \
22682 _(ip6_fib_dump, "") \
22683 _(ip6_mfib_dump, "") \
22684 _(feature_enable_disable, "arc_name <arc_name> " \
22685 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
22686 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
22688 _(l2_xconnect_dump, "") \
22689 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
22690 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
22691 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
22692 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
22693 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
22694 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
22695 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
22696 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
22697 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
22698 _(sock_init_shm, "size <nnn>") \
22699 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
22700 _(dns_enable_disable, "[enable][disable]") \
22701 _(dns_name_server_add_del, "<ip-address> [del]") \
22702 _(dns_resolve_name, "<hostname>") \
22703 _(dns_resolve_ip, "<ip4|ip6>") \
22704 _(dns_name_server_add_del, "<ip-address> [del]") \
22705 _(dns_resolve_name, "<hostname>") \
22706 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
22707 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
22708 _(session_rules_dump, "") \
22709 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
22710 _(output_acl_set_interface, \
22711 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22712 " [l2-table <nn>] [del]") \
22713 _(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
22715 /* List of command functions, CLI names map directly to functions */
22716 #define foreach_cli_function \
22717 _(comment, "usage: comment <ignore-rest-of-line>") \
22718 _(dump_interface_table, "usage: dump_interface_table") \
22719 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
22720 _(dump_ipv4_table, "usage: dump_ipv4_table") \
22721 _(dump_ipv6_table, "usage: dump_ipv6_table") \
22722 _(dump_macro_table, "usage: dump_macro_table ") \
22723 _(dump_node_table, "usage: dump_node_table") \
22724 _(dump_msg_api_table, "usage: dump_msg_api_table") \
22725 _(get_msg_id, "usage: get_msg_id name_and_crc") \
22726 _(echo, "usage: echo <message>") \
22727 _(exec, "usage: exec <vpe-debug-CLI-command>") \
22728 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
22729 _(help, "usage: help") \
22730 _(q, "usage: quit") \
22731 _(quit, "usage: quit") \
22732 _(search_node_table, "usage: search_node_table <name>...") \
22733 _(set, "usage: set <variable-name> <value>") \
22734 _(script, "usage: script <file-name>") \
22735 _(statseg, "usage: statseg"); \
22736 _(unset, "usage: unset <variable-name>")
22739 static void vl_api_##n##_t_handler_uni \
22740 (vl_api_##n##_t * mp) \
22742 vat_main_t * vam = &vat_main; \
22743 if (vam->json_output) { \
22744 vl_api_##n##_t_handler_json(mp); \
22746 vl_api_##n##_t_handler(mp); \
22749 foreach_vpe_api_reply_msg;
22750 #if VPP_API_TEST_BUILTIN == 0
22751 foreach_standalone_reply_msg;
22756 vat_api_hookup (vat_main_t * vam)
22759 vl_msg_api_set_handlers(VL_API_##N, #n, \
22760 vl_api_##n##_t_handler_uni, \
22762 vl_api_##n##_t_endian, \
22763 vl_api_##n##_t_print, \
22764 sizeof(vl_api_##n##_t), 1);
22765 foreach_vpe_api_reply_msg;
22766 #if VPP_API_TEST_BUILTIN == 0
22767 foreach_standalone_reply_msg;
22771 #if (VPP_API_TEST_BUILTIN==0)
22772 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
22774 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
22776 vam->function_by_name = hash_create_string (0, sizeof (uword));
22778 vam->help_by_name = hash_create_string (0, sizeof (uword));
22781 /* API messages we can send */
22782 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
22783 foreach_vpe_api_msg;
22787 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22788 foreach_vpe_api_msg;
22791 /* CLI functions */
22792 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
22793 foreach_cli_function;
22797 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22798 foreach_cli_function;
22802 #if VPP_API_TEST_BUILTIN
22803 static clib_error_t *
22804 vat_api_hookup_shim (vlib_main_t * vm)
22806 vat_api_hookup (&vat_main);
22810 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
22814 * fd.io coding-style-patch-verification: ON
22817 * eval: (c-set-style "gnu")