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_tunnel_if_add_del_reply) \
5214 _(ipsec_tunnel_if_set_sa_reply) \
5215 _(delete_loopback_reply) \
5216 _(bd_ip_mac_add_del_reply) \
5217 _(bd_ip_mac_flush_reply) \
5218 _(want_interface_events_reply) \
5219 _(cop_interface_enable_disable_reply) \
5220 _(cop_whitelist_enable_disable_reply) \
5221 _(sw_interface_clear_stats_reply) \
5222 _(ioam_enable_reply) \
5223 _(ioam_disable_reply) \
5224 _(one_add_del_locator_reply) \
5225 _(one_add_del_local_eid_reply) \
5226 _(one_add_del_remote_mapping_reply) \
5227 _(one_add_del_adjacency_reply) \
5228 _(one_add_del_map_resolver_reply) \
5229 _(one_add_del_map_server_reply) \
5230 _(one_enable_disable_reply) \
5231 _(one_rloc_probe_enable_disable_reply) \
5232 _(one_map_register_enable_disable_reply) \
5233 _(one_map_register_set_ttl_reply) \
5234 _(one_set_transport_protocol_reply) \
5235 _(one_map_register_fallback_threshold_reply) \
5236 _(one_pitr_set_locator_set_reply) \
5237 _(one_map_request_mode_reply) \
5238 _(one_add_del_map_request_itr_rlocs_reply) \
5239 _(one_eid_table_add_del_map_reply) \
5240 _(one_use_petr_reply) \
5241 _(one_stats_enable_disable_reply) \
5242 _(one_add_del_l2_arp_entry_reply) \
5243 _(one_add_del_ndp_entry_reply) \
5244 _(one_stats_flush_reply) \
5245 _(one_enable_disable_xtr_mode_reply) \
5246 _(one_enable_disable_pitr_mode_reply) \
5247 _(one_enable_disable_petr_mode_reply) \
5248 _(gpe_enable_disable_reply) \
5249 _(gpe_set_encap_mode_reply) \
5250 _(gpe_add_del_iface_reply) \
5251 _(gpe_add_del_native_fwd_rpath_reply) \
5252 _(af_packet_delete_reply) \
5253 _(policer_classify_set_interface_reply) \
5254 _(netmap_create_reply) \
5255 _(netmap_delete_reply) \
5256 _(set_ipfix_exporter_reply) \
5257 _(set_ipfix_classify_stream_reply) \
5258 _(ipfix_classify_table_add_del_reply) \
5259 _(flow_classify_set_interface_reply) \
5260 _(sw_interface_span_enable_disable_reply) \
5261 _(pg_capture_reply) \
5262 _(pg_enable_disable_reply) \
5263 _(ip_source_and_port_range_check_add_del_reply) \
5264 _(ip_source_and_port_range_check_interface_add_del_reply)\
5265 _(delete_subif_reply) \
5266 _(l2_interface_pbb_tag_rewrite_reply) \
5268 _(feature_enable_disable_reply) \
5269 _(sw_interface_tag_add_del_reply) \
5270 _(hw_interface_set_mtu_reply) \
5271 _(p2p_ethernet_add_reply) \
5272 _(p2p_ethernet_del_reply) \
5273 _(lldp_config_reply) \
5274 _(sw_interface_set_lldp_reply) \
5275 _(tcp_configure_src_addresses_reply) \
5276 _(dns_enable_disable_reply) \
5277 _(dns_name_server_add_del_reply) \
5278 _(session_rule_add_del_reply) \
5279 _(ip_container_proxy_add_del_reply) \
5280 _(output_acl_set_interface_reply) \
5281 _(qos_record_enable_disable_reply)
5284 static void vl_api_##n##_t_handler \
5285 (vl_api_##n##_t * mp) \
5287 vat_main_t * vam = &vat_main; \
5288 i32 retval = ntohl(mp->retval); \
5289 if (vam->async_mode) { \
5290 vam->async_errors += (retval < 0); \
5292 vam->retval = retval; \
5293 vam->result_ready = 1; \
5296 foreach_standard_reply_retval_handler;
5300 static void vl_api_##n##_t_handler_json \
5301 (vl_api_##n##_t * mp) \
5303 vat_main_t * vam = &vat_main; \
5304 vat_json_node_t node; \
5305 vat_json_init_object(&node); \
5306 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5307 vat_json_print(vam->ofp, &node); \
5308 vam->retval = ntohl(mp->retval); \
5309 vam->result_ready = 1; \
5311 foreach_standard_reply_retval_handler;
5315 * Table of message reply handlers, must include boilerplate handlers
5319 #define foreach_vpe_api_reply_msg \
5320 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
5321 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
5322 _(SW_INTERFACE_DETAILS, sw_interface_details) \
5323 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5324 _(CONTROL_PING_REPLY, control_ping_reply) \
5325 _(CLI_REPLY, cli_reply) \
5326 _(CLI_INBAND_REPLY, cli_inband_reply) \
5327 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5328 sw_interface_add_del_address_reply) \
5329 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
5330 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
5331 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
5332 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5333 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5334 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5335 _(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
5336 _(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
5337 _(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
5338 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5339 sw_interface_set_l2_xconnect_reply) \
5340 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5341 sw_interface_set_l2_bridge_reply) \
5342 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5343 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
5344 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
5345 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
5346 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5347 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
5348 _(L2_FLAGS_REPLY, l2_flags_reply) \
5349 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
5350 _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5351 _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5352 _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
5353 _(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \
5354 _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
5355 _(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
5356 _(BOND_CREATE_REPLY, bond_create_reply) \
5357 _(BOND_DELETE_REPLY, bond_delete_reply) \
5358 _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5359 _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5360 _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5361 _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
5362 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
5363 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
5364 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
5365 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
5366 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5367 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
5368 _(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5369 _(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
5370 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5371 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5372 proxy_arp_intfc_enable_disable_reply) \
5373 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5374 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5375 sw_interface_set_unnumbered_reply) \
5376 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
5377 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5378 _(CREATE_SUBIF_REPLY, create_subif_reply) \
5379 _(RESET_FIB_REPLY, reset_fib_reply) \
5380 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
5381 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
5382 _(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
5383 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5384 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5385 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5386 sw_interface_ip6_enable_disable_reply) \
5387 _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5388 _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
5389 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5390 sw_interface_ip6nd_ra_prefix_reply) \
5391 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5392 sw_interface_ip6nd_ra_config_reply) \
5393 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5394 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
5395 _(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5396 _(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5397 _(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
5398 _(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5399 _(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5400 _(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5401 _(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5402 _(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
5403 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5404 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5405 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5406 classify_set_interface_ip_table_reply) \
5407 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5408 classify_set_interface_l2_tables_reply) \
5409 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5410 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5411 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5412 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5413 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5414 l2tpv3_interface_enable_disable_reply) \
5415 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5416 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5417 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
5418 _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
5419 _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
5420 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
5421 _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
5422 _(GRE_TUNNEL_ADD_DEL_REPLY, gre_tunnel_add_del_reply) \
5423 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5424 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5425 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5426 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5427 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5428 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5429 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5430 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5431 _(SHOW_VERSION_REPLY, show_version_reply) \
5432 _(SHOW_THREADS_REPLY, show_threads_reply) \
5433 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
5434 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
5435 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5436 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
5437 _(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
5438 _(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
5439 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5440 _(IP4_ARP_EVENT, ip4_arp_event) \
5441 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5442 _(IP6_ND_EVENT, ip6_nd_event) \
5443 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5444 _(L2_MACS_EVENT, l2_macs_event) \
5445 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5446 _(IP_ADDRESS_DETAILS, ip_address_details) \
5447 _(IP_DETAILS, ip_details) \
5448 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5449 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
5450 _(IPSEC_SPD_ENTRY_ADD_DEL_REPLY, ipsec_spd_entry_add_del_reply) \
5451 _(IPSEC_SAD_ENTRY_ADD_DEL_REPLY, ipsec_sad_entry_add_del_reply) \
5452 _(IPSEC_SA_DETAILS, ipsec_sa_details) \
5453 _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
5454 _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
5455 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5456 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
5457 _(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
5458 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
5459 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
5460 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
5461 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5462 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5463 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5464 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5465 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5466 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5467 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
5468 _(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5469 _(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5470 _(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5471 _(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5472 _(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5473 _(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5474 _(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5475 _(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5476 _(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5477 one_map_register_enable_disable_reply) \
5478 _(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
5479 _(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5480 _(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
5481 _(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5482 one_map_register_fallback_threshold_reply) \
5483 _(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5484 one_rloc_probe_enable_disable_reply) \
5485 _(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
5486 _(ONE_USE_PETR_REPLY, one_use_petr_reply) \
5487 _(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5488 _(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5489 _(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5490 _(ONE_LOCATOR_DETAILS, one_locator_details) \
5491 _(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5492 _(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5493 _(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5494 _(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5495 _(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5496 _(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
5497 _(ONE_STATS_DETAILS, one_stats_details) \
5498 _(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
5499 _(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5500 _(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5501 show_one_stats_enable_disable_reply) \
5502 _(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5503 _(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5504 _(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
5505 _(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5506 _(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5507 _(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
5508 _(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5509 _(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5510 one_enable_disable_pitr_mode_reply) \
5511 _(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5512 one_enable_disable_petr_mode_reply) \
5513 _(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5514 _(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5515 _(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
5516 _(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5517 _(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
5518 _(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
5519 _(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5520 _(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
5521 _(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
5522 _(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
5523 _(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5524 _(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5525 gpe_add_del_native_fwd_rpath_reply) \
5526 _(GPE_FWD_ENTRY_PATH_DETAILS, \
5527 gpe_fwd_entry_path_details) \
5528 _(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5529 _(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5530 one_add_del_map_request_itr_rlocs_reply) \
5531 _(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5532 one_get_map_request_itr_rlocs_reply) \
5533 _(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
5534 _(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
5535 _(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
5536 _(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5537 _(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5538 _(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5539 show_one_map_register_state_reply) \
5540 _(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
5541 _(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5542 show_one_map_register_fallback_threshold_reply) \
5543 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5544 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
5545 _(AF_PACKET_DETAILS, af_packet_details) \
5546 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5547 _(POLICER_DETAILS, policer_details) \
5548 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5549 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5550 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
5551 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5552 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5553 _(MPLS_FIB_DETAILS, mpls_fib_details) \
5554 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5555 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5556 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5557 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5558 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5559 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5560 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5561 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5562 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5563 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5564 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5565 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5566 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5567 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5568 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5569 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5570 _(PG_CAPTURE_REPLY, pg_capture_reply) \
5571 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5572 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5573 ip_source_and_port_range_check_add_del_reply) \
5574 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5575 ip_source_and_port_range_check_interface_add_del_reply) \
5576 _(IPSEC_GRE_TUNNEL_ADD_DEL_REPLY, ipsec_gre_tunnel_add_del_reply) \
5577 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5578 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
5579 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
5580 _(SET_PUNT_REPLY, set_punt_reply) \
5581 _(IP_FIB_DETAILS, ip_fib_details) \
5582 _(IP6_FIB_DETAILS, ip6_fib_details) \
5583 _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5584 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5585 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
5586 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
5587 _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
5588 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5589 _(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
5590 _(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5591 _(LLDP_CONFIG_REPLY, lldp_config_reply) \
5592 _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
5593 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
5594 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5595 _(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5596 _(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
5597 _(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
5598 _(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
5599 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
5600 _(SESSION_RULES_DETAILS, session_rules_details) \
5601 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
5602 _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
5603 _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
5605 #define foreach_standalone_reply_msg \
5606 _(SW_INTERFACE_EVENT, sw_interface_event)
5614 #define STR_VTR_OP_CASE(op) \
5615 case L2_VTR_ ## op: \
5619 str_vtr_op (u32 vtr_op)
5623 STR_VTR_OP_CASE (DISABLED);
5624 STR_VTR_OP_CASE (PUSH_1);
5625 STR_VTR_OP_CASE (PUSH_2);
5626 STR_VTR_OP_CASE (POP_1);
5627 STR_VTR_OP_CASE (POP_2);
5628 STR_VTR_OP_CASE (TRANSLATE_1_1);
5629 STR_VTR_OP_CASE (TRANSLATE_1_2);
5630 STR_VTR_OP_CASE (TRANSLATE_2_1);
5631 STR_VTR_OP_CASE (TRANSLATE_2_2);
5638 dump_sub_interface_table (vat_main_t * vam)
5640 const sw_interface_subif_t *sub = NULL;
5642 if (vam->json_output)
5645 ("JSON output supported only for VPE API calls and dump_stats_table");
5650 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5651 "Interface", "sw_if_index",
5652 "sub id", "dot1ad", "tags", "outer id",
5653 "inner id", "exact", "default", "outer any", "inner any");
5655 vec_foreach (sub, vam->sw_if_subif_table)
5658 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5659 sub->interface_name,
5661 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5662 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5663 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5664 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5665 if (sub->vtr_op != L2_VTR_DISABLED)
5668 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5669 "tag1: %d tag2: %d ]",
5670 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5671 sub->vtr_tag1, sub->vtr_tag2);
5679 name_sort_cmp (void *a1, void *a2)
5681 name_sort_t *n1 = a1;
5682 name_sort_t *n2 = a2;
5684 return strcmp ((char *) n1->name, (char *) n2->name);
5688 dump_interface_table (vat_main_t * vam)
5691 name_sort_t *nses = 0, *ns;
5693 if (vam->json_output)
5696 ("JSON output supported only for VPE API calls and dump_stats_table");
5701 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5703 vec_add2 (nses, ns, 1);
5704 ns->name = (u8 *)(p->key);
5705 ns->value = (u32) p->value[0];
5709 vec_sort_with_function (nses, name_sort_cmp);
5711 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5712 vec_foreach (ns, nses)
5714 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5721 dump_ip_table (vat_main_t * vam, int is_ipv6)
5723 const ip_details_t *det = NULL;
5724 const ip_address_details_t *address = NULL;
5727 print (vam->ofp, "%-12s", "sw_if_index");
5729 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5736 print (vam->ofp, "%-12d", i);
5737 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5742 vec_foreach (address, det->addr)
5746 is_ipv6 ? format_ip6_address : format_ip4_address,
5747 address->ip, address->prefix_length);
5755 dump_ipv4_table (vat_main_t * vam)
5757 if (vam->json_output)
5760 ("JSON output supported only for VPE API calls and dump_stats_table");
5764 return dump_ip_table (vam, 0);
5768 dump_ipv6_table (vat_main_t * vam)
5770 if (vam->json_output)
5773 ("JSON output supported only for VPE API calls and dump_stats_table");
5777 return dump_ip_table (vam, 1);
5781 * Pass CLI buffers directly in the CLI_INBAND API message,
5782 * instead of an additional shared memory area.
5785 exec_inband (vat_main_t * vam)
5787 vl_api_cli_inband_t *mp;
5788 unformat_input_t *i = vam->input;
5791 if (vec_len (i->buffer) == 0)
5794 if (vam->exec_mode == 0 && unformat (i, "mode"))
5799 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5806 * In order for the CLI command to work, it
5807 * must be a vector ending in \n, not a C-string ending
5810 u32 len = vec_len (vam->input->buffer);
5811 M2 (CLI_INBAND, mp, len);
5812 vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
5816 /* json responses may or may not include a useful reply... */
5817 if (vec_len (vam->cmd_reply))
5818 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
5823 exec (vat_main_t * vam)
5825 return exec_inband (vam);
5829 api_create_loopback (vat_main_t * vam)
5831 unformat_input_t *i = vam->input;
5832 vl_api_create_loopback_t *mp;
5833 vl_api_create_loopback_instance_t *mp_lbi;
5836 u8 is_specified = 0;
5837 u32 user_instance = 0;
5840 clib_memset (mac_address, 0, sizeof (mac_address));
5842 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5844 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5846 if (unformat (i, "instance %d", &user_instance))
5854 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5855 mp_lbi->is_specified = is_specified;
5857 mp_lbi->user_instance = htonl (user_instance);
5859 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5864 /* Construct the API message */
5865 M (CREATE_LOOPBACK, mp);
5867 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5876 api_delete_loopback (vat_main_t * vam)
5878 unformat_input_t *i = vam->input;
5879 vl_api_delete_loopback_t *mp;
5880 u32 sw_if_index = ~0;
5883 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5885 if (unformat (i, "sw_if_index %d", &sw_if_index))
5891 if (sw_if_index == ~0)
5893 errmsg ("missing sw_if_index");
5897 /* Construct the API message */
5898 M (DELETE_LOOPBACK, mp);
5899 mp->sw_if_index = ntohl (sw_if_index);
5907 api_want_interface_events (vat_main_t * vam)
5909 unformat_input_t *i = vam->input;
5910 vl_api_want_interface_events_t *mp;
5914 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5916 if (unformat (i, "enable"))
5918 else if (unformat (i, "disable"))
5926 errmsg ("missing enable|disable");
5930 M (WANT_INTERFACE_EVENTS, mp);
5931 mp->enable_disable = enable;
5933 vam->interface_event_display = enable;
5941 /* Note: non-static, called once to set up the initial intfc table */
5943 api_sw_interface_dump (vat_main_t * vam)
5945 vl_api_sw_interface_dump_t *mp;
5946 vl_api_control_ping_t *mp_ping;
5948 name_sort_t *nses = 0, *ns;
5949 sw_interface_subif_t *sub = NULL;
5952 /* Toss the old name table */
5954 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5956 vec_add2 (nses, ns, 1);
5957 ns->name = (u8 *)(p->key);
5958 ns->value = (u32) p->value[0];
5962 hash_free (vam->sw_if_index_by_interface_name);
5964 vec_foreach (ns, nses) vec_free (ns->name);
5968 vec_foreach (sub, vam->sw_if_subif_table)
5970 vec_free (sub->interface_name);
5972 vec_free (vam->sw_if_subif_table);
5974 /* recreate the interface name hash table */
5975 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
5978 * Ask for all interface names. Otherwise, the epic catalog of
5979 * name filters becomes ridiculously long, and vat ends up needing
5980 * to be taught about new interface types.
5982 M (SW_INTERFACE_DUMP, mp);
5985 /* Use a control ping for synchronization */
5986 MPING (CONTROL_PING, mp_ping);
5994 api_sw_interface_set_flags (vat_main_t * vam)
5996 unformat_input_t *i = vam->input;
5997 vl_api_sw_interface_set_flags_t *mp;
5999 u8 sw_if_index_set = 0;
6003 /* Parse args required to build the message */
6004 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6006 if (unformat (i, "admin-up"))
6008 else if (unformat (i, "admin-down"))
6011 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6012 sw_if_index_set = 1;
6013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6014 sw_if_index_set = 1;
6019 if (sw_if_index_set == 0)
6021 errmsg ("missing interface name or sw_if_index");
6025 /* Construct the API message */
6026 M (SW_INTERFACE_SET_FLAGS, mp);
6027 mp->sw_if_index = ntohl (sw_if_index);
6028 mp->admin_up_down = admin_up;
6033 /* Wait for a reply, return the good/bad news... */
6039 api_sw_interface_set_rx_mode (vat_main_t * vam)
6041 unformat_input_t *i = vam->input;
6042 vl_api_sw_interface_set_rx_mode_t *mp;
6044 u8 sw_if_index_set = 0;
6046 u8 queue_id_valid = 0;
6048 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6050 /* Parse args required to build the message */
6051 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6053 if (unformat (i, "queue %d", &queue_id))
6055 else if (unformat (i, "polling"))
6056 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6057 else if (unformat (i, "interrupt"))
6058 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6059 else if (unformat (i, "adaptive"))
6060 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6062 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6063 sw_if_index_set = 1;
6064 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6065 sw_if_index_set = 1;
6070 if (sw_if_index_set == 0)
6072 errmsg ("missing interface name or sw_if_index");
6075 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6077 errmsg ("missing rx-mode");
6081 /* Construct the API message */
6082 M (SW_INTERFACE_SET_RX_MODE, mp);
6083 mp->sw_if_index = ntohl (sw_if_index);
6085 mp->queue_id_valid = queue_id_valid;
6086 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6091 /* Wait for a reply, return the good/bad news... */
6097 api_sw_interface_set_rx_placement (vat_main_t * vam)
6099 unformat_input_t *i = vam->input;
6100 vl_api_sw_interface_set_rx_placement_t *mp;
6102 u8 sw_if_index_set = 0;
6105 u32 queue_id, thread_index;
6107 /* Parse args required to build the message */
6108 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6110 if (unformat (i, "queue %d", &queue_id))
6112 else if (unformat (i, "main"))
6114 else if (unformat (i, "worker %d", &thread_index))
6117 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6118 sw_if_index_set = 1;
6119 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6120 sw_if_index_set = 1;
6125 if (sw_if_index_set == 0)
6127 errmsg ("missing interface name or sw_if_index");
6133 /* Construct the API message */
6134 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6135 mp->sw_if_index = ntohl (sw_if_index);
6136 mp->worker_id = ntohl (thread_index);
6137 mp->queue_id = ntohl (queue_id);
6138 mp->is_main = is_main;
6142 /* Wait for a reply, return the good/bad news... */
6147 static void vl_api_sw_interface_rx_placement_details_t_handler
6148 (vl_api_sw_interface_rx_placement_details_t * mp)
6150 vat_main_t *vam = &vat_main;
6151 u32 worker_id = ntohl (mp->worker_id);
6154 "\n%-11d %-11s %-6d %-5d %-9s",
6155 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
6156 worker_id, ntohl (mp->queue_id),
6158 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
6161 static void vl_api_sw_interface_rx_placement_details_t_handler_json
6162 (vl_api_sw_interface_rx_placement_details_t * mp)
6164 vat_main_t *vam = &vat_main;
6165 vat_json_node_t *node = NULL;
6167 if (VAT_JSON_ARRAY != vam->json_tree.type)
6169 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6170 vat_json_init_array (&vam->json_tree);
6172 node = vat_json_array_add (&vam->json_tree);
6174 vat_json_init_object (node);
6175 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6176 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
6177 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
6178 vat_json_object_add_uint (node, "mode", mp->mode);
6182 api_sw_interface_rx_placement_dump (vat_main_t * vam)
6184 unformat_input_t *i = vam->input;
6185 vl_api_sw_interface_rx_placement_dump_t *mp;
6186 vl_api_control_ping_t *mp_ping;
6189 u8 sw_if_index_set = 0;
6191 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6193 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6195 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6202 "\n%-11s %-11s %-6s %-5s %-4s",
6203 "sw_if_index", "main/worker", "thread", "queue", "mode");
6205 /* Dump Interface rx placement */
6206 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
6208 if (sw_if_index_set)
6209 mp->sw_if_index = htonl (sw_if_index);
6211 mp->sw_if_index = ~0;
6215 /* Use a control ping for synchronization */
6216 MPING (CONTROL_PING, mp_ping);
6224 api_sw_interface_clear_stats (vat_main_t * vam)
6226 unformat_input_t *i = vam->input;
6227 vl_api_sw_interface_clear_stats_t *mp;
6229 u8 sw_if_index_set = 0;
6232 /* Parse args required to build the message */
6233 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6235 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6236 sw_if_index_set = 1;
6237 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6238 sw_if_index_set = 1;
6243 /* Construct the API message */
6244 M (SW_INTERFACE_CLEAR_STATS, mp);
6246 if (sw_if_index_set == 1)
6247 mp->sw_if_index = ntohl (sw_if_index);
6249 mp->sw_if_index = ~0;
6254 /* Wait for a reply, return the good/bad news... */
6260 api_sw_interface_add_del_address (vat_main_t * vam)
6262 unformat_input_t *i = vam->input;
6263 vl_api_sw_interface_add_del_address_t *mp;
6265 u8 sw_if_index_set = 0;
6266 u8 is_add = 1, del_all = 0;
6267 u32 address_length = 0;
6268 u8 v4_address_set = 0;
6269 u8 v6_address_set = 0;
6270 ip4_address_t v4address;
6271 ip6_address_t v6address;
6274 /* Parse args required to build the message */
6275 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6277 if (unformat (i, "del-all"))
6279 else if (unformat (i, "del"))
6282 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6283 sw_if_index_set = 1;
6284 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6285 sw_if_index_set = 1;
6286 else if (unformat (i, "%U/%d",
6287 unformat_ip4_address, &v4address, &address_length))
6289 else if (unformat (i, "%U/%d",
6290 unformat_ip6_address, &v6address, &address_length))
6296 if (sw_if_index_set == 0)
6298 errmsg ("missing interface name or sw_if_index");
6301 if (v4_address_set && v6_address_set)
6303 errmsg ("both v4 and v6 addresses set");
6306 if (!v4_address_set && !v6_address_set && !del_all)
6308 errmsg ("no addresses set");
6312 /* Construct the API message */
6313 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
6315 mp->sw_if_index = ntohl (sw_if_index);
6316 mp->is_add = is_add;
6317 mp->del_all = del_all;
6321 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6325 clib_memcpy (mp->address, &v4address, sizeof (v4address));
6327 mp->address_length = address_length;
6332 /* Wait for a reply, return good/bad news */
6338 api_sw_interface_set_mpls_enable (vat_main_t * vam)
6340 unformat_input_t *i = vam->input;
6341 vl_api_sw_interface_set_mpls_enable_t *mp;
6343 u8 sw_if_index_set = 0;
6347 /* Parse args required to build the message */
6348 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6350 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6351 sw_if_index_set = 1;
6352 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6353 sw_if_index_set = 1;
6354 else if (unformat (i, "disable"))
6356 else if (unformat (i, "dis"))
6362 if (sw_if_index_set == 0)
6364 errmsg ("missing interface name or sw_if_index");
6368 /* Construct the API message */
6369 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
6371 mp->sw_if_index = ntohl (sw_if_index);
6372 mp->enable = enable;
6377 /* Wait for a reply... */
6383 api_sw_interface_set_table (vat_main_t * vam)
6385 unformat_input_t *i = vam->input;
6386 vl_api_sw_interface_set_table_t *mp;
6387 u32 sw_if_index, vrf_id = 0;
6388 u8 sw_if_index_set = 0;
6392 /* Parse args required to build the message */
6393 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6395 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6396 sw_if_index_set = 1;
6397 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6398 sw_if_index_set = 1;
6399 else if (unformat (i, "vrf %d", &vrf_id))
6401 else if (unformat (i, "ipv6"))
6407 if (sw_if_index_set == 0)
6409 errmsg ("missing interface name or sw_if_index");
6413 /* Construct the API message */
6414 M (SW_INTERFACE_SET_TABLE, mp);
6416 mp->sw_if_index = ntohl (sw_if_index);
6417 mp->is_ipv6 = is_ipv6;
6418 mp->vrf_id = ntohl (vrf_id);
6423 /* Wait for a reply... */
6428 static void vl_api_sw_interface_get_table_reply_t_handler
6429 (vl_api_sw_interface_get_table_reply_t * mp)
6431 vat_main_t *vam = &vat_main;
6433 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6435 vam->retval = ntohl (mp->retval);
6436 vam->result_ready = 1;
6440 static void vl_api_sw_interface_get_table_reply_t_handler_json
6441 (vl_api_sw_interface_get_table_reply_t * mp)
6443 vat_main_t *vam = &vat_main;
6444 vat_json_node_t node;
6446 vat_json_init_object (&node);
6447 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6448 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6450 vat_json_print (vam->ofp, &node);
6451 vat_json_free (&node);
6453 vam->retval = ntohl (mp->retval);
6454 vam->result_ready = 1;
6458 api_sw_interface_get_table (vat_main_t * vam)
6460 unformat_input_t *i = vam->input;
6461 vl_api_sw_interface_get_table_t *mp;
6463 u8 sw_if_index_set = 0;
6467 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6469 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6470 sw_if_index_set = 1;
6471 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6472 sw_if_index_set = 1;
6473 else if (unformat (i, "ipv6"))
6479 if (sw_if_index_set == 0)
6481 errmsg ("missing interface name or sw_if_index");
6485 M (SW_INTERFACE_GET_TABLE, mp);
6486 mp->sw_if_index = htonl (sw_if_index);
6487 mp->is_ipv6 = is_ipv6;
6495 api_sw_interface_set_vpath (vat_main_t * vam)
6497 unformat_input_t *i = vam->input;
6498 vl_api_sw_interface_set_vpath_t *mp;
6499 u32 sw_if_index = 0;
6500 u8 sw_if_index_set = 0;
6504 /* Parse args required to build the message */
6505 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6507 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6508 sw_if_index_set = 1;
6509 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6510 sw_if_index_set = 1;
6511 else if (unformat (i, "enable"))
6513 else if (unformat (i, "disable"))
6519 if (sw_if_index_set == 0)
6521 errmsg ("missing interface name or sw_if_index");
6525 /* Construct the API message */
6526 M (SW_INTERFACE_SET_VPATH, mp);
6528 mp->sw_if_index = ntohl (sw_if_index);
6529 mp->enable = is_enable;
6534 /* Wait for a reply... */
6540 api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6542 unformat_input_t *i = vam->input;
6543 vl_api_sw_interface_set_vxlan_bypass_t *mp;
6544 u32 sw_if_index = 0;
6545 u8 sw_if_index_set = 0;
6550 /* Parse args required to build the message */
6551 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6553 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6554 sw_if_index_set = 1;
6555 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6556 sw_if_index_set = 1;
6557 else if (unformat (i, "enable"))
6559 else if (unformat (i, "disable"))
6561 else if (unformat (i, "ip4"))
6563 else if (unformat (i, "ip6"))
6569 if (sw_if_index_set == 0)
6571 errmsg ("missing interface name or sw_if_index");
6575 /* Construct the API message */
6576 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
6578 mp->sw_if_index = ntohl (sw_if_index);
6579 mp->enable = is_enable;
6580 mp->is_ipv6 = is_ipv6;
6585 /* Wait for a reply... */
6591 api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6593 unformat_input_t *i = vam->input;
6594 vl_api_sw_interface_set_geneve_bypass_t *mp;
6595 u32 sw_if_index = 0;
6596 u8 sw_if_index_set = 0;
6601 /* Parse args required to build the message */
6602 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6604 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6605 sw_if_index_set = 1;
6606 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6607 sw_if_index_set = 1;
6608 else if (unformat (i, "enable"))
6610 else if (unformat (i, "disable"))
6612 else if (unformat (i, "ip4"))
6614 else if (unformat (i, "ip6"))
6620 if (sw_if_index_set == 0)
6622 errmsg ("missing interface name or sw_if_index");
6626 /* Construct the API message */
6627 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
6629 mp->sw_if_index = ntohl (sw_if_index);
6630 mp->enable = is_enable;
6631 mp->is_ipv6 = is_ipv6;
6636 /* Wait for a reply... */
6642 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6644 unformat_input_t *i = vam->input;
6645 vl_api_sw_interface_set_l2_xconnect_t *mp;
6647 u8 rx_sw_if_index_set = 0;
6649 u8 tx_sw_if_index_set = 0;
6653 /* Parse args required to build the message */
6654 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6656 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6657 rx_sw_if_index_set = 1;
6658 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6659 tx_sw_if_index_set = 1;
6660 else if (unformat (i, "rx"))
6662 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6664 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6666 rx_sw_if_index_set = 1;
6671 else if (unformat (i, "tx"))
6673 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6675 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6677 tx_sw_if_index_set = 1;
6682 else if (unformat (i, "enable"))
6684 else if (unformat (i, "disable"))
6690 if (rx_sw_if_index_set == 0)
6692 errmsg ("missing rx interface name or rx_sw_if_index");
6696 if (enable && (tx_sw_if_index_set == 0))
6698 errmsg ("missing tx interface name or tx_sw_if_index");
6702 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
6704 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6705 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6706 mp->enable = enable;
6714 api_sw_interface_set_l2_bridge (vat_main_t * vam)
6716 unformat_input_t *i = vam->input;
6717 vl_api_sw_interface_set_l2_bridge_t *mp;
6718 vl_api_l2_port_type_t port_type;
6720 u8 rx_sw_if_index_set = 0;
6727 port_type = L2_API_PORT_TYPE_NORMAL;
6729 /* Parse args required to build the message */
6730 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6732 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6733 rx_sw_if_index_set = 1;
6734 else if (unformat (i, "bd_id %d", &bd_id))
6738 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6739 rx_sw_if_index_set = 1;
6740 else if (unformat (i, "shg %d", &shg))
6742 else if (unformat (i, "bvi"))
6743 port_type = L2_API_PORT_TYPE_BVI;
6744 else if (unformat (i, "uu-fwd"))
6745 port_type = L2_API_PORT_TYPE_UU_FWD;
6746 else if (unformat (i, "enable"))
6748 else if (unformat (i, "disable"))
6754 if (rx_sw_if_index_set == 0)
6756 errmsg ("missing rx interface name or sw_if_index");
6760 if (enable && (bd_id_set == 0))
6762 errmsg ("missing bridge domain");
6766 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
6768 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6769 mp->bd_id = ntohl (bd_id);
6771 mp->port_type = ntohl (port_type);
6772 mp->enable = enable;
6780 api_bridge_domain_dump (vat_main_t * vam)
6782 unformat_input_t *i = vam->input;
6783 vl_api_bridge_domain_dump_t *mp;
6784 vl_api_control_ping_t *mp_ping;
6788 /* Parse args required to build the message */
6789 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6791 if (unformat (i, "bd_id %d", &bd_id))
6797 M (BRIDGE_DOMAIN_DUMP, mp);
6798 mp->bd_id = ntohl (bd_id);
6801 /* Use a control ping for synchronization */
6802 MPING (CONTROL_PING, mp_ping);
6810 api_bridge_domain_add_del (vat_main_t * vam)
6812 unformat_input_t *i = vam->input;
6813 vl_api_bridge_domain_add_del_t *mp;
6816 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
6821 /* Parse args required to build the message */
6822 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6824 if (unformat (i, "bd_id %d", &bd_id))
6826 else if (unformat (i, "flood %d", &flood))
6828 else if (unformat (i, "uu-flood %d", &uu_flood))
6830 else if (unformat (i, "forward %d", &forward))
6832 else if (unformat (i, "learn %d", &learn))
6834 else if (unformat (i, "arp-term %d", &arp_term))
6836 else if (unformat (i, "mac-age %d", &mac_age))
6838 else if (unformat (i, "bd-tag %s", &bd_tag))
6840 else if (unformat (i, "del"))
6843 flood = uu_flood = forward = learn = 0;
6851 errmsg ("missing bridge domain");
6858 errmsg ("mac age must be less than 256 ");
6863 if ((bd_tag) && (vec_len (bd_tag) > 63))
6865 errmsg ("bd-tag cannot be longer than 63");
6870 M (BRIDGE_DOMAIN_ADD_DEL, mp);
6872 mp->bd_id = ntohl (bd_id);
6874 mp->uu_flood = uu_flood;
6875 mp->forward = forward;
6877 mp->arp_term = arp_term;
6878 mp->is_add = is_add;
6879 mp->mac_age = (u8) mac_age;
6882 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
6883 mp->bd_tag[vec_len (bd_tag)] = 0;
6894 api_l2fib_flush_bd (vat_main_t * vam)
6896 unformat_input_t *i = vam->input;
6897 vl_api_l2fib_flush_bd_t *mp;
6901 /* Parse args required to build the message */
6902 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6904 if (unformat (i, "bd_id %d", &bd_id));
6911 errmsg ("missing bridge domain");
6915 M (L2FIB_FLUSH_BD, mp);
6917 mp->bd_id = htonl (bd_id);
6925 api_l2fib_flush_int (vat_main_t * vam)
6927 unformat_input_t *i = vam->input;
6928 vl_api_l2fib_flush_int_t *mp;
6929 u32 sw_if_index = ~0;
6932 /* Parse args required to build the message */
6933 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6935 if (unformat (i, "sw_if_index %d", &sw_if_index));
6937 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
6942 if (sw_if_index == ~0)
6944 errmsg ("missing interface name or sw_if_index");
6948 M (L2FIB_FLUSH_INT, mp);
6950 mp->sw_if_index = ntohl (sw_if_index);
6958 api_l2fib_add_del (vat_main_t * vam)
6960 unformat_input_t *i = vam->input;
6961 vl_api_l2fib_add_del_t *mp;
6967 u32 sw_if_index = 0;
6968 u8 sw_if_index_set = 0;
6977 /* Parse args required to build the message */
6978 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6980 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
6982 else if (unformat (i, "bd_id %d", &bd_id))
6984 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6985 sw_if_index_set = 1;
6986 else if (unformat (i, "sw_if"))
6988 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6991 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6992 sw_if_index_set = 1;
6997 else if (unformat (i, "static"))
6999 else if (unformat (i, "filter"))
7004 else if (unformat (i, "bvi"))
7009 else if (unformat (i, "del"))
7011 else if (unformat (i, "count %d", &count))
7019 errmsg ("missing mac address");
7025 errmsg ("missing bridge domain");
7029 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7031 errmsg ("missing interface name or sw_if_index");
7037 /* Turn on async mode */
7038 vam->async_mode = 1;
7039 vam->async_errors = 0;
7040 before = vat_time_now (vam);
7043 for (j = 0; j < count; j++)
7045 M (L2FIB_ADD_DEL, mp);
7047 clib_memcpy (mp->mac, mac, 6);
7048 mp->bd_id = ntohl (bd_id);
7049 mp->is_add = is_add;
7050 mp->sw_if_index = ntohl (sw_if_index);
7054 mp->static_mac = static_mac;
7055 mp->filter_mac = filter_mac;
7056 mp->bvi_mac = bvi_mac;
7058 increment_mac_address (mac);
7065 vl_api_control_ping_t *mp_ping;
7068 /* Shut off async mode */
7069 vam->async_mode = 0;
7071 MPING (CONTROL_PING, mp_ping);
7074 timeout = vat_time_now (vam) + 1.0;
7075 while (vat_time_now (vam) < timeout)
7076 if (vam->result_ready == 1)
7081 if (vam->retval == -99)
7084 if (vam->async_errors > 0)
7086 errmsg ("%d asynchronous errors", vam->async_errors);
7089 vam->async_errors = 0;
7090 after = vat_time_now (vam);
7092 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7093 count, after - before, count / (after - before));
7099 /* Wait for a reply... */
7103 /* Return the good/bad news */
7104 return (vam->retval);
7108 api_bridge_domain_set_mac_age (vat_main_t * vam)
7110 unformat_input_t *i = vam->input;
7111 vl_api_bridge_domain_set_mac_age_t *mp;
7116 /* Parse args required to build the message */
7117 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7119 if (unformat (i, "bd_id %d", &bd_id));
7120 else if (unformat (i, "mac-age %d", &mac_age));
7127 errmsg ("missing bridge domain");
7133 errmsg ("mac age must be less than 256 ");
7137 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7139 mp->bd_id = htonl (bd_id);
7140 mp->mac_age = (u8) mac_age;
7148 api_l2_flags (vat_main_t * vam)
7150 unformat_input_t *i = vam->input;
7151 vl_api_l2_flags_t *mp;
7154 u8 sw_if_index_set = 0;
7158 /* Parse args required to build the message */
7159 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7161 if (unformat (i, "sw_if_index %d", &sw_if_index))
7162 sw_if_index_set = 1;
7163 else if (unformat (i, "sw_if"))
7165 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7168 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7169 sw_if_index_set = 1;
7174 else if (unformat (i, "learn"))
7176 else if (unformat (i, "forward"))
7178 else if (unformat (i, "flood"))
7180 else if (unformat (i, "uu-flood"))
7181 flags |= L2_UU_FLOOD;
7182 else if (unformat (i, "arp-term"))
7183 flags |= L2_ARP_TERM;
7184 else if (unformat (i, "off"))
7186 else if (unformat (i, "disable"))
7192 if (sw_if_index_set == 0)
7194 errmsg ("missing interface name or sw_if_index");
7200 mp->sw_if_index = ntohl (sw_if_index);
7201 mp->feature_bitmap = ntohl (flags);
7202 mp->is_set = is_set;
7210 api_bridge_flags (vat_main_t * vam)
7212 unformat_input_t *i = vam->input;
7213 vl_api_bridge_flags_t *mp;
7217 bd_flags_t flags = 0;
7220 /* Parse args required to build the message */
7221 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7223 if (unformat (i, "bd_id %d", &bd_id))
7225 else if (unformat (i, "learn"))
7226 flags |= BRIDGE_API_FLAG_LEARN;
7227 else if (unformat (i, "forward"))
7228 flags |= BRIDGE_API_FLAG_FWD;
7229 else if (unformat (i, "flood"))
7230 flags |= BRIDGE_API_FLAG_FLOOD;
7231 else if (unformat (i, "uu-flood"))
7232 flags |= BRIDGE_API_FLAG_UU_FLOOD;
7233 else if (unformat (i, "arp-term"))
7234 flags |= BRIDGE_API_FLAG_ARP_TERM;
7235 else if (unformat (i, "off"))
7237 else if (unformat (i, "disable"))
7245 errmsg ("missing bridge domain");
7249 M (BRIDGE_FLAGS, mp);
7251 mp->bd_id = ntohl (bd_id);
7252 mp->flags = ntohl (flags);
7253 mp->is_set = is_set;
7261 api_bd_ip_mac_add_del (vat_main_t * vam)
7263 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
7264 vl_api_mac_address_t mac = { 0 };
7265 unformat_input_t *i = vam->input;
7266 vl_api_bd_ip_mac_add_del_t *mp;
7278 /* Parse args required to build the message */
7279 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7281 if (unformat (i, "bd_id %d", &bd_id))
7285 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
7289 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
7293 else if (unformat (i, "del"))
7301 errmsg ("missing bridge domain");
7304 else if (ip_set == 0)
7306 errmsg ("missing IP address");
7309 else if (mac_set == 0)
7311 errmsg ("missing MAC address");
7315 M (BD_IP_MAC_ADD_DEL, mp);
7317 mp->bd_id = ntohl (bd_id);
7318 mp->is_add = is_add;
7320 clib_memcpy (&mp->ip, &ip, sizeof (ip));
7321 clib_memcpy (&mp->mac, &mac, sizeof (mac));
7329 api_bd_ip_mac_flush (vat_main_t * vam)
7331 unformat_input_t *i = vam->input;
7332 vl_api_bd_ip_mac_flush_t *mp;
7337 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7339 if (unformat (i, "bd_id %d", &bd_id))
7349 errmsg ("missing bridge domain");
7353 M (BD_IP_MAC_FLUSH, mp);
7355 mp->bd_id = ntohl (bd_id);
7362 static void vl_api_bd_ip_mac_details_t_handler
7363 (vl_api_bd_ip_mac_details_t * mp)
7365 vat_main_t *vam = &vat_main;
7370 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7373 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7376 "\n%-5d %-7s %-20U %-30s",
7377 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7378 format_ethernet_address, mp->mac_address, ip);
7383 static void vl_api_bd_ip_mac_details_t_handler_json
7384 (vl_api_bd_ip_mac_details_t * mp)
7386 vat_main_t *vam = &vat_main;
7387 vat_json_node_t *node = NULL;
7389 if (VAT_JSON_ARRAY != vam->json_tree.type)
7391 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7392 vat_json_init_array (&vam->json_tree);
7394 node = vat_json_array_add (&vam->json_tree);
7396 vat_json_init_object (node);
7397 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7398 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
7399 vat_json_object_add_string_copy (node, "mac_address",
7400 format (0, "%U", format_ethernet_address,
7406 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7409 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7410 vat_json_object_add_string_copy (node, "ip_address", ip);
7415 api_bd_ip_mac_dump (vat_main_t * vam)
7417 unformat_input_t *i = vam->input;
7418 vl_api_bd_ip_mac_dump_t *mp;
7419 vl_api_control_ping_t *mp_ping;
7424 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7426 if (unformat (i, "bd_id %d", &bd_id))
7435 "\n%-5s %-7s %-20s %-30s",
7436 "bd_id", "is_ipv6", "mac_address", "ip_address");
7438 /* Dump Bridge Domain Ip to Mac entries */
7439 M (BD_IP_MAC_DUMP, mp);
7442 mp->bd_id = htonl (bd_id);
7448 /* Use a control ping for synchronization */
7449 MPING (CONTROL_PING, mp_ping);
7457 api_tap_create_v2 (vat_main_t * vam)
7459 unformat_input_t *i = vam->input;
7460 vl_api_tap_create_v2_t *mp;
7464 u8 *host_if_name = 0;
7466 u8 host_mac_addr[6];
7467 u8 host_mac_addr_set = 0;
7468 u8 *host_bridge = 0;
7469 ip4_address_t host_ip4_addr;
7470 ip4_address_t host_ip4_gw;
7471 u8 host_ip4_gw_set = 0;
7472 u32 host_ip4_prefix_len = 0;
7473 ip6_address_t host_ip6_addr;
7474 ip6_address_t host_ip6_gw;
7475 u8 host_ip6_gw_set = 0;
7476 u32 host_ip6_prefix_len = 0;
7478 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7480 clib_memset (mac_address, 0, sizeof (mac_address));
7482 /* Parse args required to build the message */
7483 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7485 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7489 else if (unformat (i, "id %u", &id))
7491 else if (unformat (i, "host-if-name %s", &host_if_name))
7493 else if (unformat (i, "host-ns %s", &host_ns))
7495 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
7497 host_mac_addr_set = 1;
7498 else if (unformat (i, "host-bridge %s", &host_bridge))
7500 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
7501 &host_ip4_addr, &host_ip4_prefix_len))
7503 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
7504 &host_ip6_addr, &host_ip6_prefix_len))
7506 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
7508 host_ip4_gw_set = 1;
7509 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
7511 host_ip6_gw_set = 1;
7512 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
7514 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
7520 if (vec_len (host_if_name) > 63)
7522 errmsg ("tap name too long. ");
7525 if (vec_len (host_ns) > 63)
7527 errmsg ("host name space too long. ");
7530 if (vec_len (host_bridge) > 63)
7532 errmsg ("host bridge name too long. ");
7535 if (host_ip4_prefix_len > 32)
7537 errmsg ("host ip4 prefix length not valid. ");
7540 if (host_ip6_prefix_len > 128)
7542 errmsg ("host ip6 prefix length not valid. ");
7545 if (!is_pow2 (rx_ring_sz))
7547 errmsg ("rx ring size must be power of 2. ");
7550 if (rx_ring_sz > 32768)
7552 errmsg ("rx ring size must be 32768 or lower. ");
7555 if (!is_pow2 (tx_ring_sz))
7557 errmsg ("tx ring size must be power of 2. ");
7560 if (tx_ring_sz > 32768)
7562 errmsg ("tx ring size must be 32768 or lower. ");
7566 /* Construct the API message */
7567 M (TAP_CREATE_V2, mp);
7569 mp->use_random_mac = random_mac;
7571 mp->id = ntohl (id);
7572 mp->host_namespace_set = host_ns != 0;
7573 mp->host_bridge_set = host_bridge != 0;
7574 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
7575 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
7576 mp->rx_ring_sz = ntohs (rx_ring_sz);
7577 mp->tx_ring_sz = ntohs (tx_ring_sz);
7579 if (random_mac == 0)
7580 clib_memcpy (mp->mac_address, mac_address, 6);
7581 if (host_mac_addr_set)
7582 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
7584 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
7586 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
7588 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
7589 if (host_ip4_prefix_len)
7590 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
7591 if (host_ip6_prefix_len)
7592 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
7593 if (host_ip4_gw_set)
7594 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
7595 if (host_ip6_gw_set)
7596 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
7599 vec_free (host_if_name);
7600 vec_free (host_bridge);
7605 /* Wait for a reply... */
7611 api_tap_delete_v2 (vat_main_t * vam)
7613 unformat_input_t *i = vam->input;
7614 vl_api_tap_delete_v2_t *mp;
7615 u32 sw_if_index = ~0;
7616 u8 sw_if_index_set = 0;
7619 /* Parse args required to build the message */
7620 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7622 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7623 sw_if_index_set = 1;
7624 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7625 sw_if_index_set = 1;
7630 if (sw_if_index_set == 0)
7632 errmsg ("missing vpp interface name. ");
7636 /* Construct the API message */
7637 M (TAP_DELETE_V2, mp);
7639 mp->sw_if_index = ntohl (sw_if_index);
7644 /* Wait for a reply... */
7650 unformat_pci_addr (unformat_input_t * input, va_list * args)
7659 addr = va_arg (*args, struct pci_addr_t *);
7662 if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
7665 addr->domain = x[0];
7668 addr->function = x[3];
7674 api_virtio_pci_create (vat_main_t * vam)
7676 unformat_input_t *i = vam->input;
7677 vl_api_virtio_pci_create_t *mp;
7682 u64 features = (u64) ~ (0ULL);
7685 clib_memset (mac_address, 0, sizeof (mac_address));
7687 /* Parse args required to build the message */
7688 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7690 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7694 else if (unformat (i, "pci-addr %U", unformat_pci_addr, &pci_addr))
7696 else if (unformat (i, "features 0x%llx", &features))
7698 else if (unformat (i, "gso-enabled"))
7706 errmsg ("pci address must be non zero. ");
7710 /* Construct the API message */
7711 M (VIRTIO_PCI_CREATE, mp);
7713 mp->use_random_mac = random_mac;
7715 mp->pci_addr = htonl (pci_addr);
7716 mp->features = clib_host_to_net_u64 (features);
7718 if (random_mac == 0)
7719 clib_memcpy (mp->mac_address, mac_address, 6);
7724 /* Wait for a reply... */
7730 api_virtio_pci_delete (vat_main_t * vam)
7732 unformat_input_t *i = vam->input;
7733 vl_api_virtio_pci_delete_t *mp;
7734 u32 sw_if_index = ~0;
7735 u8 sw_if_index_set = 0;
7738 /* Parse args required to build the message */
7739 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7741 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7742 sw_if_index_set = 1;
7743 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7744 sw_if_index_set = 1;
7749 if (sw_if_index_set == 0)
7751 errmsg ("missing vpp interface name. ");
7755 /* Construct the API message */
7756 M (VIRTIO_PCI_DELETE, mp);
7758 mp->sw_if_index = htonl (sw_if_index);
7763 /* Wait for a reply... */
7769 api_bond_create (vat_main_t * vam)
7771 unformat_input_t *i = vam->input;
7772 vl_api_bond_create_t *mp;
7781 clib_memset (mac_address, 0, sizeof (mac_address));
7784 /* Parse args required to build the message */
7785 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7787 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
7789 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
7790 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
7792 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
7795 else if (unformat (i, "id %u", &id))
7801 if (mode_is_set == 0)
7803 errmsg ("Missing bond mode. ");
7807 /* Construct the API message */
7808 M (BOND_CREATE, mp);
7810 mp->use_custom_mac = custom_mac;
7814 mp->id = htonl (id);
7817 clib_memcpy (mp->mac_address, mac_address, 6);
7822 /* Wait for a reply... */
7828 api_bond_delete (vat_main_t * vam)
7830 unformat_input_t *i = vam->input;
7831 vl_api_bond_delete_t *mp;
7832 u32 sw_if_index = ~0;
7833 u8 sw_if_index_set = 0;
7836 /* Parse args required to build the message */
7837 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7839 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7840 sw_if_index_set = 1;
7841 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7842 sw_if_index_set = 1;
7847 if (sw_if_index_set == 0)
7849 errmsg ("missing vpp interface name. ");
7853 /* Construct the API message */
7854 M (BOND_DELETE, mp);
7856 mp->sw_if_index = ntohl (sw_if_index);
7861 /* Wait for a reply... */
7867 api_bond_enslave (vat_main_t * vam)
7869 unformat_input_t *i = vam->input;
7870 vl_api_bond_enslave_t *mp;
7871 u32 bond_sw_if_index;
7875 u32 bond_sw_if_index_is_set = 0;
7877 u8 sw_if_index_is_set = 0;
7879 /* Parse args required to build the message */
7880 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7882 if (unformat (i, "sw_if_index %d", &sw_if_index))
7883 sw_if_index_is_set = 1;
7884 else if (unformat (i, "bond %u", &bond_sw_if_index))
7885 bond_sw_if_index_is_set = 1;
7886 else if (unformat (i, "passive %d", &is_passive))
7888 else if (unformat (i, "long-timeout %d", &is_long_timeout))
7894 if (bond_sw_if_index_is_set == 0)
7896 errmsg ("Missing bond sw_if_index. ");
7899 if (sw_if_index_is_set == 0)
7901 errmsg ("Missing slave sw_if_index. ");
7905 /* Construct the API message */
7906 M (BOND_ENSLAVE, mp);
7908 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
7909 mp->sw_if_index = ntohl (sw_if_index);
7910 mp->is_long_timeout = is_long_timeout;
7911 mp->is_passive = is_passive;
7916 /* Wait for a reply... */
7922 api_bond_detach_slave (vat_main_t * vam)
7924 unformat_input_t *i = vam->input;
7925 vl_api_bond_detach_slave_t *mp;
7926 u32 sw_if_index = ~0;
7927 u8 sw_if_index_set = 0;
7930 /* Parse args required to build the message */
7931 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7933 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7934 sw_if_index_set = 1;
7935 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7936 sw_if_index_set = 1;
7941 if (sw_if_index_set == 0)
7943 errmsg ("missing vpp interface name. ");
7947 /* Construct the API message */
7948 M (BOND_DETACH_SLAVE, mp);
7950 mp->sw_if_index = ntohl (sw_if_index);
7955 /* Wait for a reply... */
7961 api_ip_table_add_del (vat_main_t * vam)
7963 unformat_input_t *i = vam->input;
7964 vl_api_ip_table_add_del_t *mp;
7970 /* Parse args required to build the message */
7971 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7973 if (unformat (i, "ipv6"))
7975 else if (unformat (i, "del"))
7977 else if (unformat (i, "add"))
7979 else if (unformat (i, "table %d", &table_id))
7983 clib_warning ("parse error '%U'", format_unformat_error, i);
7990 errmsg ("missing table-ID");
7994 /* Construct the API message */
7995 M (IP_TABLE_ADD_DEL, mp);
7997 mp->table_id = ntohl (table_id);
7998 mp->is_ipv6 = is_ipv6;
7999 mp->is_add = is_add;
8004 /* Wait for a reply... */
8011 api_ip_add_del_route (vat_main_t * vam)
8013 unformat_input_t *i = vam->input;
8014 vl_api_ip_add_del_route_t *mp;
8015 u32 sw_if_index = ~0, vrf_id = 0;
8017 u8 is_local = 0, is_drop = 0;
8018 u8 is_unreach = 0, is_prohibit = 0;
8020 u32 next_hop_weight = 1;
8021 u8 is_multipath = 0;
8023 u8 address_length_set = 0;
8024 u32 next_hop_table_id = 0;
8025 u32 resolve_attempts = 0;
8026 u32 dst_address_length = 0;
8027 u8 next_hop_set = 0;
8028 ip4_address_t v4_dst_address, v4_next_hop_address;
8029 ip6_address_t v6_dst_address, v6_next_hop_address;
8033 u32 random_add_del = 0;
8034 u32 *random_vector = 0;
8036 u32 random_seed = 0xdeaddabe;
8037 u32 classify_table_index = ~0;
8039 u8 resolve_host = 0, resolve_attached = 0;
8040 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8041 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8042 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8044 clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8045 clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
8046 /* Parse args required to build the message */
8047 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8049 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8051 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8053 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8058 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8063 else if (unformat (i, "/%d", &dst_address_length))
8065 address_length_set = 1;
8068 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8069 &v4_next_hop_address))
8073 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8074 &v6_next_hop_address))
8080 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8084 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8088 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8090 else if (unformat (i, "weight %d", &next_hop_weight))
8092 else if (unformat (i, "drop"))
8096 else if (unformat (i, "null-send-unreach"))
8100 else if (unformat (i, "null-send-prohibit"))
8104 else if (unformat (i, "local"))
8108 else if (unformat (i, "classify %d", &classify_table_index))
8112 else if (unformat (i, "del"))
8114 else if (unformat (i, "add"))
8116 else if (unformat (i, "resolve-via-host"))
8118 else if (unformat (i, "resolve-via-attached"))
8119 resolve_attached = 1;
8120 else if (unformat (i, "multipath"))
8122 else if (unformat (i, "vrf %d", &vrf_id))
8124 else if (unformat (i, "count %d", &count))
8126 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8128 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8130 else if (unformat (i, "out-label %d", &next_hop_out_label))
8132 vl_api_fib_mpls_label_t fib_label = {
8133 .label = ntohl (next_hop_out_label),
8137 vec_add1 (next_hop_out_label_stack, fib_label);
8139 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8141 else if (unformat (i, "random"))
8143 else if (unformat (i, "seed %d", &random_seed))
8147 clib_warning ("parse error '%U'", format_unformat_error, i);
8152 if (!next_hop_set && !is_drop && !is_local &&
8153 !is_classify && !is_unreach && !is_prohibit &&
8154 MPLS_LABEL_INVALID == next_hop_via_label)
8157 ("next hop / local / drop / unreach / prohibit / classify not set");
8161 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8163 errmsg ("next hop and next-hop via label set");
8166 if (address_set == 0)
8168 errmsg ("missing addresses");
8172 if (address_length_set == 0)
8174 errmsg ("missing address length");
8178 /* Generate a pile of unique, random routes */
8181 u32 this_random_address;
8182 random_hash = hash_create (count, sizeof (uword));
8184 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8185 for (j = 0; j <= count; j++)
8189 this_random_address = random_u32 (&random_seed);
8190 this_random_address =
8191 clib_host_to_net_u32 (this_random_address);
8193 while (hash_get (random_hash, this_random_address));
8194 vec_add1 (random_vector, this_random_address);
8195 hash_set (random_hash, this_random_address, 1);
8197 hash_free (random_hash);
8198 v4_dst_address.as_u32 = random_vector[0];
8203 /* Turn on async mode */
8204 vam->async_mode = 1;
8205 vam->async_errors = 0;
8206 before = vat_time_now (vam);
8209 for (j = 0; j < count; j++)
8211 /* Construct the API message */
8212 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8213 vec_len (next_hop_out_label_stack));
8215 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8216 mp->table_id = ntohl (vrf_id);
8218 mp->is_add = is_add;
8219 mp->is_drop = is_drop;
8220 mp->is_unreach = is_unreach;
8221 mp->is_prohibit = is_prohibit;
8222 mp->is_ipv6 = is_ipv6;
8223 mp->is_local = is_local;
8224 mp->is_classify = is_classify;
8225 mp->is_multipath = is_multipath;
8226 mp->is_resolve_host = resolve_host;
8227 mp->is_resolve_attached = resolve_attached;
8228 mp->next_hop_weight = next_hop_weight;
8229 mp->next_hop_preference = 0;
8230 mp->dst_address_length = dst_address_length;
8231 mp->next_hop_table_id = ntohl (next_hop_table_id);
8232 mp->classify_table_index = ntohl (classify_table_index);
8233 mp->next_hop_via_label = ntohl (next_hop_via_label);
8234 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8235 if (0 != mp->next_hop_n_out_labels)
8237 memcpy (mp->next_hop_out_label_stack,
8238 next_hop_out_label_stack,
8239 (vec_len (next_hop_out_label_stack) *
8240 sizeof (vl_api_fib_mpls_label_t)));
8241 vec_free (next_hop_out_label_stack);
8246 clib_memcpy (mp->dst_address, &v6_dst_address,
8247 sizeof (v6_dst_address));
8249 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8250 sizeof (v6_next_hop_address));
8251 increment_v6_address (&v6_dst_address);
8255 clib_memcpy (mp->dst_address, &v4_dst_address,
8256 sizeof (v4_dst_address));
8258 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8259 sizeof (v4_next_hop_address));
8261 v4_dst_address.as_u32 = random_vector[j + 1];
8263 increment_v4_address (&v4_dst_address);
8267 /* If we receive SIGTERM, stop now... */
8272 /* When testing multiple add/del ops, use a control-ping to sync */
8275 vl_api_control_ping_t *mp_ping;
8279 /* Shut off async mode */
8280 vam->async_mode = 0;
8282 MPING (CONTROL_PING, mp_ping);
8285 timeout = vat_time_now (vam) + 1.0;
8286 while (vat_time_now (vam) < timeout)
8287 if (vam->result_ready == 1)
8292 if (vam->retval == -99)
8295 if (vam->async_errors > 0)
8297 errmsg ("%d asynchronous errors", vam->async_errors);
8300 vam->async_errors = 0;
8301 after = vat_time_now (vam);
8303 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8307 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8308 count, after - before, count / (after - before));
8314 /* Wait for a reply... */
8319 /* Return the good/bad news */
8320 return (vam->retval);
8324 api_ip_mroute_add_del (vat_main_t * vam)
8326 unformat_input_t *i = vam->input;
8327 vl_api_ip_mroute_add_del_t *mp;
8328 u32 sw_if_index = ~0, vrf_id = 0;
8333 u32 grp_address_length = 0;
8334 ip4_address_t v4_grp_address, v4_src_address;
8335 ip6_address_t v6_grp_address, v6_src_address;
8336 mfib_itf_flags_t iflags = 0;
8337 mfib_entry_flags_t eflags = 0;
8340 /* Parse args required to build the message */
8341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8343 if (unformat (i, "sw_if_index %d", &sw_if_index))
8345 else if (unformat (i, "%U %U",
8346 unformat_ip4_address, &v4_src_address,
8347 unformat_ip4_address, &v4_grp_address))
8349 grp_address_length = 64;
8353 else if (unformat (i, "%U %U",
8354 unformat_ip6_address, &v6_src_address,
8355 unformat_ip6_address, &v6_grp_address))
8357 grp_address_length = 256;
8361 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8363 clib_memset (&v4_src_address, 0, sizeof (v4_src_address));
8364 grp_address_length = 32;
8368 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8370 clib_memset (&v6_src_address, 0, sizeof (v6_src_address));
8371 grp_address_length = 128;
8375 else if (unformat (i, "/%d", &grp_address_length))
8377 else if (unformat (i, "local"))
8381 else if (unformat (i, "del"))
8383 else if (unformat (i, "add"))
8385 else if (unformat (i, "vrf %d", &vrf_id))
8387 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8389 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8393 clib_warning ("parse error '%U'", format_unformat_error, i);
8398 if (address_set == 0)
8400 errmsg ("missing addresses\n");
8404 /* Construct the API message */
8405 M (IP_MROUTE_ADD_DEL, mp);
8407 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8408 mp->table_id = ntohl (vrf_id);
8410 mp->is_add = is_add;
8411 mp->is_ipv6 = is_ipv6;
8412 mp->is_local = is_local;
8413 mp->itf_flags = ntohl (iflags);
8414 mp->entry_flags = ntohl (eflags);
8415 mp->grp_address_length = grp_address_length;
8416 mp->grp_address_length = ntohs (mp->grp_address_length);
8420 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8421 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8425 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8426 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8432 /* Wait for a reply... */
8438 api_mpls_table_add_del (vat_main_t * vam)
8440 unformat_input_t *i = vam->input;
8441 vl_api_mpls_table_add_del_t *mp;
8446 /* Parse args required to build the message */
8447 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8449 if (unformat (i, "table %d", &table_id))
8451 else if (unformat (i, "del"))
8453 else if (unformat (i, "add"))
8457 clib_warning ("parse error '%U'", format_unformat_error, i);
8464 errmsg ("missing table-ID");
8468 /* Construct the API message */
8469 M (MPLS_TABLE_ADD_DEL, mp);
8471 mp->mt_table_id = ntohl (table_id);
8472 mp->mt_is_add = is_add;
8477 /* Wait for a reply... */
8484 api_mpls_route_add_del (vat_main_t * vam)
8486 unformat_input_t *i = vam->input;
8487 vl_api_mpls_route_add_del_t *mp;
8488 u32 sw_if_index = ~0, table_id = 0;
8490 u32 next_hop_weight = 1;
8491 u8 is_multipath = 0;
8492 u32 next_hop_table_id = 0;
8493 u8 next_hop_set = 0;
8494 ip4_address_t v4_next_hop_address = {
8497 ip6_address_t v6_next_hop_address = { {0} };
8501 u32 classify_table_index = ~0;
8503 u8 resolve_host = 0, resolve_attached = 0;
8504 u8 is_interface_rx = 0;
8505 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8506 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8507 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
8508 mpls_label_t local_label = MPLS_LABEL_INVALID;
8510 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
8512 /* Parse args required to build the message */
8513 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8515 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8517 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8519 else if (unformat (i, "%d", &local_label))
8521 else if (unformat (i, "eos"))
8523 else if (unformat (i, "non-eos"))
8525 else if (unformat (i, "via %U", unformat_ip4_address,
8526 &v4_next_hop_address))
8529 next_hop_proto = DPO_PROTO_IP4;
8531 else if (unformat (i, "via %U", unformat_ip6_address,
8532 &v6_next_hop_address))
8535 next_hop_proto = DPO_PROTO_IP6;
8537 else if (unformat (i, "weight %d", &next_hop_weight))
8539 else if (unformat (i, "classify %d", &classify_table_index))
8543 else if (unformat (i, "del"))
8545 else if (unformat (i, "add"))
8547 else if (unformat (i, "resolve-via-host"))
8549 else if (unformat (i, "resolve-via-attached"))
8550 resolve_attached = 1;
8551 else if (unformat (i, "multipath"))
8553 else if (unformat (i, "count %d", &count))
8555 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
8558 next_hop_proto = DPO_PROTO_IP4;
8560 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
8563 next_hop_proto = DPO_PROTO_IP6;
8567 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
8571 next_hop_proto = DPO_PROTO_ETHERNET;
8572 is_interface_rx = 1;
8574 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
8577 next_hop_proto = DPO_PROTO_ETHERNET;
8578 is_interface_rx = 1;
8580 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
8582 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8584 else if (unformat (i, "out-label %d", &next_hop_out_label))
8586 vl_api_fib_mpls_label_t fib_label = {
8587 .label = ntohl (next_hop_out_label),
8591 vec_add1 (next_hop_out_label_stack, fib_label);
8595 clib_warning ("parse error '%U'", format_unformat_error, i);
8600 if (!next_hop_set && !is_classify)
8602 errmsg ("next hop / classify not set");
8606 if (MPLS_LABEL_INVALID == local_label)
8608 errmsg ("missing label");
8614 /* Turn on async mode */
8615 vam->async_mode = 1;
8616 vam->async_errors = 0;
8617 before = vat_time_now (vam);
8620 for (j = 0; j < count; j++)
8622 /* Construct the API message */
8623 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
8624 vec_len (next_hop_out_label_stack));
8626 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
8627 mp->mr_table_id = ntohl (table_id);
8629 mp->mr_is_add = is_add;
8630 mp->mr_next_hop_proto = next_hop_proto;
8631 mp->mr_is_classify = is_classify;
8632 mp->mr_is_multipath = is_multipath;
8633 mp->mr_is_resolve_host = resolve_host;
8634 mp->mr_is_resolve_attached = resolve_attached;
8635 mp->mr_is_interface_rx = is_interface_rx;
8636 mp->mr_next_hop_weight = next_hop_weight;
8637 mp->mr_next_hop_preference = 0;
8638 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
8639 mp->mr_classify_table_index = ntohl (classify_table_index);
8640 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
8641 mp->mr_label = ntohl (local_label);
8642 mp->mr_eos = is_eos;
8644 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8645 if (0 != mp->mr_next_hop_n_out_labels)
8647 memcpy (mp->mr_next_hop_out_label_stack,
8648 next_hop_out_label_stack,
8649 vec_len (next_hop_out_label_stack) *
8650 sizeof (vl_api_fib_mpls_label_t));
8651 vec_free (next_hop_out_label_stack);
8656 if (DPO_PROTO_IP4 == next_hop_proto)
8658 clib_memcpy (mp->mr_next_hop,
8659 &v4_next_hop_address,
8660 sizeof (v4_next_hop_address));
8662 else if (DPO_PROTO_IP6 == next_hop_proto)
8665 clib_memcpy (mp->mr_next_hop,
8666 &v6_next_hop_address,
8667 sizeof (v6_next_hop_address));
8674 /* If we receive SIGTERM, stop now... */
8679 /* When testing multiple add/del ops, use a control-ping to sync */
8682 vl_api_control_ping_t *mp_ping;
8686 /* Shut off async mode */
8687 vam->async_mode = 0;
8689 MPING (CONTROL_PING, mp_ping);
8692 timeout = vat_time_now (vam) + 1.0;
8693 while (vat_time_now (vam) < timeout)
8694 if (vam->result_ready == 1)
8699 if (vam->retval == -99)
8702 if (vam->async_errors > 0)
8704 errmsg ("%d asynchronous errors", vam->async_errors);
8707 vam->async_errors = 0;
8708 after = vat_time_now (vam);
8710 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8714 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8715 count, after - before, count / (after - before));
8721 /* Wait for a reply... */
8726 /* Return the good/bad news */
8727 return (vam->retval);
8731 api_mpls_ip_bind_unbind (vat_main_t * vam)
8733 unformat_input_t *i = vam->input;
8734 vl_api_mpls_ip_bind_unbind_t *mp;
8735 u32 ip_table_id = 0;
8738 ip4_address_t v4_address;
8739 ip6_address_t v6_address;
8742 mpls_label_t local_label = MPLS_LABEL_INVALID;
8745 /* Parse args required to build the message */
8746 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8748 if (unformat (i, "%U/%d", unformat_ip4_address,
8749 &v4_address, &address_length))
8754 else if (unformat (i, "%U/%d", unformat_ip6_address,
8755 &v6_address, &address_length))
8760 else if (unformat (i, "%d", &local_label))
8762 else if (unformat (i, "table-id %d", &ip_table_id))
8764 else if (unformat (i, "unbind"))
8766 else if (unformat (i, "bind"))
8770 clib_warning ("parse error '%U'", format_unformat_error, i);
8777 errmsg ("IP address not set");
8781 if (MPLS_LABEL_INVALID == local_label)
8783 errmsg ("missing label");
8787 /* Construct the API message */
8788 M (MPLS_IP_BIND_UNBIND, mp);
8790 mp->mb_is_bind = is_bind;
8791 mp->mb_is_ip4 = is_ip4;
8792 mp->mb_ip_table_id = ntohl (ip_table_id);
8793 mp->mb_mpls_table_id = 0;
8794 mp->mb_label = ntohl (local_label);
8795 mp->mb_address_length = address_length;
8798 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
8800 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
8805 /* Wait for a reply... */
8811 api_sr_mpls_policy_add (vat_main_t * vam)
8813 unformat_input_t *i = vam->input;
8814 vl_api_sr_mpls_policy_add_t *mp;
8820 u32 *segments = NULL;
8823 /* Parse args required to build the message */
8824 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8826 if (unformat (i, "bsid %d", &bsid))
8828 else if (unformat (i, "weight %d", &weight))
8830 else if (unformat (i, "spray"))
8832 else if (unformat (i, "next %d", &sid))
8835 vec_add1 (segments, htonl (sid));
8839 clib_warning ("parse error '%U'", format_unformat_error, i);
8846 errmsg ("bsid not set");
8850 if (n_segments == 0)
8852 errmsg ("no sid in segment stack");
8856 /* Construct the API message */
8857 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
8859 mp->bsid = htonl (bsid);
8860 mp->weight = htonl (weight);
8862 mp->n_segments = n_segments;
8863 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
8864 vec_free (segments);
8869 /* Wait for a reply... */
8875 api_sr_mpls_policy_del (vat_main_t * vam)
8877 unformat_input_t *i = vam->input;
8878 vl_api_sr_mpls_policy_del_t *mp;
8882 /* Parse args required to build the message */
8883 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8885 if (unformat (i, "bsid %d", &bsid))
8889 clib_warning ("parse error '%U'", format_unformat_error, i);
8896 errmsg ("bsid not set");
8900 /* Construct the API message */
8901 M (SR_MPLS_POLICY_DEL, mp);
8903 mp->bsid = htonl (bsid);
8908 /* Wait for a reply... */
8914 api_bier_table_add_del (vat_main_t * vam)
8916 unformat_input_t *i = vam->input;
8917 vl_api_bier_table_add_del_t *mp;
8919 u32 set = 0, sub_domain = 0, hdr_len = 3;
8920 mpls_label_t local_label = MPLS_LABEL_INVALID;
8923 /* Parse args required to build the message */
8924 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8926 if (unformat (i, "sub-domain %d", &sub_domain))
8928 else if (unformat (i, "set %d", &set))
8930 else if (unformat (i, "label %d", &local_label))
8932 else if (unformat (i, "hdr-len %d", &hdr_len))
8934 else if (unformat (i, "add"))
8936 else if (unformat (i, "del"))
8940 clib_warning ("parse error '%U'", format_unformat_error, i);
8945 if (MPLS_LABEL_INVALID == local_label)
8947 errmsg ("missing label\n");
8951 /* Construct the API message */
8952 M (BIER_TABLE_ADD_DEL, mp);
8954 mp->bt_is_add = is_add;
8955 mp->bt_label = ntohl (local_label);
8956 mp->bt_tbl_id.bt_set = set;
8957 mp->bt_tbl_id.bt_sub_domain = sub_domain;
8958 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
8963 /* Wait for a reply... */
8970 api_bier_route_add_del (vat_main_t * vam)
8972 unformat_input_t *i = vam->input;
8973 vl_api_bier_route_add_del_t *mp;
8975 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
8976 ip4_address_t v4_next_hop_address;
8977 ip6_address_t v6_next_hop_address;
8978 u8 next_hop_set = 0;
8979 u8 next_hop_proto_is_ip4 = 1;
8980 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8983 /* Parse args required to build the message */
8984 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8986 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
8988 next_hop_proto_is_ip4 = 1;
8991 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
8993 next_hop_proto_is_ip4 = 0;
8996 if (unformat (i, "sub-domain %d", &sub_domain))
8998 else if (unformat (i, "set %d", &set))
9000 else if (unformat (i, "hdr-len %d", &hdr_len))
9002 else if (unformat (i, "bp %d", &bp))
9004 else if (unformat (i, "add"))
9006 else if (unformat (i, "del"))
9008 else if (unformat (i, "out-label %d", &next_hop_out_label))
9012 clib_warning ("parse error '%U'", format_unformat_error, i);
9017 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9019 errmsg ("next hop / label set\n");
9024 errmsg ("bit=position not set\n");
9028 /* Construct the API message */
9029 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
9031 mp->br_is_add = is_add;
9032 mp->br_tbl_id.bt_set = set;
9033 mp->br_tbl_id.bt_sub_domain = sub_domain;
9034 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9035 mp->br_bp = ntohs (bp);
9037 mp->br_paths[0].n_labels = 1;
9038 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
9039 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9041 if (next_hop_proto_is_ip4)
9043 clib_memcpy (mp->br_paths[0].next_hop,
9044 &v4_next_hop_address, sizeof (v4_next_hop_address));
9048 clib_memcpy (mp->br_paths[0].next_hop,
9049 &v6_next_hop_address, sizeof (v6_next_hop_address));
9055 /* Wait for a reply... */
9062 api_proxy_arp_add_del (vat_main_t * vam)
9064 unformat_input_t *i = vam->input;
9065 vl_api_proxy_arp_add_del_t *mp;
9068 vl_api_ip4_address_t lo, hi;
9072 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9074 if (unformat (i, "vrf %d", &vrf_id))
9076 else if (unformat (i, "%U - %U", unformat_vl_api_ip4_address, &lo,
9077 unformat_vl_api_ip4_address, &hi))
9079 else if (unformat (i, "del"))
9083 clib_warning ("parse error '%U'", format_unformat_error, i);
9090 errmsg ("address range not set");
9094 M (PROXY_ARP_ADD_DEL, mp);
9096 mp->proxy.table_id = ntohl (vrf_id);
9097 mp->is_add = is_add;
9098 clib_memcpy (mp->proxy.low, &lo, sizeof (lo));
9099 clib_memcpy (mp->proxy.hi, &hi, sizeof (hi));
9107 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9109 unformat_input_t *i = vam->input;
9110 vl_api_proxy_arp_intfc_enable_disable_t *mp;
9113 u8 sw_if_index_set = 0;
9116 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9118 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9119 sw_if_index_set = 1;
9120 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9121 sw_if_index_set = 1;
9122 else if (unformat (i, "enable"))
9124 else if (unformat (i, "disable"))
9128 clib_warning ("parse error '%U'", format_unformat_error, i);
9133 if (sw_if_index_set == 0)
9135 errmsg ("missing interface name or sw_if_index");
9139 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
9141 mp->sw_if_index = ntohl (sw_if_index);
9142 mp->enable_disable = enable;
9150 api_mpls_tunnel_add_del (vat_main_t * vam)
9152 unformat_input_t *i = vam->input;
9153 vl_api_mpls_tunnel_add_del_t *mp;
9157 u32 sw_if_index = ~0;
9158 u32 next_hop_sw_if_index = ~0;
9159 u32 next_hop_proto_is_ip4 = 1;
9161 u32 next_hop_table_id = 0;
9162 ip4_address_t v4_next_hop_address = {
9165 ip6_address_t v6_next_hop_address = { {0} };
9166 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
9167 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
9168 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
9171 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9173 if (unformat (i, "add"))
9177 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
9179 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9181 else if (unformat (i, "via %U",
9182 unformat_ip4_address, &v4_next_hop_address))
9184 next_hop_proto_is_ip4 = 1;
9186 else if (unformat (i, "via %U",
9187 unformat_ip6_address, &v6_next_hop_address))
9189 next_hop_proto_is_ip4 = 0;
9191 else if (unformat (i, "via-label %d", &next_hop_via_label))
9195 (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index))
9197 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9199 else if (unformat (i, "l2-only"))
9201 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9203 else if (unformat (i, "out-label %d", &next_hop_out_label))
9205 vl_api_fib_mpls_label_t fib_label = {
9206 .label = ntohl (next_hop_out_label),
9210 vec_add1 (next_hop_out_label_stack, fib_label);
9214 clib_warning ("parse error '%U'", format_unformat_error, i);
9219 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9220 vec_len (next_hop_out_label_stack));
9222 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9223 mp->mt_sw_if_index = ntohl (sw_if_index);
9224 mp->mt_is_add = is_add;
9225 mp->mt_l2_only = l2_only;
9226 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9227 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
9228 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
9229 mp->mt_next_hop_weight = 1;
9230 mp->mt_next_hop_preference = 0;
9232 mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
9234 if (0 != mp->mt_next_hop_n_out_labels)
9236 clib_memcpy (mp->mt_next_hop_out_label_stack,
9237 next_hop_out_label_stack,
9238 (vec_len (next_hop_out_label_stack) *
9239 sizeof (vl_api_fib_mpls_label_t)));
9240 vec_free (next_hop_out_label_stack);
9243 if (next_hop_proto_is_ip4)
9245 clib_memcpy (mp->mt_next_hop,
9246 &v4_next_hop_address, sizeof (v4_next_hop_address));
9250 clib_memcpy (mp->mt_next_hop,
9251 &v6_next_hop_address, sizeof (v6_next_hop_address));
9260 api_sw_interface_set_unnumbered (vat_main_t * vam)
9262 unformat_input_t *i = vam->input;
9263 vl_api_sw_interface_set_unnumbered_t *mp;
9265 u32 unnum_sw_index = ~0;
9267 u8 sw_if_index_set = 0;
9270 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9272 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9273 sw_if_index_set = 1;
9274 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9275 sw_if_index_set = 1;
9276 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9278 else if (unformat (i, "del"))
9282 clib_warning ("parse error '%U'", format_unformat_error, i);
9287 if (sw_if_index_set == 0)
9289 errmsg ("missing interface name or sw_if_index");
9293 M (SW_INTERFACE_SET_UNNUMBERED, mp);
9295 mp->sw_if_index = ntohl (sw_if_index);
9296 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9297 mp->is_add = is_add;
9305 api_ip_neighbor_add_del (vat_main_t * vam)
9307 vl_api_mac_address_t mac_address;
9308 unformat_input_t *i = vam->input;
9309 vl_api_ip_neighbor_add_del_t *mp;
9310 vl_api_address_t ip_address;
9312 u8 sw_if_index_set = 0;
9317 ip_neighbor_flags_t flags;
9319 flags = IP_NEIGHBOR_FLAG_NONE;
9320 clib_memset (&ip_address, 0, sizeof (ip_address));
9321 clib_memset (&mac_address, 0, sizeof (mac_address));
9322 /* Parse args required to build the message */
9323 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9325 if (unformat (i, "mac %U", unformat_vl_api_mac_address, &mac_address))
9329 else if (unformat (i, "del"))
9332 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9333 sw_if_index_set = 1;
9334 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9335 sw_if_index_set = 1;
9336 else if (unformat (i, "static"))
9337 flags |= IP_NEIGHBOR_FLAG_STATIC;
9338 else if (unformat (i, "no-fib-entry"))
9339 flags |= IP_NEIGHBOR_FLAG_NO_FIB_ENTRY;
9340 else if (unformat (i, "dst %U", unformat_vl_api_address, &ip_address))
9344 clib_warning ("parse error '%U'", format_unformat_error, i);
9349 if (sw_if_index_set == 0)
9351 errmsg ("missing interface name or sw_if_index");
9356 errmsg ("no address set");
9360 /* Construct the API message */
9361 M (IP_NEIGHBOR_ADD_DEL, mp);
9363 mp->neighbor.sw_if_index = ntohl (sw_if_index);
9364 mp->is_add = is_add;
9365 mp->neighbor.flags = htonl (flags);
9367 clib_memcpy (&mp->neighbor.mac_address, &mac_address,
9368 sizeof (mac_address));
9370 clib_memcpy (&mp->neighbor.ip_address, &ip_address, sizeof (ip_address));
9375 /* Wait for a reply, return good/bad news */
9381 api_create_vlan_subif (vat_main_t * vam)
9383 unformat_input_t *i = vam->input;
9384 vl_api_create_vlan_subif_t *mp;
9386 u8 sw_if_index_set = 0;
9391 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9393 if (unformat (i, "sw_if_index %d", &sw_if_index))
9394 sw_if_index_set = 1;
9396 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9397 sw_if_index_set = 1;
9398 else if (unformat (i, "vlan %d", &vlan_id))
9402 clib_warning ("parse error '%U'", format_unformat_error, i);
9407 if (sw_if_index_set == 0)
9409 errmsg ("missing interface name or sw_if_index");
9413 if (vlan_id_set == 0)
9415 errmsg ("missing vlan_id");
9418 M (CREATE_VLAN_SUBIF, mp);
9420 mp->sw_if_index = ntohl (sw_if_index);
9421 mp->vlan_id = ntohl (vlan_id);
9428 #define foreach_create_subif_bit \
9435 _(outer_vlan_id_any) \
9436 _(inner_vlan_id_any)
9439 api_create_subif (vat_main_t * vam)
9441 unformat_input_t *i = vam->input;
9442 vl_api_create_subif_t *mp;
9444 u8 sw_if_index_set = 0;
9451 u32 exact_match = 0;
9452 u32 default_sub = 0;
9453 u32 outer_vlan_id_any = 0;
9454 u32 inner_vlan_id_any = 0;
9456 u16 outer_vlan_id = 0;
9457 u16 inner_vlan_id = 0;
9460 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9462 if (unformat (i, "sw_if_index %d", &sw_if_index))
9463 sw_if_index_set = 1;
9465 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9466 sw_if_index_set = 1;
9467 else if (unformat (i, "sub_id %d", &sub_id))
9469 else if (unformat (i, "outer_vlan_id %d", &tmp))
9470 outer_vlan_id = tmp;
9471 else if (unformat (i, "inner_vlan_id %d", &tmp))
9472 inner_vlan_id = tmp;
9474 #define _(a) else if (unformat (i, #a)) a = 1 ;
9475 foreach_create_subif_bit
9479 clib_warning ("parse error '%U'", format_unformat_error, i);
9484 if (sw_if_index_set == 0)
9486 errmsg ("missing interface name or sw_if_index");
9490 if (sub_id_set == 0)
9492 errmsg ("missing sub_id");
9495 M (CREATE_SUBIF, mp);
9497 mp->sw_if_index = ntohl (sw_if_index);
9498 mp->sub_id = ntohl (sub_id);
9500 #define _(a) mp->a = a;
9501 foreach_create_subif_bit;
9504 mp->outer_vlan_id = ntohs (outer_vlan_id);
9505 mp->inner_vlan_id = ntohs (inner_vlan_id);
9513 api_reset_fib (vat_main_t * vam)
9515 unformat_input_t *i = vam->input;
9516 vl_api_reset_fib_t *mp;
9522 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9524 if (unformat (i, "vrf %d", &vrf_id))
9526 else if (unformat (i, "ipv6"))
9530 clib_warning ("parse error '%U'", format_unformat_error, i);
9535 if (vrf_id_set == 0)
9537 errmsg ("missing vrf id");
9543 mp->vrf_id = ntohl (vrf_id);
9544 mp->is_ipv6 = is_ipv6;
9552 api_dhcp_proxy_config (vat_main_t * vam)
9554 unformat_input_t *i = vam->input;
9555 vl_api_dhcp_proxy_config_t *mp;
9557 u32 server_vrf_id = 0;
9559 u8 v4_address_set = 0;
9560 u8 v6_address_set = 0;
9561 ip4_address_t v4address;
9562 ip6_address_t v6address;
9563 u8 v4_src_address_set = 0;
9564 u8 v6_src_address_set = 0;
9565 ip4_address_t v4srcaddress;
9566 ip6_address_t v6srcaddress;
9569 /* Parse args required to build the message */
9570 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9572 if (unformat (i, "del"))
9574 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
9576 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
9578 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
9580 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
9582 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
9583 v4_src_address_set = 1;
9584 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
9585 v6_src_address_set = 1;
9590 if (v4_address_set && v6_address_set)
9592 errmsg ("both v4 and v6 server addresses set");
9595 if (!v4_address_set && !v6_address_set)
9597 errmsg ("no server addresses set");
9601 if (v4_src_address_set && v6_src_address_set)
9603 errmsg ("both v4 and v6 src addresses set");
9606 if (!v4_src_address_set && !v6_src_address_set)
9608 errmsg ("no src addresses set");
9612 if (!(v4_src_address_set && v4_address_set) &&
9613 !(v6_src_address_set && v6_address_set))
9615 errmsg ("no matching server and src addresses set");
9619 /* Construct the API message */
9620 M (DHCP_PROXY_CONFIG, mp);
9622 mp->is_add = is_add;
9623 mp->rx_vrf_id = ntohl (rx_vrf_id);
9624 mp->server_vrf_id = ntohl (server_vrf_id);
9628 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
9629 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
9633 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
9634 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
9640 /* Wait for a reply, return good/bad news */
9645 #define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
9646 #define vl_api_dhcp_proxy_details_t_print vl_noop_handler
9649 vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
9651 vat_main_t *vam = &vat_main;
9652 u32 i, count = mp->count;
9653 vl_api_dhcp_server_t *s;
9657 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9658 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9659 ntohl (mp->rx_vrf_id),
9660 format_ip6_address, mp->dhcp_src_address,
9661 mp->vss_type, mp->vss_vpn_ascii_id,
9662 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9665 "RX Table-ID %d, Source Address %U, VSS Type %d, "
9666 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
9667 ntohl (mp->rx_vrf_id),
9668 format_ip4_address, mp->dhcp_src_address,
9669 mp->vss_type, mp->vss_vpn_ascii_id,
9670 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9672 for (i = 0; i < count; i++)
9674 s = &mp->servers[i];
9678 " Server Table-ID %d, Server Address %U",
9679 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
9682 " Server Table-ID %d, Server Address %U",
9683 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
9687 static void vl_api_dhcp_proxy_details_t_handler_json
9688 (vl_api_dhcp_proxy_details_t * mp)
9690 vat_main_t *vam = &vat_main;
9691 vat_json_node_t *node = NULL;
9692 u32 i, count = mp->count;
9694 struct in6_addr ip6;
9695 vl_api_dhcp_server_t *s;
9697 if (VAT_JSON_ARRAY != vam->json_tree.type)
9699 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9700 vat_json_init_array (&vam->json_tree);
9702 node = vat_json_array_add (&vam->json_tree);
9704 vat_json_init_object (node);
9705 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
9706 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
9707 sizeof (mp->vss_type));
9708 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
9709 mp->vss_vpn_ascii_id);
9710 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
9711 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
9715 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
9716 vat_json_object_add_ip6 (node, "src_address", ip6);
9720 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
9721 vat_json_object_add_ip4 (node, "src_address", ip4);
9724 for (i = 0; i < count; i++)
9726 s = &mp->servers[i];
9728 vat_json_object_add_uint (node, "server-table-id",
9729 ntohl (s->server_vrf_id));
9733 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
9734 vat_json_object_add_ip4 (node, "src_address", ip4);
9738 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
9739 vat_json_object_add_ip6 (node, "server_address", ip6);
9745 api_dhcp_proxy_dump (vat_main_t * vam)
9747 unformat_input_t *i = vam->input;
9748 vl_api_control_ping_t *mp_ping;
9749 vl_api_dhcp_proxy_dump_t *mp;
9753 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9755 if (unformat (i, "ipv6"))
9759 clib_warning ("parse error '%U'", format_unformat_error, i);
9764 M (DHCP_PROXY_DUMP, mp);
9766 mp->is_ip6 = is_ipv6;
9769 /* Use a control ping for synchronization */
9770 MPING (CONTROL_PING, mp_ping);
9778 api_dhcp_proxy_set_vss (vat_main_t * vam)
9780 unformat_input_t *i = vam->input;
9781 vl_api_dhcp_proxy_set_vss_t *mp;
9785 u8 vss_type = VSS_TYPE_DEFAULT;
9786 u8 *vpn_ascii_id = 0;
9791 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9793 if (unformat (i, "tbl_id %d", &tbl_id))
9795 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
9796 vss_type = VSS_TYPE_ASCII;
9797 else if (unformat (i, "fib_id %d", &fib_id))
9798 vss_type = VSS_TYPE_VPN_ID;
9799 else if (unformat (i, "oui %d", &oui))
9800 vss_type = VSS_TYPE_VPN_ID;
9801 else if (unformat (i, "ipv6"))
9803 else if (unformat (i, "del"))
9811 errmsg ("missing tbl_id ");
9812 vec_free (vpn_ascii_id);
9816 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
9818 errmsg ("vpn_ascii_id cannot be longer than 128 ");
9819 vec_free (vpn_ascii_id);
9823 M (DHCP_PROXY_SET_VSS, mp);
9824 mp->tbl_id = ntohl (tbl_id);
9825 mp->vss_type = vss_type;
9828 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
9829 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
9831 mp->vpn_index = ntohl (fib_id);
9832 mp->oui = ntohl (oui);
9833 mp->is_ipv6 = is_ipv6;
9834 mp->is_add = is_add;
9839 vec_free (vpn_ascii_id);
9844 api_dhcp_client_config (vat_main_t * vam)
9846 unformat_input_t *i = vam->input;
9847 vl_api_dhcp_client_config_t *mp;
9849 u8 sw_if_index_set = 0;
9852 u8 disable_event = 0;
9855 /* Parse args required to build the message */
9856 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9858 if (unformat (i, "del"))
9861 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9862 sw_if_index_set = 1;
9863 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9864 sw_if_index_set = 1;
9865 else if (unformat (i, "hostname %s", &hostname))
9867 else if (unformat (i, "disable_event"))
9873 if (sw_if_index_set == 0)
9875 errmsg ("missing interface name or sw_if_index");
9879 if (vec_len (hostname) > 63)
9881 errmsg ("hostname too long");
9883 vec_add1 (hostname, 0);
9885 /* Construct the API message */
9886 M (DHCP_CLIENT_CONFIG, mp);
9888 mp->is_add = is_add;
9889 mp->client.sw_if_index = htonl (sw_if_index);
9890 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
9891 vec_free (hostname);
9892 mp->client.want_dhcp_event = disable_event ? 0 : 1;
9893 mp->client.pid = htonl (getpid ());
9898 /* Wait for a reply, return good/bad news */
9904 api_set_ip_flow_hash (vat_main_t * vam)
9906 unformat_input_t *i = vam->input;
9907 vl_api_set_ip_flow_hash_t *mp;
9919 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9921 if (unformat (i, "vrf %d", &vrf_id))
9923 else if (unformat (i, "ipv6"))
9925 else if (unformat (i, "src"))
9927 else if (unformat (i, "dst"))
9929 else if (unformat (i, "sport"))
9931 else if (unformat (i, "dport"))
9933 else if (unformat (i, "proto"))
9935 else if (unformat (i, "reverse"))
9940 clib_warning ("parse error '%U'", format_unformat_error, i);
9945 if (vrf_id_set == 0)
9947 errmsg ("missing vrf id");
9951 M (SET_IP_FLOW_HASH, mp);
9957 mp->reverse = reverse;
9958 mp->vrf_id = ntohl (vrf_id);
9959 mp->is_ipv6 = is_ipv6;
9967 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
9969 unformat_input_t *i = vam->input;
9970 vl_api_sw_interface_ip6_enable_disable_t *mp;
9972 u8 sw_if_index_set = 0;
9976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9978 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9979 sw_if_index_set = 1;
9980 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9981 sw_if_index_set = 1;
9982 else if (unformat (i, "enable"))
9984 else if (unformat (i, "disable"))
9988 clib_warning ("parse error '%U'", format_unformat_error, i);
9993 if (sw_if_index_set == 0)
9995 errmsg ("missing interface name or sw_if_index");
9999 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
10001 mp->sw_if_index = ntohl (sw_if_index);
10002 mp->enable = enable;
10010 api_ip6nd_proxy_add_del (vat_main_t * vam)
10012 unformat_input_t *i = vam->input;
10013 vl_api_ip6nd_proxy_add_del_t *mp;
10014 u32 sw_if_index = ~0;
10015 u8 v6_address_set = 0;
10016 vl_api_ip6_address_t v6address;
10020 /* Parse args required to build the message */
10021 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10023 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10025 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10027 else if (unformat (i, "%U", unformat_vl_api_ip6_address, &v6address))
10028 v6_address_set = 1;
10029 if (unformat (i, "del"))
10033 clib_warning ("parse error '%U'", format_unformat_error, i);
10038 if (sw_if_index == ~0)
10040 errmsg ("missing interface name or sw_if_index");
10043 if (!v6_address_set)
10045 errmsg ("no address set");
10049 /* Construct the API message */
10050 M (IP6ND_PROXY_ADD_DEL, mp);
10052 mp->is_del = is_del;
10053 mp->sw_if_index = ntohl (sw_if_index);
10054 clib_memcpy (mp->ip, v6address, sizeof (v6address));
10059 /* Wait for a reply, return good/bad news */
10065 api_ip6nd_proxy_dump (vat_main_t * vam)
10067 vl_api_ip6nd_proxy_dump_t *mp;
10068 vl_api_control_ping_t *mp_ping;
10071 M (IP6ND_PROXY_DUMP, mp);
10075 /* Use a control ping for synchronization */
10076 MPING (CONTROL_PING, mp_ping);
10083 static void vl_api_ip6nd_proxy_details_t_handler
10084 (vl_api_ip6nd_proxy_details_t * mp)
10086 vat_main_t *vam = &vat_main;
10088 print (vam->ofp, "host %U sw_if_index %d",
10089 format_vl_api_ip6_address, mp->ip, ntohl (mp->sw_if_index));
10092 static void vl_api_ip6nd_proxy_details_t_handler_json
10093 (vl_api_ip6nd_proxy_details_t * mp)
10095 vat_main_t *vam = &vat_main;
10096 struct in6_addr ip6;
10097 vat_json_node_t *node = NULL;
10099 if (VAT_JSON_ARRAY != vam->json_tree.type)
10101 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10102 vat_json_init_array (&vam->json_tree);
10104 node = vat_json_array_add (&vam->json_tree);
10106 vat_json_init_object (node);
10107 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10109 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
10110 vat_json_object_add_ip6 (node, "host", ip6);
10114 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10116 unformat_input_t *i = vam->input;
10117 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
10119 u8 sw_if_index_set = 0;
10120 u32 address_length = 0;
10121 u8 v6_address_set = 0;
10122 vl_api_prefix_t pfx;
10123 u8 use_default = 0;
10124 u8 no_advertise = 0;
10126 u8 no_autoconfig = 0;
10129 u32 val_lifetime = 0;
10130 u32 pref_lifetime = 0;
10133 /* Parse args required to build the message */
10134 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10136 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10137 sw_if_index_set = 1;
10138 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10139 sw_if_index_set = 1;
10140 else if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
10141 v6_address_set = 1;
10142 else if (unformat (i, "val_life %d", &val_lifetime))
10144 else if (unformat (i, "pref_life %d", &pref_lifetime))
10146 else if (unformat (i, "def"))
10148 else if (unformat (i, "noadv"))
10150 else if (unformat (i, "offl"))
10152 else if (unformat (i, "noauto"))
10154 else if (unformat (i, "nolink"))
10156 else if (unformat (i, "isno"))
10160 clib_warning ("parse error '%U'", format_unformat_error, i);
10165 if (sw_if_index_set == 0)
10167 errmsg ("missing interface name or sw_if_index");
10170 if (!v6_address_set)
10172 errmsg ("no address set");
10176 /* Construct the API message */
10177 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
10179 mp->sw_if_index = ntohl (sw_if_index);
10180 clib_memcpy (&mp->prefix, &pfx, sizeof (pfx));
10181 mp->use_default = use_default;
10182 mp->no_advertise = no_advertise;
10183 mp->off_link = off_link;
10184 mp->no_autoconfig = no_autoconfig;
10185 mp->no_onlink = no_onlink;
10187 mp->val_lifetime = ntohl (val_lifetime);
10188 mp->pref_lifetime = ntohl (pref_lifetime);
10193 /* Wait for a reply, return good/bad news */
10199 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10201 unformat_input_t *i = vam->input;
10202 vl_api_sw_interface_ip6nd_ra_config_t *mp;
10204 u8 sw_if_index_set = 0;
10209 u8 send_unicast = 0;
10212 u8 default_router = 0;
10213 u32 max_interval = 0;
10214 u32 min_interval = 0;
10216 u32 initial_count = 0;
10217 u32 initial_interval = 0;
10221 /* Parse args required to build the message */
10222 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10224 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10225 sw_if_index_set = 1;
10226 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10227 sw_if_index_set = 1;
10228 else if (unformat (i, "maxint %d", &max_interval))
10230 else if (unformat (i, "minint %d", &min_interval))
10232 else if (unformat (i, "life %d", &lifetime))
10234 else if (unformat (i, "count %d", &initial_count))
10236 else if (unformat (i, "interval %d", &initial_interval))
10238 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10240 else if (unformat (i, "managed"))
10242 else if (unformat (i, "other"))
10244 else if (unformat (i, "ll"))
10246 else if (unformat (i, "send"))
10248 else if (unformat (i, "cease"))
10250 else if (unformat (i, "isno"))
10252 else if (unformat (i, "def"))
10253 default_router = 1;
10256 clib_warning ("parse error '%U'", format_unformat_error, i);
10261 if (sw_if_index_set == 0)
10263 errmsg ("missing interface name or sw_if_index");
10267 /* Construct the API message */
10268 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
10270 mp->sw_if_index = ntohl (sw_if_index);
10271 mp->max_interval = ntohl (max_interval);
10272 mp->min_interval = ntohl (min_interval);
10273 mp->lifetime = ntohl (lifetime);
10274 mp->initial_count = ntohl (initial_count);
10275 mp->initial_interval = ntohl (initial_interval);
10276 mp->suppress = suppress;
10277 mp->managed = managed;
10279 mp->ll_option = ll_option;
10280 mp->send_unicast = send_unicast;
10283 mp->default_router = default_router;
10288 /* Wait for a reply, return good/bad news */
10294 api_set_arp_neighbor_limit (vat_main_t * vam)
10296 unformat_input_t *i = vam->input;
10297 vl_api_set_arp_neighbor_limit_t *mp;
10303 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10305 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10307 else if (unformat (i, "ipv6"))
10311 clib_warning ("parse error '%U'", format_unformat_error, i);
10316 if (limit_set == 0)
10318 errmsg ("missing limit value");
10322 M (SET_ARP_NEIGHBOR_LIMIT, mp);
10324 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10325 mp->is_ipv6 = is_ipv6;
10333 api_l2_patch_add_del (vat_main_t * vam)
10335 unformat_input_t *i = vam->input;
10336 vl_api_l2_patch_add_del_t *mp;
10337 u32 rx_sw_if_index;
10338 u8 rx_sw_if_index_set = 0;
10339 u32 tx_sw_if_index;
10340 u8 tx_sw_if_index_set = 0;
10344 /* Parse args required to build the message */
10345 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10347 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10348 rx_sw_if_index_set = 1;
10349 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10350 tx_sw_if_index_set = 1;
10351 else if (unformat (i, "rx"))
10353 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10355 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10357 rx_sw_if_index_set = 1;
10362 else if (unformat (i, "tx"))
10364 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10366 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10368 tx_sw_if_index_set = 1;
10373 else if (unformat (i, "del"))
10379 if (rx_sw_if_index_set == 0)
10381 errmsg ("missing rx interface name or rx_sw_if_index");
10385 if (tx_sw_if_index_set == 0)
10387 errmsg ("missing tx interface name or tx_sw_if_index");
10391 M (L2_PATCH_ADD_DEL, mp);
10393 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10394 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10395 mp->is_add = is_add;
10403 u8 localsid_addr[16];
10412 api_sr_localsid_add_del (vat_main_t * vam)
10414 unformat_input_t *i = vam->input;
10415 vl_api_sr_localsid_add_del_t *mp;
10418 ip6_address_t localsid;
10422 u32 fib_table = ~(u32) 0;
10423 ip6_address_t nh_addr6;
10424 ip4_address_t nh_addr4;
10425 clib_memset (&nh_addr6, 0, sizeof (ip6_address_t));
10426 clib_memset (&nh_addr4, 0, sizeof (ip4_address_t));
10428 bool nexthop_set = 0;
10432 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10434 if (unformat (i, "del"))
10436 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
10437 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10439 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
10441 else if (unformat (i, "behavior %u", &behavior));
10442 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10443 else if (unformat (i, "fib-table %u", &fib_table));
10444 else if (unformat (i, "end.psp %u", &behavior));
10449 M (SR_LOCALSID_ADD_DEL, mp);
10451 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
10454 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
10455 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
10457 mp->behavior = behavior;
10458 mp->sw_if_index = ntohl (sw_if_index);
10459 mp->fib_table = ntohl (fib_table);
10460 mp->end_psp = end_psp;
10461 mp->is_del = is_del;
10469 api_ioam_enable (vat_main_t * vam)
10471 unformat_input_t *input = vam->input;
10472 vl_api_ioam_enable_t *mp;
10474 int has_trace_option = 0;
10475 int has_pot_option = 0;
10476 int has_seqno_option = 0;
10477 int has_analyse_option = 0;
10480 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10482 if (unformat (input, "trace"))
10483 has_trace_option = 1;
10484 else if (unformat (input, "pot"))
10485 has_pot_option = 1;
10486 else if (unformat (input, "seqno"))
10487 has_seqno_option = 1;
10488 else if (unformat (input, "analyse"))
10489 has_analyse_option = 1;
10493 M (IOAM_ENABLE, mp);
10494 mp->id = htons (id);
10495 mp->seqno = has_seqno_option;
10496 mp->analyse = has_analyse_option;
10497 mp->pot_enable = has_pot_option;
10498 mp->trace_enable = has_trace_option;
10507 api_ioam_disable (vat_main_t * vam)
10509 vl_api_ioam_disable_t *mp;
10512 M (IOAM_DISABLE, mp);
10518 #define foreach_tcp_proto_field \
10522 #define foreach_udp_proto_field \
10526 #define foreach_ip4_proto_field \
10538 u16 src_port, dst_port;
10541 #if VPP_API_TEST_BUILTIN == 0
10543 unformat_tcp_mask (unformat_input_t * input, va_list * args)
10545 u8 **maskp = va_arg (*args, u8 **);
10547 u8 found_something = 0;
10550 #define _(a) u8 a=0;
10551 foreach_tcp_proto_field;
10554 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10557 #define _(a) else if (unformat (input, #a)) a=1;
10558 foreach_tcp_proto_field
10564 #define _(a) found_something += a;
10565 foreach_tcp_proto_field;
10568 if (found_something == 0)
10571 vec_validate (mask, sizeof (*tcp) - 1);
10573 tcp = (tcp_header_t *) mask;
10575 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
10576 foreach_tcp_proto_field;
10584 unformat_udp_mask (unformat_input_t * input, va_list * args)
10586 u8 **maskp = va_arg (*args, u8 **);
10588 u8 found_something = 0;
10591 #define _(a) u8 a=0;
10592 foreach_udp_proto_field;
10595 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10598 #define _(a) else if (unformat (input, #a)) a=1;
10599 foreach_udp_proto_field
10605 #define _(a) found_something += a;
10606 foreach_udp_proto_field;
10609 if (found_something == 0)
10612 vec_validate (mask, sizeof (*udp) - 1);
10614 udp = (udp_header_t *) mask;
10616 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
10617 foreach_udp_proto_field;
10625 unformat_l4_mask (unformat_input_t * input, va_list * args)
10627 u8 **maskp = va_arg (*args, u8 **);
10628 u16 src_port = 0, dst_port = 0;
10629 tcpudp_header_t *tcpudp;
10631 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10633 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
10635 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
10637 else if (unformat (input, "src_port"))
10639 else if (unformat (input, "dst_port"))
10645 if (!src_port && !dst_port)
10649 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
10651 tcpudp = (tcpudp_header_t *) mask;
10652 tcpudp->src_port = src_port;
10653 tcpudp->dst_port = dst_port;
10661 unformat_ip4_mask (unformat_input_t * input, va_list * args)
10663 u8 **maskp = va_arg (*args, u8 **);
10665 u8 found_something = 0;
10668 #define _(a) u8 a=0;
10669 foreach_ip4_proto_field;
10675 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10677 if (unformat (input, "version"))
10679 else if (unformat (input, "hdr_length"))
10681 else if (unformat (input, "src"))
10683 else if (unformat (input, "dst"))
10685 else if (unformat (input, "proto"))
10688 #define _(a) else if (unformat (input, #a)) a=1;
10689 foreach_ip4_proto_field
10695 #define _(a) found_something += a;
10696 foreach_ip4_proto_field;
10699 if (found_something == 0)
10702 vec_validate (mask, sizeof (*ip) - 1);
10704 ip = (ip4_header_t *) mask;
10706 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10707 foreach_ip4_proto_field;
10710 ip->ip_version_and_header_length = 0;
10713 ip->ip_version_and_header_length |= 0xF0;
10716 ip->ip_version_and_header_length |= 0x0F;
10722 #define foreach_ip6_proto_field \
10725 _(payload_length) \
10730 unformat_ip6_mask (unformat_input_t * input, va_list * args)
10732 u8 **maskp = va_arg (*args, u8 **);
10734 u8 found_something = 0;
10736 u32 ip_version_traffic_class_and_flow_label;
10738 #define _(a) u8 a=0;
10739 foreach_ip6_proto_field;
10742 u8 traffic_class = 0;
10745 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10747 if (unformat (input, "version"))
10749 else if (unformat (input, "traffic-class"))
10751 else if (unformat (input, "flow-label"))
10753 else if (unformat (input, "src"))
10755 else if (unformat (input, "dst"))
10757 else if (unformat (input, "proto"))
10760 #define _(a) else if (unformat (input, #a)) a=1;
10761 foreach_ip6_proto_field
10767 #define _(a) found_something += a;
10768 foreach_ip6_proto_field;
10771 if (found_something == 0)
10774 vec_validate (mask, sizeof (*ip) - 1);
10776 ip = (ip6_header_t *) mask;
10778 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
10779 foreach_ip6_proto_field;
10782 ip_version_traffic_class_and_flow_label = 0;
10785 ip_version_traffic_class_and_flow_label |= 0xF0000000;
10788 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
10791 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
10793 ip->ip_version_traffic_class_and_flow_label =
10794 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
10801 unformat_l3_mask (unformat_input_t * input, va_list * args)
10803 u8 **maskp = va_arg (*args, u8 **);
10805 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10807 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
10809 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
10818 unformat_l2_mask (unformat_input_t * input, va_list * args)
10820 u8 **maskp = va_arg (*args, u8 **);
10827 u8 ignore_tag1 = 0;
10828 u8 ignore_tag2 = 0;
10835 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10837 if (unformat (input, "src"))
10839 else if (unformat (input, "dst"))
10841 else if (unformat (input, "proto"))
10843 else if (unformat (input, "tag1"))
10845 else if (unformat (input, "tag2"))
10847 else if (unformat (input, "ignore-tag1"))
10849 else if (unformat (input, "ignore-tag2"))
10851 else if (unformat (input, "cos1"))
10853 else if (unformat (input, "cos2"))
10855 else if (unformat (input, "dot1q"))
10857 else if (unformat (input, "dot1ad"))
10862 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
10863 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
10866 if (tag1 || ignore_tag1 || cos1 || dot1q)
10868 if (tag2 || ignore_tag2 || cos2 || dot1ad)
10871 vec_validate (mask, len - 1);
10874 clib_memset (mask, 0xff, 6);
10877 clib_memset (mask + 6, 0xff, 6);
10879 if (tag2 || dot1ad)
10881 /* inner vlan tag */
10890 mask[21] = mask[20] = 0xff;
10911 mask[16] = mask[17] = 0xff;
10921 mask[12] = mask[13] = 0xff;
10928 unformat_classify_mask (unformat_input_t * input, va_list * args)
10930 u8 **maskp = va_arg (*args, u8 **);
10931 u32 *skipp = va_arg (*args, u32 *);
10932 u32 *matchp = va_arg (*args, u32 *);
10940 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10942 if (unformat (input, "hex %U", unformat_hex_string, &mask))
10944 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
10946 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
10948 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
10962 if (mask || l2 || l3 || l4)
10964 if (l2 || l3 || l4)
10966 /* "With a free Ethernet header in every package" */
10968 vec_validate (l2, 13);
10972 vec_append (mask, l3);
10977 vec_append (mask, l4);
10982 /* Scan forward looking for the first significant mask octet */
10983 for (i = 0; i < vec_len (mask); i++)
10987 /* compute (skip, match) params */
10988 *skipp = i / sizeof (u32x4);
10989 vec_delete (mask, *skipp * sizeof (u32x4), 0);
10991 /* Pad mask to an even multiple of the vector size */
10992 while (vec_len (mask) % sizeof (u32x4))
10993 vec_add1 (mask, 0);
10995 match = vec_len (mask) / sizeof (u32x4);
10997 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
10999 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11000 if (*tmp || *(tmp + 1))
11005 clib_warning ("BUG: match 0");
11007 _vec_len (mask) = match * sizeof (u32x4);
11017 #endif /* VPP_API_TEST_BUILTIN */
11019 #define foreach_l2_next \
11021 _(ethernet, ETHERNET_INPUT) \
11022 _(ip4, IP4_INPUT) \
11026 unformat_l2_next_index (unformat_input_t * input, va_list * args)
11028 u32 *miss_next_indexp = va_arg (*args, u32 *);
11029 u32 next_index = 0;
11033 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11037 if (unformat (input, "%d", &tmp))
11046 *miss_next_indexp = next_index;
11050 #define foreach_ip_next \
11053 _(rewrite, REWRITE)
11056 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
11058 u32 *miss_next_indexp = va_arg (*args, u32 *);
11059 u32 next_index = 0;
11063 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11067 if (unformat (input, "%d", &tmp))
11076 *miss_next_indexp = next_index;
11080 #define foreach_acl_next \
11084 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
11086 u32 *miss_next_indexp = va_arg (*args, u32 *);
11087 u32 next_index = 0;
11091 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11095 if (unformat (input, "permit"))
11100 else if (unformat (input, "%d", &tmp))
11109 *miss_next_indexp = next_index;
11114 unformat_policer_precolor (unformat_input_t * input, va_list * args)
11116 u32 *r = va_arg (*args, u32 *);
11118 if (unformat (input, "conform-color"))
11119 *r = POLICE_CONFORM;
11120 else if (unformat (input, "exceed-color"))
11121 *r = POLICE_EXCEED;
11129 api_classify_add_del_table (vat_main_t * vam)
11131 unformat_input_t *i = vam->input;
11132 vl_api_classify_add_del_table_t *mp;
11139 u32 table_index = ~0;
11140 u32 next_table_index = ~0;
11141 u32 miss_next_index = ~0;
11142 u32 memory_size = 32 << 20;
11144 u32 current_data_flag = 0;
11145 int current_data_offset = 0;
11148 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11150 if (unformat (i, "del"))
11152 else if (unformat (i, "del-chain"))
11157 else if (unformat (i, "buckets %d", &nbuckets))
11159 else if (unformat (i, "memory_size %d", &memory_size))
11161 else if (unformat (i, "skip %d", &skip))
11163 else if (unformat (i, "match %d", &match))
11165 else if (unformat (i, "table %d", &table_index))
11167 else if (unformat (i, "mask %U", unformat_classify_mask,
11168 &mask, &skip, &match))
11170 else if (unformat (i, "next-table %d", &next_table_index))
11172 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
11175 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11178 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
11181 else if (unformat (i, "current-data-flag %d", ¤t_data_flag))
11183 else if (unformat (i, "current-data-offset %d", ¤t_data_offset))
11189 if (is_add && mask == 0)
11191 errmsg ("Mask required");
11195 if (is_add && skip == ~0)
11197 errmsg ("skip count required");
11201 if (is_add && match == ~0)
11203 errmsg ("match count required");
11207 if (!is_add && table_index == ~0)
11209 errmsg ("table index required for delete");
11213 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
11215 mp->is_add = is_add;
11216 mp->del_chain = del_chain;
11217 mp->table_index = ntohl (table_index);
11218 mp->nbuckets = ntohl (nbuckets);
11219 mp->memory_size = ntohl (memory_size);
11220 mp->skip_n_vectors = ntohl (skip);
11221 mp->match_n_vectors = ntohl (match);
11222 mp->next_table_index = ntohl (next_table_index);
11223 mp->miss_next_index = ntohl (miss_next_index);
11224 mp->current_data_flag = ntohl (current_data_flag);
11225 mp->current_data_offset = ntohl (current_data_offset);
11226 mp->mask_len = ntohl (vec_len (mask));
11227 clib_memcpy (mp->mask, mask, vec_len (mask));
11236 #if VPP_API_TEST_BUILTIN == 0
11238 unformat_l4_match (unformat_input_t * input, va_list * args)
11240 u8 **matchp = va_arg (*args, u8 **);
11242 u8 *proto_header = 0;
11248 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11250 if (unformat (input, "src_port %d", &src_port))
11252 else if (unformat (input, "dst_port %d", &dst_port))
11258 h.src_port = clib_host_to_net_u16 (src_port);
11259 h.dst_port = clib_host_to_net_u16 (dst_port);
11260 vec_validate (proto_header, sizeof (h) - 1);
11261 memcpy (proto_header, &h, sizeof (h));
11263 *matchp = proto_header;
11269 unformat_ip4_match (unformat_input_t * input, va_list * args)
11271 u8 **matchp = va_arg (*args, u8 **);
11276 int hdr_length = 0;
11277 u32 hdr_length_val;
11278 int src = 0, dst = 0;
11279 ip4_address_t src_val, dst_val;
11286 int fragment_id = 0;
11287 u32 fragment_id_val;
11293 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11295 if (unformat (input, "version %d", &version_val))
11297 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11299 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11301 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11303 else if (unformat (input, "proto %d", &proto_val))
11305 else if (unformat (input, "tos %d", &tos_val))
11307 else if (unformat (input, "length %d", &length_val))
11309 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11311 else if (unformat (input, "ttl %d", &ttl_val))
11313 else if (unformat (input, "checksum %d", &checksum_val))
11319 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11320 + ttl + checksum == 0)
11324 * Aligned because we use the real comparison functions
11326 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11328 ip = (ip4_header_t *) match;
11330 /* These are realistically matched in practice */
11332 ip->src_address.as_u32 = src_val.as_u32;
11335 ip->dst_address.as_u32 = dst_val.as_u32;
11338 ip->protocol = proto_val;
11341 /* These are not, but they're included for completeness */
11343 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11346 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11352 ip->length = clib_host_to_net_u16 (length_val);
11358 ip->checksum = clib_host_to_net_u16 (checksum_val);
11365 unformat_ip6_match (unformat_input_t * input, va_list * args)
11367 u8 **matchp = va_arg (*args, u8 **);
11372 u8 traffic_class = 0;
11373 u32 traffic_class_val = 0;
11376 int src = 0, dst = 0;
11377 ip6_address_t src_val, dst_val;
11380 int payload_length = 0;
11381 u32 payload_length_val;
11384 u32 ip_version_traffic_class_and_flow_label;
11386 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11388 if (unformat (input, "version %d", &version_val))
11390 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11392 else if (unformat (input, "flow_label %d", &flow_label_val))
11394 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11396 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11398 else if (unformat (input, "proto %d", &proto_val))
11400 else if (unformat (input, "payload_length %d", &payload_length_val))
11401 payload_length = 1;
11402 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11408 if (version + traffic_class + flow_label + src + dst + proto +
11409 payload_length + hop_limit == 0)
11413 * Aligned because we use the real comparison functions
11415 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11417 ip = (ip6_header_t *) match;
11420 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11423 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11426 ip->protocol = proto_val;
11428 ip_version_traffic_class_and_flow_label = 0;
11431 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11434 ip_version_traffic_class_and_flow_label |=
11435 (traffic_class_val & 0xFF) << 20;
11438 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11440 ip->ip_version_traffic_class_and_flow_label =
11441 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11443 if (payload_length)
11444 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11447 ip->hop_limit = hop_limit_val;
11454 unformat_l3_match (unformat_input_t * input, va_list * args)
11456 u8 **matchp = va_arg (*args, u8 **);
11458 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11460 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
11462 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
11471 unformat_vlan_tag (unformat_input_t * input, va_list * args)
11473 u8 *tagp = va_arg (*args, u8 *);
11476 if (unformat (input, "%d", &tag))
11478 tagp[0] = (tag >> 8) & 0x0F;
11479 tagp[1] = tag & 0xFF;
11487 unformat_l2_match (unformat_input_t * input, va_list * args)
11489 u8 **matchp = va_arg (*args, u8 **);
11502 u8 ignore_tag1 = 0;
11503 u8 ignore_tag2 = 0;
11509 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11511 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
11514 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
11516 else if (unformat (input, "proto %U",
11517 unformat_ethernet_type_host_byte_order, &proto_val))
11519 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
11521 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
11523 else if (unformat (input, "ignore-tag1"))
11525 else if (unformat (input, "ignore-tag2"))
11527 else if (unformat (input, "cos1 %d", &cos1_val))
11529 else if (unformat (input, "cos2 %d", &cos2_val))
11534 if ((src + dst + proto + tag1 + tag2 +
11535 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11538 if (tag1 || ignore_tag1 || cos1)
11540 if (tag2 || ignore_tag2 || cos2)
11543 vec_validate_aligned (match, len - 1, sizeof (u32x4));
11546 clib_memcpy (match, dst_val, 6);
11549 clib_memcpy (match + 6, src_val, 6);
11553 /* inner vlan tag */
11554 match[19] = tag2_val[1];
11555 match[18] = tag2_val[0];
11557 match[18] |= (cos2_val & 0x7) << 5;
11560 match[21] = proto_val & 0xff;
11561 match[20] = proto_val >> 8;
11565 match[15] = tag1_val[1];
11566 match[14] = tag1_val[0];
11569 match[14] |= (cos1_val & 0x7) << 5;
11575 match[15] = tag1_val[1];
11576 match[14] = tag1_val[0];
11579 match[17] = proto_val & 0xff;
11580 match[16] = proto_val >> 8;
11583 match[14] |= (cos1_val & 0x7) << 5;
11589 match[18] |= (cos2_val & 0x7) << 5;
11591 match[14] |= (cos1_val & 0x7) << 5;
11594 match[13] = proto_val & 0xff;
11595 match[12] = proto_val >> 8;
11603 unformat_qos_source (unformat_input_t * input, va_list * args)
11605 int *qs = va_arg (*args, int *);
11607 if (unformat (input, "ip"))
11608 *qs = QOS_SOURCE_IP;
11609 else if (unformat (input, "mpls"))
11610 *qs = QOS_SOURCE_MPLS;
11611 else if (unformat (input, "ext"))
11612 *qs = QOS_SOURCE_EXT;
11613 else if (unformat (input, "vlan"))
11614 *qs = QOS_SOURCE_VLAN;
11623 api_unformat_classify_match (unformat_input_t * input, va_list * args)
11625 u8 **matchp = va_arg (*args, u8 **);
11626 u32 skip_n_vectors = va_arg (*args, u32);
11627 u32 match_n_vectors = va_arg (*args, u32);
11634 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11636 if (unformat (input, "hex %U", unformat_hex_string, &match))
11638 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
11640 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
11642 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
11656 if (match || l2 || l3 || l4)
11658 if (l2 || l3 || l4)
11660 /* "Win a free Ethernet header in every packet" */
11662 vec_validate_aligned (l2, 13, sizeof (u32x4));
11666 vec_append_aligned (match, l3, sizeof (u32x4));
11671 vec_append_aligned (match, l4, sizeof (u32x4));
11676 /* Make sure the vector is big enough even if key is all 0's */
11677 vec_validate_aligned
11678 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
11681 /* Set size, include skipped vectors */
11682 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
11693 api_classify_add_del_session (vat_main_t * vam)
11695 unformat_input_t *i = vam->input;
11696 vl_api_classify_add_del_session_t *mp;
11698 u32 table_index = ~0;
11699 u32 hit_next_index = ~0;
11700 u32 opaque_index = ~0;
11703 u32 skip_n_vectors = 0;
11704 u32 match_n_vectors = 0;
11710 * Warning: you have to supply skip_n and match_n
11711 * because the API client cant simply look at the classify
11715 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11717 if (unformat (i, "del"))
11719 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
11722 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
11725 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
11728 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
11730 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
11732 else if (unformat (i, "opaque-index %d", &opaque_index))
11734 else if (unformat (i, "skip_n %d", &skip_n_vectors))
11736 else if (unformat (i, "match_n %d", &match_n_vectors))
11738 else if (unformat (i, "match %U", api_unformat_classify_match,
11739 &match, skip_n_vectors, match_n_vectors))
11741 else if (unformat (i, "advance %d", &advance))
11743 else if (unformat (i, "table-index %d", &table_index))
11745 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
11747 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
11749 else if (unformat (i, "action %d", &action))
11751 else if (unformat (i, "metadata %d", &metadata))
11757 if (table_index == ~0)
11759 errmsg ("Table index required");
11763 if (is_add && match == 0)
11765 errmsg ("Match value required");
11769 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
11771 mp->is_add = is_add;
11772 mp->table_index = ntohl (table_index);
11773 mp->hit_next_index = ntohl (hit_next_index);
11774 mp->opaque_index = ntohl (opaque_index);
11775 mp->advance = ntohl (advance);
11776 mp->action = action;
11777 mp->metadata = ntohl (metadata);
11778 mp->match_len = ntohl (vec_len (match));
11779 clib_memcpy (mp->match, match, vec_len (match));
11788 api_classify_set_interface_ip_table (vat_main_t * vam)
11790 unformat_input_t *i = vam->input;
11791 vl_api_classify_set_interface_ip_table_t *mp;
11793 int sw_if_index_set;
11794 u32 table_index = ~0;
11798 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11800 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11801 sw_if_index_set = 1;
11802 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11803 sw_if_index_set = 1;
11804 else if (unformat (i, "table %d", &table_index))
11808 clib_warning ("parse error '%U'", format_unformat_error, i);
11813 if (sw_if_index_set == 0)
11815 errmsg ("missing interface name or sw_if_index");
11820 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
11822 mp->sw_if_index = ntohl (sw_if_index);
11823 mp->table_index = ntohl (table_index);
11824 mp->is_ipv6 = is_ipv6;
11832 api_classify_set_interface_l2_tables (vat_main_t * vam)
11834 unformat_input_t *i = vam->input;
11835 vl_api_classify_set_interface_l2_tables_t *mp;
11837 int sw_if_index_set;
11838 u32 ip4_table_index = ~0;
11839 u32 ip6_table_index = ~0;
11840 u32 other_table_index = ~0;
11844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11846 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11847 sw_if_index_set = 1;
11848 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11849 sw_if_index_set = 1;
11850 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11852 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11854 else if (unformat (i, "other-table %d", &other_table_index))
11856 else if (unformat (i, "is-input %d", &is_input))
11860 clib_warning ("parse error '%U'", format_unformat_error, i);
11865 if (sw_if_index_set == 0)
11867 errmsg ("missing interface name or sw_if_index");
11872 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
11874 mp->sw_if_index = ntohl (sw_if_index);
11875 mp->ip4_table_index = ntohl (ip4_table_index);
11876 mp->ip6_table_index = ntohl (ip6_table_index);
11877 mp->other_table_index = ntohl (other_table_index);
11878 mp->is_input = (u8) is_input;
11886 api_set_ipfix_exporter (vat_main_t * vam)
11888 unformat_input_t *i = vam->input;
11889 vl_api_set_ipfix_exporter_t *mp;
11890 ip4_address_t collector_address;
11891 u8 collector_address_set = 0;
11892 u32 collector_port = ~0;
11893 ip4_address_t src_address;
11894 u8 src_address_set = 0;
11897 u32 template_interval = ~0;
11898 u8 udp_checksum = 0;
11901 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11903 if (unformat (i, "collector_address %U", unformat_ip4_address,
11904 &collector_address))
11905 collector_address_set = 1;
11906 else if (unformat (i, "collector_port %d", &collector_port))
11908 else if (unformat (i, "src_address %U", unformat_ip4_address,
11910 src_address_set = 1;
11911 else if (unformat (i, "vrf_id %d", &vrf_id))
11913 else if (unformat (i, "path_mtu %d", &path_mtu))
11915 else if (unformat (i, "template_interval %d", &template_interval))
11917 else if (unformat (i, "udp_checksum"))
11923 if (collector_address_set == 0)
11925 errmsg ("collector_address required");
11929 if (src_address_set == 0)
11931 errmsg ("src_address required");
11935 M (SET_IPFIX_EXPORTER, mp);
11937 memcpy (mp->collector_address, collector_address.data,
11938 sizeof (collector_address.data));
11939 mp->collector_port = htons ((u16) collector_port);
11940 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
11941 mp->vrf_id = htonl (vrf_id);
11942 mp->path_mtu = htonl (path_mtu);
11943 mp->template_interval = htonl (template_interval);
11944 mp->udp_checksum = udp_checksum;
11952 api_set_ipfix_classify_stream (vat_main_t * vam)
11954 unformat_input_t *i = vam->input;
11955 vl_api_set_ipfix_classify_stream_t *mp;
11957 u32 src_port = UDP_DST_PORT_ipfix;
11960 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11962 if (unformat (i, "domain %d", &domain_id))
11964 else if (unformat (i, "src_port %d", &src_port))
11968 errmsg ("unknown input `%U'", format_unformat_error, i);
11973 M (SET_IPFIX_CLASSIFY_STREAM, mp);
11975 mp->domain_id = htonl (domain_id);
11976 mp->src_port = htons ((u16) src_port);
11984 api_ipfix_classify_table_add_del (vat_main_t * vam)
11986 unformat_input_t *i = vam->input;
11987 vl_api_ipfix_classify_table_add_del_t *mp;
11989 u32 classify_table_index = ~0;
11991 u8 transport_protocol = 255;
11994 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11996 if (unformat (i, "add"))
11998 else if (unformat (i, "del"))
12000 else if (unformat (i, "table %d", &classify_table_index))
12002 else if (unformat (i, "ip4"))
12004 else if (unformat (i, "ip6"))
12006 else if (unformat (i, "tcp"))
12007 transport_protocol = 6;
12008 else if (unformat (i, "udp"))
12009 transport_protocol = 17;
12012 errmsg ("unknown input `%U'", format_unformat_error, i);
12019 errmsg ("expecting: add|del");
12022 if (classify_table_index == ~0)
12024 errmsg ("classifier table not specified");
12027 if (ip_version == 0)
12029 errmsg ("IP version not specified");
12033 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
12035 mp->is_add = is_add;
12036 mp->table_id = htonl (classify_table_index);
12037 mp->ip_version = ip_version;
12038 mp->transport_protocol = transport_protocol;
12046 api_get_node_index (vat_main_t * vam)
12048 unformat_input_t *i = vam->input;
12049 vl_api_get_node_index_t *mp;
12053 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12055 if (unformat (i, "node %s", &name))
12062 errmsg ("node name required");
12065 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12067 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12071 M (GET_NODE_INDEX, mp);
12072 clib_memcpy (mp->node_name, name, vec_len (name));
12081 api_get_next_index (vat_main_t * vam)
12083 unformat_input_t *i = vam->input;
12084 vl_api_get_next_index_t *mp;
12085 u8 *node_name = 0, *next_node_name = 0;
12088 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12090 if (unformat (i, "node-name %s", &node_name))
12092 else if (unformat (i, "next-node-name %s", &next_node_name))
12096 if (node_name == 0)
12098 errmsg ("node name required");
12101 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12103 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12107 if (next_node_name == 0)
12109 errmsg ("next node name required");
12112 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12114 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12118 M (GET_NEXT_INDEX, mp);
12119 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12120 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12121 vec_free (node_name);
12122 vec_free (next_node_name);
12130 api_add_node_next (vat_main_t * vam)
12132 unformat_input_t *i = vam->input;
12133 vl_api_add_node_next_t *mp;
12138 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12140 if (unformat (i, "node %s", &name))
12142 else if (unformat (i, "next %s", &next))
12149 errmsg ("node name required");
12152 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12154 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12159 errmsg ("next node required");
12162 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12164 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12168 M (ADD_NODE_NEXT, mp);
12169 clib_memcpy (mp->node_name, name, vec_len (name));
12170 clib_memcpy (mp->next_name, next, vec_len (next));
12180 api_l2tpv3_create_tunnel (vat_main_t * vam)
12182 unformat_input_t *i = vam->input;
12183 ip6_address_t client_address, our_address;
12184 int client_address_set = 0;
12185 int our_address_set = 0;
12186 u32 local_session_id = 0;
12187 u32 remote_session_id = 0;
12188 u64 local_cookie = 0;
12189 u64 remote_cookie = 0;
12190 u8 l2_sublayer_present = 0;
12191 vl_api_l2tpv3_create_tunnel_t *mp;
12194 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12196 if (unformat (i, "client_address %U", unformat_ip6_address,
12198 client_address_set = 1;
12199 else if (unformat (i, "our_address %U", unformat_ip6_address,
12201 our_address_set = 1;
12202 else if (unformat (i, "local_session_id %d", &local_session_id))
12204 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12206 else if (unformat (i, "local_cookie %lld", &local_cookie))
12208 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12210 else if (unformat (i, "l2-sublayer-present"))
12211 l2_sublayer_present = 1;
12216 if (client_address_set == 0)
12218 errmsg ("client_address required");
12222 if (our_address_set == 0)
12224 errmsg ("our_address required");
12228 M (L2TPV3_CREATE_TUNNEL, mp);
12230 clib_memcpy (mp->client_address, client_address.as_u8,
12231 sizeof (mp->client_address));
12233 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12235 mp->local_session_id = ntohl (local_session_id);
12236 mp->remote_session_id = ntohl (remote_session_id);
12237 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12238 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12239 mp->l2_sublayer_present = l2_sublayer_present;
12248 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12250 unformat_input_t *i = vam->input;
12252 u8 sw_if_index_set = 0;
12253 u64 new_local_cookie = 0;
12254 u64 new_remote_cookie = 0;
12255 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
12258 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12260 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12261 sw_if_index_set = 1;
12262 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12263 sw_if_index_set = 1;
12264 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12266 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12272 if (sw_if_index_set == 0)
12274 errmsg ("missing interface name or sw_if_index");
12278 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
12280 mp->sw_if_index = ntohl (sw_if_index);
12281 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12282 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12290 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12292 unformat_input_t *i = vam->input;
12293 vl_api_l2tpv3_interface_enable_disable_t *mp;
12295 u8 sw_if_index_set = 0;
12296 u8 enable_disable = 1;
12299 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12301 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12302 sw_if_index_set = 1;
12303 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12304 sw_if_index_set = 1;
12305 else if (unformat (i, "enable"))
12306 enable_disable = 1;
12307 else if (unformat (i, "disable"))
12308 enable_disable = 0;
12313 if (sw_if_index_set == 0)
12315 errmsg ("missing interface name or sw_if_index");
12319 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
12321 mp->sw_if_index = ntohl (sw_if_index);
12322 mp->enable_disable = enable_disable;
12330 api_l2tpv3_set_lookup_key (vat_main_t * vam)
12332 unformat_input_t *i = vam->input;
12333 vl_api_l2tpv3_set_lookup_key_t *mp;
12337 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12339 if (unformat (i, "lookup_v6_src"))
12340 key = L2T_LOOKUP_SRC_ADDRESS;
12341 else if (unformat (i, "lookup_v6_dst"))
12342 key = L2T_LOOKUP_DST_ADDRESS;
12343 else if (unformat (i, "lookup_session_id"))
12344 key = L2T_LOOKUP_SESSION_ID;
12349 if (key == (u8) ~ 0)
12351 errmsg ("l2tp session lookup key unset");
12355 M (L2TPV3_SET_LOOKUP_KEY, mp);
12364 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12365 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12367 vat_main_t *vam = &vat_main;
12369 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12370 format_ip6_address, mp->our_address,
12371 format_ip6_address, mp->client_address,
12372 clib_net_to_host_u32 (mp->sw_if_index));
12375 " local cookies %016llx %016llx remote cookie %016llx",
12376 clib_net_to_host_u64 (mp->local_cookie[0]),
12377 clib_net_to_host_u64 (mp->local_cookie[1]),
12378 clib_net_to_host_u64 (mp->remote_cookie));
12380 print (vam->ofp, " local session-id %d remote session-id %d",
12381 clib_net_to_host_u32 (mp->local_session_id),
12382 clib_net_to_host_u32 (mp->remote_session_id));
12384 print (vam->ofp, " l2 specific sublayer %s\n",
12385 mp->l2_sublayer_present ? "preset" : "absent");
12389 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12390 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12392 vat_main_t *vam = &vat_main;
12393 vat_json_node_t *node = NULL;
12394 struct in6_addr addr;
12396 if (VAT_JSON_ARRAY != vam->json_tree.type)
12398 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12399 vat_json_init_array (&vam->json_tree);
12401 node = vat_json_array_add (&vam->json_tree);
12403 vat_json_init_object (node);
12405 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12406 vat_json_object_add_ip6 (node, "our_address", addr);
12407 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12408 vat_json_object_add_ip6 (node, "client_address", addr);
12410 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12411 vat_json_init_array (lc);
12412 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12413 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12414 vat_json_object_add_uint (node, "remote_cookie",
12415 clib_net_to_host_u64 (mp->remote_cookie));
12417 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12418 vat_json_object_add_uint (node, "local_session_id",
12419 clib_net_to_host_u32 (mp->local_session_id));
12420 vat_json_object_add_uint (node, "remote_session_id",
12421 clib_net_to_host_u32 (mp->remote_session_id));
12422 vat_json_object_add_string_copy (node, "l2_sublayer",
12423 mp->l2_sublayer_present ? (u8 *) "present"
12424 : (u8 *) "absent");
12428 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12430 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
12431 vl_api_control_ping_t *mp_ping;
12434 /* Get list of l2tpv3-tunnel interfaces */
12435 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
12438 /* Use a control ping for synchronization */
12439 MPING (CONTROL_PING, mp_ping);
12447 static void vl_api_sw_interface_tap_v2_details_t_handler
12448 (vl_api_sw_interface_tap_v2_details_t * mp)
12450 vat_main_t *vam = &vat_main;
12452 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
12453 mp->host_ip4_prefix_len);
12454 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
12455 mp->host_ip6_prefix_len);
12458 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s 0x%-08x",
12459 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
12460 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12461 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
12462 mp->host_bridge, ip4, ip6, ntohl (mp->tap_flags));
12468 static void vl_api_sw_interface_tap_v2_details_t_handler_json
12469 (vl_api_sw_interface_tap_v2_details_t * mp)
12471 vat_main_t *vam = &vat_main;
12472 vat_json_node_t *node = NULL;
12474 if (VAT_JSON_ARRAY != vam->json_tree.type)
12476 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12477 vat_json_init_array (&vam->json_tree);
12479 node = vat_json_array_add (&vam->json_tree);
12481 vat_json_init_object (node);
12482 vat_json_object_add_uint (node, "id", ntohl (mp->id));
12483 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12484 vat_json_object_add_uint (node, "tap_flags", ntohl (mp->tap_flags));
12485 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
12486 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12487 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12488 vat_json_object_add_string_copy (node, "host_mac_addr",
12489 format (0, "%U", format_ethernet_address,
12490 &mp->host_mac_addr));
12491 vat_json_object_add_string_copy (node, "host_namespace",
12492 mp->host_namespace);
12493 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
12494 vat_json_object_add_string_copy (node, "host_ip4_addr",
12495 format (0, "%U/%d", format_ip4_address,
12497 mp->host_ip4_prefix_len));
12498 vat_json_object_add_string_copy (node, "host_ip6_addr",
12499 format (0, "%U/%d", format_ip6_address,
12501 mp->host_ip6_prefix_len));
12506 api_sw_interface_tap_v2_dump (vat_main_t * vam)
12508 vl_api_sw_interface_tap_v2_dump_t *mp;
12509 vl_api_control_ping_t *mp_ping;
12513 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
12514 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
12515 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
12518 /* Get list of tap interfaces */
12519 M (SW_INTERFACE_TAP_V2_DUMP, mp);
12522 /* Use a control ping for synchronization */
12523 MPING (CONTROL_PING, mp_ping);
12530 static void vl_api_sw_interface_virtio_pci_details_t_handler
12531 (vl_api_sw_interface_virtio_pci_details_t * mp)
12533 vat_main_t *vam = &vat_main;
12547 addr.as_u32 = ntohl (mp->pci_addr);
12548 u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus,
12549 addr.slot, addr.function);
12552 "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx",
12553 pci_addr, ntohl (mp->sw_if_index),
12554 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12555 format_ethernet_address, mp->mac_addr,
12556 clib_net_to_host_u64 (mp->features));
12557 vec_free (pci_addr);
12560 static void vl_api_sw_interface_virtio_pci_details_t_handler_json
12561 (vl_api_sw_interface_virtio_pci_details_t * mp)
12563 vat_main_t *vam = &vat_main;
12564 vat_json_node_t *node = NULL;
12566 if (VAT_JSON_ARRAY != vam->json_tree.type)
12568 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12569 vat_json_init_array (&vam->json_tree);
12571 node = vat_json_array_add (&vam->json_tree);
12573 vat_json_init_object (node);
12574 vat_json_object_add_uint (node, "pci-addr", ntohl (mp->pci_addr));
12575 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12576 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12577 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12578 vat_json_object_add_uint (node, "features",
12579 clib_net_to_host_u64 (mp->features));
12580 vat_json_object_add_string_copy (node, "mac_addr",
12581 format (0, "%U", format_ethernet_address,
12586 api_sw_interface_virtio_pci_dump (vat_main_t * vam)
12588 vl_api_sw_interface_virtio_pci_dump_t *mp;
12589 vl_api_control_ping_t *mp_ping;
12593 "\n%-12s %-12s %-12s %-12s %-17s %-08s",
12594 "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz",
12595 "mac_addr", "features");
12597 /* Get list of tap interfaces */
12598 M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp);
12601 /* Use a control ping for synchronization */
12602 MPING (CONTROL_PING, mp_ping);
12610 api_vxlan_offload_rx (vat_main_t * vam)
12612 unformat_input_t *line_input = vam->input;
12613 vl_api_vxlan_offload_rx_t *mp;
12614 u32 hw_if_index = ~0, rx_if_index = ~0;
12618 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12620 if (unformat (line_input, "del"))
12622 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
12625 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
12627 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
12630 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
12634 errmsg ("parse error '%U'", format_unformat_error, line_input);
12639 if (hw_if_index == ~0)
12641 errmsg ("no hw interface");
12645 if (rx_if_index == ~0)
12647 errmsg ("no rx tunnel");
12651 M (VXLAN_OFFLOAD_RX, mp);
12653 mp->hw_if_index = ntohl (hw_if_index);
12654 mp->sw_if_index = ntohl (rx_if_index);
12655 mp->enable = is_add;
12662 static uword unformat_vxlan_decap_next
12663 (unformat_input_t * input, va_list * args)
12665 u32 *result = va_arg (*args, u32 *);
12668 if (unformat (input, "l2"))
12669 *result = VXLAN_INPUT_NEXT_L2_INPUT;
12670 else if (unformat (input, "%d", &tmp))
12678 api_vxlan_add_del_tunnel (vat_main_t * vam)
12680 unformat_input_t *line_input = vam->input;
12681 vl_api_vxlan_add_del_tunnel_t *mp;
12682 ip46_address_t src, dst;
12684 u8 ipv4_set = 0, ipv6_set = 0;
12689 u32 mcast_sw_if_index = ~0;
12690 u32 encap_vrf_id = 0;
12691 u32 decap_next_index = ~0;
12695 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12696 clib_memset (&src, 0, sizeof src);
12697 clib_memset (&dst, 0, sizeof dst);
12699 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12701 if (unformat (line_input, "del"))
12703 else if (unformat (line_input, "instance %d", &instance))
12706 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12712 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12718 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
12724 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
12729 else if (unformat (line_input, "group %U %U",
12730 unformat_ip4_address, &dst.ip4,
12731 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12733 grp_set = dst_set = 1;
12736 else if (unformat (line_input, "group %U",
12737 unformat_ip4_address, &dst.ip4))
12739 grp_set = dst_set = 1;
12742 else if (unformat (line_input, "group %U %U",
12743 unformat_ip6_address, &dst.ip6,
12744 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12746 grp_set = dst_set = 1;
12749 else if (unformat (line_input, "group %U",
12750 unformat_ip6_address, &dst.ip6))
12752 grp_set = dst_set = 1;
12756 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12758 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12760 else if (unformat (line_input, "decap-next %U",
12761 unformat_vxlan_decap_next, &decap_next_index))
12763 else if (unformat (line_input, "vni %d", &vni))
12767 errmsg ("parse error '%U'", format_unformat_error, line_input);
12774 errmsg ("tunnel src address not specified");
12779 errmsg ("tunnel dst address not specified");
12783 if (grp_set && !ip46_address_is_multicast (&dst))
12785 errmsg ("tunnel group address not multicast");
12788 if (grp_set && mcast_sw_if_index == ~0)
12790 errmsg ("tunnel nonexistent multicast device");
12793 if (grp_set == 0 && ip46_address_is_multicast (&dst))
12795 errmsg ("tunnel dst address must be unicast");
12800 if (ipv4_set && ipv6_set)
12802 errmsg ("both IPv4 and IPv6 addresses specified");
12806 if ((vni == 0) || (vni >> 24))
12808 errmsg ("vni not specified or out of range");
12812 M (VXLAN_ADD_DEL_TUNNEL, mp);
12816 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
12817 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
12821 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
12822 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
12825 mp->instance = htonl (instance);
12826 mp->encap_vrf_id = ntohl (encap_vrf_id);
12827 mp->decap_next_index = ntohl (decap_next_index);
12828 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
12829 mp->vni = ntohl (vni);
12830 mp->is_add = is_add;
12831 mp->is_ipv6 = ipv6_set;
12838 static void vl_api_vxlan_tunnel_details_t_handler
12839 (vl_api_vxlan_tunnel_details_t * mp)
12841 vat_main_t *vam = &vat_main;
12842 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
12843 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
12845 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
12846 ntohl (mp->sw_if_index),
12847 ntohl (mp->instance),
12848 format_ip46_address, &src, IP46_TYPE_ANY,
12849 format_ip46_address, &dst, IP46_TYPE_ANY,
12850 ntohl (mp->encap_vrf_id),
12851 ntohl (mp->decap_next_index), ntohl (mp->vni),
12852 ntohl (mp->mcast_sw_if_index));
12855 static void vl_api_vxlan_tunnel_details_t_handler_json
12856 (vl_api_vxlan_tunnel_details_t * mp)
12858 vat_main_t *vam = &vat_main;
12859 vat_json_node_t *node = NULL;
12861 if (VAT_JSON_ARRAY != vam->json_tree.type)
12863 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12864 vat_json_init_array (&vam->json_tree);
12866 node = vat_json_array_add (&vam->json_tree);
12868 vat_json_init_object (node);
12869 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12871 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
12875 struct in6_addr ip6;
12877 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
12878 vat_json_object_add_ip6 (node, "src_address", ip6);
12879 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
12880 vat_json_object_add_ip6 (node, "dst_address", ip6);
12884 struct in_addr ip4;
12886 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
12887 vat_json_object_add_ip4 (node, "src_address", ip4);
12888 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
12889 vat_json_object_add_ip4 (node, "dst_address", ip4);
12891 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
12892 vat_json_object_add_uint (node, "decap_next_index",
12893 ntohl (mp->decap_next_index));
12894 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
12895 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
12896 vat_json_object_add_uint (node, "mcast_sw_if_index",
12897 ntohl (mp->mcast_sw_if_index));
12901 api_vxlan_tunnel_dump (vat_main_t * vam)
12903 unformat_input_t *i = vam->input;
12904 vl_api_vxlan_tunnel_dump_t *mp;
12905 vl_api_control_ping_t *mp_ping;
12907 u8 sw_if_index_set = 0;
12910 /* Parse args required to build the message */
12911 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12913 if (unformat (i, "sw_if_index %d", &sw_if_index))
12914 sw_if_index_set = 1;
12919 if (sw_if_index_set == 0)
12924 if (!vam->json_output)
12926 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
12927 "sw_if_index", "instance", "src_address", "dst_address",
12928 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
12931 /* Get list of vxlan-tunnel interfaces */
12932 M (VXLAN_TUNNEL_DUMP, mp);
12934 mp->sw_if_index = htonl (sw_if_index);
12938 /* Use a control ping for synchronization */
12939 MPING (CONTROL_PING, mp_ping);
12946 static uword unformat_geneve_decap_next
12947 (unformat_input_t * input, va_list * args)
12949 u32 *result = va_arg (*args, u32 *);
12952 if (unformat (input, "l2"))
12953 *result = GENEVE_INPUT_NEXT_L2_INPUT;
12954 else if (unformat (input, "%d", &tmp))
12962 api_geneve_add_del_tunnel (vat_main_t * vam)
12964 unformat_input_t *line_input = vam->input;
12965 vl_api_geneve_add_del_tunnel_t *mp;
12966 ip46_address_t src, dst;
12968 u8 ipv4_set = 0, ipv6_set = 0;
12972 u32 mcast_sw_if_index = ~0;
12973 u32 encap_vrf_id = 0;
12974 u32 decap_next_index = ~0;
12978 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
12979 clib_memset (&src, 0, sizeof src);
12980 clib_memset (&dst, 0, sizeof dst);
12982 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12984 if (unformat (line_input, "del"))
12987 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12993 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12999 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13005 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13010 else if (unformat (line_input, "group %U %U",
13011 unformat_ip4_address, &dst.ip4,
13012 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13014 grp_set = dst_set = 1;
13017 else if (unformat (line_input, "group %U",
13018 unformat_ip4_address, &dst.ip4))
13020 grp_set = dst_set = 1;
13023 else if (unformat (line_input, "group %U %U",
13024 unformat_ip6_address, &dst.ip6,
13025 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13027 grp_set = dst_set = 1;
13030 else if (unformat (line_input, "group %U",
13031 unformat_ip6_address, &dst.ip6))
13033 grp_set = dst_set = 1;
13037 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13039 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13041 else if (unformat (line_input, "decap-next %U",
13042 unformat_geneve_decap_next, &decap_next_index))
13044 else if (unformat (line_input, "vni %d", &vni))
13048 errmsg ("parse error '%U'", format_unformat_error, line_input);
13055 errmsg ("tunnel src address not specified");
13060 errmsg ("tunnel dst address not specified");
13064 if (grp_set && !ip46_address_is_multicast (&dst))
13066 errmsg ("tunnel group address not multicast");
13069 if (grp_set && mcast_sw_if_index == ~0)
13071 errmsg ("tunnel nonexistent multicast device");
13074 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13076 errmsg ("tunnel dst address must be unicast");
13081 if (ipv4_set && ipv6_set)
13083 errmsg ("both IPv4 and IPv6 addresses specified");
13087 if ((vni == 0) || (vni >> 24))
13089 errmsg ("vni not specified or out of range");
13093 M (GENEVE_ADD_DEL_TUNNEL, mp);
13097 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13098 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13102 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13103 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13105 mp->encap_vrf_id = ntohl (encap_vrf_id);
13106 mp->decap_next_index = ntohl (decap_next_index);
13107 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13108 mp->vni = ntohl (vni);
13109 mp->is_add = is_add;
13110 mp->is_ipv6 = ipv6_set;
13117 static void vl_api_geneve_tunnel_details_t_handler
13118 (vl_api_geneve_tunnel_details_t * mp)
13120 vat_main_t *vam = &vat_main;
13121 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13122 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13124 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13125 ntohl (mp->sw_if_index),
13126 format_ip46_address, &src, IP46_TYPE_ANY,
13127 format_ip46_address, &dst, IP46_TYPE_ANY,
13128 ntohl (mp->encap_vrf_id),
13129 ntohl (mp->decap_next_index), ntohl (mp->vni),
13130 ntohl (mp->mcast_sw_if_index));
13133 static void vl_api_geneve_tunnel_details_t_handler_json
13134 (vl_api_geneve_tunnel_details_t * mp)
13136 vat_main_t *vam = &vat_main;
13137 vat_json_node_t *node = NULL;
13139 if (VAT_JSON_ARRAY != vam->json_tree.type)
13141 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13142 vat_json_init_array (&vam->json_tree);
13144 node = vat_json_array_add (&vam->json_tree);
13146 vat_json_init_object (node);
13147 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13150 struct in6_addr ip6;
13152 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13153 vat_json_object_add_ip6 (node, "src_address", ip6);
13154 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13155 vat_json_object_add_ip6 (node, "dst_address", ip6);
13159 struct in_addr ip4;
13161 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13162 vat_json_object_add_ip4 (node, "src_address", ip4);
13163 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13164 vat_json_object_add_ip4 (node, "dst_address", ip4);
13166 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13167 vat_json_object_add_uint (node, "decap_next_index",
13168 ntohl (mp->decap_next_index));
13169 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13170 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13171 vat_json_object_add_uint (node, "mcast_sw_if_index",
13172 ntohl (mp->mcast_sw_if_index));
13176 api_geneve_tunnel_dump (vat_main_t * vam)
13178 unformat_input_t *i = vam->input;
13179 vl_api_geneve_tunnel_dump_t *mp;
13180 vl_api_control_ping_t *mp_ping;
13182 u8 sw_if_index_set = 0;
13185 /* Parse args required to build the message */
13186 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13188 if (unformat (i, "sw_if_index %d", &sw_if_index))
13189 sw_if_index_set = 1;
13194 if (sw_if_index_set == 0)
13199 if (!vam->json_output)
13201 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13202 "sw_if_index", "local_address", "remote_address",
13203 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13206 /* Get list of geneve-tunnel interfaces */
13207 M (GENEVE_TUNNEL_DUMP, mp);
13209 mp->sw_if_index = htonl (sw_if_index);
13213 /* Use a control ping for synchronization */
13214 M (CONTROL_PING, mp_ping);
13222 api_gre_tunnel_add_del (vat_main_t * vam)
13224 unformat_input_t *line_input = vam->input;
13225 vl_api_address_t src = { }, dst =
13228 vl_api_gre_tunnel_add_del_t *mp;
13229 vl_api_gre_tunnel_type_t t_type;
13235 u32 outer_fib_id = 0;
13236 u32 session_id = 0;
13240 t_type = GRE_API_TUNNEL_TYPE_L3;
13242 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13244 if (unformat (line_input, "del"))
13246 else if (unformat (line_input, "instance %d", &instance))
13248 else if (unformat (line_input, "src %U", unformat_vl_api_address, &src))
13252 else if (unformat (line_input, "dst %U", unformat_vl_api_address, &dst))
13256 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13258 else if (unformat (line_input, "teb"))
13259 t_type = GRE_API_TUNNEL_TYPE_TEB;
13260 else if (unformat (line_input, "erspan %d", &session_id))
13261 t_type = GRE_API_TUNNEL_TYPE_ERSPAN;
13264 errmsg ("parse error '%U'", format_unformat_error, line_input);
13271 errmsg ("tunnel src address not specified");
13276 errmsg ("tunnel dst address not specified");
13280 M (GRE_TUNNEL_ADD_DEL, mp);
13282 clib_memcpy (&mp->tunnel.src, &src, sizeof (mp->tunnel.src));
13283 clib_memcpy (&mp->tunnel.dst, &dst, sizeof (mp->tunnel.dst));
13285 mp->tunnel.instance = htonl (instance);
13286 mp->tunnel.outer_fib_id = htonl (outer_fib_id);
13287 mp->is_add = is_add;
13288 mp->tunnel.session_id = htons ((u16) session_id);
13289 mp->tunnel.type = htonl (t_type);
13296 static void vl_api_gre_tunnel_details_t_handler
13297 (vl_api_gre_tunnel_details_t * mp)
13299 vat_main_t *vam = &vat_main;
13301 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
13302 ntohl (mp->tunnel.sw_if_index),
13303 ntohl (mp->tunnel.instance),
13304 format_vl_api_address, &mp->tunnel.src,
13305 format_vl_api_address, &mp->tunnel.dst,
13306 mp->tunnel.type, ntohl (mp->tunnel.outer_fib_id),
13307 ntohl (mp->tunnel.session_id));
13311 vat_json_object_add_address (vat_json_node_t * node,
13312 const char *str, const vl_api_address_t * addr)
13314 if (ADDRESS_IP6 == addr->af)
13316 struct in6_addr ip6;
13318 clib_memcpy (&ip6, &addr->un.ip6, sizeof (ip6));
13319 vat_json_object_add_ip6 (node, str, ip6);
13323 struct in_addr ip4;
13325 clib_memcpy (&ip4, &addr->un.ip4, sizeof (ip4));
13326 vat_json_object_add_ip4 (node, str, ip4);
13330 static void vl_api_gre_tunnel_details_t_handler_json
13331 (vl_api_gre_tunnel_details_t * mp)
13333 vat_main_t *vam = &vat_main;
13334 vat_json_node_t *node = NULL;
13335 struct in_addr ip4;
13336 struct in6_addr ip6;
13338 if (VAT_JSON_ARRAY != vam->json_tree.type)
13340 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13341 vat_json_init_array (&vam->json_tree);
13343 node = vat_json_array_add (&vam->json_tree);
13345 vat_json_init_object (node);
13346 vat_json_object_add_uint (node, "sw_if_index",
13347 ntohl (mp->tunnel.sw_if_index));
13348 vat_json_object_add_uint (node, "instance", ntohl (mp->tunnel.instance));
13350 vat_json_object_add_address (node, "src", &mp->tunnel.src);
13351 vat_json_object_add_address (node, "dst", &mp->tunnel.dst);
13352 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel.type);
13353 vat_json_object_add_uint (node, "outer_fib_id",
13354 ntohl (mp->tunnel.outer_fib_id));
13355 vat_json_object_add_uint (node, "session_id", mp->tunnel.session_id);
13359 api_gre_tunnel_dump (vat_main_t * vam)
13361 unformat_input_t *i = vam->input;
13362 vl_api_gre_tunnel_dump_t *mp;
13363 vl_api_control_ping_t *mp_ping;
13365 u8 sw_if_index_set = 0;
13368 /* Parse args required to build the message */
13369 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13371 if (unformat (i, "sw_if_index %d", &sw_if_index))
13372 sw_if_index_set = 1;
13377 if (sw_if_index_set == 0)
13382 if (!vam->json_output)
13384 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13385 "sw_if_index", "instance", "src_address", "dst_address",
13386 "tunnel_type", "outer_fib_id", "session_id");
13389 /* Get list of gre-tunnel interfaces */
13390 M (GRE_TUNNEL_DUMP, mp);
13392 mp->sw_if_index = htonl (sw_if_index);
13396 /* Use a control ping for synchronization */
13397 MPING (CONTROL_PING, mp_ping);
13405 api_l2_fib_clear_table (vat_main_t * vam)
13407 // unformat_input_t * i = vam->input;
13408 vl_api_l2_fib_clear_table_t *mp;
13411 M (L2_FIB_CLEAR_TABLE, mp);
13419 api_l2_interface_efp_filter (vat_main_t * vam)
13421 unformat_input_t *i = vam->input;
13422 vl_api_l2_interface_efp_filter_t *mp;
13425 u8 sw_if_index_set = 0;
13428 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13430 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13431 sw_if_index_set = 1;
13432 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13433 sw_if_index_set = 1;
13434 else if (unformat (i, "enable"))
13436 else if (unformat (i, "disable"))
13440 clib_warning ("parse error '%U'", format_unformat_error, i);
13445 if (sw_if_index_set == 0)
13447 errmsg ("missing sw_if_index");
13451 M (L2_INTERFACE_EFP_FILTER, mp);
13453 mp->sw_if_index = ntohl (sw_if_index);
13454 mp->enable_disable = enable;
13461 #define foreach_vtr_op \
13462 _("disable", L2_VTR_DISABLED) \
13463 _("push-1", L2_VTR_PUSH_1) \
13464 _("push-2", L2_VTR_PUSH_2) \
13465 _("pop-1", L2_VTR_POP_1) \
13466 _("pop-2", L2_VTR_POP_2) \
13467 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
13468 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
13469 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
13470 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
13473 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
13475 unformat_input_t *i = vam->input;
13476 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
13478 u8 sw_if_index_set = 0;
13481 u32 push_dot1q = 1;
13486 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13488 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13489 sw_if_index_set = 1;
13490 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13491 sw_if_index_set = 1;
13492 else if (unformat (i, "vtr_op %d", &vtr_op))
13494 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
13497 else if (unformat (i, "push_dot1q %d", &push_dot1q))
13499 else if (unformat (i, "tag1 %d", &tag1))
13501 else if (unformat (i, "tag2 %d", &tag2))
13505 clib_warning ("parse error '%U'", format_unformat_error, i);
13510 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
13512 errmsg ("missing vtr operation or sw_if_index");
13516 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
13517 mp->sw_if_index = ntohl (sw_if_index);
13518 mp->vtr_op = ntohl (vtr_op);
13519 mp->push_dot1q = ntohl (push_dot1q);
13520 mp->tag1 = ntohl (tag1);
13521 mp->tag2 = ntohl (tag2);
13529 api_create_vhost_user_if (vat_main_t * vam)
13531 unformat_input_t *i = vam->input;
13532 vl_api_create_vhost_user_if_t *mp;
13535 u8 file_name_set = 0;
13536 u32 custom_dev_instance = ~0;
13538 u8 use_custom_mac = 0;
13539 u8 disable_mrg_rxbuf = 0;
13540 u8 disable_indirect_desc = 0;
13544 /* Shut up coverity */
13545 clib_memset (hwaddr, 0, sizeof (hwaddr));
13547 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13549 if (unformat (i, "socket %s", &file_name))
13553 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13555 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
13556 use_custom_mac = 1;
13557 else if (unformat (i, "server"))
13559 else if (unformat (i, "disable_mrg_rxbuf"))
13560 disable_mrg_rxbuf = 1;
13561 else if (unformat (i, "disable_indirect_desc"))
13562 disable_indirect_desc = 1;
13563 else if (unformat (i, "tag %s", &tag))
13569 if (file_name_set == 0)
13571 errmsg ("missing socket file name");
13575 if (vec_len (file_name) > 255)
13577 errmsg ("socket file name too long");
13580 vec_add1 (file_name, 0);
13582 M (CREATE_VHOST_USER_IF, mp);
13584 mp->is_server = is_server;
13585 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
13586 mp->disable_indirect_desc = disable_indirect_desc;
13587 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13588 vec_free (file_name);
13589 if (custom_dev_instance != ~0)
13592 mp->custom_dev_instance = ntohl (custom_dev_instance);
13595 mp->use_custom_mac = use_custom_mac;
13596 clib_memcpy (mp->mac_address, hwaddr, 6);
13598 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
13607 api_modify_vhost_user_if (vat_main_t * vam)
13609 unformat_input_t *i = vam->input;
13610 vl_api_modify_vhost_user_if_t *mp;
13613 u8 file_name_set = 0;
13614 u32 custom_dev_instance = ~0;
13615 u8 sw_if_index_set = 0;
13616 u32 sw_if_index = (u32) ~ 0;
13619 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13621 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13622 sw_if_index_set = 1;
13623 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13624 sw_if_index_set = 1;
13625 else if (unformat (i, "socket %s", &file_name))
13629 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13631 else if (unformat (i, "server"))
13637 if (sw_if_index_set == 0)
13639 errmsg ("missing sw_if_index or interface name");
13643 if (file_name_set == 0)
13645 errmsg ("missing socket file name");
13649 if (vec_len (file_name) > 255)
13651 errmsg ("socket file name too long");
13654 vec_add1 (file_name, 0);
13656 M (MODIFY_VHOST_USER_IF, mp);
13658 mp->sw_if_index = ntohl (sw_if_index);
13659 mp->is_server = is_server;
13660 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13661 vec_free (file_name);
13662 if (custom_dev_instance != ~0)
13665 mp->custom_dev_instance = ntohl (custom_dev_instance);
13674 api_delete_vhost_user_if (vat_main_t * vam)
13676 unformat_input_t *i = vam->input;
13677 vl_api_delete_vhost_user_if_t *mp;
13678 u32 sw_if_index = ~0;
13679 u8 sw_if_index_set = 0;
13682 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13684 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13685 sw_if_index_set = 1;
13686 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13687 sw_if_index_set = 1;
13692 if (sw_if_index_set == 0)
13694 errmsg ("missing sw_if_index or interface name");
13699 M (DELETE_VHOST_USER_IF, mp);
13701 mp->sw_if_index = ntohl (sw_if_index);
13708 static void vl_api_sw_interface_vhost_user_details_t_handler
13709 (vl_api_sw_interface_vhost_user_details_t * mp)
13711 vat_main_t *vam = &vat_main;
13713 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
13714 (char *) mp->interface_name,
13715 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
13716 clib_net_to_host_u64 (mp->features), mp->is_server,
13717 ntohl (mp->num_regions), (char *) mp->sock_filename);
13718 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
13721 static void vl_api_sw_interface_vhost_user_details_t_handler_json
13722 (vl_api_sw_interface_vhost_user_details_t * mp)
13724 vat_main_t *vam = &vat_main;
13725 vat_json_node_t *node = NULL;
13727 if (VAT_JSON_ARRAY != vam->json_tree.type)
13729 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13730 vat_json_init_array (&vam->json_tree);
13732 node = vat_json_array_add (&vam->json_tree);
13734 vat_json_init_object (node);
13735 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13736 vat_json_object_add_string_copy (node, "interface_name",
13737 mp->interface_name);
13738 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
13739 ntohl (mp->virtio_net_hdr_sz));
13740 vat_json_object_add_uint (node, "features",
13741 clib_net_to_host_u64 (mp->features));
13742 vat_json_object_add_uint (node, "is_server", mp->is_server);
13743 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
13744 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
13745 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
13749 api_sw_interface_vhost_user_dump (vat_main_t * vam)
13751 vl_api_sw_interface_vhost_user_dump_t *mp;
13752 vl_api_control_ping_t *mp_ping;
13755 "Interface name idx hdr_sz features server regions filename");
13757 /* Get list of vhost-user interfaces */
13758 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
13761 /* Use a control ping for synchronization */
13762 MPING (CONTROL_PING, mp_ping);
13770 api_show_version (vat_main_t * vam)
13772 vl_api_show_version_t *mp;
13775 M (SHOW_VERSION, mp);
13784 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
13786 unformat_input_t *line_input = vam->input;
13787 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
13788 ip4_address_t local4, remote4;
13789 ip6_address_t local6, remote6;
13791 u8 ipv4_set = 0, ipv6_set = 0;
13795 u32 mcast_sw_if_index = ~0;
13796 u32 encap_vrf_id = 0;
13797 u32 decap_vrf_id = 0;
13803 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
13804 clib_memset (&local4, 0, sizeof local4);
13805 clib_memset (&remote4, 0, sizeof remote4);
13806 clib_memset (&local6, 0, sizeof local6);
13807 clib_memset (&remote6, 0, sizeof remote6);
13809 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13811 if (unformat (line_input, "del"))
13813 else if (unformat (line_input, "local %U",
13814 unformat_ip4_address, &local4))
13819 else if (unformat (line_input, "remote %U",
13820 unformat_ip4_address, &remote4))
13825 else if (unformat (line_input, "local %U",
13826 unformat_ip6_address, &local6))
13831 else if (unformat (line_input, "remote %U",
13832 unformat_ip6_address, &remote6))
13837 else if (unformat (line_input, "group %U %U",
13838 unformat_ip4_address, &remote4,
13839 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13841 grp_set = remote_set = 1;
13844 else if (unformat (line_input, "group %U",
13845 unformat_ip4_address, &remote4))
13847 grp_set = remote_set = 1;
13850 else if (unformat (line_input, "group %U %U",
13851 unformat_ip6_address, &remote6,
13852 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13854 grp_set = remote_set = 1;
13857 else if (unformat (line_input, "group %U",
13858 unformat_ip6_address, &remote6))
13860 grp_set = remote_set = 1;
13864 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13866 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13868 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
13870 else if (unformat (line_input, "vni %d", &vni))
13872 else if (unformat (line_input, "next-ip4"))
13874 else if (unformat (line_input, "next-ip6"))
13876 else if (unformat (line_input, "next-ethernet"))
13878 else if (unformat (line_input, "next-nsh"))
13882 errmsg ("parse error '%U'", format_unformat_error, line_input);
13887 if (local_set == 0)
13889 errmsg ("tunnel local address not specified");
13892 if (remote_set == 0)
13894 errmsg ("tunnel remote address not specified");
13897 if (grp_set && mcast_sw_if_index == ~0)
13899 errmsg ("tunnel nonexistent multicast device");
13902 if (ipv4_set && ipv6_set)
13904 errmsg ("both IPv4 and IPv6 addresses specified");
13910 errmsg ("vni not specified");
13914 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
13919 clib_memcpy (&mp->local, &local6, sizeof (local6));
13920 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
13924 clib_memcpy (&mp->local, &local4, sizeof (local4));
13925 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
13928 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13929 mp->encap_vrf_id = ntohl (encap_vrf_id);
13930 mp->decap_vrf_id = ntohl (decap_vrf_id);
13931 mp->protocol = protocol;
13932 mp->vni = ntohl (vni);
13933 mp->is_add = is_add;
13934 mp->is_ipv6 = ipv6_set;
13941 static void vl_api_vxlan_gpe_tunnel_details_t_handler
13942 (vl_api_vxlan_gpe_tunnel_details_t * mp)
13944 vat_main_t *vam = &vat_main;
13945 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
13946 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
13948 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
13949 ntohl (mp->sw_if_index),
13950 format_ip46_address, &local, IP46_TYPE_ANY,
13951 format_ip46_address, &remote, IP46_TYPE_ANY,
13952 ntohl (mp->vni), mp->protocol,
13953 ntohl (mp->mcast_sw_if_index),
13954 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
13958 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
13959 (vl_api_vxlan_gpe_tunnel_details_t * mp)
13961 vat_main_t *vam = &vat_main;
13962 vat_json_node_t *node = NULL;
13963 struct in_addr ip4;
13964 struct in6_addr ip6;
13966 if (VAT_JSON_ARRAY != vam->json_tree.type)
13968 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13969 vat_json_init_array (&vam->json_tree);
13971 node = vat_json_array_add (&vam->json_tree);
13973 vat_json_init_object (node);
13974 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13977 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
13978 vat_json_object_add_ip6 (node, "local", ip6);
13979 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
13980 vat_json_object_add_ip6 (node, "remote", ip6);
13984 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
13985 vat_json_object_add_ip4 (node, "local", ip4);
13986 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
13987 vat_json_object_add_ip4 (node, "remote", ip4);
13989 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13990 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
13991 vat_json_object_add_uint (node, "mcast_sw_if_index",
13992 ntohl (mp->mcast_sw_if_index));
13993 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13994 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
13995 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13999 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14001 unformat_input_t *i = vam->input;
14002 vl_api_vxlan_gpe_tunnel_dump_t *mp;
14003 vl_api_control_ping_t *mp_ping;
14005 u8 sw_if_index_set = 0;
14008 /* Parse args required to build the message */
14009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14011 if (unformat (i, "sw_if_index %d", &sw_if_index))
14012 sw_if_index_set = 1;
14017 if (sw_if_index_set == 0)
14022 if (!vam->json_output)
14024 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
14025 "sw_if_index", "local", "remote", "vni",
14026 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
14029 /* Get list of vxlan-tunnel interfaces */
14030 M (VXLAN_GPE_TUNNEL_DUMP, mp);
14032 mp->sw_if_index = htonl (sw_if_index);
14036 /* Use a control ping for synchronization */
14037 MPING (CONTROL_PING, mp_ping);
14044 static void vl_api_l2_fib_table_details_t_handler
14045 (vl_api_l2_fib_table_details_t * mp)
14047 vat_main_t *vam = &vat_main;
14049 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14051 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
14052 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14056 static void vl_api_l2_fib_table_details_t_handler_json
14057 (vl_api_l2_fib_table_details_t * mp)
14059 vat_main_t *vam = &vat_main;
14060 vat_json_node_t *node = NULL;
14062 if (VAT_JSON_ARRAY != vam->json_tree.type)
14064 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14065 vat_json_init_array (&vam->json_tree);
14067 node = vat_json_array_add (&vam->json_tree);
14069 vat_json_init_object (node);
14070 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
14071 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
14072 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14073 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14074 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14075 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14079 api_l2_fib_table_dump (vat_main_t * vam)
14081 unformat_input_t *i = vam->input;
14082 vl_api_l2_fib_table_dump_t *mp;
14083 vl_api_control_ping_t *mp_ping;
14088 /* Parse args required to build the message */
14089 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14091 if (unformat (i, "bd_id %d", &bd_id))
14097 if (bd_id_set == 0)
14099 errmsg ("missing bridge domain");
14103 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14105 /* Get list of l2 fib entries */
14106 M (L2_FIB_TABLE_DUMP, mp);
14108 mp->bd_id = ntohl (bd_id);
14111 /* Use a control ping for synchronization */
14112 MPING (CONTROL_PING, mp_ping);
14121 api_interface_name_renumber (vat_main_t * vam)
14123 unformat_input_t *line_input = vam->input;
14124 vl_api_interface_name_renumber_t *mp;
14125 u32 sw_if_index = ~0;
14126 u32 new_show_dev_instance = ~0;
14129 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14131 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14134 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14136 else if (unformat (line_input, "new_show_dev_instance %d",
14137 &new_show_dev_instance))
14143 if (sw_if_index == ~0)
14145 errmsg ("missing interface name or sw_if_index");
14149 if (new_show_dev_instance == ~0)
14151 errmsg ("missing new_show_dev_instance");
14155 M (INTERFACE_NAME_RENUMBER, mp);
14157 mp->sw_if_index = ntohl (sw_if_index);
14158 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14166 api_ip_probe_neighbor (vat_main_t * vam)
14168 unformat_input_t *i = vam->input;
14169 vl_api_ip_probe_neighbor_t *mp;
14170 vl_api_address_t dst_adr;
14176 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14178 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14180 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14182 else if (unformat (i, "address %U", unformat_vl_api_address, dst_adr))
14190 errmsg ("missing interface");
14196 errmsg ("missing addresses");
14200 M (IP_PROBE_NEIGHBOR, mp);
14202 mp->sw_if_index = ntohl (sw_if_index);
14203 clib_memcpy (&mp->dst, &dst_adr, sizeof (dst_adr));
14211 api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14213 unformat_input_t *i = vam->input;
14214 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14215 u8 mode = IP_SCAN_V46_NEIGHBORS;
14216 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14219 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14221 if (unformat (i, "ip4"))
14222 mode = IP_SCAN_V4_NEIGHBORS;
14223 else if (unformat (i, "ip6"))
14224 mode = IP_SCAN_V6_NEIGHBORS;
14225 if (unformat (i, "both"))
14226 mode = IP_SCAN_V46_NEIGHBORS;
14227 else if (unformat (i, "disable"))
14228 mode = IP_SCAN_DISABLED;
14229 else if (unformat (i, "interval %d", &interval))
14231 else if (unformat (i, "max-time %d", &time))
14233 else if (unformat (i, "max-update %d", &update))
14235 else if (unformat (i, "delay %d", &delay))
14237 else if (unformat (i, "stale %d", &stale))
14243 if (interval > 255)
14245 errmsg ("interval cannot exceed 255 minutes.");
14250 errmsg ("max-time cannot exceed 255 usec.");
14255 errmsg ("max-update cannot exceed 255.");
14260 errmsg ("delay cannot exceed 255 msec.");
14265 errmsg ("stale cannot exceed 255 minutes.");
14269 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14271 mp->scan_interval = interval;
14272 mp->max_proc_time = time;
14273 mp->max_update = update;
14274 mp->scan_int_delay = delay;
14275 mp->stale_threshold = stale;
14283 api_want_ip4_arp_events (vat_main_t * vam)
14285 unformat_input_t *line_input = vam->input;
14286 vl_api_want_ip4_arp_events_t *mp;
14287 ip4_address_t address;
14288 int address_set = 0;
14289 u32 enable_disable = 1;
14292 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14294 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14296 else if (unformat (line_input, "del"))
14297 enable_disable = 0;
14302 if (address_set == 0)
14304 errmsg ("missing addresses");
14308 M (WANT_IP4_ARP_EVENTS, mp);
14309 mp->enable_disable = enable_disable;
14310 mp->pid = htonl (getpid ());
14311 clib_memcpy (mp->ip, &address, sizeof (address));
14319 api_want_ip6_nd_events (vat_main_t * vam)
14321 unformat_input_t *line_input = vam->input;
14322 vl_api_want_ip6_nd_events_t *mp;
14323 vl_api_ip6_address_t address;
14324 int address_set = 0;
14325 u32 enable_disable = 1;
14328 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14331 (line_input, "address %U", unformat_vl_api_ip6_address, &address))
14333 else if (unformat (line_input, "del"))
14334 enable_disable = 0;
14339 if (address_set == 0)
14341 errmsg ("missing addresses");
14345 M (WANT_IP6_ND_EVENTS, mp);
14346 mp->enable_disable = enable_disable;
14347 mp->pid = htonl (getpid ());
14348 clib_memcpy (&mp->ip, &address, sizeof (address));
14356 api_want_l2_macs_events (vat_main_t * vam)
14358 unformat_input_t *line_input = vam->input;
14359 vl_api_want_l2_macs_events_t *mp;
14360 u8 enable_disable = 1;
14361 u32 scan_delay = 0;
14362 u32 max_macs_in_event = 0;
14363 u32 learn_limit = 0;
14366 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14368 if (unformat (line_input, "learn-limit %d", &learn_limit))
14370 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14372 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14374 else if (unformat (line_input, "disable"))
14375 enable_disable = 0;
14380 M (WANT_L2_MACS_EVENTS, mp);
14381 mp->enable_disable = enable_disable;
14382 mp->pid = htonl (getpid ());
14383 mp->learn_limit = htonl (learn_limit);
14384 mp->scan_delay = (u8) scan_delay;
14385 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14392 api_input_acl_set_interface (vat_main_t * vam)
14394 unformat_input_t *i = vam->input;
14395 vl_api_input_acl_set_interface_t *mp;
14397 int sw_if_index_set;
14398 u32 ip4_table_index = ~0;
14399 u32 ip6_table_index = ~0;
14400 u32 l2_table_index = ~0;
14404 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14406 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14407 sw_if_index_set = 1;
14408 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14409 sw_if_index_set = 1;
14410 else if (unformat (i, "del"))
14412 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14414 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14416 else if (unformat (i, "l2-table %d", &l2_table_index))
14420 clib_warning ("parse error '%U'", format_unformat_error, i);
14425 if (sw_if_index_set == 0)
14427 errmsg ("missing interface name or sw_if_index");
14431 M (INPUT_ACL_SET_INTERFACE, mp);
14433 mp->sw_if_index = ntohl (sw_if_index);
14434 mp->ip4_table_index = ntohl (ip4_table_index);
14435 mp->ip6_table_index = ntohl (ip6_table_index);
14436 mp->l2_table_index = ntohl (l2_table_index);
14437 mp->is_add = is_add;
14445 api_output_acl_set_interface (vat_main_t * vam)
14447 unformat_input_t *i = vam->input;
14448 vl_api_output_acl_set_interface_t *mp;
14450 int sw_if_index_set;
14451 u32 ip4_table_index = ~0;
14452 u32 ip6_table_index = ~0;
14453 u32 l2_table_index = ~0;
14457 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14459 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14460 sw_if_index_set = 1;
14461 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14462 sw_if_index_set = 1;
14463 else if (unformat (i, "del"))
14465 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14467 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14469 else if (unformat (i, "l2-table %d", &l2_table_index))
14473 clib_warning ("parse error '%U'", format_unformat_error, i);
14478 if (sw_if_index_set == 0)
14480 errmsg ("missing interface name or sw_if_index");
14484 M (OUTPUT_ACL_SET_INTERFACE, mp);
14486 mp->sw_if_index = ntohl (sw_if_index);
14487 mp->ip4_table_index = ntohl (ip4_table_index);
14488 mp->ip6_table_index = ntohl (ip6_table_index);
14489 mp->l2_table_index = ntohl (l2_table_index);
14490 mp->is_add = is_add;
14498 api_ip_address_dump (vat_main_t * vam)
14500 unformat_input_t *i = vam->input;
14501 vl_api_ip_address_dump_t *mp;
14502 vl_api_control_ping_t *mp_ping;
14503 u32 sw_if_index = ~0;
14504 u8 sw_if_index_set = 0;
14509 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14511 if (unformat (i, "sw_if_index %d", &sw_if_index))
14512 sw_if_index_set = 1;
14514 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14515 sw_if_index_set = 1;
14516 else if (unformat (i, "ipv4"))
14518 else if (unformat (i, "ipv6"))
14524 if (ipv4_set && ipv6_set)
14526 errmsg ("ipv4 and ipv6 flags cannot be both set");
14530 if ((!ipv4_set) && (!ipv6_set))
14532 errmsg ("no ipv4 nor ipv6 flag set");
14536 if (sw_if_index_set == 0)
14538 errmsg ("missing interface name or sw_if_index");
14542 vam->current_sw_if_index = sw_if_index;
14543 vam->is_ipv6 = ipv6_set;
14545 M (IP_ADDRESS_DUMP, mp);
14546 mp->sw_if_index = ntohl (sw_if_index);
14547 mp->is_ipv6 = ipv6_set;
14550 /* Use a control ping for synchronization */
14551 MPING (CONTROL_PING, mp_ping);
14559 api_ip_dump (vat_main_t * vam)
14561 vl_api_ip_dump_t *mp;
14562 vl_api_control_ping_t *mp_ping;
14563 unformat_input_t *in = vam->input;
14570 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
14572 if (unformat (in, "ipv4"))
14574 else if (unformat (in, "ipv6"))
14580 if (ipv4_set && ipv6_set)
14582 errmsg ("ipv4 and ipv6 flags cannot be both set");
14586 if ((!ipv4_set) && (!ipv6_set))
14588 errmsg ("no ipv4 nor ipv6 flag set");
14592 is_ipv6 = ipv6_set;
14593 vam->is_ipv6 = is_ipv6;
14595 /* free old data */
14596 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
14598 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
14600 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
14603 mp->is_ipv6 = ipv6_set;
14606 /* Use a control ping for synchronization */
14607 MPING (CONTROL_PING, mp_ping);
14615 api_ipsec_spd_add_del (vat_main_t * vam)
14617 unformat_input_t *i = vam->input;
14618 vl_api_ipsec_spd_add_del_t *mp;
14623 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14625 if (unformat (i, "spd_id %d", &spd_id))
14627 else if (unformat (i, "del"))
14631 clib_warning ("parse error '%U'", format_unformat_error, i);
14637 errmsg ("spd_id must be set");
14641 M (IPSEC_SPD_ADD_DEL, mp);
14643 mp->spd_id = ntohl (spd_id);
14644 mp->is_add = is_add;
14652 api_ipsec_interface_add_del_spd (vat_main_t * vam)
14654 unformat_input_t *i = vam->input;
14655 vl_api_ipsec_interface_add_del_spd_t *mp;
14657 u8 sw_if_index_set = 0;
14658 u32 spd_id = (u32) ~ 0;
14662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14664 if (unformat (i, "del"))
14666 else if (unformat (i, "spd_id %d", &spd_id))
14669 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14670 sw_if_index_set = 1;
14671 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14672 sw_if_index_set = 1;
14675 clib_warning ("parse error '%U'", format_unformat_error, i);
14681 if (spd_id == (u32) ~ 0)
14683 errmsg ("spd_id must be set");
14687 if (sw_if_index_set == 0)
14689 errmsg ("missing interface name or sw_if_index");
14693 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
14695 mp->spd_id = ntohl (spd_id);
14696 mp->sw_if_index = ntohl (sw_if_index);
14697 mp->is_add = is_add;
14705 api_ipsec_spd_entry_add_del (vat_main_t * vam)
14707 unformat_input_t *i = vam->input;
14708 vl_api_ipsec_spd_entry_add_del_t *mp;
14709 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
14710 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
14712 u32 rport_start = 0, rport_stop = (u32) ~ 0;
14713 u32 lport_start = 0, lport_stop = (u32) ~ 0;
14714 vl_api_address_t laddr_start = { }, laddr_stop =
14723 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14725 if (unformat (i, "del"))
14727 if (unformat (i, "outbound"))
14729 if (unformat (i, "inbound"))
14731 else if (unformat (i, "spd_id %d", &spd_id))
14733 else if (unformat (i, "sa_id %d", &sa_id))
14735 else if (unformat (i, "priority %d", &priority))
14737 else if (unformat (i, "protocol %d", &protocol))
14739 else if (unformat (i, "lport_start %d", &lport_start))
14741 else if (unformat (i, "lport_stop %d", &lport_stop))
14743 else if (unformat (i, "rport_start %d", &rport_start))
14745 else if (unformat (i, "rport_stop %d", &rport_stop))
14747 else if (unformat (i, "laddr_start %U",
14748 unformat_vl_api_address, &laddr_start))
14750 else if (unformat (i, "laddr_stop %U", unformat_vl_api_address,
14753 else if (unformat (i, "raddr_start %U", unformat_vl_api_address,
14756 else if (unformat (i, "raddr_stop %U", unformat_vl_api_address,
14760 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
14762 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
14764 clib_warning ("unsupported action: 'resolve'");
14770 clib_warning ("parse error '%U'", format_unformat_error, i);
14776 M (IPSEC_SPD_ENTRY_ADD_DEL, mp);
14778 mp->is_add = is_add;
14780 mp->entry.spd_id = ntohl (spd_id);
14781 mp->entry.priority = ntohl (priority);
14782 mp->entry.is_outbound = is_outbound;
14784 clib_memcpy (&mp->entry.remote_address_start, &raddr_start,
14785 sizeof (vl_api_address_t));
14786 clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop,
14787 sizeof (vl_api_address_t));
14788 clib_memcpy (&mp->entry.local_address_start, &laddr_start,
14789 sizeof (vl_api_address_t));
14790 clib_memcpy (&mp->entry.local_address_stop, &laddr_stop,
14791 sizeof (vl_api_address_t));
14793 mp->entry.protocol = (u8) protocol;
14794 mp->entry.local_port_start = ntohs ((u16) lport_start);
14795 mp->entry.local_port_stop = ntohs ((u16) lport_stop);
14796 mp->entry.remote_port_start = ntohs ((u16) rport_start);
14797 mp->entry.remote_port_stop = ntohs ((u16) rport_stop);
14798 mp->entry.policy = (u8) policy;
14799 mp->entry.sa_id = ntohl (sa_id);
14807 api_ipsec_sad_entry_add_del (vat_main_t * vam)
14809 unformat_input_t *i = vam->input;
14810 vl_api_ipsec_sad_entry_add_del_t *mp;
14811 u32 sad_id = 0, spi = 0;
14812 u8 *ck = 0, *ik = 0;
14815 vl_api_ipsec_crypto_alg_t crypto_alg = IPSEC_API_CRYPTO_ALG_NONE;
14816 vl_api_ipsec_integ_alg_t integ_alg = IPSEC_API_INTEG_ALG_NONE;
14817 vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE;
14818 vl_api_ipsec_proto_t protocol = IPSEC_API_PROTO_AH;
14819 vl_api_address_t tun_src, tun_dst;
14822 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14824 if (unformat (i, "del"))
14826 else if (unformat (i, "sad_id %d", &sad_id))
14828 else if (unformat (i, "spi %d", &spi))
14830 else if (unformat (i, "esp"))
14831 protocol = IPSEC_API_PROTO_ESP;
14833 if (unformat (i, "tunnel_src %U", unformat_vl_api_address, &tun_src))
14835 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14836 if (ADDRESS_IP6 == tun_src.af)
14837 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
14840 if (unformat (i, "tunnel_dst %U", unformat_vl_api_address, &tun_dst))
14842 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14843 if (ADDRESS_IP6 == tun_src.af)
14844 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
14847 if (unformat (i, "crypto_alg %U",
14848 unformat_ipsec_api_crypto_alg, &crypto_alg))
14850 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
14852 else if (unformat (i, "integ_alg %U",
14853 unformat_ipsec_api_integ_alg, &integ_alg))
14855 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
14859 clib_warning ("parse error '%U'", format_unformat_error, i);
14865 M (IPSEC_SAD_ENTRY_ADD_DEL, mp);
14867 mp->is_add = is_add;
14868 mp->entry.sad_id = ntohl (sad_id);
14869 mp->entry.protocol = protocol;
14870 mp->entry.spi = ntohl (spi);
14871 mp->entry.flags = flags;
14873 mp->entry.crypto_algorithm = crypto_alg;
14874 mp->entry.integrity_algorithm = integ_alg;
14875 mp->entry.crypto_key.length = vec_len (ck);
14876 mp->entry.integrity_key.length = vec_len (ik);
14878 if (mp->entry.crypto_key.length > sizeof (mp->entry.crypto_key.data))
14879 mp->entry.crypto_key.length = sizeof (mp->entry.crypto_key.data);
14881 if (mp->entry.integrity_key.length > sizeof (mp->entry.integrity_key.data))
14882 mp->entry.integrity_key.length = sizeof (mp->entry.integrity_key.data);
14885 clib_memcpy (mp->entry.crypto_key.data, ck, mp->entry.crypto_key.length);
14887 clib_memcpy (mp->entry.integrity_key.data, ik,
14888 mp->entry.integrity_key.length);
14890 if (flags & IPSEC_API_SAD_FLAG_IS_TUNNEL)
14892 clib_memcpy (&mp->entry.tunnel_src, &tun_src,
14893 sizeof (mp->entry.tunnel_src));
14894 clib_memcpy (&mp->entry.tunnel_dst, &tun_dst,
14895 sizeof (mp->entry.tunnel_dst));
14904 api_ipsec_tunnel_if_add_del (vat_main_t * vam)
14906 unformat_input_t *i = vam->input;
14907 vl_api_ipsec_tunnel_if_add_del_t *mp;
14908 u32 local_spi = 0, remote_spi = 0;
14909 u32 crypto_alg = 0, integ_alg = 0;
14910 u8 *lck = NULL, *rck = NULL;
14911 u8 *lik = NULL, *rik = NULL;
14912 vl_api_address_t local_ip = { 0 };
14913 vl_api_address_t remote_ip = { 0 };
14917 u8 anti_replay = 0;
14923 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14925 if (unformat (i, "del"))
14927 else if (unformat (i, "esn"))
14929 else if (unformat (i, "anti-replay"))
14931 else if (unformat (i, "count %d", &count))
14933 else if (unformat (i, "local_spi %d", &local_spi))
14935 else if (unformat (i, "remote_spi %d", &remote_spi))
14938 if (unformat (i, "local_ip %U", unformat_vl_api_address, &local_ip))
14941 if (unformat (i, "remote_ip %U", unformat_vl_api_address, &remote_ip))
14943 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
14946 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
14948 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
14950 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
14954 (i, "crypto_alg %U", unformat_ipsec_api_crypto_alg, &crypto_alg))
14956 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
14958 errmsg ("unsupported crypto-alg: '%U'\n",
14959 format_ipsec_crypto_alg, crypto_alg);
14965 (i, "integ_alg %U", unformat_ipsec_api_integ_alg, &integ_alg))
14967 if (integ_alg >= IPSEC_INTEG_N_ALG)
14969 errmsg ("unsupported integ-alg: '%U'\n",
14970 format_ipsec_integ_alg, integ_alg);
14974 else if (unformat (i, "instance %u", &instance))
14978 errmsg ("parse error '%U'\n", format_unformat_error, i);
14985 /* Turn on async mode */
14986 vam->async_mode = 1;
14987 vam->async_errors = 0;
14988 before = vat_time_now (vam);
14991 for (jj = 0; jj < count; jj++)
14993 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
14995 mp->is_add = is_add;
14997 mp->anti_replay = anti_replay;
15000 increment_vl_address (&remote_ip);
15002 clib_memcpy (&mp->local_ip, &local_ip, sizeof (local_ip));
15003 clib_memcpy (&mp->remote_ip, &remote_ip, sizeof (remote_ip));
15005 mp->local_spi = htonl (local_spi + jj);
15006 mp->remote_spi = htonl (remote_spi + jj);
15007 mp->crypto_alg = (u8) crypto_alg;
15009 mp->local_crypto_key_len = 0;
15012 mp->local_crypto_key_len = vec_len (lck);
15013 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15014 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15015 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15018 mp->remote_crypto_key_len = 0;
15021 mp->remote_crypto_key_len = vec_len (rck);
15022 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15023 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15024 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15027 mp->integ_alg = (u8) integ_alg;
15029 mp->local_integ_key_len = 0;
15032 mp->local_integ_key_len = vec_len (lik);
15033 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15034 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15035 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15038 mp->remote_integ_key_len = 0;
15041 mp->remote_integ_key_len = vec_len (rik);
15042 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15043 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15044 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15049 mp->renumber = renumber;
15050 mp->show_instance = ntohl (instance);
15055 /* When testing multiple add/del ops, use a control-ping to sync */
15058 vl_api_control_ping_t *mp_ping;
15062 /* Shut off async mode */
15063 vam->async_mode = 0;
15065 MPING (CONTROL_PING, mp_ping);
15068 timeout = vat_time_now (vam) + 1.0;
15069 while (vat_time_now (vam) < timeout)
15070 if (vam->result_ready == 1)
15075 if (vam->retval == -99)
15076 errmsg ("timeout");
15078 if (vam->async_errors > 0)
15080 errmsg ("%d asynchronous errors", vam->async_errors);
15083 vam->async_errors = 0;
15084 after = vat_time_now (vam);
15086 /* slim chance, but we might have eaten SIGTERM on the first iteration */
15090 print (vam->ofp, "%d tunnels in %.6f secs, %.2f tunnels/sec",
15091 count, after - before, count / (after - before));
15095 /* Wait for a reply... */
15104 vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15106 vat_main_t *vam = &vat_main;
15108 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
15109 "crypto_key %U integ_alg %u integ_key %U flags %x "
15110 "tunnel_src_addr %U tunnel_dst_addr %U "
15111 "salt %u seq_outbound %lu last_seq_inbound %lu "
15112 "replay_window %lu\n",
15113 ntohl (mp->entry.sad_id),
15114 ntohl (mp->sw_if_index),
15115 ntohl (mp->entry.spi),
15116 ntohl (mp->entry.protocol),
15117 ntohl (mp->entry.crypto_algorithm),
15118 format_hex_bytes, mp->entry.crypto_key.data,
15119 mp->entry.crypto_key.length, ntohl (mp->entry.integrity_algorithm),
15120 format_hex_bytes, mp->entry.integrity_key.data,
15121 mp->entry.integrity_key.length, ntohl (mp->entry.flags),
15122 format_vl_api_address, &mp->entry.tunnel_src, format_vl_api_address,
15123 &mp->entry.tunnel_dst, ntohl (mp->salt),
15124 clib_net_to_host_u64 (mp->seq_outbound),
15125 clib_net_to_host_u64 (mp->last_seq_inbound),
15126 clib_net_to_host_u64 (mp->replay_window));
15129 #define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15130 #define vl_api_ipsec_sa_details_t_print vl_noop_handler
15132 static void vl_api_ipsec_sa_details_t_handler_json
15133 (vl_api_ipsec_sa_details_t * mp)
15135 vat_main_t *vam = &vat_main;
15136 vat_json_node_t *node = NULL;
15137 vl_api_ipsec_sad_flags_t flags;
15139 if (VAT_JSON_ARRAY != vam->json_tree.type)
15141 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15142 vat_json_init_array (&vam->json_tree);
15144 node = vat_json_array_add (&vam->json_tree);
15146 vat_json_init_object (node);
15147 vat_json_object_add_uint (node, "sa_id", ntohl (mp->entry.sad_id));
15148 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15149 vat_json_object_add_uint (node, "spi", ntohl (mp->entry.spi));
15150 vat_json_object_add_uint (node, "proto", ntohl (mp->entry.protocol));
15151 vat_json_object_add_uint (node, "crypto_alg",
15152 ntohl (mp->entry.crypto_algorithm));
15153 vat_json_object_add_uint (node, "integ_alg",
15154 ntohl (mp->entry.integrity_algorithm));
15155 flags = ntohl (mp->entry.flags);
15156 vat_json_object_add_uint (node, "use_esn",
15157 ! !(flags & IPSEC_API_SAD_FLAG_USE_ESN));
15158 vat_json_object_add_uint (node, "use_anti_replay",
15159 ! !(flags & IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY));
15160 vat_json_object_add_uint (node, "is_tunnel",
15161 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL));
15162 vat_json_object_add_uint (node, "is_tunnel_ip6",
15163 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL_V6));
15164 vat_json_object_add_uint (node, "udp_encap",
15165 ! !(flags & IPSEC_API_SAD_FLAG_UDP_ENCAP));
15166 vat_json_object_add_bytes (node, "crypto_key", mp->entry.crypto_key.data,
15167 mp->entry.crypto_key.length);
15168 vat_json_object_add_bytes (node, "integ_key", mp->entry.integrity_key.data,
15169 mp->entry.integrity_key.length);
15170 vat_json_object_add_address (node, "src", &mp->entry.tunnel_src);
15171 vat_json_object_add_address (node, "dst", &mp->entry.tunnel_dst);
15172 vat_json_object_add_uint (node, "replay_window",
15173 clib_net_to_host_u64 (mp->replay_window));
15177 api_ipsec_sa_dump (vat_main_t * vam)
15179 unformat_input_t *i = vam->input;
15180 vl_api_ipsec_sa_dump_t *mp;
15181 vl_api_control_ping_t *mp_ping;
15185 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15187 if (unformat (i, "sa_id %d", &sa_id))
15191 clib_warning ("parse error '%U'", format_unformat_error, i);
15196 M (IPSEC_SA_DUMP, mp);
15198 mp->sa_id = ntohl (sa_id);
15202 /* Use a control ping for synchronization */
15203 M (CONTROL_PING, mp_ping);
15211 api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15213 unformat_input_t *i = vam->input;
15214 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15215 u32 sw_if_index = ~0;
15217 u8 is_outbound = (u8) ~ 0;
15220 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15222 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15224 else if (unformat (i, "sa_id %d", &sa_id))
15226 else if (unformat (i, "outbound"))
15228 else if (unformat (i, "inbound"))
15232 clib_warning ("parse error '%U'", format_unformat_error, i);
15237 if (sw_if_index == ~0)
15239 errmsg ("interface must be specified");
15245 errmsg ("SA ID must be specified");
15249 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15251 mp->sw_if_index = htonl (sw_if_index);
15252 mp->sa_id = htonl (sa_id);
15253 mp->is_outbound = is_outbound;
15262 api_get_first_msg_id (vat_main_t * vam)
15264 vl_api_get_first_msg_id_t *mp;
15265 unformat_input_t *i = vam->input;
15270 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15272 if (unformat (i, "client %s", &name))
15280 errmsg ("missing client name");
15283 vec_add1 (name, 0);
15285 if (vec_len (name) > 63)
15287 errmsg ("client name too long");
15291 M (GET_FIRST_MSG_ID, mp);
15292 clib_memcpy (mp->name, name, vec_len (name));
15299 api_cop_interface_enable_disable (vat_main_t * vam)
15301 unformat_input_t *line_input = vam->input;
15302 vl_api_cop_interface_enable_disable_t *mp;
15303 u32 sw_if_index = ~0;
15304 u8 enable_disable = 1;
15307 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15309 if (unformat (line_input, "disable"))
15310 enable_disable = 0;
15311 if (unformat (line_input, "enable"))
15312 enable_disable = 1;
15313 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15314 vam, &sw_if_index))
15316 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15322 if (sw_if_index == ~0)
15324 errmsg ("missing interface name or sw_if_index");
15328 /* Construct the API message */
15329 M (COP_INTERFACE_ENABLE_DISABLE, mp);
15330 mp->sw_if_index = ntohl (sw_if_index);
15331 mp->enable_disable = enable_disable;
15335 /* Wait for the reply */
15341 api_cop_whitelist_enable_disable (vat_main_t * vam)
15343 unformat_input_t *line_input = vam->input;
15344 vl_api_cop_whitelist_enable_disable_t *mp;
15345 u32 sw_if_index = ~0;
15346 u8 ip4 = 0, ip6 = 0, default_cop = 0;
15350 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15352 if (unformat (line_input, "ip4"))
15354 else if (unformat (line_input, "ip6"))
15356 else if (unformat (line_input, "default"))
15358 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15359 vam, &sw_if_index))
15361 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15363 else if (unformat (line_input, "fib-id %d", &fib_id))
15369 if (sw_if_index == ~0)
15371 errmsg ("missing interface name or sw_if_index");
15375 /* Construct the API message */
15376 M (COP_WHITELIST_ENABLE_DISABLE, mp);
15377 mp->sw_if_index = ntohl (sw_if_index);
15378 mp->fib_id = ntohl (fib_id);
15381 mp->default_cop = default_cop;
15385 /* Wait for the reply */
15391 api_get_node_graph (vat_main_t * vam)
15393 vl_api_get_node_graph_t *mp;
15396 M (GET_NODE_GRAPH, mp);
15400 /* Wait for the reply */
15406 /** Used for parsing LISP eids */
15407 typedef CLIB_PACKED(struct{
15408 u8 addr[16]; /**< eid address */
15409 u32 len; /**< prefix length if IP */
15410 u8 type; /**< type of eid */
15415 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
15417 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
15419 clib_memset (a, 0, sizeof (a[0]));
15421 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
15423 a->type = 0; /* ipv4 type */
15425 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
15427 a->type = 1; /* ipv6 type */
15429 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
15431 a->type = 2; /* mac type */
15433 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
15435 a->type = 3; /* NSH type */
15436 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
15437 nsh->spi = clib_host_to_net_u32 (nsh->spi);
15444 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
15453 lisp_eid_size_vat (u8 type)
15470 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
15472 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
15476 api_one_add_del_locator_set (vat_main_t * vam)
15478 unformat_input_t *input = vam->input;
15479 vl_api_one_add_del_locator_set_t *mp;
15481 u8 *locator_set_name = NULL;
15482 u8 locator_set_name_set = 0;
15483 vl_api_local_locator_t locator, *locators = 0;
15484 u32 sw_if_index, priority, weight;
15488 /* Parse args required to build the message */
15489 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15491 if (unformat (input, "del"))
15495 else if (unformat (input, "locator-set %s", &locator_set_name))
15497 locator_set_name_set = 1;
15499 else if (unformat (input, "sw_if_index %u p %u w %u",
15500 &sw_if_index, &priority, &weight))
15502 locator.sw_if_index = htonl (sw_if_index);
15503 locator.priority = priority;
15504 locator.weight = weight;
15505 vec_add1 (locators, locator);
15509 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
15510 &sw_if_index, &priority, &weight))
15512 locator.sw_if_index = htonl (sw_if_index);
15513 locator.priority = priority;
15514 locator.weight = weight;
15515 vec_add1 (locators, locator);
15521 if (locator_set_name_set == 0)
15523 errmsg ("missing locator-set name");
15524 vec_free (locators);
15528 if (vec_len (locator_set_name) > 64)
15530 errmsg ("locator-set name too long");
15531 vec_free (locator_set_name);
15532 vec_free (locators);
15535 vec_add1 (locator_set_name, 0);
15537 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
15539 /* Construct the API message */
15540 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
15542 mp->is_add = is_add;
15543 clib_memcpy (mp->locator_set_name, locator_set_name,
15544 vec_len (locator_set_name));
15545 vec_free (locator_set_name);
15547 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
15549 clib_memcpy (mp->locators, locators, data_len);
15550 vec_free (locators);
15555 /* Wait for a reply... */
15560 #define api_lisp_add_del_locator_set api_one_add_del_locator_set
15563 api_one_add_del_locator (vat_main_t * vam)
15565 unformat_input_t *input = vam->input;
15566 vl_api_one_add_del_locator_t *mp;
15567 u32 tmp_if_index = ~0;
15568 u32 sw_if_index = ~0;
15569 u8 sw_if_index_set = 0;
15570 u8 sw_if_index_if_name_set = 0;
15572 u8 priority_set = 0;
15576 u8 *locator_set_name = NULL;
15577 u8 locator_set_name_set = 0;
15580 /* Parse args required to build the message */
15581 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15583 if (unformat (input, "del"))
15587 else if (unformat (input, "locator-set %s", &locator_set_name))
15589 locator_set_name_set = 1;
15591 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
15594 sw_if_index_if_name_set = 1;
15595 sw_if_index = tmp_if_index;
15597 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
15599 sw_if_index_set = 1;
15600 sw_if_index = tmp_if_index;
15602 else if (unformat (input, "p %d", &priority))
15606 else if (unformat (input, "w %d", &weight))
15614 if (locator_set_name_set == 0)
15616 errmsg ("missing locator-set name");
15620 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
15622 errmsg ("missing sw_if_index");
15623 vec_free (locator_set_name);
15627 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
15629 errmsg ("cannot use both params interface name and sw_if_index");
15630 vec_free (locator_set_name);
15634 if (priority_set == 0)
15636 errmsg ("missing locator-set priority");
15637 vec_free (locator_set_name);
15641 if (weight_set == 0)
15643 errmsg ("missing locator-set weight");
15644 vec_free (locator_set_name);
15648 if (vec_len (locator_set_name) > 64)
15650 errmsg ("locator-set name too long");
15651 vec_free (locator_set_name);
15654 vec_add1 (locator_set_name, 0);
15656 /* Construct the API message */
15657 M (ONE_ADD_DEL_LOCATOR, mp);
15659 mp->is_add = is_add;
15660 mp->sw_if_index = ntohl (sw_if_index);
15661 mp->priority = priority;
15662 mp->weight = weight;
15663 clib_memcpy (mp->locator_set_name, locator_set_name,
15664 vec_len (locator_set_name));
15665 vec_free (locator_set_name);
15670 /* Wait for a reply... */
15675 #define api_lisp_add_del_locator api_one_add_del_locator
15678 unformat_hmac_key_id (unformat_input_t * input, va_list * args)
15680 u32 *key_id = va_arg (*args, u32 *);
15683 if (unformat (input, "%s", &s))
15685 if (!strcmp ((char *) s, "sha1"))
15686 key_id[0] = HMAC_SHA_1_96;
15687 else if (!strcmp ((char *) s, "sha256"))
15688 key_id[0] = HMAC_SHA_256_128;
15691 clib_warning ("invalid key_id: '%s'", s);
15692 key_id[0] = HMAC_NO_KEY;
15703 api_one_add_del_local_eid (vat_main_t * vam)
15705 unformat_input_t *input = vam->input;
15706 vl_api_one_add_del_local_eid_t *mp;
15709 lisp_eid_vat_t _eid, *eid = &_eid;
15710 u8 *locator_set_name = 0;
15711 u8 locator_set_name_set = 0;
15717 /* Parse args required to build the message */
15718 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15720 if (unformat (input, "del"))
15724 else if (unformat (input, "vni %d", &vni))
15728 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
15732 else if (unformat (input, "locator-set %s", &locator_set_name))
15734 locator_set_name_set = 1;
15736 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
15738 else if (unformat (input, "secret-key %_%v%_", &key))
15744 if (locator_set_name_set == 0)
15746 errmsg ("missing locator-set name");
15752 errmsg ("EID address not set!");
15753 vec_free (locator_set_name);
15757 if (key && (0 == key_id))
15759 errmsg ("invalid key_id!");
15763 if (vec_len (key) > 64)
15765 errmsg ("key too long");
15770 if (vec_len (locator_set_name) > 64)
15772 errmsg ("locator-set name too long");
15773 vec_free (locator_set_name);
15776 vec_add1 (locator_set_name, 0);
15778 /* Construct the API message */
15779 M (ONE_ADD_DEL_LOCAL_EID, mp);
15781 mp->is_add = is_add;
15782 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
15783 mp->eid_type = eid->type;
15784 mp->prefix_len = eid->len;
15785 mp->vni = clib_host_to_net_u32 (vni);
15786 mp->key_id = clib_host_to_net_u16 (key_id);
15787 clib_memcpy (mp->locator_set_name, locator_set_name,
15788 vec_len (locator_set_name));
15789 clib_memcpy (mp->key, key, vec_len (key));
15791 vec_free (locator_set_name);
15797 /* Wait for a reply... */
15802 #define api_lisp_add_del_local_eid api_one_add_del_local_eid
15805 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
15807 u32 dp_table = 0, vni = 0;;
15808 unformat_input_t *input = vam->input;
15809 vl_api_gpe_add_del_fwd_entry_t *mp;
15811 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
15812 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
15813 u8 rmt_eid_set = 0, lcl_eid_set = 0;
15814 u32 action = ~0, w;
15815 ip4_address_t rmt_rloc4, lcl_rloc4;
15816 ip6_address_t rmt_rloc6, lcl_rloc6;
15817 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
15820 clib_memset (&rloc, 0, sizeof (rloc));
15822 /* Parse args required to build the message */
15823 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15825 if (unformat (input, "del"))
15827 else if (unformat (input, "add"))
15829 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
15833 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
15837 else if (unformat (input, "vrf %d", &dp_table))
15839 else if (unformat (input, "bd %d", &dp_table))
15841 else if (unformat (input, "vni %d", &vni))
15843 else if (unformat (input, "w %d", &w))
15847 errmsg ("No RLOC configured for setting priority/weight!");
15850 curr_rloc->weight = w;
15852 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
15853 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
15857 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
15859 vec_add1 (lcl_locs, rloc);
15861 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
15862 vec_add1 (rmt_locs, rloc);
15863 /* weight saved in rmt loc */
15864 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
15866 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
15867 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
15870 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
15872 vec_add1 (lcl_locs, rloc);
15874 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
15875 vec_add1 (rmt_locs, rloc);
15876 /* weight saved in rmt loc */
15877 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
15879 else if (unformat (input, "action %d", &action))
15885 clib_warning ("parse error '%U'", format_unformat_error, input);
15892 errmsg ("remote eid addresses not set");
15896 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
15898 errmsg ("eid types don't match");
15902 if (0 == rmt_locs && (u32) ~ 0 == action)
15904 errmsg ("action not set for negative mapping");
15908 /* Construct the API message */
15909 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
15910 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
15912 mp->is_add = is_add;
15913 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
15914 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
15915 mp->eid_type = rmt_eid->type;
15916 mp->dp_table = clib_host_to_net_u32 (dp_table);
15917 mp->vni = clib_host_to_net_u32 (vni);
15918 mp->rmt_len = rmt_eid->len;
15919 mp->lcl_len = lcl_eid->len;
15920 mp->action = action;
15922 if (0 != rmt_locs && 0 != lcl_locs)
15924 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
15925 clib_memcpy (mp->locs, lcl_locs,
15926 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
15928 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
15929 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
15930 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
15932 vec_free (lcl_locs);
15933 vec_free (rmt_locs);
15938 /* Wait for a reply... */
15944 api_one_add_del_map_server (vat_main_t * vam)
15946 unformat_input_t *input = vam->input;
15947 vl_api_one_add_del_map_server_t *mp;
15951 ip4_address_t ipv4;
15952 ip6_address_t ipv6;
15955 /* Parse args required to build the message */
15956 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15958 if (unformat (input, "del"))
15962 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
15966 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
15974 if (ipv4_set && ipv6_set)
15976 errmsg ("both eid v4 and v6 addresses set");
15980 if (!ipv4_set && !ipv6_set)
15982 errmsg ("eid addresses not set");
15986 /* Construct the API message */
15987 M (ONE_ADD_DEL_MAP_SERVER, mp);
15989 mp->is_add = is_add;
15993 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
15998 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16004 /* Wait for a reply... */
16009 #define api_lisp_add_del_map_server api_one_add_del_map_server
16012 api_one_add_del_map_resolver (vat_main_t * vam)
16014 unformat_input_t *input = vam->input;
16015 vl_api_one_add_del_map_resolver_t *mp;
16019 ip4_address_t ipv4;
16020 ip6_address_t ipv6;
16023 /* Parse args required to build the message */
16024 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16026 if (unformat (input, "del"))
16030 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16034 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16042 if (ipv4_set && ipv6_set)
16044 errmsg ("both eid v4 and v6 addresses set");
16048 if (!ipv4_set && !ipv6_set)
16050 errmsg ("eid addresses not set");
16054 /* Construct the API message */
16055 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
16057 mp->is_add = is_add;
16061 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16066 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16072 /* Wait for a reply... */
16077 #define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
16080 api_lisp_gpe_enable_disable (vat_main_t * vam)
16082 unformat_input_t *input = vam->input;
16083 vl_api_gpe_enable_disable_t *mp;
16088 /* Parse args required to build the message */
16089 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16091 if (unformat (input, "enable"))
16096 else if (unformat (input, "disable"))
16107 errmsg ("Value not set");
16111 /* Construct the API message */
16112 M (GPE_ENABLE_DISABLE, mp);
16119 /* Wait for a reply... */
16125 api_one_rloc_probe_enable_disable (vat_main_t * vam)
16127 unformat_input_t *input = vam->input;
16128 vl_api_one_rloc_probe_enable_disable_t *mp;
16133 /* Parse args required to build the message */
16134 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16136 if (unformat (input, "enable"))
16141 else if (unformat (input, "disable"))
16149 errmsg ("Value not set");
16153 /* Construct the API message */
16154 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
16156 mp->is_enabled = is_en;
16161 /* Wait for a reply... */
16166 #define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
16169 api_one_map_register_enable_disable (vat_main_t * vam)
16171 unformat_input_t *input = vam->input;
16172 vl_api_one_map_register_enable_disable_t *mp;
16177 /* Parse args required to build the message */
16178 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16180 if (unformat (input, "enable"))
16185 else if (unformat (input, "disable"))
16193 errmsg ("Value not set");
16197 /* Construct the API message */
16198 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
16200 mp->is_enabled = is_en;
16205 /* Wait for a reply... */
16210 #define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
16213 api_one_enable_disable (vat_main_t * vam)
16215 unformat_input_t *input = vam->input;
16216 vl_api_one_enable_disable_t *mp;
16221 /* Parse args required to build the message */
16222 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16224 if (unformat (input, "enable"))
16229 else if (unformat (input, "disable"))
16239 errmsg ("Value not set");
16243 /* Construct the API message */
16244 M (ONE_ENABLE_DISABLE, mp);
16251 /* Wait for a reply... */
16256 #define api_lisp_enable_disable api_one_enable_disable
16259 api_one_enable_disable_xtr_mode (vat_main_t * vam)
16261 unformat_input_t *input = vam->input;
16262 vl_api_one_enable_disable_xtr_mode_t *mp;
16267 /* Parse args required to build the message */
16268 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16270 if (unformat (input, "enable"))
16275 else if (unformat (input, "disable"))
16285 errmsg ("Value not set");
16289 /* Construct the API message */
16290 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
16297 /* Wait for a reply... */
16303 api_one_show_xtr_mode (vat_main_t * vam)
16305 vl_api_one_show_xtr_mode_t *mp;
16308 /* Construct the API message */
16309 M (ONE_SHOW_XTR_MODE, mp);
16314 /* Wait for a reply... */
16320 api_one_enable_disable_pitr_mode (vat_main_t * vam)
16322 unformat_input_t *input = vam->input;
16323 vl_api_one_enable_disable_pitr_mode_t *mp;
16328 /* Parse args required to build the message */
16329 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16331 if (unformat (input, "enable"))
16336 else if (unformat (input, "disable"))
16346 errmsg ("Value not set");
16350 /* Construct the API message */
16351 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
16358 /* Wait for a reply... */
16364 api_one_show_pitr_mode (vat_main_t * vam)
16366 vl_api_one_show_pitr_mode_t *mp;
16369 /* Construct the API message */
16370 M (ONE_SHOW_PITR_MODE, mp);
16375 /* Wait for a reply... */
16381 api_one_enable_disable_petr_mode (vat_main_t * vam)
16383 unformat_input_t *input = vam->input;
16384 vl_api_one_enable_disable_petr_mode_t *mp;
16389 /* Parse args required to build the message */
16390 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16392 if (unformat (input, "enable"))
16397 else if (unformat (input, "disable"))
16407 errmsg ("Value not set");
16411 /* Construct the API message */
16412 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
16419 /* Wait for a reply... */
16425 api_one_show_petr_mode (vat_main_t * vam)
16427 vl_api_one_show_petr_mode_t *mp;
16430 /* Construct the API message */
16431 M (ONE_SHOW_PETR_MODE, mp);
16436 /* Wait for a reply... */
16442 api_show_one_map_register_state (vat_main_t * vam)
16444 vl_api_show_one_map_register_state_t *mp;
16447 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
16452 /* wait for reply */
16457 #define api_show_lisp_map_register_state api_show_one_map_register_state
16460 api_show_one_rloc_probe_state (vat_main_t * vam)
16462 vl_api_show_one_rloc_probe_state_t *mp;
16465 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
16470 /* wait for reply */
16475 #define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
16478 api_one_add_del_ndp_entry (vat_main_t * vam)
16480 vl_api_one_add_del_ndp_entry_t *mp;
16481 unformat_input_t *input = vam->input;
16486 u8 mac[6] = { 0, };
16487 u8 ip6[16] = { 0, };
16491 /* Parse args required to build the message */
16492 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16494 if (unformat (input, "del"))
16496 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16498 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
16500 else if (unformat (input, "bd %d", &bd))
16504 errmsg ("parse error '%U'", format_unformat_error, input);
16509 if (!bd_set || !ip_set || (!mac_set && is_add))
16511 errmsg ("Missing BD, IP or MAC!");
16515 M (ONE_ADD_DEL_NDP_ENTRY, mp);
16516 mp->is_add = is_add;
16517 clib_memcpy (mp->mac, mac, 6);
16518 mp->bd = clib_host_to_net_u32 (bd);
16519 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
16524 /* wait for reply */
16530 api_one_add_del_l2_arp_entry (vat_main_t * vam)
16532 vl_api_one_add_del_l2_arp_entry_t *mp;
16533 unformat_input_t *input = vam->input;
16538 u8 mac[6] = { 0, };
16539 u32 ip4 = 0, bd = ~0;
16542 /* Parse args required to build the message */
16543 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16545 if (unformat (input, "del"))
16547 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16549 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
16551 else if (unformat (input, "bd %d", &bd))
16555 errmsg ("parse error '%U'", format_unformat_error, input);
16560 if (!bd_set || !ip_set || (!mac_set && is_add))
16562 errmsg ("Missing BD, IP or MAC!");
16566 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
16567 mp->is_add = is_add;
16568 clib_memcpy (mp->mac, mac, 6);
16569 mp->bd = clib_host_to_net_u32 (bd);
16575 /* wait for reply */
16581 api_one_ndp_bd_get (vat_main_t * vam)
16583 vl_api_one_ndp_bd_get_t *mp;
16586 M (ONE_NDP_BD_GET, mp);
16591 /* wait for reply */
16597 api_one_ndp_entries_get (vat_main_t * vam)
16599 vl_api_one_ndp_entries_get_t *mp;
16600 unformat_input_t *input = vam->input;
16605 /* Parse args required to build the message */
16606 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16608 if (unformat (input, "bd %d", &bd))
16612 errmsg ("parse error '%U'", format_unformat_error, input);
16619 errmsg ("Expected bridge domain!");
16623 M (ONE_NDP_ENTRIES_GET, mp);
16624 mp->bd = clib_host_to_net_u32 (bd);
16629 /* wait for reply */
16635 api_one_l2_arp_bd_get (vat_main_t * vam)
16637 vl_api_one_l2_arp_bd_get_t *mp;
16640 M (ONE_L2_ARP_BD_GET, mp);
16645 /* wait for reply */
16651 api_one_l2_arp_entries_get (vat_main_t * vam)
16653 vl_api_one_l2_arp_entries_get_t *mp;
16654 unformat_input_t *input = vam->input;
16659 /* Parse args required to build the message */
16660 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16662 if (unformat (input, "bd %d", &bd))
16666 errmsg ("parse error '%U'", format_unformat_error, input);
16673 errmsg ("Expected bridge domain!");
16677 M (ONE_L2_ARP_ENTRIES_GET, mp);
16678 mp->bd = clib_host_to_net_u32 (bd);
16683 /* wait for reply */
16689 api_one_stats_enable_disable (vat_main_t * vam)
16691 vl_api_one_stats_enable_disable_t *mp;
16692 unformat_input_t *input = vam->input;
16697 /* Parse args required to build the message */
16698 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16700 if (unformat (input, "enable"))
16705 else if (unformat (input, "disable"))
16715 errmsg ("Value not set");
16719 M (ONE_STATS_ENABLE_DISABLE, mp);
16725 /* wait for reply */
16731 api_show_one_stats_enable_disable (vat_main_t * vam)
16733 vl_api_show_one_stats_enable_disable_t *mp;
16736 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
16741 /* wait for reply */
16747 api_show_one_map_request_mode (vat_main_t * vam)
16749 vl_api_show_one_map_request_mode_t *mp;
16752 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
16757 /* wait for reply */
16762 #define api_show_lisp_map_request_mode api_show_one_map_request_mode
16765 api_one_map_request_mode (vat_main_t * vam)
16767 unformat_input_t *input = vam->input;
16768 vl_api_one_map_request_mode_t *mp;
16772 /* Parse args required to build the message */
16773 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16775 if (unformat (input, "dst-only"))
16777 else if (unformat (input, "src-dst"))
16781 errmsg ("parse error '%U'", format_unformat_error, input);
16786 M (ONE_MAP_REQUEST_MODE, mp);
16793 /* wait for reply */
16798 #define api_lisp_map_request_mode api_one_map_request_mode
16801 * Enable/disable ONE proxy ITR.
16803 * @param vam vpp API test context
16804 * @return return code
16807 api_one_pitr_set_locator_set (vat_main_t * vam)
16809 u8 ls_name_set = 0;
16810 unformat_input_t *input = vam->input;
16811 vl_api_one_pitr_set_locator_set_t *mp;
16816 /* Parse args required to build the message */
16817 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16819 if (unformat (input, "del"))
16821 else if (unformat (input, "locator-set %s", &ls_name))
16825 errmsg ("parse error '%U'", format_unformat_error, input);
16832 errmsg ("locator-set name not set!");
16836 M (ONE_PITR_SET_LOCATOR_SET, mp);
16838 mp->is_add = is_add;
16839 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
16840 vec_free (ls_name);
16845 /* wait for reply */
16850 #define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
16853 api_one_nsh_set_locator_set (vat_main_t * vam)
16855 u8 ls_name_set = 0;
16856 unformat_input_t *input = vam->input;
16857 vl_api_one_nsh_set_locator_set_t *mp;
16862 /* Parse args required to build the message */
16863 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16865 if (unformat (input, "del"))
16867 else if (unformat (input, "ls %s", &ls_name))
16871 errmsg ("parse error '%U'", format_unformat_error, input);
16876 if (!ls_name_set && is_add)
16878 errmsg ("locator-set name not set!");
16882 M (ONE_NSH_SET_LOCATOR_SET, mp);
16884 mp->is_add = is_add;
16885 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
16886 vec_free (ls_name);
16891 /* wait for reply */
16897 api_show_one_pitr (vat_main_t * vam)
16899 vl_api_show_one_pitr_t *mp;
16902 if (!vam->json_output)
16904 print (vam->ofp, "%=20s", "lisp status:");
16907 M (SHOW_ONE_PITR, mp);
16911 /* Wait for a reply... */
16916 #define api_show_lisp_pitr api_show_one_pitr
16919 api_one_use_petr (vat_main_t * vam)
16921 unformat_input_t *input = vam->input;
16922 vl_api_one_use_petr_t *mp;
16927 clib_memset (&ip, 0, sizeof (ip));
16929 /* Parse args required to build the message */
16930 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16932 if (unformat (input, "disable"))
16935 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
16938 ip_addr_version (&ip) = IP4;
16941 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
16944 ip_addr_version (&ip) = IP6;
16948 errmsg ("parse error '%U'", format_unformat_error, input);
16953 M (ONE_USE_PETR, mp);
16955 mp->is_add = is_add;
16958 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
16960 clib_memcpy (mp->address, &ip, 4);
16962 clib_memcpy (mp->address, &ip, 16);
16968 /* wait for reply */
16973 #define api_lisp_use_petr api_one_use_petr
16976 api_show_one_nsh_mapping (vat_main_t * vam)
16978 vl_api_show_one_use_petr_t *mp;
16981 if (!vam->json_output)
16983 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
16986 M (SHOW_ONE_NSH_MAPPING, mp);
16990 /* Wait for a reply... */
16996 api_show_one_use_petr (vat_main_t * vam)
16998 vl_api_show_one_use_petr_t *mp;
17001 if (!vam->json_output)
17003 print (vam->ofp, "%=20s", "Proxy-ETR status:");
17006 M (SHOW_ONE_USE_PETR, mp);
17010 /* Wait for a reply... */
17015 #define api_show_lisp_use_petr api_show_one_use_petr
17018 * Add/delete mapping between vni and vrf
17021 api_one_eid_table_add_del_map (vat_main_t * vam)
17023 unformat_input_t *input = vam->input;
17024 vl_api_one_eid_table_add_del_map_t *mp;
17025 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
17026 u32 vni, vrf, bd_index;
17029 /* Parse args required to build the message */
17030 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17032 if (unformat (input, "del"))
17034 else if (unformat (input, "vrf %d", &vrf))
17036 else if (unformat (input, "bd_index %d", &bd_index))
17038 else if (unformat (input, "vni %d", &vni))
17044 if (!vni_set || (!vrf_set && !bd_index_set))
17046 errmsg ("missing arguments!");
17050 if (vrf_set && bd_index_set)
17052 errmsg ("error: both vrf and bd entered!");
17056 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
17058 mp->is_add = is_add;
17059 mp->vni = htonl (vni);
17060 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
17061 mp->is_l2 = bd_index_set;
17066 /* wait for reply */
17071 #define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
17074 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
17076 u32 *action = va_arg (*args, u32 *);
17079 if (unformat (input, "%s", &s))
17081 if (!strcmp ((char *) s, "no-action"))
17083 else if (!strcmp ((char *) s, "natively-forward"))
17085 else if (!strcmp ((char *) s, "send-map-request"))
17087 else if (!strcmp ((char *) s, "drop"))
17091 clib_warning ("invalid action: '%s'", s);
17103 * Add/del remote mapping to/from ONE control plane
17105 * @param vam vpp API test context
17106 * @return return code
17109 api_one_add_del_remote_mapping (vat_main_t * vam)
17111 unformat_input_t *input = vam->input;
17112 vl_api_one_add_del_remote_mapping_t *mp;
17114 lisp_eid_vat_t _eid, *eid = &_eid;
17115 lisp_eid_vat_t _seid, *seid = &_seid;
17116 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
17117 u32 action = ~0, p, w, data_len;
17118 ip4_address_t rloc4;
17119 ip6_address_t rloc6;
17120 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
17123 clib_memset (&rloc, 0, sizeof (rloc));
17125 /* Parse args required to build the message */
17126 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17128 if (unformat (input, "del-all"))
17132 else if (unformat (input, "del"))
17136 else if (unformat (input, "add"))
17140 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
17144 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
17148 else if (unformat (input, "vni %d", &vni))
17152 else if (unformat (input, "p %d w %d", &p, &w))
17156 errmsg ("No RLOC configured for setting priority/weight!");
17159 curr_rloc->priority = p;
17160 curr_rloc->weight = w;
17162 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
17165 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
17166 vec_add1 (rlocs, rloc);
17167 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17169 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
17172 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
17173 vec_add1 (rlocs, rloc);
17174 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17176 else if (unformat (input, "action %U",
17177 unformat_negative_mapping_action, &action))
17183 clib_warning ("parse error '%U'", format_unformat_error, input);
17190 errmsg ("missing params!");
17194 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
17196 errmsg ("no action set for negative map-reply!");
17200 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
17202 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
17203 mp->is_add = is_add;
17204 mp->vni = htonl (vni);
17205 mp->action = (u8) action;
17206 mp->is_src_dst = seid_set;
17207 mp->eid_len = eid->len;
17208 mp->seid_len = seid->len;
17209 mp->del_all = del_all;
17210 mp->eid_type = eid->type;
17211 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
17212 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
17214 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
17215 clib_memcpy (mp->rlocs, rlocs, data_len);
17221 /* Wait for a reply... */
17226 #define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
17229 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
17230 * forwarding entries in data-plane accordingly.
17232 * @param vam vpp API test context
17233 * @return return code
17236 api_one_add_del_adjacency (vat_main_t * vam)
17238 unformat_input_t *input = vam->input;
17239 vl_api_one_add_del_adjacency_t *mp;
17241 ip4_address_t leid4, reid4;
17242 ip6_address_t leid6, reid6;
17243 u8 reid_mac[6] = { 0 };
17244 u8 leid_mac[6] = { 0 };
17245 u8 reid_type, leid_type;
17246 u32 leid_len = 0, reid_len = 0, len;
17250 leid_type = reid_type = (u8) ~ 0;
17252 /* Parse args required to build the message */
17253 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17255 if (unformat (input, "del"))
17259 else if (unformat (input, "add"))
17263 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
17266 reid_type = 0; /* ipv4 */
17269 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
17272 reid_type = 1; /* ipv6 */
17275 else if (unformat (input, "reid %U", unformat_ethernet_address,
17278 reid_type = 2; /* mac */
17280 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
17283 leid_type = 0; /* ipv4 */
17286 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
17289 leid_type = 1; /* ipv6 */
17292 else if (unformat (input, "leid %U", unformat_ethernet_address,
17295 leid_type = 2; /* mac */
17297 else if (unformat (input, "vni %d", &vni))
17303 errmsg ("parse error '%U'", format_unformat_error, input);
17308 if ((u8) ~ 0 == reid_type)
17310 errmsg ("missing params!");
17314 if (leid_type != reid_type)
17316 errmsg ("remote and local EIDs are of different types!");
17320 M (ONE_ADD_DEL_ADJACENCY, mp);
17321 mp->is_add = is_add;
17322 mp->vni = htonl (vni);
17323 mp->leid_len = leid_len;
17324 mp->reid_len = reid_len;
17325 mp->eid_type = reid_type;
17327 switch (mp->eid_type)
17330 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
17331 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
17334 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
17335 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
17338 clib_memcpy (mp->leid, leid_mac, 6);
17339 clib_memcpy (mp->reid, reid_mac, 6);
17342 errmsg ("unknown EID type %d!", mp->eid_type);
17349 /* Wait for a reply... */
17354 #define api_lisp_add_del_adjacency api_one_add_del_adjacency
17357 unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
17359 u32 *mode = va_arg (*args, u32 *);
17361 if (unformat (input, "lisp"))
17363 else if (unformat (input, "vxlan"))
17372 api_gpe_get_encap_mode (vat_main_t * vam)
17374 vl_api_gpe_get_encap_mode_t *mp;
17377 /* Construct the API message */
17378 M (GPE_GET_ENCAP_MODE, mp);
17383 /* Wait for a reply... */
17389 api_gpe_set_encap_mode (vat_main_t * vam)
17391 unformat_input_t *input = vam->input;
17392 vl_api_gpe_set_encap_mode_t *mp;
17396 /* Parse args required to build the message */
17397 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17399 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
17405 /* Construct the API message */
17406 M (GPE_SET_ENCAP_MODE, mp);
17413 /* Wait for a reply... */
17419 api_lisp_gpe_add_del_iface (vat_main_t * vam)
17421 unformat_input_t *input = vam->input;
17422 vl_api_gpe_add_del_iface_t *mp;
17423 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
17424 u32 dp_table = 0, vni = 0;
17427 /* Parse args required to build the message */
17428 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17430 if (unformat (input, "up"))
17435 else if (unformat (input, "down"))
17440 else if (unformat (input, "table_id %d", &dp_table))
17444 else if (unformat (input, "bd_id %d", &dp_table))
17449 else if (unformat (input, "vni %d", &vni))
17457 if (action_set == 0)
17459 errmsg ("Action not set");
17462 if (dp_table_set == 0 || vni_set == 0)
17464 errmsg ("vni and dp_table must be set");
17468 /* Construct the API message */
17469 M (GPE_ADD_DEL_IFACE, mp);
17471 mp->is_add = is_add;
17472 mp->dp_table = clib_host_to_net_u32 (dp_table);
17474 mp->vni = clib_host_to_net_u32 (vni);
17479 /* Wait for a reply... */
17485 api_one_map_register_fallback_threshold (vat_main_t * vam)
17487 unformat_input_t *input = vam->input;
17488 vl_api_one_map_register_fallback_threshold_t *mp;
17493 /* Parse args required to build the message */
17494 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17496 if (unformat (input, "%u", &value))
17500 clib_warning ("parse error '%U'", format_unformat_error, input);
17507 errmsg ("fallback threshold value is missing!");
17511 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17512 mp->value = clib_host_to_net_u32 (value);
17517 /* Wait for a reply... */
17523 api_show_one_map_register_fallback_threshold (vat_main_t * vam)
17525 vl_api_show_one_map_register_fallback_threshold_t *mp;
17528 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17533 /* Wait for a reply... */
17539 unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
17541 u32 *proto = va_arg (*args, u32 *);
17543 if (unformat (input, "udp"))
17545 else if (unformat (input, "api"))
17554 api_one_set_transport_protocol (vat_main_t * vam)
17556 unformat_input_t *input = vam->input;
17557 vl_api_one_set_transport_protocol_t *mp;
17562 /* Parse args required to build the message */
17563 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17565 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
17569 clib_warning ("parse error '%U'", format_unformat_error, input);
17576 errmsg ("Transport protocol missing!");
17580 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
17581 mp->protocol = (u8) protocol;
17586 /* Wait for a reply... */
17592 api_one_get_transport_protocol (vat_main_t * vam)
17594 vl_api_one_get_transport_protocol_t *mp;
17597 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
17602 /* Wait for a reply... */
17608 api_one_map_register_set_ttl (vat_main_t * vam)
17610 unformat_input_t *input = vam->input;
17611 vl_api_one_map_register_set_ttl_t *mp;
17616 /* Parse args required to build the message */
17617 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17619 if (unformat (input, "%u", &ttl))
17623 clib_warning ("parse error '%U'", format_unformat_error, input);
17630 errmsg ("TTL value missing!");
17634 M (ONE_MAP_REGISTER_SET_TTL, mp);
17635 mp->ttl = clib_host_to_net_u32 (ttl);
17640 /* Wait for a reply... */
17646 api_show_one_map_register_ttl (vat_main_t * vam)
17648 vl_api_show_one_map_register_ttl_t *mp;
17651 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
17656 /* Wait for a reply... */
17662 * Add/del map request itr rlocs from ONE control plane and updates
17664 * @param vam vpp API test context
17665 * @return return code
17668 api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
17670 unformat_input_t *input = vam->input;
17671 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
17672 u8 *locator_set_name = 0;
17673 u8 locator_set_name_set = 0;
17677 /* Parse args required to build the message */
17678 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17680 if (unformat (input, "del"))
17684 else if (unformat (input, "%_%v%_", &locator_set_name))
17686 locator_set_name_set = 1;
17690 clib_warning ("parse error '%U'", format_unformat_error, input);
17695 if (is_add && !locator_set_name_set)
17697 errmsg ("itr-rloc is not set!");
17701 if (is_add && vec_len (locator_set_name) > 64)
17703 errmsg ("itr-rloc locator-set name too long");
17704 vec_free (locator_set_name);
17708 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
17709 mp->is_add = is_add;
17712 clib_memcpy (mp->locator_set_name, locator_set_name,
17713 vec_len (locator_set_name));
17717 clib_memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
17719 vec_free (locator_set_name);
17724 /* Wait for a reply... */
17729 #define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
17732 api_one_locator_dump (vat_main_t * vam)
17734 unformat_input_t *input = vam->input;
17735 vl_api_one_locator_dump_t *mp;
17736 vl_api_control_ping_t *mp_ping;
17737 u8 is_index_set = 0, is_name_set = 0;
17742 /* Parse args required to build the message */
17743 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17745 if (unformat (input, "ls_name %_%v%_", &ls_name))
17749 else if (unformat (input, "ls_index %d", &ls_index))
17755 errmsg ("parse error '%U'", format_unformat_error, input);
17760 if (!is_index_set && !is_name_set)
17762 errmsg ("error: expected one of index or name!");
17766 if (is_index_set && is_name_set)
17768 errmsg ("error: only one param expected!");
17772 if (vec_len (ls_name) > 62)
17774 errmsg ("error: locator set name too long!");
17778 if (!vam->json_output)
17780 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
17783 M (ONE_LOCATOR_DUMP, mp);
17784 mp->is_index_set = is_index_set;
17787 mp->ls_index = clib_host_to_net_u32 (ls_index);
17790 vec_add1 (ls_name, 0);
17791 strncpy ((char *) mp->ls_name, (char *) ls_name,
17792 sizeof (mp->ls_name) - 1);
17798 /* Use a control ping for synchronization */
17799 MPING (CONTROL_PING, mp_ping);
17802 /* Wait for a reply... */
17807 #define api_lisp_locator_dump api_one_locator_dump
17810 api_one_locator_set_dump (vat_main_t * vam)
17812 vl_api_one_locator_set_dump_t *mp;
17813 vl_api_control_ping_t *mp_ping;
17814 unformat_input_t *input = vam->input;
17818 /* Parse args required to build the message */
17819 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17821 if (unformat (input, "local"))
17825 else if (unformat (input, "remote"))
17831 errmsg ("parse error '%U'", format_unformat_error, input);
17836 if (!vam->json_output)
17838 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
17841 M (ONE_LOCATOR_SET_DUMP, mp);
17843 mp->filter = filter;
17848 /* Use a control ping for synchronization */
17849 MPING (CONTROL_PING, mp_ping);
17852 /* Wait for a reply... */
17857 #define api_lisp_locator_set_dump api_one_locator_set_dump
17860 api_one_eid_table_map_dump (vat_main_t * vam)
17864 unformat_input_t *input = vam->input;
17865 vl_api_one_eid_table_map_dump_t *mp;
17866 vl_api_control_ping_t *mp_ping;
17869 /* Parse args required to build the message */
17870 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17872 if (unformat (input, "l2"))
17877 else if (unformat (input, "l3"))
17884 errmsg ("parse error '%U'", format_unformat_error, input);
17891 errmsg ("expected one of 'l2' or 'l3' parameter!");
17895 if (!vam->json_output)
17897 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
17900 M (ONE_EID_TABLE_MAP_DUMP, mp);
17906 /* Use a control ping for synchronization */
17907 MPING (CONTROL_PING, mp_ping);
17910 /* Wait for a reply... */
17915 #define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
17918 api_one_eid_table_vni_dump (vat_main_t * vam)
17920 vl_api_one_eid_table_vni_dump_t *mp;
17921 vl_api_control_ping_t *mp_ping;
17924 if (!vam->json_output)
17926 print (vam->ofp, "VNI");
17929 M (ONE_EID_TABLE_VNI_DUMP, mp);
17934 /* Use a control ping for synchronization */
17935 MPING (CONTROL_PING, mp_ping);
17938 /* Wait for a reply... */
17943 #define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
17946 api_one_eid_table_dump (vat_main_t * vam)
17948 unformat_input_t *i = vam->input;
17949 vl_api_one_eid_table_dump_t *mp;
17950 vl_api_control_ping_t *mp_ping;
17951 struct in_addr ip4;
17952 struct in6_addr ip6;
17954 u8 eid_type = ~0, eid_set = 0;
17955 u32 prefix_length = ~0, t, vni = 0;
17958 lisp_nsh_api_t nsh;
17960 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
17962 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
17968 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
17974 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
17979 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
17984 else if (unformat (i, "vni %d", &t))
17988 else if (unformat (i, "local"))
17992 else if (unformat (i, "remote"))
17998 errmsg ("parse error '%U'", format_unformat_error, i);
18003 if (!vam->json_output)
18005 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
18006 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
18009 M (ONE_EID_TABLE_DUMP, mp);
18011 mp->filter = filter;
18015 mp->vni = htonl (vni);
18016 mp->eid_type = eid_type;
18020 mp->prefix_length = prefix_length;
18021 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
18024 mp->prefix_length = prefix_length;
18025 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
18028 clib_memcpy (mp->eid, mac, sizeof (mac));
18031 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
18034 errmsg ("unknown EID type %d!", eid_type);
18042 /* Use a control ping for synchronization */
18043 MPING (CONTROL_PING, mp_ping);
18046 /* Wait for a reply... */
18051 #define api_lisp_eid_table_dump api_one_eid_table_dump
18054 api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
18056 unformat_input_t *i = vam->input;
18057 vl_api_gpe_fwd_entries_get_t *mp;
18062 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18064 if (unformat (i, "vni %d", &vni))
18070 errmsg ("parse error '%U'", format_unformat_error, i);
18077 errmsg ("vni not set!");
18081 if (!vam->json_output)
18083 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
18087 M (GPE_FWD_ENTRIES_GET, mp);
18088 mp->vni = clib_host_to_net_u32 (vni);
18093 /* Wait for a reply... */
18098 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
18099 #define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
18100 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
18101 #define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
18102 #define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
18103 #define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
18104 #define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
18105 #define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
18108 api_one_adjacencies_get (vat_main_t * vam)
18110 unformat_input_t *i = vam->input;
18111 vl_api_one_adjacencies_get_t *mp;
18116 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18118 if (unformat (i, "vni %d", &vni))
18124 errmsg ("parse error '%U'", format_unformat_error, i);
18131 errmsg ("vni not set!");
18135 if (!vam->json_output)
18137 print (vam->ofp, "%s %40s", "leid", "reid");
18140 M (ONE_ADJACENCIES_GET, mp);
18141 mp->vni = clib_host_to_net_u32 (vni);
18146 /* Wait for a reply... */
18151 #define api_lisp_adjacencies_get api_one_adjacencies_get
18154 api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
18156 unformat_input_t *i = vam->input;
18157 vl_api_gpe_native_fwd_rpaths_get_t *mp;
18159 u8 ip_family_set = 0, is_ip4 = 1;
18161 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18163 if (unformat (i, "ip4"))
18168 else if (unformat (i, "ip6"))
18175 errmsg ("parse error '%U'", format_unformat_error, i);
18180 if (!ip_family_set)
18182 errmsg ("ip family not set!");
18186 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
18187 mp->is_ip4 = is_ip4;
18192 /* Wait for a reply... */
18198 api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
18200 vl_api_gpe_fwd_entry_vnis_get_t *mp;
18203 if (!vam->json_output)
18205 print (vam->ofp, "VNIs");
18208 M (GPE_FWD_ENTRY_VNIS_GET, mp);
18213 /* Wait for a reply... */
18219 api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
18221 unformat_input_t *i = vam->input;
18222 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
18224 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
18225 struct in_addr ip4;
18226 struct in6_addr ip6;
18227 u32 table_id = 0, nh_sw_if_index = ~0;
18229 clib_memset (&ip4, 0, sizeof (ip4));
18230 clib_memset (&ip6, 0, sizeof (ip6));
18232 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18234 if (unformat (i, "del"))
18236 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
18237 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18242 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
18243 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18248 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
18252 nh_sw_if_index = ~0;
18254 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
18258 nh_sw_if_index = ~0;
18260 else if (unformat (i, "table %d", &table_id))
18264 errmsg ("parse error '%U'", format_unformat_error, i);
18271 errmsg ("nh addr not set!");
18275 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
18276 mp->is_add = is_add;
18277 mp->table_id = clib_host_to_net_u32 (table_id);
18278 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
18279 mp->is_ip4 = is_ip4;
18281 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
18283 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
18288 /* Wait for a reply... */
18294 api_one_map_server_dump (vat_main_t * vam)
18296 vl_api_one_map_server_dump_t *mp;
18297 vl_api_control_ping_t *mp_ping;
18300 if (!vam->json_output)
18302 print (vam->ofp, "%=20s", "Map server");
18305 M (ONE_MAP_SERVER_DUMP, mp);
18309 /* Use a control ping for synchronization */
18310 MPING (CONTROL_PING, mp_ping);
18313 /* Wait for a reply... */
18318 #define api_lisp_map_server_dump api_one_map_server_dump
18321 api_one_map_resolver_dump (vat_main_t * vam)
18323 vl_api_one_map_resolver_dump_t *mp;
18324 vl_api_control_ping_t *mp_ping;
18327 if (!vam->json_output)
18329 print (vam->ofp, "%=20s", "Map resolver");
18332 M (ONE_MAP_RESOLVER_DUMP, mp);
18336 /* Use a control ping for synchronization */
18337 MPING (CONTROL_PING, mp_ping);
18340 /* Wait for a reply... */
18345 #define api_lisp_map_resolver_dump api_one_map_resolver_dump
18348 api_one_stats_flush (vat_main_t * vam)
18350 vl_api_one_stats_flush_t *mp;
18353 M (ONE_STATS_FLUSH, mp);
18360 api_one_stats_dump (vat_main_t * vam)
18362 vl_api_one_stats_dump_t *mp;
18363 vl_api_control_ping_t *mp_ping;
18366 M (ONE_STATS_DUMP, mp);
18370 /* Use a control ping for synchronization */
18371 MPING (CONTROL_PING, mp_ping);
18374 /* Wait for a reply... */
18380 api_show_one_status (vat_main_t * vam)
18382 vl_api_show_one_status_t *mp;
18385 if (!vam->json_output)
18387 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
18390 M (SHOW_ONE_STATUS, mp);
18393 /* Wait for a reply... */
18398 #define api_show_lisp_status api_show_one_status
18401 api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
18403 vl_api_gpe_fwd_entry_path_dump_t *mp;
18404 vl_api_control_ping_t *mp_ping;
18405 unformat_input_t *i = vam->input;
18406 u32 fwd_entry_index = ~0;
18409 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18411 if (unformat (i, "index %d", &fwd_entry_index))
18417 if (~0 == fwd_entry_index)
18419 errmsg ("no index specified!");
18423 if (!vam->json_output)
18425 print (vam->ofp, "first line");
18428 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
18432 /* Use a control ping for synchronization */
18433 MPING (CONTROL_PING, mp_ping);
18436 /* Wait for a reply... */
18442 api_one_get_map_request_itr_rlocs (vat_main_t * vam)
18444 vl_api_one_get_map_request_itr_rlocs_t *mp;
18447 if (!vam->json_output)
18449 print (vam->ofp, "%=20s", "itr-rlocs:");
18452 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
18455 /* Wait for a reply... */
18460 #define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
18463 api_af_packet_create (vat_main_t * vam)
18465 unformat_input_t *i = vam->input;
18466 vl_api_af_packet_create_t *mp;
18467 u8 *host_if_name = 0;
18469 u8 random_hw_addr = 1;
18472 clib_memset (hw_addr, 0, sizeof (hw_addr));
18474 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18476 if (unformat (i, "name %s", &host_if_name))
18477 vec_add1 (host_if_name, 0);
18478 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
18479 random_hw_addr = 0;
18484 if (!vec_len (host_if_name))
18486 errmsg ("host-interface name must be specified");
18490 if (vec_len (host_if_name) > 64)
18492 errmsg ("host-interface name too long");
18496 M (AF_PACKET_CREATE, mp);
18498 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18499 clib_memcpy (mp->hw_addr, hw_addr, 6);
18500 mp->use_random_hw_addr = random_hw_addr;
18501 vec_free (host_if_name);
18509 fprintf (vam->ofp ? vam->ofp : stderr,
18510 " new sw_if_index = %d\n", vam->sw_if_index);
18517 api_af_packet_delete (vat_main_t * vam)
18519 unformat_input_t *i = vam->input;
18520 vl_api_af_packet_delete_t *mp;
18521 u8 *host_if_name = 0;
18524 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18526 if (unformat (i, "name %s", &host_if_name))
18527 vec_add1 (host_if_name, 0);
18532 if (!vec_len (host_if_name))
18534 errmsg ("host-interface name must be specified");
18538 if (vec_len (host_if_name) > 64)
18540 errmsg ("host-interface name too long");
18544 M (AF_PACKET_DELETE, mp);
18546 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18547 vec_free (host_if_name);
18554 static void vl_api_af_packet_details_t_handler
18555 (vl_api_af_packet_details_t * mp)
18557 vat_main_t *vam = &vat_main;
18559 print (vam->ofp, "%-16s %d",
18560 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
18563 static void vl_api_af_packet_details_t_handler_json
18564 (vl_api_af_packet_details_t * mp)
18566 vat_main_t *vam = &vat_main;
18567 vat_json_node_t *node = NULL;
18569 if (VAT_JSON_ARRAY != vam->json_tree.type)
18571 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18572 vat_json_init_array (&vam->json_tree);
18574 node = vat_json_array_add (&vam->json_tree);
18576 vat_json_init_object (node);
18577 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
18578 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
18582 api_af_packet_dump (vat_main_t * vam)
18584 vl_api_af_packet_dump_t *mp;
18585 vl_api_control_ping_t *mp_ping;
18588 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
18589 /* Get list of tap interfaces */
18590 M (AF_PACKET_DUMP, mp);
18593 /* Use a control ping for synchronization */
18594 MPING (CONTROL_PING, mp_ping);
18602 api_policer_add_del (vat_main_t * vam)
18604 unformat_input_t *i = vam->input;
18605 vl_api_policer_add_del_t *mp;
18615 u8 color_aware = 0;
18616 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
18619 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
18620 conform_action.dscp = 0;
18621 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
18622 exceed_action.dscp = 0;
18623 violate_action.action_type = SSE2_QOS_ACTION_DROP;
18624 violate_action.dscp = 0;
18626 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18628 if (unformat (i, "del"))
18630 else if (unformat (i, "name %s", &name))
18631 vec_add1 (name, 0);
18632 else if (unformat (i, "cir %u", &cir))
18634 else if (unformat (i, "eir %u", &eir))
18636 else if (unformat (i, "cb %u", &cb))
18638 else if (unformat (i, "eb %u", &eb))
18640 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
18643 else if (unformat (i, "round_type %U", unformat_policer_round_type,
18646 else if (unformat (i, "type %U", unformat_policer_type, &type))
18648 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
18651 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
18654 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
18657 else if (unformat (i, "color-aware"))
18663 if (!vec_len (name))
18665 errmsg ("policer name must be specified");
18669 if (vec_len (name) > 64)
18671 errmsg ("policer name too long");
18675 M (POLICER_ADD_DEL, mp);
18677 clib_memcpy (mp->name, name, vec_len (name));
18679 mp->is_add = is_add;
18680 mp->cir = ntohl (cir);
18681 mp->eir = ntohl (eir);
18682 mp->cb = clib_net_to_host_u64 (cb);
18683 mp->eb = clib_net_to_host_u64 (eb);
18684 mp->rate_type = rate_type;
18685 mp->round_type = round_type;
18687 mp->conform_action_type = conform_action.action_type;
18688 mp->conform_dscp = conform_action.dscp;
18689 mp->exceed_action_type = exceed_action.action_type;
18690 mp->exceed_dscp = exceed_action.dscp;
18691 mp->violate_action_type = violate_action.action_type;
18692 mp->violate_dscp = violate_action.dscp;
18693 mp->color_aware = color_aware;
18701 api_policer_dump (vat_main_t * vam)
18703 unformat_input_t *i = vam->input;
18704 vl_api_policer_dump_t *mp;
18705 vl_api_control_ping_t *mp_ping;
18706 u8 *match_name = 0;
18707 u8 match_name_valid = 0;
18710 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18712 if (unformat (i, "name %s", &match_name))
18714 vec_add1 (match_name, 0);
18715 match_name_valid = 1;
18721 M (POLICER_DUMP, mp);
18722 mp->match_name_valid = match_name_valid;
18723 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
18724 vec_free (match_name);
18728 /* Use a control ping for synchronization */
18729 MPING (CONTROL_PING, mp_ping);
18732 /* Wait for a reply... */
18738 api_policer_classify_set_interface (vat_main_t * vam)
18740 unformat_input_t *i = vam->input;
18741 vl_api_policer_classify_set_interface_t *mp;
18743 int sw_if_index_set;
18744 u32 ip4_table_index = ~0;
18745 u32 ip6_table_index = ~0;
18746 u32 l2_table_index = ~0;
18750 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18752 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
18753 sw_if_index_set = 1;
18754 else if (unformat (i, "sw_if_index %d", &sw_if_index))
18755 sw_if_index_set = 1;
18756 else if (unformat (i, "del"))
18758 else if (unformat (i, "ip4-table %d", &ip4_table_index))
18760 else if (unformat (i, "ip6-table %d", &ip6_table_index))
18762 else if (unformat (i, "l2-table %d", &l2_table_index))
18766 clib_warning ("parse error '%U'", format_unformat_error, i);
18771 if (sw_if_index_set == 0)
18773 errmsg ("missing interface name or sw_if_index");
18777 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
18779 mp->sw_if_index = ntohl (sw_if_index);
18780 mp->ip4_table_index = ntohl (ip4_table_index);
18781 mp->ip6_table_index = ntohl (ip6_table_index);
18782 mp->l2_table_index = ntohl (l2_table_index);
18783 mp->is_add = is_add;
18791 api_policer_classify_dump (vat_main_t * vam)
18793 unformat_input_t *i = vam->input;
18794 vl_api_policer_classify_dump_t *mp;
18795 vl_api_control_ping_t *mp_ping;
18796 u8 type = POLICER_CLASSIFY_N_TABLES;
18799 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
18803 errmsg ("classify table type must be specified");
18807 if (!vam->json_output)
18809 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
18812 M (POLICER_CLASSIFY_DUMP, mp);
18817 /* Use a control ping for synchronization */
18818 MPING (CONTROL_PING, mp_ping);
18821 /* Wait for a reply... */
18827 api_netmap_create (vat_main_t * vam)
18829 unformat_input_t *i = vam->input;
18830 vl_api_netmap_create_t *mp;
18833 u8 random_hw_addr = 1;
18838 clib_memset (hw_addr, 0, sizeof (hw_addr));
18840 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18842 if (unformat (i, "name %s", &if_name))
18843 vec_add1 (if_name, 0);
18844 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
18845 random_hw_addr = 0;
18846 else if (unformat (i, "pipe"))
18848 else if (unformat (i, "master"))
18850 else if (unformat (i, "slave"))
18856 if (!vec_len (if_name))
18858 errmsg ("interface name must be specified");
18862 if (vec_len (if_name) > 64)
18864 errmsg ("interface name too long");
18868 M (NETMAP_CREATE, mp);
18870 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
18871 clib_memcpy (mp->hw_addr, hw_addr, 6);
18872 mp->use_random_hw_addr = random_hw_addr;
18873 mp->is_pipe = is_pipe;
18874 mp->is_master = is_master;
18875 vec_free (if_name);
18883 api_netmap_delete (vat_main_t * vam)
18885 unformat_input_t *i = vam->input;
18886 vl_api_netmap_delete_t *mp;
18890 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18892 if (unformat (i, "name %s", &if_name))
18893 vec_add1 (if_name, 0);
18898 if (!vec_len (if_name))
18900 errmsg ("interface name must be specified");
18904 if (vec_len (if_name) > 64)
18906 errmsg ("interface name too long");
18910 M (NETMAP_DELETE, mp);
18912 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
18913 vec_free (if_name);
18921 vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
18923 if (fp->afi == IP46_TYPE_IP6)
18925 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
18926 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
18927 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
18928 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
18929 format_ip6_address, fp->next_hop);
18930 else if (fp->afi == IP46_TYPE_IP4)
18932 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
18933 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
18934 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
18935 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
18936 format_ip4_address, fp->next_hop);
18940 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
18941 vl_api_fib_path_t * fp)
18943 struct in_addr ip4;
18944 struct in6_addr ip6;
18946 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
18947 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
18948 vat_json_object_add_uint (node, "is_local", fp->is_local);
18949 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
18950 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
18951 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
18952 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
18953 if (fp->afi == IP46_TYPE_IP4)
18955 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
18956 vat_json_object_add_ip4 (node, "next_hop", ip4);
18958 else if (fp->afi == IP46_TYPE_IP6)
18960 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
18961 vat_json_object_add_ip6 (node, "next_hop", ip6);
18966 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
18968 vat_main_t *vam = &vat_main;
18969 int count = ntohl (mp->mt_count);
18970 vl_api_fib_path_t *fp;
18973 print (vam->ofp, "[%d]: sw_if_index %d via:",
18974 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
18976 for (i = 0; i < count; i++)
18978 vl_api_mpls_fib_path_print (vam, fp);
18982 print (vam->ofp, "");
18985 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
18986 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
18989 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
18991 vat_main_t *vam = &vat_main;
18992 vat_json_node_t *node = NULL;
18993 int count = ntohl (mp->mt_count);
18994 vl_api_fib_path_t *fp;
18997 if (VAT_JSON_ARRAY != vam->json_tree.type)
18999 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19000 vat_json_init_array (&vam->json_tree);
19002 node = vat_json_array_add (&vam->json_tree);
19004 vat_json_init_object (node);
19005 vat_json_object_add_uint (node, "tunnel_index",
19006 ntohl (mp->mt_tunnel_index));
19007 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
19009 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
19012 for (i = 0; i < count; i++)
19014 vl_api_mpls_fib_path_json_print (node, fp);
19020 api_mpls_tunnel_dump (vat_main_t * vam)
19022 vl_api_mpls_tunnel_dump_t *mp;
19023 vl_api_control_ping_t *mp_ping;
19024 u32 sw_if_index = ~0;
19027 /* Parse args required to build the message */
19028 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
19030 if (unformat (vam->input, "sw_if_index %d", &sw_if_index))
19034 print (vam->ofp, " sw_if_index %d", sw_if_index);
19036 M (MPLS_TUNNEL_DUMP, mp);
19037 mp->sw_if_index = htonl (sw_if_index);
19040 /* Use a control ping for synchronization */
19041 MPING (CONTROL_PING, mp_ping);
19048 #define vl_api_mpls_fib_details_t_endian vl_noop_handler
19049 #define vl_api_mpls_fib_details_t_print vl_noop_handler
19053 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
19055 vat_main_t *vam = &vat_main;
19056 int count = ntohl (mp->count);
19057 vl_api_fib_path_t *fp;
19061 "table-id %d, label %u, ess_bit %u",
19062 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
19064 for (i = 0; i < count; i++)
19066 vl_api_mpls_fib_path_print (vam, fp);
19071 static void vl_api_mpls_fib_details_t_handler_json
19072 (vl_api_mpls_fib_details_t * mp)
19074 vat_main_t *vam = &vat_main;
19075 int count = ntohl (mp->count);
19076 vat_json_node_t *node = NULL;
19077 vl_api_fib_path_t *fp;
19080 if (VAT_JSON_ARRAY != vam->json_tree.type)
19082 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19083 vat_json_init_array (&vam->json_tree);
19085 node = vat_json_array_add (&vam->json_tree);
19087 vat_json_init_object (node);
19088 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19089 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
19090 vat_json_object_add_uint (node, "label", ntohl (mp->label));
19091 vat_json_object_add_uint (node, "path_count", count);
19093 for (i = 0; i < count; i++)
19095 vl_api_mpls_fib_path_json_print (node, fp);
19101 api_mpls_fib_dump (vat_main_t * vam)
19103 vl_api_mpls_fib_dump_t *mp;
19104 vl_api_control_ping_t *mp_ping;
19107 M (MPLS_FIB_DUMP, mp);
19110 /* Use a control ping for synchronization */
19111 MPING (CONTROL_PING, mp_ping);
19118 #define vl_api_ip_fib_details_t_endian vl_noop_handler
19119 #define vl_api_ip_fib_details_t_print vl_noop_handler
19122 vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
19124 vat_main_t *vam = &vat_main;
19125 int count = ntohl (mp->count);
19126 vl_api_fib_path_t *fp;
19130 "table-id %d, prefix %U/%d stats-index %d",
19131 ntohl (mp->table_id), format_ip4_address, mp->address,
19132 mp->address_length, ntohl (mp->stats_index));
19134 for (i = 0; i < count; i++)
19136 if (fp->afi == IP46_TYPE_IP6)
19138 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19139 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19140 "next_hop_table %d",
19141 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19142 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19143 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
19144 else if (fp->afi == IP46_TYPE_IP4)
19146 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19147 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19148 "next_hop_table %d",
19149 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19150 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19151 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
19156 static void vl_api_ip_fib_details_t_handler_json
19157 (vl_api_ip_fib_details_t * mp)
19159 vat_main_t *vam = &vat_main;
19160 int count = ntohl (mp->count);
19161 vat_json_node_t *node = NULL;
19162 struct in_addr ip4;
19163 struct in6_addr ip6;
19164 vl_api_fib_path_t *fp;
19167 if (VAT_JSON_ARRAY != vam->json_tree.type)
19169 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19170 vat_json_init_array (&vam->json_tree);
19172 node = vat_json_array_add (&vam->json_tree);
19174 vat_json_init_object (node);
19175 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19176 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
19177 vat_json_object_add_ip4 (node, "prefix", ip4);
19178 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19179 vat_json_object_add_uint (node, "path_count", count);
19181 for (i = 0; i < count; i++)
19183 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19184 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19185 vat_json_object_add_uint (node, "is_local", fp->is_local);
19186 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19187 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19188 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19189 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19190 if (fp->afi == IP46_TYPE_IP4)
19192 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19193 vat_json_object_add_ip4 (node, "next_hop", ip4);
19195 else if (fp->afi == IP46_TYPE_IP6)
19197 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19198 vat_json_object_add_ip6 (node, "next_hop", ip6);
19204 api_ip_fib_dump (vat_main_t * vam)
19206 vl_api_ip_fib_dump_t *mp;
19207 vl_api_control_ping_t *mp_ping;
19210 M (IP_FIB_DUMP, mp);
19213 /* Use a control ping for synchronization */
19214 MPING (CONTROL_PING, mp_ping);
19222 api_ip_mfib_dump (vat_main_t * vam)
19224 vl_api_ip_mfib_dump_t *mp;
19225 vl_api_control_ping_t *mp_ping;
19228 M (IP_MFIB_DUMP, mp);
19231 /* Use a control ping for synchronization */
19232 MPING (CONTROL_PING, mp_ping);
19239 static void vl_api_ip_neighbor_details_t_handler
19240 (vl_api_ip_neighbor_details_t * mp)
19242 vat_main_t *vam = &vat_main;
19244 print (vam->ofp, "%c %U %U",
19245 (ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ? 'S' : 'D',
19246 format_vl_api_mac_address, &mp->neighbor.mac_address,
19247 format_vl_api_address, &mp->neighbor.ip_address);
19250 static void vl_api_ip_neighbor_details_t_handler_json
19251 (vl_api_ip_neighbor_details_t * mp)
19254 vat_main_t *vam = &vat_main;
19255 vat_json_node_t *node;
19257 if (VAT_JSON_ARRAY != vam->json_tree.type)
19259 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19260 vat_json_init_array (&vam->json_tree);
19262 node = vat_json_array_add (&vam->json_tree);
19264 vat_json_init_object (node);
19265 vat_json_object_add_string_copy
19267 ((ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ?
19268 (u8 *) "static" : (u8 *) "dynamic"));
19270 vat_json_object_add_string_copy (node, "link_layer",
19271 format (0, "%U", format_vl_api_mac_address,
19272 &mp->neighbor.mac_address));
19273 vat_json_object_add_address (node, "ip", &mp->neighbor.ip_address);
19277 api_ip_neighbor_dump (vat_main_t * vam)
19279 unformat_input_t *i = vam->input;
19280 vl_api_ip_neighbor_dump_t *mp;
19281 vl_api_control_ping_t *mp_ping;
19283 u32 sw_if_index = ~0;
19286 /* Parse args required to build the message */
19287 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19289 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19291 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19293 else if (unformat (i, "ip6"))
19299 if (sw_if_index == ~0)
19301 errmsg ("missing interface name or sw_if_index");
19305 M (IP_NEIGHBOR_DUMP, mp);
19306 mp->is_ipv6 = (u8) is_ipv6;
19307 mp->sw_if_index = ntohl (sw_if_index);
19310 /* Use a control ping for synchronization */
19311 MPING (CONTROL_PING, mp_ping);
19318 #define vl_api_ip6_fib_details_t_endian vl_noop_handler
19319 #define vl_api_ip6_fib_details_t_print vl_noop_handler
19322 vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
19324 vat_main_t *vam = &vat_main;
19325 int count = ntohl (mp->count);
19326 vl_api_fib_path_t *fp;
19330 "table-id %d, prefix %U/%d stats-index %d",
19331 ntohl (mp->table_id), format_ip6_address, mp->address,
19332 mp->address_length, ntohl (mp->stats_index));
19334 for (i = 0; i < count; i++)
19336 if (fp->afi == IP46_TYPE_IP6)
19338 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19339 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19340 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19341 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19342 format_ip6_address, fp->next_hop);
19343 else if (fp->afi == IP46_TYPE_IP4)
19345 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19346 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19347 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19348 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19349 format_ip4_address, fp->next_hop);
19354 static void vl_api_ip6_fib_details_t_handler_json
19355 (vl_api_ip6_fib_details_t * mp)
19357 vat_main_t *vam = &vat_main;
19358 int count = ntohl (mp->count);
19359 vat_json_node_t *node = NULL;
19360 struct in_addr ip4;
19361 struct in6_addr ip6;
19362 vl_api_fib_path_t *fp;
19365 if (VAT_JSON_ARRAY != vam->json_tree.type)
19367 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19368 vat_json_init_array (&vam->json_tree);
19370 node = vat_json_array_add (&vam->json_tree);
19372 vat_json_init_object (node);
19373 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19374 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
19375 vat_json_object_add_ip6 (node, "prefix", ip6);
19376 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19377 vat_json_object_add_uint (node, "path_count", count);
19379 for (i = 0; i < count; i++)
19381 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19382 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19383 vat_json_object_add_uint (node, "is_local", fp->is_local);
19384 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19385 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19386 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19387 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19388 if (fp->afi == IP46_TYPE_IP4)
19390 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19391 vat_json_object_add_ip4 (node, "next_hop", ip4);
19393 else if (fp->afi == IP46_TYPE_IP6)
19395 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19396 vat_json_object_add_ip6 (node, "next_hop", ip6);
19402 api_ip6_fib_dump (vat_main_t * vam)
19404 vl_api_ip6_fib_dump_t *mp;
19405 vl_api_control_ping_t *mp_ping;
19408 M (IP6_FIB_DUMP, mp);
19411 /* Use a control ping for synchronization */
19412 MPING (CONTROL_PING, mp_ping);
19420 api_ip6_mfib_dump (vat_main_t * vam)
19422 vl_api_ip6_mfib_dump_t *mp;
19423 vl_api_control_ping_t *mp_ping;
19426 M (IP6_MFIB_DUMP, mp);
19429 /* Use a control ping for synchronization */
19430 MPING (CONTROL_PING, mp_ping);
19438 api_classify_table_ids (vat_main_t * vam)
19440 vl_api_classify_table_ids_t *mp;
19443 /* Construct the API message */
19444 M (CLASSIFY_TABLE_IDS, mp);
19453 api_classify_table_by_interface (vat_main_t * vam)
19455 unformat_input_t *input = vam->input;
19456 vl_api_classify_table_by_interface_t *mp;
19458 u32 sw_if_index = ~0;
19460 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19462 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19464 else if (unformat (input, "sw_if_index %d", &sw_if_index))
19469 if (sw_if_index == ~0)
19471 errmsg ("missing interface name or sw_if_index");
19475 /* Construct the API message */
19476 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
19478 mp->sw_if_index = ntohl (sw_if_index);
19486 api_classify_table_info (vat_main_t * vam)
19488 unformat_input_t *input = vam->input;
19489 vl_api_classify_table_info_t *mp;
19493 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19495 if (unformat (input, "table_id %d", &table_id))
19500 if (table_id == ~0)
19502 errmsg ("missing table id");
19506 /* Construct the API message */
19507 M (CLASSIFY_TABLE_INFO, mp);
19509 mp->table_id = ntohl (table_id);
19517 api_classify_session_dump (vat_main_t * vam)
19519 unformat_input_t *input = vam->input;
19520 vl_api_classify_session_dump_t *mp;
19521 vl_api_control_ping_t *mp_ping;
19525 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19527 if (unformat (input, "table_id %d", &table_id))
19532 if (table_id == ~0)
19534 errmsg ("missing table id");
19538 /* Construct the API message */
19539 M (CLASSIFY_SESSION_DUMP, mp);
19541 mp->table_id = ntohl (table_id);
19544 /* Use a control ping for synchronization */
19545 MPING (CONTROL_PING, mp_ping);
19553 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
19555 vat_main_t *vam = &vat_main;
19557 print (vam->ofp, "collector_address %U, collector_port %d, "
19558 "src_address %U, vrf_id %d, path_mtu %u, "
19559 "template_interval %u, udp_checksum %d",
19560 format_ip4_address, mp->collector_address,
19561 ntohs (mp->collector_port),
19562 format_ip4_address, mp->src_address,
19563 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
19564 ntohl (mp->template_interval), mp->udp_checksum);
19567 vam->result_ready = 1;
19571 vl_api_ipfix_exporter_details_t_handler_json
19572 (vl_api_ipfix_exporter_details_t * mp)
19574 vat_main_t *vam = &vat_main;
19575 vat_json_node_t node;
19576 struct in_addr collector_address;
19577 struct in_addr src_address;
19579 vat_json_init_object (&node);
19580 clib_memcpy (&collector_address, &mp->collector_address,
19581 sizeof (collector_address));
19582 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
19583 vat_json_object_add_uint (&node, "collector_port",
19584 ntohs (mp->collector_port));
19585 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
19586 vat_json_object_add_ip4 (&node, "src_address", src_address);
19587 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
19588 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
19589 vat_json_object_add_uint (&node, "template_interval",
19590 ntohl (mp->template_interval));
19591 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
19593 vat_json_print (vam->ofp, &node);
19594 vat_json_free (&node);
19596 vam->result_ready = 1;
19600 api_ipfix_exporter_dump (vat_main_t * vam)
19602 vl_api_ipfix_exporter_dump_t *mp;
19605 /* Construct the API message */
19606 M (IPFIX_EXPORTER_DUMP, mp);
19615 api_ipfix_classify_stream_dump (vat_main_t * vam)
19617 vl_api_ipfix_classify_stream_dump_t *mp;
19620 /* Construct the API message */
19621 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
19632 vl_api_ipfix_classify_stream_details_t_handler
19633 (vl_api_ipfix_classify_stream_details_t * mp)
19635 vat_main_t *vam = &vat_main;
19636 print (vam->ofp, "domain_id %d, src_port %d",
19637 ntohl (mp->domain_id), ntohs (mp->src_port));
19639 vam->result_ready = 1;
19643 vl_api_ipfix_classify_stream_details_t_handler_json
19644 (vl_api_ipfix_classify_stream_details_t * mp)
19646 vat_main_t *vam = &vat_main;
19647 vat_json_node_t node;
19649 vat_json_init_object (&node);
19650 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
19651 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
19653 vat_json_print (vam->ofp, &node);
19654 vat_json_free (&node);
19656 vam->result_ready = 1;
19660 api_ipfix_classify_table_dump (vat_main_t * vam)
19662 vl_api_ipfix_classify_table_dump_t *mp;
19663 vl_api_control_ping_t *mp_ping;
19666 if (!vam->json_output)
19668 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
19669 "transport_protocol");
19672 /* Construct the API message */
19673 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
19678 /* Use a control ping for synchronization */
19679 MPING (CONTROL_PING, mp_ping);
19687 vl_api_ipfix_classify_table_details_t_handler
19688 (vl_api_ipfix_classify_table_details_t * mp)
19690 vat_main_t *vam = &vat_main;
19691 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
19692 mp->transport_protocol);
19696 vl_api_ipfix_classify_table_details_t_handler_json
19697 (vl_api_ipfix_classify_table_details_t * mp)
19699 vat_json_node_t *node = NULL;
19700 vat_main_t *vam = &vat_main;
19702 if (VAT_JSON_ARRAY != vam->json_tree.type)
19704 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19705 vat_json_init_array (&vam->json_tree);
19708 node = vat_json_array_add (&vam->json_tree);
19709 vat_json_init_object (node);
19711 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
19712 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
19713 vat_json_object_add_uint (node, "transport_protocol",
19714 mp->transport_protocol);
19718 api_sw_interface_span_enable_disable (vat_main_t * vam)
19720 unformat_input_t *i = vam->input;
19721 vl_api_sw_interface_span_enable_disable_t *mp;
19722 u32 src_sw_if_index = ~0;
19723 u32 dst_sw_if_index = ~0;
19728 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19731 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
19733 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
19737 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
19739 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
19741 else if (unformat (i, "disable"))
19743 else if (unformat (i, "rx"))
19745 else if (unformat (i, "tx"))
19747 else if (unformat (i, "both"))
19749 else if (unformat (i, "l2"))
19755 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
19757 mp->sw_if_index_from = htonl (src_sw_if_index);
19758 mp->sw_if_index_to = htonl (dst_sw_if_index);
19768 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
19771 vat_main_t *vam = &vat_main;
19772 u8 *sw_if_from_name = 0;
19773 u8 *sw_if_to_name = 0;
19774 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19775 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19776 char *states[] = { "none", "rx", "tx", "both" };
19780 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19782 if ((u32) p->value[0] == sw_if_index_from)
19784 sw_if_from_name = (u8 *)(p->key);
19788 if ((u32) p->value[0] == sw_if_index_to)
19790 sw_if_to_name = (u8 *)(p->key);
19791 if (sw_if_from_name)
19796 print (vam->ofp, "%20s => %20s (%s) %s",
19797 sw_if_from_name, sw_if_to_name, states[mp->state],
19798 mp->is_l2 ? "l2" : "device");
19802 vl_api_sw_interface_span_details_t_handler_json
19803 (vl_api_sw_interface_span_details_t * mp)
19805 vat_main_t *vam = &vat_main;
19806 vat_json_node_t *node = NULL;
19807 u8 *sw_if_from_name = 0;
19808 u8 *sw_if_to_name = 0;
19809 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19810 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19814 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19816 if ((u32) p->value[0] == sw_if_index_from)
19818 sw_if_from_name = (u8 *)(p->key);
19822 if ((u32) p->value[0] == sw_if_index_to)
19824 sw_if_to_name = (u8 *)(p->key);
19825 if (sw_if_from_name)
19831 if (VAT_JSON_ARRAY != vam->json_tree.type)
19833 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19834 vat_json_init_array (&vam->json_tree);
19836 node = vat_json_array_add (&vam->json_tree);
19838 vat_json_init_object (node);
19839 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
19840 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
19841 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
19842 if (0 != sw_if_to_name)
19844 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
19846 vat_json_object_add_uint (node, "state", mp->state);
19847 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
19851 api_sw_interface_span_dump (vat_main_t * vam)
19853 unformat_input_t *input = vam->input;
19854 vl_api_sw_interface_span_dump_t *mp;
19855 vl_api_control_ping_t *mp_ping;
19859 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19861 if (unformat (input, "l2"))
19867 M (SW_INTERFACE_SPAN_DUMP, mp);
19871 /* Use a control ping for synchronization */
19872 MPING (CONTROL_PING, mp_ping);
19880 api_pg_create_interface (vat_main_t * vam)
19882 unformat_input_t *input = vam->input;
19883 vl_api_pg_create_interface_t *mp;
19887 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19889 if (unformat (input, "if_id %d", &if_id))
19896 errmsg ("missing pg interface index");
19900 /* Construct the API message */
19901 M (PG_CREATE_INTERFACE, mp);
19903 mp->interface_id = ntohl (if_id);
19911 api_pg_capture (vat_main_t * vam)
19913 unformat_input_t *input = vam->input;
19914 vl_api_pg_capture_t *mp;
19919 u8 pcap_file_set = 0;
19922 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19924 if (unformat (input, "if_id %d", &if_id))
19926 else if (unformat (input, "pcap %s", &pcap_file))
19928 else if (unformat (input, "count %d", &count))
19930 else if (unformat (input, "disable"))
19937 errmsg ("missing pg interface index");
19940 if (pcap_file_set > 0)
19942 if (vec_len (pcap_file) > 255)
19944 errmsg ("pcap file name is too long");
19949 u32 name_len = vec_len (pcap_file);
19950 /* Construct the API message */
19951 M (PG_CAPTURE, mp);
19953 mp->interface_id = ntohl (if_id);
19954 mp->is_enabled = enable;
19955 mp->count = ntohl (count);
19956 mp->pcap_name_length = ntohl (name_len);
19957 if (pcap_file_set != 0)
19959 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
19961 vec_free (pcap_file);
19969 api_pg_enable_disable (vat_main_t * vam)
19971 unformat_input_t *input = vam->input;
19972 vl_api_pg_enable_disable_t *mp;
19975 u8 stream_name_set = 0;
19976 u8 *stream_name = 0;
19978 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19980 if (unformat (input, "stream %s", &stream_name))
19981 stream_name_set = 1;
19982 else if (unformat (input, "disable"))
19988 if (stream_name_set > 0)
19990 if (vec_len (stream_name) > 255)
19992 errmsg ("stream name too long");
19997 u32 name_len = vec_len (stream_name);
19998 /* Construct the API message */
19999 M (PG_ENABLE_DISABLE, mp);
20001 mp->is_enabled = enable;
20002 if (stream_name_set != 0)
20004 mp->stream_name_length = ntohl (name_len);
20005 clib_memcpy (mp->stream_name, stream_name, name_len);
20007 vec_free (stream_name);
20015 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
20017 unformat_input_t *input = vam->input;
20018 vl_api_ip_source_and_port_range_check_add_del_t *mp;
20020 u16 *low_ports = 0;
20021 u16 *high_ports = 0;
20024 vl_api_prefix_t prefix;
20032 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20034 if (unformat (input, "%U", unformat_vl_api_prefix, &prefix))
20036 else if (unformat (input, "vrf %d", &vrf_id))
20038 else if (unformat (input, "del"))
20040 else if (unformat (input, "port %d", &tmp))
20042 if (tmp == 0 || tmp > 65535)
20044 errmsg ("port %d out of range", tmp);
20048 this_hi = this_low + 1;
20049 vec_add1 (low_ports, this_low);
20050 vec_add1 (high_ports, this_hi);
20052 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
20054 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
20056 errmsg ("incorrect range parameters");
20060 /* Note: in debug CLI +1 is added to high before
20061 passing to real fn that does "the work"
20062 (ip_source_and_port_range_check_add_del).
20063 This fn is a wrapper around the binary API fn a
20064 control plane will call, which expects this increment
20065 to have occurred. Hence letting the binary API control
20066 plane fn do the increment for consistency between VAT
20067 and other control planes.
20070 vec_add1 (low_ports, this_low);
20071 vec_add1 (high_ports, this_hi);
20077 if (prefix_set == 0)
20079 errmsg ("<address>/<mask> not specified");
20085 errmsg ("VRF ID required, not specified");
20092 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20096 if (vec_len (low_ports) == 0)
20098 errmsg ("At least one port or port range required");
20102 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
20104 mp->is_add = is_add;
20106 clib_memcpy (&mp->prefix, &prefix, sizeof (prefix));
20108 mp->number_of_ranges = vec_len (low_ports);
20110 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
20111 vec_free (low_ports);
20113 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
20114 vec_free (high_ports);
20116 mp->vrf_id = ntohl (vrf_id);
20124 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
20126 unformat_input_t *input = vam->input;
20127 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
20128 u32 sw_if_index = ~0;
20130 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
20131 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
20135 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20137 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20139 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20141 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
20143 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
20145 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
20147 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
20149 else if (unformat (input, "del"))
20155 if (sw_if_index == ~0)
20157 errmsg ("Interface required but not specified");
20163 errmsg ("VRF ID required but not specified");
20167 if (tcp_out_vrf_id == 0
20168 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
20171 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20175 /* Construct the API message */
20176 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
20178 mp->sw_if_index = ntohl (sw_if_index);
20179 mp->is_add = is_add;
20180 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
20181 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
20182 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
20183 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
20188 /* Wait for a reply... */
20194 api_ipsec_gre_tunnel_add_del (vat_main_t * vam)
20196 unformat_input_t *i = vam->input;
20197 vl_api_ipsec_gre_tunnel_add_del_t *mp;
20198 u32 local_sa_id = 0;
20199 u32 remote_sa_id = 0;
20200 vl_api_ip4_address_t src_address;
20201 vl_api_ip4_address_t dst_address;
20205 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20207 if (unformat (i, "local_sa %d", &local_sa_id))
20209 else if (unformat (i, "remote_sa %d", &remote_sa_id))
20212 if (unformat (i, "src %U", unformat_vl_api_ip4_address, &src_address))
20215 if (unformat (i, "dst %U", unformat_vl_api_ip4_address, &dst_address))
20217 else if (unformat (i, "del"))
20221 clib_warning ("parse error '%U'", format_unformat_error, i);
20226 M (IPSEC_GRE_TUNNEL_ADD_DEL, mp);
20228 mp->tunnel.local_sa_id = ntohl (local_sa_id);
20229 mp->tunnel.remote_sa_id = ntohl (remote_sa_id);
20230 clib_memcpy (mp->tunnel.src, &src_address, sizeof (src_address));
20231 clib_memcpy (mp->tunnel.dst, &dst_address, sizeof (dst_address));
20232 mp->is_add = is_add;
20240 api_set_punt (vat_main_t * vam)
20242 unformat_input_t *i = vam->input;
20243 vl_api_address_family_t af;
20244 vl_api_set_punt_t *mp;
20252 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20254 if (unformat (i, "%U", unformat_vl_api_address_family, &af))
20256 else if (unformat (i, "protocol %d", &protocol))
20258 else if (unformat (i, "port %d", &port))
20260 else if (unformat (i, "del"))
20264 clib_warning ("parse error '%U'", format_unformat_error, i);
20271 mp->is_add = (u8) is_add;
20272 mp->punt.type = PUNT_API_TYPE_L4;
20273 mp->punt.punt.l4.af = af;
20274 mp->punt.punt.l4.protocol = (u8) protocol;
20275 mp->punt.punt.l4.port = htons ((u16) port);
20282 static void vl_api_ipsec_gre_tunnel_details_t_handler
20283 (vl_api_ipsec_gre_tunnel_details_t * mp)
20285 vat_main_t *vam = &vat_main;
20287 print (vam->ofp, "%11d%15U%15U%14d%14d",
20288 ntohl (mp->tunnel.sw_if_index),
20289 format_vl_api_ip4_address, mp->tunnel.src,
20290 format_vl_api_ip4_address, mp->tunnel.dst,
20291 ntohl (mp->tunnel.local_sa_id), ntohl (mp->tunnel.remote_sa_id));
20295 vat_json_object_add_vl_api_ip4 (vat_json_node_t * node,
20297 const vl_api_ip4_address_t addr)
20299 struct in_addr ip4;
20301 clib_memcpy (&ip4, addr, sizeof (ip4));
20302 vat_json_object_add_ip4 (node, name, ip4);
20305 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
20306 (vl_api_ipsec_gre_tunnel_details_t * mp)
20308 vat_main_t *vam = &vat_main;
20309 vat_json_node_t *node = NULL;
20310 struct in_addr ip4;
20312 if (VAT_JSON_ARRAY != vam->json_tree.type)
20314 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20315 vat_json_init_array (&vam->json_tree);
20317 node = vat_json_array_add (&vam->json_tree);
20319 vat_json_init_object (node);
20320 vat_json_object_add_uint (node, "sw_if_index",
20321 ntohl (mp->tunnel.sw_if_index));
20322 vat_json_object_add_vl_api_ip4 (node, "src", mp->tunnel.src);
20323 vat_json_object_add_vl_api_ip4 (node, "src", mp->tunnel.dst);
20324 vat_json_object_add_uint (node, "local_sa_id",
20325 ntohl (mp->tunnel.local_sa_id));
20326 vat_json_object_add_uint (node, "remote_sa_id",
20327 ntohl (mp->tunnel.remote_sa_id));
20331 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
20333 unformat_input_t *i = vam->input;
20334 vl_api_ipsec_gre_tunnel_dump_t *mp;
20335 vl_api_control_ping_t *mp_ping;
20337 u8 sw_if_index_set = 0;
20340 /* Parse args required to build the message */
20341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20343 if (unformat (i, "sw_if_index %d", &sw_if_index))
20344 sw_if_index_set = 1;
20349 if (sw_if_index_set == 0)
20354 if (!vam->json_output)
20356 print (vam->ofp, "%11s%15s%15s%14s%14s",
20357 "sw_if_index", "src_address", "dst_address",
20358 "local_sa_id", "remote_sa_id");
20361 /* Get list of gre-tunnel interfaces */
20362 M (IPSEC_GRE_TUNNEL_DUMP, mp);
20364 mp->sw_if_index = htonl (sw_if_index);
20368 /* Use a control ping for synchronization */
20369 MPING (CONTROL_PING, mp_ping);
20377 api_delete_subif (vat_main_t * vam)
20379 unformat_input_t *i = vam->input;
20380 vl_api_delete_subif_t *mp;
20381 u32 sw_if_index = ~0;
20384 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20386 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20388 if (unformat (i, "sw_if_index %d", &sw_if_index))
20394 if (sw_if_index == ~0)
20396 errmsg ("missing sw_if_index");
20400 /* Construct the API message */
20401 M (DELETE_SUBIF, mp);
20402 mp->sw_if_index = ntohl (sw_if_index);
20409 #define foreach_pbb_vtr_op \
20410 _("disable", L2_VTR_DISABLED) \
20411 _("pop", L2_VTR_POP_2) \
20412 _("push", L2_VTR_PUSH_2)
20415 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
20417 unformat_input_t *i = vam->input;
20418 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
20419 u32 sw_if_index = ~0, vtr_op = ~0;
20420 u16 outer_tag = ~0;
20421 u8 dmac[6], smac[6];
20422 u8 dmac_set = 0, smac_set = 0;
20428 /* Shut up coverity */
20429 clib_memset (dmac, 0, sizeof (dmac));
20430 clib_memset (smac, 0, sizeof (smac));
20432 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20434 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20436 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20438 else if (unformat (i, "vtr_op %d", &vtr_op))
20440 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
20443 else if (unformat (i, "translate_pbb_stag"))
20445 if (unformat (i, "%d", &tmp))
20447 vtr_op = L2_VTR_TRANSLATE_2_1;
20453 ("translate_pbb_stag operation requires outer tag definition");
20457 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
20459 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
20461 else if (unformat (i, "sid %d", &sid))
20463 else if (unformat (i, "vlanid %d", &tmp))
20467 clib_warning ("parse error '%U'", format_unformat_error, i);
20472 if ((sw_if_index == ~0) || (vtr_op == ~0))
20474 errmsg ("missing sw_if_index or vtr operation");
20477 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
20478 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
20481 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
20485 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
20486 mp->sw_if_index = ntohl (sw_if_index);
20487 mp->vtr_op = ntohl (vtr_op);
20488 mp->outer_tag = ntohs (outer_tag);
20489 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
20490 clib_memcpy (mp->b_smac, smac, sizeof (smac));
20491 mp->b_vlanid = ntohs (vlanid);
20492 mp->i_sid = ntohl (sid);
20500 api_flow_classify_set_interface (vat_main_t * vam)
20502 unformat_input_t *i = vam->input;
20503 vl_api_flow_classify_set_interface_t *mp;
20505 int sw_if_index_set;
20506 u32 ip4_table_index = ~0;
20507 u32 ip6_table_index = ~0;
20511 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20513 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20514 sw_if_index_set = 1;
20515 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20516 sw_if_index_set = 1;
20517 else if (unformat (i, "del"))
20519 else if (unformat (i, "ip4-table %d", &ip4_table_index))
20521 else if (unformat (i, "ip6-table %d", &ip6_table_index))
20525 clib_warning ("parse error '%U'", format_unformat_error, i);
20530 if (sw_if_index_set == 0)
20532 errmsg ("missing interface name or sw_if_index");
20536 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
20538 mp->sw_if_index = ntohl (sw_if_index);
20539 mp->ip4_table_index = ntohl (ip4_table_index);
20540 mp->ip6_table_index = ntohl (ip6_table_index);
20541 mp->is_add = is_add;
20549 api_flow_classify_dump (vat_main_t * vam)
20551 unformat_input_t *i = vam->input;
20552 vl_api_flow_classify_dump_t *mp;
20553 vl_api_control_ping_t *mp_ping;
20554 u8 type = FLOW_CLASSIFY_N_TABLES;
20557 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
20561 errmsg ("classify table type must be specified");
20565 if (!vam->json_output)
20567 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
20570 M (FLOW_CLASSIFY_DUMP, mp);
20575 /* Use a control ping for synchronization */
20576 MPING (CONTROL_PING, mp_ping);
20579 /* Wait for a reply... */
20585 api_feature_enable_disable (vat_main_t * vam)
20587 unformat_input_t *i = vam->input;
20588 vl_api_feature_enable_disable_t *mp;
20590 u8 *feature_name = 0;
20591 u32 sw_if_index = ~0;
20595 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20597 if (unformat (i, "arc_name %s", &arc_name))
20599 else if (unformat (i, "feature_name %s", &feature_name))
20602 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20604 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20606 else if (unformat (i, "disable"))
20614 errmsg ("missing arc name");
20617 if (vec_len (arc_name) > 63)
20619 errmsg ("arc name too long");
20622 if (feature_name == 0)
20624 errmsg ("missing feature name");
20627 if (vec_len (feature_name) > 63)
20629 errmsg ("feature name too long");
20632 if (sw_if_index == ~0)
20634 errmsg ("missing interface name or sw_if_index");
20638 /* Construct the API message */
20639 M (FEATURE_ENABLE_DISABLE, mp);
20640 mp->sw_if_index = ntohl (sw_if_index);
20641 mp->enable = enable;
20642 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
20643 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
20644 vec_free (arc_name);
20645 vec_free (feature_name);
20653 api_sw_interface_tag_add_del (vat_main_t * vam)
20655 unformat_input_t *i = vam->input;
20656 vl_api_sw_interface_tag_add_del_t *mp;
20657 u32 sw_if_index = ~0;
20662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20664 if (unformat (i, "tag %s", &tag))
20666 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20668 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20670 else if (unformat (i, "del"))
20676 if (sw_if_index == ~0)
20678 errmsg ("missing interface name or sw_if_index");
20682 if (enable && (tag == 0))
20684 errmsg ("no tag specified");
20688 /* Construct the API message */
20689 M (SW_INTERFACE_TAG_ADD_DEL, mp);
20690 mp->sw_if_index = ntohl (sw_if_index);
20691 mp->is_add = enable;
20693 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
20701 static void vl_api_l2_xconnect_details_t_handler
20702 (vl_api_l2_xconnect_details_t * mp)
20704 vat_main_t *vam = &vat_main;
20706 print (vam->ofp, "%15d%15d",
20707 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
20710 static void vl_api_l2_xconnect_details_t_handler_json
20711 (vl_api_l2_xconnect_details_t * mp)
20713 vat_main_t *vam = &vat_main;
20714 vat_json_node_t *node = NULL;
20716 if (VAT_JSON_ARRAY != vam->json_tree.type)
20718 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20719 vat_json_init_array (&vam->json_tree);
20721 node = vat_json_array_add (&vam->json_tree);
20723 vat_json_init_object (node);
20724 vat_json_object_add_uint (node, "rx_sw_if_index",
20725 ntohl (mp->rx_sw_if_index));
20726 vat_json_object_add_uint (node, "tx_sw_if_index",
20727 ntohl (mp->tx_sw_if_index));
20731 api_l2_xconnect_dump (vat_main_t * vam)
20733 vl_api_l2_xconnect_dump_t *mp;
20734 vl_api_control_ping_t *mp_ping;
20737 if (!vam->json_output)
20739 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
20742 M (L2_XCONNECT_DUMP, mp);
20746 /* Use a control ping for synchronization */
20747 MPING (CONTROL_PING, mp_ping);
20755 api_hw_interface_set_mtu (vat_main_t * vam)
20757 unformat_input_t *i = vam->input;
20758 vl_api_hw_interface_set_mtu_t *mp;
20759 u32 sw_if_index = ~0;
20763 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20765 if (unformat (i, "mtu %d", &mtu))
20767 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20769 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20775 if (sw_if_index == ~0)
20777 errmsg ("missing interface name or sw_if_index");
20783 errmsg ("no mtu specified");
20787 /* Construct the API message */
20788 M (HW_INTERFACE_SET_MTU, mp);
20789 mp->sw_if_index = ntohl (sw_if_index);
20790 mp->mtu = ntohs ((u16) mtu);
20798 api_p2p_ethernet_add (vat_main_t * vam)
20800 unformat_input_t *i = vam->input;
20801 vl_api_p2p_ethernet_add_t *mp;
20802 u32 parent_if_index = ~0;
20808 clib_memset (remote_mac, 0, sizeof (remote_mac));
20809 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20811 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
20813 else if (unformat (i, "sw_if_index %d", &parent_if_index))
20817 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
20819 else if (unformat (i, "sub_id %d", &sub_id))
20823 clib_warning ("parse error '%U'", format_unformat_error, i);
20828 if (parent_if_index == ~0)
20830 errmsg ("missing interface name or sw_if_index");
20835 errmsg ("missing remote mac address");
20840 errmsg ("missing sub-interface id");
20844 M (P2P_ETHERNET_ADD, mp);
20845 mp->parent_if_index = ntohl (parent_if_index);
20846 mp->subif_id = ntohl (sub_id);
20847 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
20855 api_p2p_ethernet_del (vat_main_t * vam)
20857 unformat_input_t *i = vam->input;
20858 vl_api_p2p_ethernet_del_t *mp;
20859 u32 parent_if_index = ~0;
20864 clib_memset (remote_mac, 0, sizeof (remote_mac));
20865 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20867 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
20869 else if (unformat (i, "sw_if_index %d", &parent_if_index))
20873 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
20877 clib_warning ("parse error '%U'", format_unformat_error, i);
20882 if (parent_if_index == ~0)
20884 errmsg ("missing interface name or sw_if_index");
20889 errmsg ("missing remote mac address");
20893 M (P2P_ETHERNET_DEL, mp);
20894 mp->parent_if_index = ntohl (parent_if_index);
20895 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
20903 api_lldp_config (vat_main_t * vam)
20905 unformat_input_t *i = vam->input;
20906 vl_api_lldp_config_t *mp;
20908 int tx_interval = 0;
20909 u8 *sys_name = NULL;
20912 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20914 if (unformat (i, "system-name %s", &sys_name))
20916 else if (unformat (i, "tx-hold %d", &tx_hold))
20918 else if (unformat (i, "tx-interval %d", &tx_interval))
20922 clib_warning ("parse error '%U'", format_unformat_error, i);
20927 vec_add1 (sys_name, 0);
20929 M (LLDP_CONFIG, mp);
20930 mp->tx_hold = htonl (tx_hold);
20931 mp->tx_interval = htonl (tx_interval);
20932 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
20933 vec_free (sys_name);
20941 api_sw_interface_set_lldp (vat_main_t * vam)
20943 unformat_input_t *i = vam->input;
20944 vl_api_sw_interface_set_lldp_t *mp;
20945 u32 sw_if_index = ~0;
20947 u8 *port_desc = NULL, *mgmt_oid = NULL;
20948 ip4_address_t ip4_addr;
20949 ip6_address_t ip6_addr;
20952 clib_memset (&ip4_addr, 0, sizeof (ip4_addr));
20953 clib_memset (&ip6_addr, 0, sizeof (ip6_addr));
20955 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20957 if (unformat (i, "disable"))
20960 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20962 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20964 else if (unformat (i, "port-desc %s", &port_desc))
20966 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
20968 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
20970 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
20976 if (sw_if_index == ~0)
20978 errmsg ("missing interface name or sw_if_index");
20982 /* Construct the API message */
20983 vec_add1 (port_desc, 0);
20984 vec_add1 (mgmt_oid, 0);
20985 M (SW_INTERFACE_SET_LLDP, mp);
20986 mp->sw_if_index = ntohl (sw_if_index);
20987 mp->enable = enable;
20988 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
20989 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
20990 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
20991 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
20992 vec_free (port_desc);
20993 vec_free (mgmt_oid);
21001 api_tcp_configure_src_addresses (vat_main_t * vam)
21003 vl_api_tcp_configure_src_addresses_t *mp;
21004 unformat_input_t *i = vam->input;
21005 ip4_address_t v4first, v4last;
21006 ip6_address_t v6first, v6last;
21011 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21013 if (unformat (i, "%U - %U",
21014 unformat_ip4_address, &v4first,
21015 unformat_ip4_address, &v4last))
21019 errmsg ("one range per message (range already set)");
21024 else if (unformat (i, "%U - %U",
21025 unformat_ip6_address, &v6first,
21026 unformat_ip6_address, &v6last))
21030 errmsg ("one range per message (range already set)");
21035 else if (unformat (i, "vrf %d", &vrf_id))
21041 if (range_set == 0)
21043 errmsg ("address range not set");
21047 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
21048 mp->vrf_id = ntohl (vrf_id);
21050 if (range_set == 2)
21053 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
21054 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
21059 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
21060 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
21067 static void vl_api_app_namespace_add_del_reply_t_handler
21068 (vl_api_app_namespace_add_del_reply_t * mp)
21070 vat_main_t *vam = &vat_main;
21071 i32 retval = ntohl (mp->retval);
21072 if (vam->async_mode)
21074 vam->async_errors += (retval < 0);
21078 vam->retval = retval;
21080 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
21081 vam->result_ready = 1;
21085 static void vl_api_app_namespace_add_del_reply_t_handler_json
21086 (vl_api_app_namespace_add_del_reply_t * mp)
21088 vat_main_t *vam = &vat_main;
21089 vat_json_node_t node;
21091 vat_json_init_object (&node);
21092 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
21093 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
21095 vat_json_print (vam->ofp, &node);
21096 vat_json_free (&node);
21098 vam->retval = ntohl (mp->retval);
21099 vam->result_ready = 1;
21103 api_app_namespace_add_del (vat_main_t * vam)
21105 vl_api_app_namespace_add_del_t *mp;
21106 unformat_input_t *i = vam->input;
21107 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
21108 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
21112 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21114 if (unformat (i, "id %_%v%_", &ns_id))
21116 else if (unformat (i, "secret %lu", &secret))
21118 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21119 sw_if_index_set = 1;
21120 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
21122 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
21127 if (!ns_id || !secret_set || !sw_if_index_set)
21129 errmsg ("namespace id, secret and sw_if_index must be set");
21132 if (vec_len (ns_id) > 64)
21134 errmsg ("namespace id too long");
21137 M (APP_NAMESPACE_ADD_DEL, mp);
21139 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
21140 mp->namespace_id_len = vec_len (ns_id);
21141 mp->secret = clib_host_to_net_u64 (secret);
21142 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
21143 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
21144 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
21152 api_sock_init_shm (vat_main_t * vam)
21154 #if VPP_API_TEST_BUILTIN == 0
21155 unformat_input_t *i = vam->input;
21156 vl_api_shm_elem_config_t *config = 0;
21157 u64 size = 64 << 20;
21160 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21162 if (unformat (i, "size %U", unformat_memory_size, &size))
21169 * Canned custom ring allocator config.
21170 * Should probably parse all of this
21172 vec_validate (config, 6);
21173 config[0].type = VL_API_VLIB_RING;
21174 config[0].size = 256;
21175 config[0].count = 32;
21177 config[1].type = VL_API_VLIB_RING;
21178 config[1].size = 1024;
21179 config[1].count = 16;
21181 config[2].type = VL_API_VLIB_RING;
21182 config[2].size = 4096;
21183 config[2].count = 2;
21185 config[3].type = VL_API_CLIENT_RING;
21186 config[3].size = 256;
21187 config[3].count = 32;
21189 config[4].type = VL_API_CLIENT_RING;
21190 config[4].size = 1024;
21191 config[4].count = 16;
21193 config[5].type = VL_API_CLIENT_RING;
21194 config[5].size = 4096;
21195 config[5].count = 2;
21197 config[6].type = VL_API_QUEUE;
21198 config[6].count = 128;
21199 config[6].size = sizeof (uword);
21201 rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ );
21203 vam->client_index_invalid = 1;
21211 api_dns_enable_disable (vat_main_t * vam)
21213 unformat_input_t *line_input = vam->input;
21214 vl_api_dns_enable_disable_t *mp;
21215 u8 enable_disable = 1;
21218 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21220 if (unformat (line_input, "disable"))
21221 enable_disable = 0;
21222 if (unformat (line_input, "enable"))
21223 enable_disable = 1;
21228 /* Construct the API message */
21229 M (DNS_ENABLE_DISABLE, mp);
21230 mp->enable = enable_disable;
21234 /* Wait for the reply */
21240 api_dns_resolve_name (vat_main_t * vam)
21242 unformat_input_t *line_input = vam->input;
21243 vl_api_dns_resolve_name_t *mp;
21247 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21249 if (unformat (line_input, "%s", &name))
21255 if (vec_len (name) > 127)
21257 errmsg ("name too long");
21261 /* Construct the API message */
21262 M (DNS_RESOLVE_NAME, mp);
21263 memcpy (mp->name, name, vec_len (name));
21268 /* Wait for the reply */
21274 api_dns_resolve_ip (vat_main_t * vam)
21276 unformat_input_t *line_input = vam->input;
21277 vl_api_dns_resolve_ip_t *mp;
21279 ip4_address_t addr4;
21280 ip6_address_t addr6;
21283 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21285 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
21287 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
21295 errmsg ("missing address");
21299 /* Construct the API message */
21300 M (DNS_RESOLVE_IP, mp);
21301 mp->is_ip6 = is_ip6;
21303 memcpy (mp->address, &addr6, sizeof (addr6));
21305 memcpy (mp->address, &addr4, sizeof (addr4));
21309 /* Wait for the reply */
21315 api_dns_name_server_add_del (vat_main_t * vam)
21317 unformat_input_t *i = vam->input;
21318 vl_api_dns_name_server_add_del_t *mp;
21320 ip6_address_t ip6_server;
21321 ip4_address_t ip4_server;
21326 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21328 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
21330 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
21332 else if (unformat (i, "del"))
21336 clib_warning ("parse error '%U'", format_unformat_error, i);
21341 if (ip4_set && ip6_set)
21343 errmsg ("Only one server address allowed per message");
21346 if ((ip4_set + ip6_set) == 0)
21348 errmsg ("Server address required");
21352 /* Construct the API message */
21353 M (DNS_NAME_SERVER_ADD_DEL, mp);
21357 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
21362 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
21366 mp->is_add = is_add;
21371 /* Wait for a reply, return good/bad news */
21377 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
21379 vat_main_t *vam = &vat_main;
21384 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
21385 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21386 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
21387 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
21388 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21389 clib_net_to_host_u32 (mp->action_index), mp->tag);
21394 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
21395 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21396 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
21397 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
21398 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21399 clib_net_to_host_u32 (mp->action_index), mp->tag);
21404 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
21407 vat_main_t *vam = &vat_main;
21408 vat_json_node_t *node = NULL;
21409 struct in6_addr ip6;
21410 struct in_addr ip4;
21412 if (VAT_JSON_ARRAY != vam->json_tree.type)
21414 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21415 vat_json_init_array (&vam->json_tree);
21417 node = vat_json_array_add (&vam->json_tree);
21418 vat_json_init_object (node);
21420 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
21421 vat_json_object_add_uint (node, "appns_index",
21422 clib_net_to_host_u32 (mp->appns_index));
21423 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
21424 vat_json_object_add_uint (node, "scope", mp->scope);
21425 vat_json_object_add_uint (node, "action_index",
21426 clib_net_to_host_u32 (mp->action_index));
21427 vat_json_object_add_uint (node, "lcl_port",
21428 clib_net_to_host_u16 (mp->lcl_port));
21429 vat_json_object_add_uint (node, "rmt_port",
21430 clib_net_to_host_u16 (mp->rmt_port));
21431 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
21432 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
21433 vat_json_object_add_string_copy (node, "tag", mp->tag);
21436 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
21437 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
21438 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
21439 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
21443 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
21444 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
21445 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
21446 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
21451 api_session_rule_add_del (vat_main_t * vam)
21453 vl_api_session_rule_add_del_t *mp;
21454 unformat_input_t *i = vam->input;
21455 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
21456 u32 appns_index = 0, scope = 0;
21457 ip4_address_t lcl_ip4, rmt_ip4;
21458 ip6_address_t lcl_ip6, rmt_ip6;
21459 u8 is_ip4 = 1, conn_set = 0;
21460 u8 is_add = 1, *tag = 0;
21463 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21465 if (unformat (i, "del"))
21467 else if (unformat (i, "add"))
21469 else if (unformat (i, "proto tcp"))
21471 else if (unformat (i, "proto udp"))
21473 else if (unformat (i, "appns %d", &appns_index))
21475 else if (unformat (i, "scope %d", &scope))
21477 else if (unformat (i, "tag %_%v%_", &tag))
21481 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
21482 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
21490 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
21491 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
21497 else if (unformat (i, "action %d", &action))
21502 if (proto == ~0 || !conn_set || action == ~0)
21504 errmsg ("transport proto, connection and action must be set");
21510 errmsg ("scope should be 0-3");
21514 M (SESSION_RULE_ADD_DEL, mp);
21516 mp->is_ip4 = is_ip4;
21517 mp->transport_proto = proto;
21518 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
21519 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
21520 mp->lcl_plen = lcl_plen;
21521 mp->rmt_plen = rmt_plen;
21522 mp->action_index = clib_host_to_net_u32 (action);
21523 mp->appns_index = clib_host_to_net_u32 (appns_index);
21525 mp->is_add = is_add;
21528 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
21529 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
21533 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
21534 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
21538 clib_memcpy (mp->tag, tag, vec_len (tag));
21548 api_session_rules_dump (vat_main_t * vam)
21550 vl_api_session_rules_dump_t *mp;
21551 vl_api_control_ping_t *mp_ping;
21554 if (!vam->json_output)
21556 print (vam->ofp, "%=20s", "Session Rules");
21559 M (SESSION_RULES_DUMP, mp);
21563 /* Use a control ping for synchronization */
21564 MPING (CONTROL_PING, mp_ping);
21567 /* Wait for a reply... */
21573 api_ip_container_proxy_add_del (vat_main_t * vam)
21575 vl_api_ip_container_proxy_add_del_t *mp;
21576 unformat_input_t *i = vam->input;
21577 u32 sw_if_index = ~0;
21578 vl_api_prefix_t pfx = { };
21582 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21584 if (unformat (i, "del"))
21586 else if (unformat (i, "add"))
21588 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
21590 else if (unformat (i, "sw_if_index %u", &sw_if_index))
21595 if (sw_if_index == ~0 || pfx.address_length == 0)
21597 errmsg ("address and sw_if_index must be set");
21601 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
21603 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
21604 mp->is_add = is_add;
21605 clib_memcpy (&mp->pfx, &pfx, sizeof (pfx));
21613 api_qos_record_enable_disable (vat_main_t * vam)
21615 unformat_input_t *i = vam->input;
21616 vl_api_qos_record_enable_disable_t *mp;
21617 u32 sw_if_index, qs = 0xff;
21618 u8 sw_if_index_set = 0;
21622 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21624 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21625 sw_if_index_set = 1;
21626 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21627 sw_if_index_set = 1;
21628 else if (unformat (i, "%U", unformat_qos_source, &qs))
21630 else if (unformat (i, "disable"))
21634 clib_warning ("parse error '%U'", format_unformat_error, i);
21639 if (sw_if_index_set == 0)
21641 errmsg ("missing interface name or sw_if_index");
21646 errmsg ("input location must be specified");
21650 M (QOS_RECORD_ENABLE_DISABLE, mp);
21652 mp->sw_if_index = ntohl (sw_if_index);
21653 mp->input_source = qs;
21654 mp->enable = enable;
21663 q_or_quit (vat_main_t * vam)
21665 #if VPP_API_TEST_BUILTIN == 0
21666 longjmp (vam->jump_buf, 1);
21668 return 0; /* not so much */
21672 q (vat_main_t * vam)
21674 return q_or_quit (vam);
21678 quit (vat_main_t * vam)
21680 return q_or_quit (vam);
21684 comment (vat_main_t * vam)
21690 statseg (vat_main_t * vam)
21692 ssvm_private_t *ssvmp = &vam->stat_segment;
21693 ssvm_shared_header_t *shared_header = ssvmp->sh;
21694 vlib_counter_t **counters;
21695 u64 thread0_index1_packets;
21696 u64 thread0_index1_bytes;
21697 f64 vector_rate, input_rate;
21700 uword *counter_vector_by_name;
21701 if (vam->stat_segment_lockp == 0)
21703 errmsg ("Stat segment not mapped...");
21707 /* look up "/if/rx for sw_if_index 1 as a test */
21709 clib_spinlock_lock (vam->stat_segment_lockp);
21711 counter_vector_by_name = (uword *) shared_header->opaque[1];
21713 p = hash_get_mem (counter_vector_by_name, "/if/rx");
21716 clib_spinlock_unlock (vam->stat_segment_lockp);
21717 errmsg ("/if/tx not found?");
21721 /* Fish per-thread vector of combined counters from shared memory */
21722 counters = (vlib_counter_t **) p[0];
21724 if (vec_len (counters[0]) < 2)
21726 clib_spinlock_unlock (vam->stat_segment_lockp);
21727 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
21731 /* Read thread 0 sw_if_index 1 counter */
21732 thread0_index1_packets = counters[0][1].packets;
21733 thread0_index1_bytes = counters[0][1].bytes;
21735 p = hash_get_mem (counter_vector_by_name, "vector_rate");
21738 clib_spinlock_unlock (vam->stat_segment_lockp);
21739 errmsg ("vector_rate not found?");
21743 vector_rate = *(f64 *) (p[0]);
21744 p = hash_get_mem (counter_vector_by_name, "input_rate");
21747 clib_spinlock_unlock (vam->stat_segment_lockp);
21748 errmsg ("input_rate not found?");
21751 input_rate = *(f64 *) (p[0]);
21753 clib_spinlock_unlock (vam->stat_segment_lockp);
21755 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
21756 vector_rate, input_rate);
21757 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
21758 thread0_index1_packets, thread0_index1_bytes);
21764 cmd_cmp (void *a1, void *a2)
21769 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
21773 help (vat_main_t * vam)
21778 unformat_input_t *i = vam->input;
21781 if (unformat (i, "%s", &name))
21785 vec_add1 (name, 0);
21787 hs = hash_get_mem (vam->help_by_name, name);
21789 print (vam->ofp, "usage: %s %s", name, hs[0]);
21791 print (vam->ofp, "No such msg / command '%s'", name);
21796 print (vam->ofp, "Help is available for the following:");
21799 hash_foreach_pair (p, vam->function_by_name,
21801 vec_add1 (cmds, (u8 *)(p->key));
21805 vec_sort_with_function (cmds, cmd_cmp);
21807 for (j = 0; j < vec_len (cmds); j++)
21808 print (vam->ofp, "%s", cmds[j]);
21815 set (vat_main_t * vam)
21817 u8 *name = 0, *value = 0;
21818 unformat_input_t *i = vam->input;
21820 if (unformat (i, "%s", &name))
21822 /* The input buffer is a vector, not a string. */
21823 value = vec_dup (i->buffer);
21824 vec_delete (value, i->index, 0);
21825 /* Almost certainly has a trailing newline */
21826 if (value[vec_len (value) - 1] == '\n')
21827 value[vec_len (value) - 1] = 0;
21828 /* Make sure it's a proper string, one way or the other */
21829 vec_add1 (value, 0);
21830 (void) clib_macro_set_value (&vam->macro_main,
21831 (char *) name, (char *) value);
21834 errmsg ("usage: set <name> <value>");
21842 unset (vat_main_t * vam)
21846 if (unformat (vam->input, "%s", &name))
21847 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
21848 errmsg ("unset: %s wasn't set", name);
21861 macro_sort_cmp (void *a1, void *a2)
21863 macro_sort_t *s1 = a1;
21864 macro_sort_t *s2 = a2;
21866 return strcmp ((char *) (s1->name), (char *) (s2->name));
21870 dump_macro_table (vat_main_t * vam)
21872 macro_sort_t *sort_me = 0, *sm;
21877 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
21879 vec_add2 (sort_me, sm, 1);
21880 sm->name = (u8 *)(p->key);
21881 sm->value = (u8 *) (p->value[0]);
21885 vec_sort_with_function (sort_me, macro_sort_cmp);
21887 if (vec_len (sort_me))
21888 print (vam->ofp, "%-15s%s", "Name", "Value");
21890 print (vam->ofp, "The macro table is empty...");
21892 for (i = 0; i < vec_len (sort_me); i++)
21893 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
21898 dump_node_table (vat_main_t * vam)
21901 vlib_node_t *node, *next_node;
21903 if (vec_len (vam->graph_nodes) == 0)
21905 print (vam->ofp, "Node table empty, issue get_node_graph...");
21909 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
21911 node = vam->graph_nodes[0][i];
21912 print (vam->ofp, "[%d] %s", i, node->name);
21913 for (j = 0; j < vec_len (node->next_nodes); j++)
21915 if (node->next_nodes[j] != ~0)
21917 next_node = vam->graph_nodes[0][node->next_nodes[j]];
21918 print (vam->ofp, " [%d] %s", j, next_node->name);
21926 value_sort_cmp (void *a1, void *a2)
21928 name_sort_t *n1 = a1;
21929 name_sort_t *n2 = a2;
21931 if (n1->value < n2->value)
21933 if (n1->value > n2->value)
21940 dump_msg_api_table (vat_main_t * vam)
21942 api_main_t *am = &api_main;
21943 name_sort_t *nses = 0, *ns;
21948 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
21950 vec_add2 (nses, ns, 1);
21951 ns->name = (u8 *)(hp->key);
21952 ns->value = (u32) hp->value[0];
21956 vec_sort_with_function (nses, value_sort_cmp);
21958 for (i = 0; i < vec_len (nses); i++)
21959 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
21965 get_msg_id (vat_main_t * vam)
21970 if (unformat (vam->input, "%s", &name_and_crc))
21972 message_index = vl_msg_api_get_msg_index (name_and_crc);
21973 if (message_index == ~0)
21975 print (vam->ofp, " '%s' not found", name_and_crc);
21978 print (vam->ofp, " '%s' has message index %d",
21979 name_and_crc, message_index);
21982 errmsg ("name_and_crc required...");
21987 search_node_table (vat_main_t * vam)
21989 unformat_input_t *line_input = vam->input;
21992 vlib_node_t *node, *next_node;
21995 if (vam->graph_node_index_by_name == 0)
21997 print (vam->ofp, "Node table empty, issue get_node_graph...");
22001 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22003 if (unformat (line_input, "%s", &node_to_find))
22005 vec_add1 (node_to_find, 0);
22006 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
22009 print (vam->ofp, "%s not found...", node_to_find);
22012 node = vam->graph_nodes[0][p[0]];
22013 print (vam->ofp, "[%d] %s", p[0], node->name);
22014 for (j = 0; j < vec_len (node->next_nodes); j++)
22016 if (node->next_nodes[j] != ~0)
22018 next_node = vam->graph_nodes[0][node->next_nodes[j]];
22019 print (vam->ofp, " [%d] %s", j, next_node->name);
22026 clib_warning ("parse error '%U'", format_unformat_error,
22032 vec_free (node_to_find);
22041 script (vat_main_t * vam)
22043 #if (VPP_API_TEST_BUILTIN==0)
22045 char *save_current_file;
22046 unformat_input_t save_input;
22047 jmp_buf save_jump_buf;
22048 u32 save_line_number;
22050 FILE *new_fp, *save_ifp;
22052 if (unformat (vam->input, "%s", &s))
22054 new_fp = fopen ((char *) s, "r");
22057 errmsg ("Couldn't open script file %s", s);
22064 errmsg ("Missing script name");
22068 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
22069 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
22070 save_ifp = vam->ifp;
22071 save_line_number = vam->input_line_number;
22072 save_current_file = (char *) vam->current_file;
22074 vam->input_line_number = 0;
22076 vam->current_file = s;
22079 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
22080 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
22081 vam->ifp = save_ifp;
22082 vam->input_line_number = save_line_number;
22083 vam->current_file = (u8 *) save_current_file;
22088 clib_warning ("use the exec command...");
22094 echo (vat_main_t * vam)
22096 print (vam->ofp, "%v", vam->input->buffer);
22100 /* List of API message constructors, CLI names map to api_xxx */
22101 #define foreach_vpe_api_msg \
22102 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
22103 _(sw_interface_dump,"") \
22104 _(sw_interface_set_flags, \
22105 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
22106 _(sw_interface_add_del_address, \
22107 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
22108 _(sw_interface_set_rx_mode, \
22109 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
22110 _(sw_interface_set_rx_placement, \
22111 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
22112 _(sw_interface_rx_placement_dump, \
22113 "[<intfc> | sw_if_index <id>]") \
22114 _(sw_interface_set_table, \
22115 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
22116 _(sw_interface_set_mpls_enable, \
22117 "<intfc> | sw_if_index [disable | dis]") \
22118 _(sw_interface_set_vpath, \
22119 "<intfc> | sw_if_index <id> enable | disable") \
22120 _(sw_interface_set_vxlan_bypass, \
22121 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
22122 _(sw_interface_set_geneve_bypass, \
22123 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
22124 _(sw_interface_set_l2_xconnect, \
22125 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22126 "enable | disable") \
22127 _(sw_interface_set_l2_bridge, \
22128 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
22129 "[shg <split-horizon-group>] [bvi]\n" \
22130 "enable | disable") \
22131 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
22132 _(bridge_domain_add_del, \
22133 "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") \
22134 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
22136 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
22137 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
22138 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
22140 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
22142 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
22144 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
22146 "<vpp-if-name> | sw_if_index <id>") \
22147 _(sw_interface_tap_v2_dump, "") \
22148 _(virtio_pci_create, \
22149 "pci-addr <pci-address> [use_random_mac | hw-addr <mac-addr>] [features <hex-value>] [gso-enabled]") \
22150 _(virtio_pci_delete, \
22151 "<vpp-if-name> | sw_if_index <id>") \
22152 _(sw_interface_virtio_pci_dump, "") \
22154 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
22155 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \
22158 "<vpp-if-name> | sw_if_index <id>") \
22160 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
22161 _(bond_detach_slave, \
22162 "sw_if_index <n>") \
22163 _(sw_interface_bond_dump, "") \
22164 _(sw_interface_slave_dump, \
22165 "<vpp-if-name> | sw_if_index <id>") \
22166 _(ip_table_add_del, \
22167 "table <n> [ipv6] [add | del]\n") \
22168 _(ip_add_del_route, \
22169 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
22170 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
22171 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
22172 "[multipath] [count <n>] [del]") \
22173 _(ip_mroute_add_del, \
22174 "<src> <grp>/<mask> [table-id <n>]\n" \
22175 "[<intfc> | sw_if_index <id>] [local] [del]") \
22176 _(mpls_table_add_del, \
22177 "table <n> [add | del]\n") \
22178 _(mpls_route_add_del, \
22179 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
22180 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
22181 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
22182 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
22183 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
22184 "[count <n>] [del]") \
22185 _(mpls_ip_bind_unbind, \
22186 "<label> <addr/len>") \
22187 _(mpls_tunnel_add_del, \
22188 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
22189 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
22190 "[l2-only] [out-label <n>]") \
22191 _(sr_mpls_policy_add, \
22192 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
22193 _(sr_mpls_policy_del, \
22195 _(bier_table_add_del, \
22196 "<label> <sub-domain> <set> <bsl> [del]") \
22197 _(bier_route_add_del, \
22198 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
22199 "[<intfc> | sw_if_index <id>]" \
22200 "[weight <n>] [del] [multipath]") \
22201 _(proxy_arp_add_del, \
22202 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
22203 _(proxy_arp_intfc_enable_disable, \
22204 "<intfc> | sw_if_index <id> enable | disable") \
22205 _(sw_interface_set_unnumbered, \
22206 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
22207 _(ip_neighbor_add_del, \
22208 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
22209 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
22210 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
22211 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
22212 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
22213 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
22214 "[outer_vlan_id_any][inner_vlan_id_any]") \
22215 _(reset_fib, "vrf <n> [ipv6]") \
22216 _(dhcp_proxy_config, \
22217 "svr <v46-address> src <v46-address>\n" \
22218 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
22219 _(dhcp_proxy_set_vss, \
22220 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
22221 _(dhcp_proxy_dump, "ip6") \
22222 _(dhcp_client_config, \
22223 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
22224 _(set_ip_flow_hash, \
22225 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
22226 _(sw_interface_ip6_enable_disable, \
22227 "<intfc> | sw_if_index <id> enable | disable") \
22228 _(ip6nd_proxy_add_del, \
22229 "<intfc> | sw_if_index <id> <ip6-address>") \
22230 _(ip6nd_proxy_dump, "") \
22231 _(sw_interface_ip6nd_ra_prefix, \
22232 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
22233 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
22234 "[nolink] [isno]") \
22235 _(sw_interface_ip6nd_ra_config, \
22236 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
22237 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
22238 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
22239 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
22240 _(l2_patch_add_del, \
22241 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22242 "enable | disable") \
22243 _(sr_localsid_add_del, \
22244 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
22245 "fib-table <num> (end.psp) sw_if_index <num>") \
22246 _(classify_add_del_table, \
22247 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
22248 " [del] [del-chain] mask <mask-value>\n" \
22249 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
22250 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
22251 _(classify_add_del_session, \
22252 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
22253 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
22254 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
22255 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
22256 _(classify_set_interface_ip_table, \
22257 "<intfc> | sw_if_index <nn> table <nn>") \
22258 _(classify_set_interface_l2_tables, \
22259 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22260 " [other-table <nn>]") \
22261 _(get_node_index, "node <node-name") \
22262 _(add_node_next, "node <node-name> next <next-node-name>") \
22263 _(l2tpv3_create_tunnel, \
22264 "client_address <ip6-addr> our_address <ip6-addr>\n" \
22265 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
22266 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
22267 _(l2tpv3_set_tunnel_cookies, \
22268 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
22269 "[new_remote_cookie <nn>]\n") \
22270 _(l2tpv3_interface_enable_disable, \
22271 "<intfc> | sw_if_index <nn> enable | disable") \
22272 _(l2tpv3_set_lookup_key, \
22273 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
22274 _(sw_if_l2tpv3_tunnel_dump, "") \
22275 _(vxlan_offload_rx, \
22276 "hw { <interface name> | hw_if_index <nn>} " \
22277 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
22278 _(vxlan_add_del_tunnel, \
22279 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
22280 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
22281 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
22282 _(geneve_add_del_tunnel, \
22283 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
22284 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22285 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
22286 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22287 _(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22288 _(gre_tunnel_add_del, \
22289 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
22290 "[teb | erspan <session-id>] [del]") \
22291 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22292 _(l2_fib_clear_table, "") \
22293 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
22294 _(l2_interface_vlan_tag_rewrite, \
22295 "<intfc> | sw_if_index <nn> \n" \
22296 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
22297 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
22298 _(create_vhost_user_if, \
22299 "socket <filename> [server] [renumber <dev_instance>] " \
22300 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
22301 "[mac <mac_address>]") \
22302 _(modify_vhost_user_if, \
22303 "<intfc> | sw_if_index <nn> socket <filename>\n" \
22304 "[server] [renumber <dev_instance>]") \
22305 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
22306 _(sw_interface_vhost_user_dump, "") \
22307 _(show_version, "") \
22308 _(show_threads, "") \
22309 _(vxlan_gpe_add_del_tunnel, \
22310 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
22311 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22312 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
22313 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
22314 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22315 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
22316 _(interface_name_renumber, \
22317 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
22318 _(input_acl_set_interface, \
22319 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22320 " [l2-table <nn>] [del]") \
22321 _(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
22322 _(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
22323 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
22324 _(want_ip4_arp_events, "address <ip4-address> [del]") \
22325 _(want_ip6_nd_events, "address <ip6-address> [del]") \
22326 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
22327 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
22328 _(ip_dump, "ipv4 | ipv6") \
22329 _(ipsec_spd_add_del, "spd_id <n> [del]") \
22330 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
22332 _(ipsec_sad_entry_add_del, "sad_id <n> spi <n> crypto_alg <alg>\n" \
22333 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
22334 " integ_alg <alg> integ_key <hex>") \
22335 _(ipsec_spd_entry_add_del, "spd_id <n> priority <n> action <action>\n" \
22336 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
22337 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
22338 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
22339 _(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
22340 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
22341 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
22342 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
22343 " [instance <n>]") \
22344 _(ipsec_sa_dump, "[sa_id <n>]") \
22345 _(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
22346 _(delete_loopback,"sw_if_index <nn>") \
22347 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
22348 _(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
22349 _(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
22350 _(want_interface_events, "enable|disable") \
22351 _(get_first_msg_id, "client <name>") \
22352 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
22353 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
22354 "fib-id <nn> [ip4][ip6][default]") \
22355 _(get_node_graph, " ") \
22356 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
22357 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
22358 _(ioam_disable, "") \
22359 _(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
22360 " sw_if_index <sw_if_index> p <priority> " \
22361 "w <weight>] [del]") \
22362 _(one_add_del_locator, "locator-set <locator_name> " \
22363 "iface <intf> | sw_if_index <sw_if_index> " \
22364 "p <priority> w <weight> [del]") \
22365 _(one_add_del_local_eid,"vni <vni> eid " \
22366 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22367 "locator-set <locator_name> [del]" \
22368 "[key-id sha1|sha256 secret-key <secret-key>]")\
22369 _(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
22370 _(one_add_del_map_server, "<ip4|6-addr> [del]") \
22371 _(one_enable_disable, "enable|disable") \
22372 _(one_map_register_enable_disable, "enable|disable") \
22373 _(one_map_register_fallback_threshold, "<value>") \
22374 _(one_rloc_probe_enable_disable, "enable|disable") \
22375 _(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22377 "rloc <locator> p <prio> " \
22378 "w <weight> [rloc <loc> ... ] " \
22379 "action <action> [del-all]") \
22380 _(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22382 _(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
22383 _(one_use_petr, "ip-address> | disable") \
22384 _(one_map_request_mode, "src-dst|dst-only") \
22385 _(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22386 _(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22387 _(one_locator_set_dump, "[local | remote]") \
22388 _(one_locator_dump, "ls_index <index> | ls_name <name>") \
22389 _(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22390 "[local] | [remote]") \
22391 _(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
22392 _(one_ndp_bd_get, "") \
22393 _(one_ndp_entries_get, "bd <bridge-domain>") \
22394 _(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
22395 _(one_l2_arp_bd_get, "") \
22396 _(one_l2_arp_entries_get, "bd <bridge-domain>") \
22397 _(one_stats_enable_disable, "enable|disable") \
22398 _(show_one_stats_enable_disable, "") \
22399 _(one_eid_table_vni_dump, "") \
22400 _(one_eid_table_map_dump, "l2|l3") \
22401 _(one_map_resolver_dump, "") \
22402 _(one_map_server_dump, "") \
22403 _(one_adjacencies_get, "vni <vni>") \
22404 _(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
22405 _(show_one_rloc_probe_state, "") \
22406 _(show_one_map_register_state, "") \
22407 _(show_one_status, "") \
22408 _(one_stats_dump, "") \
22409 _(one_stats_flush, "") \
22410 _(one_get_map_request_itr_rlocs, "") \
22411 _(one_map_register_set_ttl, "<ttl>") \
22412 _(one_set_transport_protocol, "udp|api") \
22413 _(one_get_transport_protocol, "") \
22414 _(one_enable_disable_xtr_mode, "enable|disable") \
22415 _(one_show_xtr_mode, "") \
22416 _(one_enable_disable_pitr_mode, "enable|disable") \
22417 _(one_show_pitr_mode, "") \
22418 _(one_enable_disable_petr_mode, "enable|disable") \
22419 _(one_show_petr_mode, "") \
22420 _(show_one_nsh_mapping, "") \
22421 _(show_one_pitr, "") \
22422 _(show_one_use_petr, "") \
22423 _(show_one_map_request_mode, "") \
22424 _(show_one_map_register_ttl, "") \
22425 _(show_one_map_register_fallback_threshold, "") \
22426 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
22427 " sw_if_index <sw_if_index> p <priority> " \
22428 "w <weight>] [del]") \
22429 _(lisp_add_del_locator, "locator-set <locator_name> " \
22430 "iface <intf> | sw_if_index <sw_if_index> " \
22431 "p <priority> w <weight> [del]") \
22432 _(lisp_add_del_local_eid,"vni <vni> eid " \
22433 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22434 "locator-set <locator_name> [del]" \
22435 "[key-id sha1|sha256 secret-key <secret-key>]") \
22436 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
22437 _(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
22438 _(lisp_enable_disable, "enable|disable") \
22439 _(lisp_map_register_enable_disable, "enable|disable") \
22440 _(lisp_rloc_probe_enable_disable, "enable|disable") \
22441 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22443 "rloc <locator> p <prio> " \
22444 "w <weight> [rloc <loc> ... ] " \
22445 "action <action> [del-all]") \
22446 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22448 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
22449 _(lisp_use_petr, "<ip-address> | disable") \
22450 _(lisp_map_request_mode, "src-dst|dst-only") \
22451 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22452 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22453 _(lisp_locator_set_dump, "[local | remote]") \
22454 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
22455 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22456 "[local] | [remote]") \
22457 _(lisp_eid_table_vni_dump, "") \
22458 _(lisp_eid_table_map_dump, "l2|l3") \
22459 _(lisp_map_resolver_dump, "") \
22460 _(lisp_map_server_dump, "") \
22461 _(lisp_adjacencies_get, "vni <vni>") \
22462 _(gpe_fwd_entry_vnis_get, "") \
22463 _(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
22464 _(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
22465 "[table <table-id>]") \
22466 _(lisp_gpe_fwd_entries_get, "vni <vni>") \
22467 _(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
22468 _(gpe_set_encap_mode, "lisp|vxlan") \
22469 _(gpe_get_encap_mode, "") \
22470 _(lisp_gpe_add_del_iface, "up|down") \
22471 _(lisp_gpe_enable_disable, "enable|disable") \
22472 _(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
22473 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
22474 _(show_lisp_rloc_probe_state, "") \
22475 _(show_lisp_map_register_state, "") \
22476 _(show_lisp_status, "") \
22477 _(lisp_get_map_request_itr_rlocs, "") \
22478 _(show_lisp_pitr, "") \
22479 _(show_lisp_use_petr, "") \
22480 _(show_lisp_map_request_mode, "") \
22481 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
22482 _(af_packet_delete, "name <host interface name>") \
22483 _(af_packet_dump, "") \
22484 _(policer_add_del, "name <policer name> <params> [del]") \
22485 _(policer_dump, "[name <policer name>]") \
22486 _(policer_classify_set_interface, \
22487 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22488 " [l2-table <nn>] [del]") \
22489 _(policer_classify_dump, "type [ip4|ip6|l2]") \
22490 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
22491 "[master|slave]") \
22492 _(netmap_delete, "name <interface name>") \
22493 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
22494 _(mpls_fib_dump, "") \
22495 _(classify_table_ids, "") \
22496 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
22497 _(classify_table_info, "table_id <nn>") \
22498 _(classify_session_dump, "table_id <nn>") \
22499 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
22500 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
22501 "[template_interval <nn>] [udp_checksum]") \
22502 _(ipfix_exporter_dump, "") \
22503 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
22504 _(ipfix_classify_stream_dump, "") \
22505 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
22506 _(ipfix_classify_table_dump, "") \
22507 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
22508 _(sw_interface_span_dump, "[l2]") \
22509 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
22510 _(pg_create_interface, "if_id <nn>") \
22511 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
22512 _(pg_enable_disable, "[stream <id>] disable") \
22513 _(ip_source_and_port_range_check_add_del, \
22514 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
22515 _(ip_source_and_port_range_check_interface_add_del, \
22516 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
22517 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
22518 _(ipsec_gre_tunnel_add_del, \
22519 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
22520 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
22521 _(delete_subif,"<intfc> | sw_if_index <nn>") \
22522 _(l2_interface_pbb_tag_rewrite, \
22523 "<intfc> | sw_if_index <nn> \n" \
22524 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
22525 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
22526 _(set_punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
22527 _(flow_classify_set_interface, \
22528 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
22529 _(flow_classify_dump, "type [ip4|ip6]") \
22530 _(ip_fib_dump, "") \
22531 _(ip_mfib_dump, "") \
22532 _(ip6_fib_dump, "") \
22533 _(ip6_mfib_dump, "") \
22534 _(feature_enable_disable, "arc_name <arc_name> " \
22535 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
22536 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
22538 _(l2_xconnect_dump, "") \
22539 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
22540 _(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
22541 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
22542 _(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
22543 _(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
22544 _(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
22545 _(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
22546 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
22547 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
22548 _(sock_init_shm, "size <nnn>") \
22549 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
22550 _(dns_enable_disable, "[enable][disable]") \
22551 _(dns_name_server_add_del, "<ip-address> [del]") \
22552 _(dns_resolve_name, "<hostname>") \
22553 _(dns_resolve_ip, "<ip4|ip6>") \
22554 _(dns_name_server_add_del, "<ip-address> [del]") \
22555 _(dns_resolve_name, "<hostname>") \
22556 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
22557 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
22558 _(session_rules_dump, "") \
22559 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
22560 _(output_acl_set_interface, \
22561 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22562 " [l2-table <nn>] [del]") \
22563 _(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
22565 /* List of command functions, CLI names map directly to functions */
22566 #define foreach_cli_function \
22567 _(comment, "usage: comment <ignore-rest-of-line>") \
22568 _(dump_interface_table, "usage: dump_interface_table") \
22569 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
22570 _(dump_ipv4_table, "usage: dump_ipv4_table") \
22571 _(dump_ipv6_table, "usage: dump_ipv6_table") \
22572 _(dump_macro_table, "usage: dump_macro_table ") \
22573 _(dump_node_table, "usage: dump_node_table") \
22574 _(dump_msg_api_table, "usage: dump_msg_api_table") \
22575 _(get_msg_id, "usage: get_msg_id name_and_crc") \
22576 _(echo, "usage: echo <message>") \
22577 _(exec, "usage: exec <vpe-debug-CLI-command>") \
22578 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
22579 _(help, "usage: help") \
22580 _(q, "usage: quit") \
22581 _(quit, "usage: quit") \
22582 _(search_node_table, "usage: search_node_table <name>...") \
22583 _(set, "usage: set <variable-name> <value>") \
22584 _(script, "usage: script <file-name>") \
22585 _(statseg, "usage: statseg"); \
22586 _(unset, "usage: unset <variable-name>")
22589 static void vl_api_##n##_t_handler_uni \
22590 (vl_api_##n##_t * mp) \
22592 vat_main_t * vam = &vat_main; \
22593 if (vam->json_output) { \
22594 vl_api_##n##_t_handler_json(mp); \
22596 vl_api_##n##_t_handler(mp); \
22599 foreach_vpe_api_reply_msg;
22600 #if VPP_API_TEST_BUILTIN == 0
22601 foreach_standalone_reply_msg;
22606 vat_api_hookup (vat_main_t * vam)
22609 vl_msg_api_set_handlers(VL_API_##N, #n, \
22610 vl_api_##n##_t_handler_uni, \
22612 vl_api_##n##_t_endian, \
22613 vl_api_##n##_t_print, \
22614 sizeof(vl_api_##n##_t), 1);
22615 foreach_vpe_api_reply_msg;
22616 #if VPP_API_TEST_BUILTIN == 0
22617 foreach_standalone_reply_msg;
22621 #if (VPP_API_TEST_BUILTIN==0)
22622 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
22624 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
22626 vam->function_by_name = hash_create_string (0, sizeof (uword));
22628 vam->help_by_name = hash_create_string (0, sizeof (uword));
22631 /* API messages we can send */
22632 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
22633 foreach_vpe_api_msg;
22637 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22638 foreach_vpe_api_msg;
22641 /* CLI functions */
22642 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
22643 foreach_cli_function;
22647 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22648 foreach_cli_function;
22652 #if VPP_API_TEST_BUILTIN
22653 static clib_error_t *
22654 vat_api_hookup_shim (vlib_main_t * vm)
22656 vat_api_hookup (&vat_main);
22660 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
22664 * fd.io coding-style-patch-verification: ON
22667 * eval: (c-set-style "gnu")