2 *------------------------------------------------------------------
5 * Copyright (c) 2014-2020 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 <vlib/pci/pci.h>
22 #include <vpp/api/types.h>
23 #include <vppinfra/socket.h>
24 #include <vlibapi/api.h>
25 #include <vlibmemory/api.h>
26 #include <vnet/ip/ip.h>
27 #include <vnet/ip-neighbor/ip_neighbor.h>
28 #include <vnet/ip/ip_types_api.h>
29 #include <vnet/l2/l2_input.h>
30 #include <vnet/udp/udp_local.h>
32 #include <vpp/api/vpe_msg_enum.h>
33 #include <vnet/l2/l2_classify.h>
34 #include <vnet/l2/l2_vtr.h>
35 #include <vnet/classify/in_out_acl.h>
36 #include <vnet/classify/policer_classify.h>
37 #include <vnet/classify/flow_classify.h>
38 #include <vnet/mpls/mpls.h>
39 #include <vnet/ipsec/ipsec.h>
41 #include <vnet/ip/ip6_hop_by_hop.h>
42 #include <vnet/ip/ip_source_and_port_range_check.h>
43 #include <vnet/policer/xlate.h>
44 #include <vnet/span/span.h>
45 #include <vnet/policer/policer.h>
46 #include <vnet/policer/police.h>
47 #include <vnet/mfib/mfib_types.h>
48 #include <vnet/bonding/node.h>
49 #include <vnet/qos/qos_types.h>
50 #include <vnet/ethernet/ethernet_types_api.h>
51 #include <vnet/ip/ip_types_api.h>
52 #include "vat/json_format.h"
53 #include <vnet/ip/ip_types_api.h>
54 #include <vnet/ethernet/ethernet_types_api.h>
59 #define vl_typedefs /* define message structures */
60 #include <vpp/api/vpe_all_api_h.h>
63 /* declare message handlers for each api */
65 #define vl_endianfun /* define message structures */
66 #include <vpp/api/vpe_all_api_h.h>
69 /* instantiate all the print functions we know about */
70 #if VPP_API_TEST_BUILTIN == 0
71 #define vl_print(handle, ...)
73 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
76 #include <vpp/api/vpe_all_api_h.h>
79 #define __plugin_msg_base 0
80 #include <vlibapi/vat_helper_macros.h>
82 void vl_api_set_elog_main (elog_main_t * m);
83 int vl_api_set_elog_trace_api_messages (int enable);
85 #if VPP_API_TEST_BUILTIN == 0
95 vat_socket_connect (vat_main_t * vam)
98 api_main_t *am = vlibapi_get_main ();
99 vam->socket_client_main = &socket_client_main;
100 if ((rv = vl_socket_client_connect ((char *) vam->socket_name,
102 0 /* default socket rx, tx buffer */ )))
105 /* vpp expects the client index in network order */
106 vam->my_client_index = htonl (socket_client_main.client_index);
107 am->my_client_index = vam->my_client_index;
110 #else /* vpp built-in case, we don't do sockets... */
112 vat_socket_connect (vat_main_t * vam)
118 vl_socket_client_read (int wait)
124 vl_socket_client_write ()
130 vl_socket_client_msg_alloc (int nbytes)
138 vat_time_now (vat_main_t * vam)
140 #if VPP_API_TEST_BUILTIN
141 return vlib_time_now (vam->vlib_main);
143 return clib_time_now (&vam->clib_time);
148 errmsg (char *fmt, ...)
150 vat_main_t *vam = &vat_main;
155 s = va_format (0, fmt, &va);
160 #if VPP_API_TEST_BUILTIN
161 vlib_cli_output (vam->vlib_main, (char *) s);
164 if (vam->ifp != stdin)
165 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
166 vam->input_line_number);
168 fformat (vam->ofp, "%s\n", (char *) s);
176 #if VPP_API_TEST_BUILTIN == 0
178 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
180 vat_main_t *vam = va_arg (*args, vat_main_t *);
181 u32 *result = va_arg (*args, u32 *);
185 if (!unformat (input, "%s", &if_name))
188 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
195 /* Parse an IP4 address %d.%d.%d.%d. */
197 unformat_ip4_address (unformat_input_t * input, va_list * args)
199 u8 *result = va_arg (*args, u8 *);
202 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
205 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
217 unformat_ethernet_address (unformat_input_t * input, va_list * args)
219 u8 *result = va_arg (*args, u8 *);
222 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
223 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
227 for (i = 0; i < 6; i++)
228 if (a[i] >= (1 << 8))
231 for (i = 0; i < 6; i++)
237 /* Returns ethernet type as an int in host byte order. */
239 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
242 u16 *result = va_arg (*args, u16 *);
246 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
248 if (type >= (1 << 16))
256 /* Parse an IP46 address. */
258 unformat_ip46_address (unformat_input_t * input, va_list * args)
260 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
261 ip46_type_t type = va_arg (*args, ip46_type_t);
262 if ((type != IP46_TYPE_IP6) &&
263 unformat (input, "%U", unformat_ip4_address, &ip46->ip4))
265 ip46_address_mask_ip4 (ip46);
268 else if ((type != IP46_TYPE_IP4) &&
269 unformat (input, "%U", unformat_ip6_address, &ip46->ip6))
276 /* Parse an IP6 address. */
278 unformat_ip6_address (unformat_input_t * input, va_list * args)
280 ip6_address_t *result = va_arg (*args, ip6_address_t *);
282 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
283 uword c, n_colon, double_colon_index;
285 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
286 double_colon_index = ARRAY_LEN (hex_quads);
287 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
290 if (c >= '0' && c <= '9')
292 else if (c >= 'a' && c <= 'f')
293 hex_digit = c + 10 - 'a';
294 else if (c >= 'A' && c <= 'F')
295 hex_digit = c + 10 - 'A';
296 else if (c == ':' && n_colon < 2)
300 unformat_put_input (input);
304 /* Too many hex quads. */
305 if (n_hex_quads >= ARRAY_LEN (hex_quads))
310 hex_quad = (hex_quad << 4) | hex_digit;
312 /* Hex quad must fit in 16 bits. */
313 if (n_hex_digits >= 4)
320 /* Save position of :: */
323 /* More than one :: ? */
324 if (double_colon_index < ARRAY_LEN (hex_quads))
326 double_colon_index = n_hex_quads;
329 if (n_colon > 0 && n_hex_digits > 0)
331 hex_quads[n_hex_quads++] = hex_quad;
337 if (n_hex_digits > 0)
338 hex_quads[n_hex_quads++] = hex_quad;
343 /* Expand :: to appropriate number of zero hex quads. */
344 if (double_colon_index < ARRAY_LEN (hex_quads))
346 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
348 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
349 hex_quads[n_zero + i] = hex_quads[i];
351 for (i = 0; i < n_zero; i++)
352 hex_quads[double_colon_index + i] = 0;
354 n_hex_quads = ARRAY_LEN (hex_quads);
357 /* Too few hex quads given. */
358 if (n_hex_quads < ARRAY_LEN (hex_quads))
361 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
362 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
369 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
371 u32 *r = va_arg (*args, u32 *);
374 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
375 foreach_ipsec_policy_action
383 format_ipsec_crypto_alg (u8 * s, va_list * args)
385 u32 i = va_arg (*args, u32);
390 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
391 foreach_ipsec_crypto_alg
394 return format (s, "unknown");
396 return format (s, "%s", t);
400 format_ipsec_integ_alg (u8 * s, va_list * args)
402 u32 i = va_arg (*args, u32);
407 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
408 foreach_ipsec_integ_alg
411 return format (s, "unknown");
413 return format (s, "%s", t);
416 #else /* VPP_API_TEST_BUILTIN == 1 */
418 api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
420 vat_main_t *vam __clib_unused = va_arg (*args, vat_main_t *);
421 vnet_main_t *vnm = vnet_get_main ();
422 u32 *result = va_arg (*args, u32 *);
424 return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result);
427 #endif /* VPP_API_TEST_BUILTIN */
429 #if (VPP_API_TEST_BUILTIN==0)
431 static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
432 static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
433 static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
434 static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
437 unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
439 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
440 mfib_itf_attribute_t attr;
443 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
445 if (unformat (input, mfib_itf_flag_long_names[attr]))
446 *iflags |= (1 << attr);
448 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
450 if (unformat (input, mfib_itf_flag_names[attr]))
451 *iflags |= (1 << attr);
454 return (old == *iflags ? 0 : 1);
458 unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
460 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
461 mfib_entry_attribute_t attr;
464 FOR_EACH_MFIB_ATTRIBUTE (attr)
466 if (unformat (input, mfib_flag_long_names[attr]))
467 *eflags |= (1 << attr);
469 FOR_EACH_MFIB_ATTRIBUTE (attr)
471 if (unformat (input, mfib_flag_names[attr]))
472 *eflags |= (1 << attr);
475 return (old == *eflags ? 0 : 1);
479 format_ip4_address (u8 * s, va_list * args)
481 u8 *a = va_arg (*args, u8 *);
482 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
486 format_ip6_address (u8 * s, va_list * args)
488 ip6_address_t *a = va_arg (*args, ip6_address_t *);
489 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
491 i_max_n_zero = ARRAY_LEN (a->as_u16);
493 i_first_zero = i_max_n_zero;
495 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
497 u32 is_zero = a->as_u16[i] == 0;
498 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
504 if ((!is_zero && n_zeros > max_n_zeros)
505 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
507 i_max_n_zero = i_first_zero;
508 max_n_zeros = n_zeros;
509 i_first_zero = ARRAY_LEN (a->as_u16);
514 last_double_colon = 0;
515 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
517 if (i == i_max_n_zero && max_n_zeros > 1)
519 s = format (s, "::");
520 i += max_n_zeros - 1;
521 last_double_colon = 1;
525 s = format (s, "%s%x",
526 (last_double_colon || i == 0) ? "" : ":",
527 clib_net_to_host_u16 (a->as_u16[i]));
528 last_double_colon = 0;
535 /* Format an IP46 address. */
537 format_ip46_address (u8 * s, va_list * args)
539 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
540 ip46_type_t type = va_arg (*args, ip46_type_t);
546 is_ip4 = ip46_address_is_ip4 (ip46);
557 format (s, "%U", format_ip4_address, &ip46->ip4) :
558 format (s, "%U", format_ip6_address, &ip46->ip6);
562 format_ethernet_address (u8 * s, va_list * args)
564 u8 *a = va_arg (*args, u8 *);
566 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
567 a[0], a[1], a[2], a[3], a[4], a[5]);
572 increment_v4_address (vl_api_ip4_address_t * i)
574 ip4_address_t *a = (ip4_address_t *) i;
577 v = ntohl (a->as_u32) + 1;
578 a->as_u32 = ntohl (v);
582 increment_v6_address (vl_api_ip6_address_t * i)
584 ip6_address_t *a = (ip6_address_t *) i;
587 v0 = clib_net_to_host_u64 (a->as_u64[0]);
588 v1 = clib_net_to_host_u64 (a->as_u64[1]);
593 a->as_u64[0] = clib_net_to_host_u64 (v0);
594 a->as_u64[1] = clib_net_to_host_u64 (v1);
598 increment_address (vl_api_address_t * a)
600 if (a->af == ADDRESS_IP4)
601 increment_v4_address (&a->un.ip4);
602 else if (a->af == ADDRESS_IP6)
603 increment_v6_address (&a->un.ip6);
607 set_ip4_address (vl_api_address_t * a, u32 v)
609 if (a->af == ADDRESS_IP4)
611 ip4_address_t *i = (ip4_address_t *) & a->un.ip4;
617 ip_set (ip46_address_t * dst, void *src, u8 is_ip4)
620 dst->ip4.as_u32 = ((ip4_address_t *) src)->as_u32;
622 clib_memcpy_fast (&dst->ip6, (ip6_address_t *) src,
623 sizeof (ip6_address_t));
627 increment_mac_address (u8 * mac)
629 u64 tmp = *((u64 *) mac);
630 tmp = clib_net_to_host_u64 (tmp);
631 tmp += 1 << 16; /* skip unused (least significant) octets */
632 tmp = clib_host_to_net_u64 (tmp);
634 clib_memcpy (mac, &tmp, 6);
638 vat_json_object_add_address (vat_json_node_t * node,
639 const char *str, const vl_api_address_t * addr)
641 if (ADDRESS_IP6 == addr->af)
645 clib_memcpy (&ip6, &addr->un.ip6, sizeof (ip6));
646 vat_json_object_add_ip6 (node, str, ip6);
652 clib_memcpy (&ip4, &addr->un.ip4, sizeof (ip4));
653 vat_json_object_add_ip4 (node, str, ip4);
658 vat_json_object_add_prefix (vat_json_node_t * node,
659 const vl_api_prefix_t * prefix)
661 vat_json_object_add_uint (node, "len", prefix->len);
662 vat_json_object_add_address (node, "address", &prefix->address);
665 static void vl_api_create_loopback_reply_t_handler
666 (vl_api_create_loopback_reply_t * mp)
668 vat_main_t *vam = &vat_main;
669 i32 retval = ntohl (mp->retval);
671 vam->retval = retval;
672 vam->regenerate_interface_table = 1;
673 vam->sw_if_index = ntohl (mp->sw_if_index);
674 vam->result_ready = 1;
677 static void vl_api_create_loopback_reply_t_handler_json
678 (vl_api_create_loopback_reply_t * mp)
680 vat_main_t *vam = &vat_main;
681 vat_json_node_t node;
683 vat_json_init_object (&node);
684 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
685 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
687 vat_json_print (vam->ofp, &node);
688 vat_json_free (&node);
689 vam->retval = ntohl (mp->retval);
690 vam->result_ready = 1;
693 static void vl_api_create_loopback_instance_reply_t_handler
694 (vl_api_create_loopback_instance_reply_t * mp)
696 vat_main_t *vam = &vat_main;
697 i32 retval = ntohl (mp->retval);
699 vam->retval = retval;
700 vam->regenerate_interface_table = 1;
701 vam->sw_if_index = ntohl (mp->sw_if_index);
702 vam->result_ready = 1;
705 static void vl_api_create_loopback_instance_reply_t_handler_json
706 (vl_api_create_loopback_instance_reply_t * mp)
708 vat_main_t *vam = &vat_main;
709 vat_json_node_t node;
711 vat_json_init_object (&node);
712 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
713 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
715 vat_json_print (vam->ofp, &node);
716 vat_json_free (&node);
717 vam->retval = ntohl (mp->retval);
718 vam->result_ready = 1;
721 static void vl_api_create_vlan_subif_reply_t_handler
722 (vl_api_create_vlan_subif_reply_t * mp)
724 vat_main_t *vam = &vat_main;
725 i32 retval = ntohl (mp->retval);
727 vam->retval = retval;
728 vam->regenerate_interface_table = 1;
729 vam->sw_if_index = ntohl (mp->sw_if_index);
730 vam->result_ready = 1;
733 static void vl_api_create_vlan_subif_reply_t_handler_json
734 (vl_api_create_vlan_subif_reply_t * mp)
736 vat_main_t *vam = &vat_main;
737 vat_json_node_t node;
739 vat_json_init_object (&node);
740 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
741 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
743 vat_json_print (vam->ofp, &node);
744 vat_json_free (&node);
746 vam->retval = ntohl (mp->retval);
747 vam->result_ready = 1;
750 static void vl_api_create_subif_reply_t_handler
751 (vl_api_create_subif_reply_t * mp)
753 vat_main_t *vam = &vat_main;
754 i32 retval = ntohl (mp->retval);
756 vam->retval = retval;
757 vam->regenerate_interface_table = 1;
758 vam->sw_if_index = ntohl (mp->sw_if_index);
759 vam->result_ready = 1;
762 static void vl_api_create_subif_reply_t_handler_json
763 (vl_api_create_subif_reply_t * mp)
765 vat_main_t *vam = &vat_main;
766 vat_json_node_t node;
768 vat_json_init_object (&node);
769 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
770 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
772 vat_json_print (vam->ofp, &node);
773 vat_json_free (&node);
775 vam->retval = ntohl (mp->retval);
776 vam->result_ready = 1;
779 static void vl_api_interface_name_renumber_reply_t_handler
780 (vl_api_interface_name_renumber_reply_t * mp)
782 vat_main_t *vam = &vat_main;
783 i32 retval = ntohl (mp->retval);
785 vam->retval = retval;
786 vam->regenerate_interface_table = 1;
787 vam->result_ready = 1;
790 static void vl_api_interface_name_renumber_reply_t_handler_json
791 (vl_api_interface_name_renumber_reply_t * mp)
793 vat_main_t *vam = &vat_main;
794 vat_json_node_t node;
796 vat_json_init_object (&node);
797 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
799 vat_json_print (vam->ofp, &node);
800 vat_json_free (&node);
802 vam->retval = ntohl (mp->retval);
803 vam->result_ready = 1;
807 * Special-case: build the interface table, maintain
808 * the next loopback sw_if_index vbl.
810 static void vl_api_sw_interface_details_t_handler
811 (vl_api_sw_interface_details_t * mp)
813 vat_main_t *vam = &vat_main;
814 u8 *s = format (0, "%s%c", mp->interface_name, 0);
816 hash_set_mem (vam->sw_if_index_by_interface_name, s,
817 ntohl (mp->sw_if_index));
819 /* In sub interface case, fill the sub interface table entry */
820 if (mp->sw_if_index != mp->sup_sw_if_index)
822 sw_interface_subif_t *sub = NULL;
824 vec_add2 (vam->sw_if_subif_table, sub, 1);
826 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
827 strncpy ((char *) sub->interface_name, (char *) s,
828 vec_len (sub->interface_name));
829 sub->sw_if_index = ntohl (mp->sw_if_index);
830 sub->sub_id = ntohl (mp->sub_id);
832 sub->raw_flags = ntohl (mp->sub_if_flags & SUB_IF_API_FLAG_MASK_VNET);
834 sub->sub_number_of_tags = mp->sub_number_of_tags;
835 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
836 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
838 /* vlan tag rewrite */
839 sub->vtr_op = ntohl (mp->vtr_op);
840 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
841 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
842 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
846 static void vl_api_sw_interface_details_t_handler_json
847 (vl_api_sw_interface_details_t * mp)
849 vat_main_t *vam = &vat_main;
850 vat_json_node_t *node = NULL;
852 if (VAT_JSON_ARRAY != vam->json_tree.type)
854 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
855 vat_json_init_array (&vam->json_tree);
857 node = vat_json_array_add (&vam->json_tree);
859 vat_json_init_object (node);
860 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
861 vat_json_object_add_uint (node, "sup_sw_if_index",
862 ntohl (mp->sup_sw_if_index));
863 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
864 sizeof (mp->l2_address));
865 vat_json_object_add_string_copy (node, "interface_name",
867 vat_json_object_add_string_copy (node, "interface_dev_type",
868 mp->interface_dev_type);
869 vat_json_object_add_uint (node, "flags", mp->flags);
870 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
871 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
872 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
873 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
874 vat_json_object_add_uint (node, "sub_number_of_tags",
875 mp->sub_number_of_tags);
876 vat_json_object_add_uint (node, "sub_outer_vlan_id",
877 ntohs (mp->sub_outer_vlan_id));
878 vat_json_object_add_uint (node, "sub_inner_vlan_id",
879 ntohs (mp->sub_inner_vlan_id));
880 vat_json_object_add_uint (node, "sub_if_flags", ntohl (mp->sub_if_flags));
881 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
882 vat_json_object_add_uint (node, "vtr_push_dot1q",
883 ntohl (mp->vtr_push_dot1q));
884 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
885 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
886 if (ntohl (mp->sub_if_flags) & SUB_IF_API_FLAG_DOT1AH)
888 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
890 format_ethernet_address,
892 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
894 format_ethernet_address,
896 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
897 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
901 #if VPP_API_TEST_BUILTIN == 0
902 static void vl_api_sw_interface_event_t_handler
903 (vl_api_sw_interface_event_t * mp)
905 vat_main_t *vam = &vat_main;
906 if (vam->interface_event_display)
907 errmsg ("interface flags: sw_if_index %d %s %s",
908 ntohl (mp->sw_if_index),
909 ((ntohl (mp->flags)) & IF_STATUS_API_FLAG_ADMIN_UP) ?
910 "admin-up" : "admin-down",
911 ((ntohl (mp->flags)) & IF_STATUS_API_FLAG_LINK_UP) ?
912 "link-up" : "link-down");
916 __clib_unused static void
917 vl_api_sw_interface_event_t_handler_json (vl_api_sw_interface_event_t * mp)
919 /* JSON output not supported */
923 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
925 vat_main_t *vam = &vat_main;
926 i32 retval = ntohl (mp->retval);
928 vam->retval = retval;
929 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
930 vam->result_ready = 1;
934 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
936 vat_main_t *vam = &vat_main;
937 vat_json_node_t node;
941 vat_json_init_object (&node);
942 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
943 vat_json_object_add_uint (&node, "reply_in_shmem",
944 ntohl (mp->reply_in_shmem));
945 /* Toss the shared-memory original... */
946 oldheap = vl_msg_push_heap ();
948 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
951 vl_msg_pop_heap (oldheap);
953 vat_json_print (vam->ofp, &node);
954 vat_json_free (&node);
956 vam->retval = ntohl (mp->retval);
957 vam->result_ready = 1;
961 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
963 vat_main_t *vam = &vat_main;
964 i32 retval = ntohl (mp->retval);
966 vec_reset_length (vam->cmd_reply);
968 vam->retval = retval;
970 vam->cmd_reply = vl_api_from_api_to_new_vec (mp, &mp->reply);
971 vam->result_ready = 1;
975 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
977 vat_main_t *vam = &vat_main;
978 vat_json_node_t node;
979 u8 *reply = 0; /* reply vector */
981 reply = vl_api_from_api_to_new_vec (mp, &mp->reply);
982 vec_reset_length (vam->cmd_reply);
984 vat_json_init_object (&node);
985 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
986 vat_json_object_add_string_copy (&node, "reply", reply);
988 vat_json_print (vam->ofp, &node);
989 vat_json_free (&node);
992 vam->retval = ntohl (mp->retval);
993 vam->result_ready = 1;
996 static void vl_api_get_node_index_reply_t_handler
997 (vl_api_get_node_index_reply_t * mp)
999 vat_main_t *vam = &vat_main;
1000 i32 retval = ntohl (mp->retval);
1001 if (vam->async_mode)
1003 vam->async_errors += (retval < 0);
1007 vam->retval = retval;
1009 errmsg ("node index %d", ntohl (mp->node_index));
1010 vam->result_ready = 1;
1014 static void vl_api_get_node_index_reply_t_handler_json
1015 (vl_api_get_node_index_reply_t * mp)
1017 vat_main_t *vam = &vat_main;
1018 vat_json_node_t node;
1020 vat_json_init_object (&node);
1021 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1022 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1024 vat_json_print (vam->ofp, &node);
1025 vat_json_free (&node);
1027 vam->retval = ntohl (mp->retval);
1028 vam->result_ready = 1;
1031 static void vl_api_get_next_index_reply_t_handler
1032 (vl_api_get_next_index_reply_t * mp)
1034 vat_main_t *vam = &vat_main;
1035 i32 retval = ntohl (mp->retval);
1036 if (vam->async_mode)
1038 vam->async_errors += (retval < 0);
1042 vam->retval = retval;
1044 errmsg ("next node index %d", ntohl (mp->next_index));
1045 vam->result_ready = 1;
1049 static void vl_api_get_next_index_reply_t_handler_json
1050 (vl_api_get_next_index_reply_t * mp)
1052 vat_main_t *vam = &vat_main;
1053 vat_json_node_t node;
1055 vat_json_init_object (&node);
1056 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1057 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1059 vat_json_print (vam->ofp, &node);
1060 vat_json_free (&node);
1062 vam->retval = ntohl (mp->retval);
1063 vam->result_ready = 1;
1066 static void vl_api_add_node_next_reply_t_handler
1067 (vl_api_add_node_next_reply_t * mp)
1069 vat_main_t *vam = &vat_main;
1070 i32 retval = ntohl (mp->retval);
1071 if (vam->async_mode)
1073 vam->async_errors += (retval < 0);
1077 vam->retval = retval;
1079 errmsg ("next index %d", ntohl (mp->next_index));
1080 vam->result_ready = 1;
1084 static void vl_api_add_node_next_reply_t_handler_json
1085 (vl_api_add_node_next_reply_t * mp)
1087 vat_main_t *vam = &vat_main;
1088 vat_json_node_t node;
1090 vat_json_init_object (&node);
1091 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1092 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1094 vat_json_print (vam->ofp, &node);
1095 vat_json_free (&node);
1097 vam->retval = ntohl (mp->retval);
1098 vam->result_ready = 1;
1101 static void vl_api_show_version_reply_t_handler
1102 (vl_api_show_version_reply_t * mp)
1104 vat_main_t *vam = &vat_main;
1105 i32 retval = ntohl (mp->retval);
1109 errmsg (" program: %s", mp->program);
1110 errmsg (" version: %s", mp->version);
1111 errmsg (" build date: %s", mp->build_date);
1112 errmsg ("build directory: %s", mp->build_directory);
1114 vam->retval = retval;
1115 vam->result_ready = 1;
1118 static void vl_api_show_version_reply_t_handler_json
1119 (vl_api_show_version_reply_t * mp)
1121 vat_main_t *vam = &vat_main;
1122 vat_json_node_t node;
1124 vat_json_init_object (&node);
1125 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1126 vat_json_object_add_string_copy (&node, "program", mp->program);
1127 vat_json_object_add_string_copy (&node, "version", mp->version);
1128 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1129 vat_json_object_add_string_copy (&node, "build_directory",
1130 mp->build_directory);
1132 vat_json_print (vam->ofp, &node);
1133 vat_json_free (&node);
1135 vam->retval = ntohl (mp->retval);
1136 vam->result_ready = 1;
1139 static void vl_api_show_threads_reply_t_handler
1140 (vl_api_show_threads_reply_t * mp)
1142 vat_main_t *vam = &vat_main;
1143 i32 retval = ntohl (mp->retval);
1147 count = ntohl (mp->count);
1149 for (i = 0; i < count; i++)
1151 "\n%-2d %-11s %-11s %-5d %-6d %-4d %-6d",
1152 ntohl (mp->thread_data[i].id), mp->thread_data[i].name,
1153 mp->thread_data[i].type, ntohl (mp->thread_data[i].pid),
1154 ntohl (mp->thread_data[i].cpu_id), ntohl (mp->thread_data[i].core),
1155 ntohl (mp->thread_data[i].cpu_socket));
1157 vam->retval = retval;
1158 vam->result_ready = 1;
1161 static void vl_api_show_threads_reply_t_handler_json
1162 (vl_api_show_threads_reply_t * mp)
1164 vat_main_t *vam = &vat_main;
1165 vat_json_node_t node;
1166 vl_api_thread_data_t *td;
1167 i32 retval = ntohl (mp->retval);
1171 count = ntohl (mp->count);
1173 vat_json_init_object (&node);
1174 vat_json_object_add_int (&node, "retval", retval);
1175 vat_json_object_add_uint (&node, "count", count);
1177 for (i = 0; i < count; i++)
1179 td = &mp->thread_data[i];
1180 vat_json_object_add_uint (&node, "id", ntohl (td->id));
1181 vat_json_object_add_string_copy (&node, "name", td->name);
1182 vat_json_object_add_string_copy (&node, "type", td->type);
1183 vat_json_object_add_uint (&node, "pid", ntohl (td->pid));
1184 vat_json_object_add_int (&node, "cpu_id", ntohl (td->cpu_id));
1185 vat_json_object_add_int (&node, "core", ntohl (td->id));
1186 vat_json_object_add_int (&node, "cpu_socket", ntohl (td->cpu_socket));
1189 vat_json_print (vam->ofp, &node);
1190 vat_json_free (&node);
1192 vam->retval = retval;
1193 vam->result_ready = 1;
1197 api_show_threads (vat_main_t * vam)
1199 vl_api_show_threads_t *mp;
1203 "\n%-2s %-11s %-11s %-5s %-6s %-4s %-6s",
1204 "ID", "Name", "Type", "LWP", "cpu_id", "Core", "Socket");
1206 M (SHOW_THREADS, mp);
1214 vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1216 u32 n_macs = ntohl (mp->n_macs);
1217 errmsg ("L2MAC event received with pid %d cl-idx %d for %d macs: \n",
1218 ntohl (mp->pid), mp->client_index, n_macs);
1220 for (i = 0; i < n_macs; i++)
1222 vl_api_mac_entry_t *mac = &mp->mac[i];
1223 errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
1224 i + 1, ntohl (mac->sw_if_index),
1225 format_ethernet_address, mac->mac_addr, mac->action);
1232 vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1234 /* JSON output not supported */
1237 #define vl_api_bridge_domain_details_t_endian vl_noop_handler
1238 #define vl_api_bridge_domain_details_t_print vl_noop_handler
1241 * Special-case: build the bridge domain table, maintain
1242 * the next bd id vbl.
1244 static void vl_api_bridge_domain_details_t_handler
1245 (vl_api_bridge_domain_details_t * mp)
1247 vat_main_t *vam = &vat_main;
1248 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1251 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-6s %-3s",
1252 " ID", "LRN", "FWD", "FLD", "BVI", "UU-FWD", "#IF");
1254 print (vam->ofp, "%3d %3d %3d %3d %3d %6d %3d",
1255 ntohl (mp->bd_id), mp->learn, mp->forward,
1256 mp->flood, ntohl (mp->bvi_sw_if_index),
1257 ntohl (mp->uu_fwd_sw_if_index), n_sw_ifs);
1261 vl_api_bridge_domain_sw_if_t *sw_ifs;
1262 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1265 sw_ifs = mp->sw_if_details;
1266 for (i = 0; i < n_sw_ifs; i++)
1272 sw_if_index = ntohl (sw_ifs->sw_if_index);
1275 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1277 if ((u32) p->value[0] == sw_if_index)
1279 sw_if_name = (u8 *)(p->key);
1284 print (vam->ofp, "%7d %3d %s", sw_if_index,
1285 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1286 "sw_if_index not found!");
1293 static void vl_api_bridge_domain_details_t_handler_json
1294 (vl_api_bridge_domain_details_t * mp)
1296 vat_main_t *vam = &vat_main;
1297 vat_json_node_t *node, *array = NULL;
1298 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1300 if (VAT_JSON_ARRAY != vam->json_tree.type)
1302 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1303 vat_json_init_array (&vam->json_tree);
1305 node = vat_json_array_add (&vam->json_tree);
1307 vat_json_init_object (node);
1308 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1309 vat_json_object_add_uint (node, "flood", mp->flood);
1310 vat_json_object_add_uint (node, "forward", mp->forward);
1311 vat_json_object_add_uint (node, "learn", mp->learn);
1312 vat_json_object_add_uint (node, "bvi_sw_if_index",
1313 ntohl (mp->bvi_sw_if_index));
1314 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
1315 array = vat_json_object_add (node, "sw_if");
1316 vat_json_init_array (array);
1322 vl_api_bridge_domain_sw_if_t *sw_ifs;
1325 sw_ifs = mp->sw_if_details;
1326 for (i = 0; i < n_sw_ifs; i++)
1328 node = vat_json_array_add (array);
1329 vat_json_init_object (node);
1330 vat_json_object_add_uint (node, "sw_if_index",
1331 ntohl (sw_ifs->sw_if_index));
1332 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1338 static void vl_api_control_ping_reply_t_handler
1339 (vl_api_control_ping_reply_t * mp)
1341 vat_main_t *vam = &vat_main;
1342 i32 retval = ntohl (mp->retval);
1343 if (vam->async_mode)
1345 vam->async_errors += (retval < 0);
1349 vam->retval = retval;
1350 vam->result_ready = 1;
1352 if (vam->socket_client_main)
1353 vam->socket_client_main->control_pings_outstanding--;
1356 static void vl_api_control_ping_reply_t_handler_json
1357 (vl_api_control_ping_reply_t * mp)
1359 vat_main_t *vam = &vat_main;
1360 i32 retval = ntohl (mp->retval);
1362 if (VAT_JSON_NONE != vam->json_tree.type)
1364 vat_json_print (vam->ofp, &vam->json_tree);
1365 vat_json_free (&vam->json_tree);
1366 vam->json_tree.type = VAT_JSON_NONE;
1371 vat_json_init_array (&vam->json_tree);
1372 vat_json_print (vam->ofp, &vam->json_tree);
1373 vam->json_tree.type = VAT_JSON_NONE;
1376 vam->retval = retval;
1377 vam->result_ready = 1;
1381 vl_api_bridge_domain_set_mac_age_reply_t_handler
1382 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1384 vat_main_t *vam = &vat_main;
1385 i32 retval = ntohl (mp->retval);
1386 if (vam->async_mode)
1388 vam->async_errors += (retval < 0);
1392 vam->retval = retval;
1393 vam->result_ready = 1;
1397 static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1398 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1400 vat_main_t *vam = &vat_main;
1401 vat_json_node_t node;
1403 vat_json_init_object (&node);
1404 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1406 vat_json_print (vam->ofp, &node);
1407 vat_json_free (&node);
1409 vam->retval = ntohl (mp->retval);
1410 vam->result_ready = 1;
1414 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1416 vat_main_t *vam = &vat_main;
1417 i32 retval = ntohl (mp->retval);
1418 if (vam->async_mode)
1420 vam->async_errors += (retval < 0);
1424 vam->retval = retval;
1425 vam->result_ready = 1;
1429 static void vl_api_l2_flags_reply_t_handler_json
1430 (vl_api_l2_flags_reply_t * mp)
1432 vat_main_t *vam = &vat_main;
1433 vat_json_node_t node;
1435 vat_json_init_object (&node);
1436 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1437 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1438 ntohl (mp->resulting_feature_bitmap));
1440 vat_json_print (vam->ofp, &node);
1441 vat_json_free (&node);
1443 vam->retval = ntohl (mp->retval);
1444 vam->result_ready = 1;
1447 static void vl_api_bridge_flags_reply_t_handler
1448 (vl_api_bridge_flags_reply_t * mp)
1450 vat_main_t *vam = &vat_main;
1451 i32 retval = ntohl (mp->retval);
1452 if (vam->async_mode)
1454 vam->async_errors += (retval < 0);
1458 vam->retval = retval;
1459 vam->result_ready = 1;
1463 static void vl_api_bridge_flags_reply_t_handler_json
1464 (vl_api_bridge_flags_reply_t * mp)
1466 vat_main_t *vam = &vat_main;
1467 vat_json_node_t node;
1469 vat_json_init_object (&node);
1470 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1471 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1472 ntohl (mp->resulting_feature_bitmap));
1474 vat_json_print (vam->ofp, &node);
1475 vat_json_free (&node);
1477 vam->retval = ntohl (mp->retval);
1478 vam->result_ready = 1;
1482 vl_api_virtio_pci_create_reply_t_handler (vl_api_virtio_pci_create_reply_t *
1485 vat_main_t *vam = &vat_main;
1486 i32 retval = ntohl (mp->retval);
1487 if (vam->async_mode)
1489 vam->async_errors += (retval < 0);
1493 vam->retval = retval;
1494 vam->sw_if_index = ntohl (mp->sw_if_index);
1495 vam->result_ready = 1;
1499 static void vl_api_virtio_pci_create_reply_t_handler_json
1500 (vl_api_virtio_pci_create_reply_t * mp)
1502 vat_main_t *vam = &vat_main;
1503 vat_json_node_t node;
1505 vat_json_init_object (&node);
1506 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1507 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1509 vat_json_print (vam->ofp, &node);
1510 vat_json_free (&node);
1512 vam->retval = ntohl (mp->retval);
1513 vam->result_ready = 1;
1518 vl_api_virtio_pci_create_v2_reply_t_handler
1519 (vl_api_virtio_pci_create_v2_reply_t * mp)
1521 vat_main_t *vam = &vat_main;
1522 i32 retval = ntohl (mp->retval);
1523 if (vam->async_mode)
1525 vam->async_errors += (retval < 0);
1529 vam->retval = retval;
1530 vam->sw_if_index = ntohl (mp->sw_if_index);
1531 vam->result_ready = 1;
1535 static void vl_api_virtio_pci_create_v2_reply_t_handler_json
1536 (vl_api_virtio_pci_create_v2_reply_t * mp)
1538 vat_main_t *vam = &vat_main;
1539 vat_json_node_t node;
1541 vat_json_init_object (&node);
1542 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1543 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1545 vat_json_print (vam->ofp, &node);
1546 vat_json_free (&node);
1548 vam->retval = ntohl (mp->retval);
1549 vam->result_ready = 1;
1553 vl_api_virtio_pci_delete_reply_t_handler (vl_api_virtio_pci_delete_reply_t *
1556 vat_main_t *vam = &vat_main;
1557 i32 retval = ntohl (mp->retval);
1558 if (vam->async_mode)
1560 vam->async_errors += (retval < 0);
1564 vam->retval = retval;
1565 vam->result_ready = 1;
1569 static void vl_api_virtio_pci_delete_reply_t_handler_json
1570 (vl_api_virtio_pci_delete_reply_t * mp)
1572 vat_main_t *vam = &vat_main;
1573 vat_json_node_t node;
1575 vat_json_init_object (&node);
1576 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1578 vat_json_print (vam->ofp, &node);
1579 vat_json_free (&node);
1581 vam->retval = ntohl (mp->retval);
1582 vam->result_ready = 1;
1585 static void vl_api_mpls_tunnel_add_del_reply_t_handler
1586 (vl_api_mpls_tunnel_add_del_reply_t * mp)
1588 vat_main_t *vam = &vat_main;
1589 i32 retval = ntohl (mp->retval);
1590 if (vam->async_mode)
1592 vam->async_errors += (retval < 0);
1596 vam->retval = retval;
1597 vam->sw_if_index = ntohl (mp->sw_if_index);
1598 vam->result_ready = 1;
1600 vam->regenerate_interface_table = 1;
1603 static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
1604 (vl_api_mpls_tunnel_add_del_reply_t * mp)
1606 vat_main_t *vam = &vat_main;
1607 vat_json_node_t node;
1609 vat_json_init_object (&node);
1610 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1611 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1612 ntohl (mp->sw_if_index));
1614 vat_json_print (vam->ofp, &node);
1615 vat_json_free (&node);
1617 vam->retval = ntohl (mp->retval);
1618 vam->result_ready = 1;
1621 static void vl_api_create_vhost_user_if_reply_t_handler
1622 (vl_api_create_vhost_user_if_reply_t * mp)
1624 vat_main_t *vam = &vat_main;
1625 i32 retval = ntohl (mp->retval);
1626 if (vam->async_mode)
1628 vam->async_errors += (retval < 0);
1632 vam->retval = retval;
1633 vam->sw_if_index = ntohl (mp->sw_if_index);
1634 vam->result_ready = 1;
1636 vam->regenerate_interface_table = 1;
1639 static void vl_api_create_vhost_user_if_reply_t_handler_json
1640 (vl_api_create_vhost_user_if_reply_t * mp)
1642 vat_main_t *vam = &vat_main;
1643 vat_json_node_t node;
1645 vat_json_init_object (&node);
1646 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1647 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1649 vat_json_print (vam->ofp, &node);
1650 vat_json_free (&node);
1652 vam->retval = ntohl (mp->retval);
1653 vam->result_ready = 1;
1656 static void vl_api_create_vhost_user_if_v2_reply_t_handler
1657 (vl_api_create_vhost_user_if_v2_reply_t * mp)
1659 vat_main_t *vam = &vat_main;
1660 i32 retval = ntohl (mp->retval);
1661 if (vam->async_mode)
1663 vam->async_errors += (retval < 0);
1667 vam->retval = retval;
1668 vam->sw_if_index = ntohl (mp->sw_if_index);
1669 vam->result_ready = 1;
1671 vam->regenerate_interface_table = 1;
1674 static void vl_api_create_vhost_user_if_v2_reply_t_handler_json
1675 (vl_api_create_vhost_user_if_v2_reply_t * mp)
1677 vat_main_t *vam = &vat_main;
1678 vat_json_node_t node;
1680 vat_json_init_object (&node);
1681 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1682 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1684 vat_json_print (vam->ofp, &node);
1685 vat_json_free (&node);
1687 vam->retval = ntohl (mp->retval);
1688 vam->result_ready = 1;
1691 static void vl_api_ip_address_details_t_handler
1692 (vl_api_ip_address_details_t * mp)
1694 vat_main_t *vam = &vat_main;
1695 static ip_address_details_t empty_ip_address_details = { {0} };
1696 ip_address_details_t *address = NULL;
1697 ip_details_t *current_ip_details = NULL;
1698 ip_details_t *details = NULL;
1700 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1702 if (!details || vam->current_sw_if_index >= vec_len (details)
1703 || !details[vam->current_sw_if_index].present)
1705 errmsg ("ip address details arrived but not stored");
1706 errmsg ("ip_dump should be called first");
1710 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1712 #define addresses (current_ip_details->addr)
1714 vec_validate_init_empty (addresses, vec_len (addresses),
1715 empty_ip_address_details);
1717 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1719 clib_memcpy (&address->ip, &mp->prefix.address.un, sizeof (address->ip));
1720 address->prefix_length = mp->prefix.len;
1724 static void vl_api_ip_address_details_t_handler_json
1725 (vl_api_ip_address_details_t * mp)
1727 vat_main_t *vam = &vat_main;
1728 vat_json_node_t *node = NULL;
1730 if (VAT_JSON_ARRAY != vam->json_tree.type)
1732 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1733 vat_json_init_array (&vam->json_tree);
1735 node = vat_json_array_add (&vam->json_tree);
1737 vat_json_init_object (node);
1738 vat_json_object_add_prefix (node, &mp->prefix);
1742 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1744 vat_main_t *vam = &vat_main;
1745 static ip_details_t empty_ip_details = { 0 };
1746 ip_details_t *ip = NULL;
1747 u32 sw_if_index = ~0;
1749 sw_if_index = ntohl (mp->sw_if_index);
1751 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1752 sw_if_index, empty_ip_details);
1754 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1761 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1763 vat_main_t *vam = &vat_main;
1765 if (VAT_JSON_ARRAY != vam->json_tree.type)
1767 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1768 vat_json_init_array (&vam->json_tree);
1770 vat_json_array_add_uint (&vam->json_tree,
1771 clib_net_to_host_u32 (mp->sw_if_index));
1774 static void vl_api_get_first_msg_id_reply_t_handler
1775 (vl_api_get_first_msg_id_reply_t * mp)
1777 vat_main_t *vam = &vat_main;
1778 i32 retval = ntohl (mp->retval);
1780 if (vam->async_mode)
1782 vam->async_errors += (retval < 0);
1786 vam->retval = retval;
1787 vam->result_ready = 1;
1791 errmsg ("first message id %d", ntohs (mp->first_msg_id));
1795 static void vl_api_get_first_msg_id_reply_t_handler_json
1796 (vl_api_get_first_msg_id_reply_t * mp)
1798 vat_main_t *vam = &vat_main;
1799 vat_json_node_t node;
1801 vat_json_init_object (&node);
1802 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1803 vat_json_object_add_uint (&node, "first_msg_id",
1804 (uint) ntohs (mp->first_msg_id));
1806 vat_json_print (vam->ofp, &node);
1807 vat_json_free (&node);
1809 vam->retval = ntohl (mp->retval);
1810 vam->result_ready = 1;
1813 static void vl_api_get_node_graph_reply_t_handler
1814 (vl_api_get_node_graph_reply_t * mp)
1816 vat_main_t *vam = &vat_main;
1817 i32 retval = ntohl (mp->retval);
1818 u8 *pvt_copy, *reply;
1823 if (vam->async_mode)
1825 vam->async_errors += (retval < 0);
1829 vam->retval = retval;
1830 vam->result_ready = 1;
1833 /* "Should never happen..." */
1837 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1838 pvt_copy = vec_dup (reply);
1840 /* Toss the shared-memory original... */
1841 oldheap = vl_msg_push_heap ();
1845 vl_msg_pop_heap (oldheap);
1847 if (vam->graph_nodes)
1849 hash_free (vam->graph_node_index_by_name);
1851 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
1853 node = vam->graph_nodes[0][i];
1854 vec_free (node->name);
1855 vec_free (node->next_nodes);
1858 vec_free (vam->graph_nodes[0]);
1859 vec_free (vam->graph_nodes);
1862 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
1863 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
1864 vec_free (pvt_copy);
1866 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
1868 node = vam->graph_nodes[0][i];
1869 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
1873 static void vl_api_get_node_graph_reply_t_handler_json
1874 (vl_api_get_node_graph_reply_t * mp)
1876 vat_main_t *vam = &vat_main;
1878 vat_json_node_t node;
1881 /* $$$$ make this real? */
1882 vat_json_init_object (&node);
1883 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1884 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
1886 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1888 /* Toss the shared-memory original... */
1889 oldheap = vl_msg_push_heap ();
1893 vl_msg_pop_heap (oldheap);
1895 vat_json_print (vam->ofp, &node);
1896 vat_json_free (&node);
1898 vam->retval = ntohl (mp->retval);
1899 vam->result_ready = 1;
1902 /* Format hex dump. */
1904 format_hex_bytes (u8 * s, va_list * va)
1906 u8 *bytes = va_arg (*va, u8 *);
1907 int n_bytes = va_arg (*va, int);
1910 /* Print short or long form depending on byte count. */
1911 uword short_form = n_bytes <= 32;
1912 u32 indent = format_get_indent (s);
1917 for (i = 0; i < n_bytes; i++)
1919 if (!short_form && (i % 32) == 0)
1920 s = format (s, "%08x: ", i);
1921 s = format (s, "%02x", bytes[i]);
1922 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
1923 s = format (s, "\n%U", format_white_space, indent);
1930 * Generate boilerplate reply handlers, which
1931 * dig the return value out of the xxx_reply_t API message,
1932 * stick it into vam->retval, and set vam->result_ready
1934 * Could also do this by pointing N message decode slots at
1935 * a single function, but that could break in subtle ways.
1938 #define foreach_standard_reply_retval_handler \
1939 _(sw_interface_set_flags_reply) \
1940 _(sw_interface_add_del_address_reply) \
1941 _(sw_interface_set_rx_mode_reply) \
1942 _(sw_interface_set_rx_placement_reply) \
1943 _(sw_interface_set_table_reply) \
1944 _(sw_interface_set_mpls_enable_reply) \
1945 _(sw_interface_set_vpath_reply) \
1946 _(sw_interface_set_l2_bridge_reply) \
1947 _(bridge_domain_add_del_reply) \
1948 _(sw_interface_set_l2_xconnect_reply) \
1949 _(l2fib_add_del_reply) \
1950 _(l2fib_flush_int_reply) \
1951 _(l2fib_flush_bd_reply) \
1952 _(ip_route_add_del_reply) \
1953 _(ip_table_add_del_reply) \
1954 _(ip_table_replace_begin_reply) \
1955 _(ip_table_flush_reply) \
1956 _(ip_table_replace_end_reply) \
1957 _(ip_mroute_add_del_reply) \
1958 _(mpls_route_add_del_reply) \
1959 _(mpls_table_add_del_reply) \
1960 _(mpls_ip_bind_unbind_reply) \
1961 _(sw_interface_set_unnumbered_reply) \
1962 _(set_ip_flow_hash_reply) \
1963 _(sw_interface_ip6_enable_disable_reply) \
1964 _(l2_patch_add_del_reply) \
1965 _(l2_fib_clear_table_reply) \
1966 _(l2_interface_efp_filter_reply) \
1967 _(l2_interface_vlan_tag_rewrite_reply) \
1968 _(modify_vhost_user_if_reply) \
1969 _(modify_vhost_user_if_v2_reply) \
1970 _(delete_vhost_user_if_reply) \
1971 _(want_l2_macs_events_reply) \
1972 _(delete_loopback_reply) \
1973 _(bd_ip_mac_add_del_reply) \
1974 _(bd_ip_mac_flush_reply) \
1975 _(want_interface_events_reply) \
1976 _(sw_interface_clear_stats_reply) \
1977 _(ioam_enable_reply) \
1978 _(ioam_disable_reply) \
1979 _(sw_interface_span_enable_disable_reply) \
1980 _(ip_source_and_port_range_check_add_del_reply) \
1981 _(ip_source_and_port_range_check_interface_add_del_reply)\
1982 _(delete_subif_reply) \
1983 _(l2_interface_pbb_tag_rewrite_reply) \
1984 _(sw_interface_tag_add_del_reply) \
1985 _(sw_interface_add_del_mac_address_reply) \
1986 _(hw_interface_set_mtu_reply) \
1987 _(tcp_configure_src_addresses_reply) \
1988 _(session_rule_add_del_reply) \
1989 _(ip_container_proxy_add_del_reply) \
1992 static void vl_api_##n##_t_handler \
1993 (vl_api_##n##_t * mp) \
1995 vat_main_t * vam = &vat_main; \
1996 i32 retval = ntohl(mp->retval); \
1997 if (vam->async_mode) { \
1998 vam->async_errors += (retval < 0); \
2000 vam->retval = retval; \
2001 vam->result_ready = 1; \
2004 foreach_standard_reply_retval_handler;
2008 static void vl_api_##n##_t_handler_json \
2009 (vl_api_##n##_t * mp) \
2011 vat_main_t * vam = &vat_main; \
2012 vat_json_node_t node; \
2013 vat_json_init_object(&node); \
2014 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
2015 vat_json_print(vam->ofp, &node); \
2016 vam->retval = ntohl(mp->retval); \
2017 vam->result_ready = 1; \
2019 foreach_standard_reply_retval_handler;
2023 * Table of message reply handlers, must include boilerplate handlers
2027 #define foreach_vpe_api_reply_msg \
2028 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
2029 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
2030 _(SW_INTERFACE_DETAILS, sw_interface_details) \
2031 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
2032 _(CONTROL_PING_REPLY, control_ping_reply) \
2033 _(CLI_REPLY, cli_reply) \
2034 _(CLI_INBAND_REPLY, cli_inband_reply) \
2035 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
2036 sw_interface_add_del_address_reply) \
2037 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
2038 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
2039 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
2040 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
2041 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
2042 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
2043 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
2044 sw_interface_set_l2_xconnect_reply) \
2045 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
2046 sw_interface_set_l2_bridge_reply) \
2047 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
2048 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
2049 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
2050 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
2051 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
2052 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
2053 _(L2_FLAGS_REPLY, l2_flags_reply) \
2054 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
2055 _(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \
2056 _(VIRTIO_PCI_CREATE_V2_REPLY, virtio_pci_create_v2_reply) \
2057 _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
2058 _(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
2059 _(IP_ROUTE_ADD_DEL_REPLY, ip_route_add_del_reply) \
2060 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
2061 _(IP_TABLE_REPLACE_BEGIN_REPLY, ip_table_replace_begin_reply) \
2062 _(IP_TABLE_FLUSH_REPLY, ip_table_flush_reply) \
2063 _(IP_TABLE_REPLACE_END_REPLY, ip_table_replace_end_reply) \
2064 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
2065 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
2066 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
2067 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
2068 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
2069 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
2070 sw_interface_set_unnumbered_reply) \
2071 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
2072 _(CREATE_SUBIF_REPLY, create_subif_reply) \
2073 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
2074 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
2075 sw_interface_ip6_enable_disable_reply) \
2076 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
2077 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
2078 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
2079 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
2080 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
2081 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
2082 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
2083 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
2084 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
2085 _(CREATE_VHOST_USER_IF_V2_REPLY, create_vhost_user_if_v2_reply) \
2086 _(MODIFY_VHOST_USER_IF_V2_REPLY, modify_vhost_user_if_v2_reply) \
2087 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
2088 _(SHOW_VERSION_REPLY, show_version_reply) \
2089 _(SHOW_THREADS_REPLY, show_threads_reply) \
2090 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
2091 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
2092 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
2093 _(L2_MACS_EVENT, l2_macs_event) \
2094 _(IP_ADDRESS_DETAILS, ip_address_details) \
2095 _(IP_DETAILS, ip_details) \
2096 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
2097 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
2098 _(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
2099 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
2100 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
2101 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
2102 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
2103 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
2104 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
2105 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
2106 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
2107 _(MPLS_TABLE_DETAILS, mpls_table_details) \
2108 _(MPLS_ROUTE_DETAILS, mpls_route_details) \
2109 _(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
2110 _(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
2111 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
2112 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
2113 ip_source_and_port_range_check_add_del_reply) \
2114 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
2115 ip_source_and_port_range_check_interface_add_del_reply) \
2116 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
2117 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
2118 _(IP_TABLE_DETAILS, ip_table_details) \
2119 _(IP_ROUTE_DETAILS, ip_route_details) \
2120 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
2121 _(SW_INTERFACE_ADD_DEL_MAC_ADDRESS_REPLY, sw_interface_add_del_mac_address_reply) \
2122 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
2123 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
2124 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
2125 _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
2126 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
2127 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
2128 _(SESSION_RULES_DETAILS, session_rules_details) \
2129 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
2131 #define foreach_standalone_reply_msg \
2132 _(SW_INTERFACE_EVENT, sw_interface_event)
2140 #define STR_VTR_OP_CASE(op) \
2141 case L2_VTR_ ## op: \
2145 str_vtr_op (u32 vtr_op)
2149 STR_VTR_OP_CASE (DISABLED);
2150 STR_VTR_OP_CASE (PUSH_1);
2151 STR_VTR_OP_CASE (PUSH_2);
2152 STR_VTR_OP_CASE (POP_1);
2153 STR_VTR_OP_CASE (POP_2);
2154 STR_VTR_OP_CASE (TRANSLATE_1_1);
2155 STR_VTR_OP_CASE (TRANSLATE_1_2);
2156 STR_VTR_OP_CASE (TRANSLATE_2_1);
2157 STR_VTR_OP_CASE (TRANSLATE_2_2);
2164 dump_sub_interface_table (vat_main_t * vam)
2166 const sw_interface_subif_t *sub = NULL;
2168 if (vam->json_output)
2171 ("JSON output supported only for VPE API calls and dump_stats_table");
2176 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
2177 "Interface", "sw_if_index",
2178 "sub id", "dot1ad", "tags", "outer id",
2179 "inner id", "exact", "default", "outer any", "inner any");
2181 vec_foreach (sub, vam->sw_if_subif_table)
2184 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
2185 sub->interface_name,
2187 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
2188 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
2189 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
2190 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
2191 if (sub->vtr_op != L2_VTR_DISABLED)
2194 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
2195 "tag1: %d tag2: %d ]",
2196 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
2197 sub->vtr_tag1, sub->vtr_tag2);
2205 name_sort_cmp (void *a1, void *a2)
2207 name_sort_t *n1 = a1;
2208 name_sort_t *n2 = a2;
2210 return strcmp ((char *) n1->name, (char *) n2->name);
2214 dump_interface_table (vat_main_t * vam)
2217 name_sort_t *nses = 0, *ns;
2219 if (vam->json_output)
2222 ("JSON output supported only for VPE API calls and dump_stats_table");
2227 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2229 vec_add2 (nses, ns, 1);
2230 ns->name = (u8 *)(p->key);
2231 ns->value = (u32) p->value[0];
2235 vec_sort_with_function (nses, name_sort_cmp);
2237 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
2238 vec_foreach (ns, nses)
2240 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
2247 dump_ip_table (vat_main_t * vam, int is_ipv6)
2249 const ip_details_t *det = NULL;
2250 const ip_address_details_t *address = NULL;
2253 print (vam->ofp, "%-12s", "sw_if_index");
2255 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
2262 print (vam->ofp, "%-12d", i);
2263 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
2268 vec_foreach (address, det->addr)
2272 is_ipv6 ? format_ip6_address : format_ip4_address,
2273 address->ip, address->prefix_length);
2281 dump_ipv4_table (vat_main_t * vam)
2283 if (vam->json_output)
2286 ("JSON output supported only for VPE API calls and dump_stats_table");
2290 return dump_ip_table (vam, 0);
2294 dump_ipv6_table (vat_main_t * vam)
2296 if (vam->json_output)
2299 ("JSON output supported only for VPE API calls and dump_stats_table");
2303 return dump_ip_table (vam, 1);
2307 * Pass CLI buffers directly in the CLI_INBAND API message,
2308 * instead of an additional shared memory area.
2311 exec_inband (vat_main_t * vam)
2313 vl_api_cli_inband_t *mp;
2314 unformat_input_t *i = vam->input;
2317 if (vec_len (i->buffer) == 0)
2320 if (vam->exec_mode == 0 && unformat (i, "mode"))
2325 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
2332 * In order for the CLI command to work, it
2333 * must be a vector ending in \n, not a C-string ending
2336 M2 (CLI_INBAND, mp, vec_len (vam->input->buffer));
2337 vl_api_vec_to_api_string (vam->input->buffer, &mp->cmd);
2341 /* json responses may or may not include a useful reply... */
2342 if (vec_len (vam->cmd_reply))
2343 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
2348 exec (vat_main_t * vam)
2350 return exec_inband (vam);
2354 api_create_loopback (vat_main_t * vam)
2356 unformat_input_t *i = vam->input;
2357 vl_api_create_loopback_t *mp;
2358 vl_api_create_loopback_instance_t *mp_lbi;
2361 u8 is_specified = 0;
2362 u32 user_instance = 0;
2365 clib_memset (mac_address, 0, sizeof (mac_address));
2367 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2369 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
2371 if (unformat (i, "instance %d", &user_instance))
2379 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
2380 mp_lbi->is_specified = is_specified;
2382 mp_lbi->user_instance = htonl (user_instance);
2384 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
2389 /* Construct the API message */
2390 M (CREATE_LOOPBACK, mp);
2392 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
2401 api_delete_loopback (vat_main_t * vam)
2403 unformat_input_t *i = vam->input;
2404 vl_api_delete_loopback_t *mp;
2405 u32 sw_if_index = ~0;
2408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2410 if (unformat (i, "sw_if_index %d", &sw_if_index))
2416 if (sw_if_index == ~0)
2418 errmsg ("missing sw_if_index");
2422 /* Construct the API message */
2423 M (DELETE_LOOPBACK, mp);
2424 mp->sw_if_index = ntohl (sw_if_index);
2432 api_want_interface_events (vat_main_t * vam)
2434 unformat_input_t *i = vam->input;
2435 vl_api_want_interface_events_t *mp;
2439 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2441 if (unformat (i, "enable"))
2443 else if (unformat (i, "disable"))
2451 errmsg ("missing enable|disable");
2455 M (WANT_INTERFACE_EVENTS, mp);
2456 mp->enable_disable = enable;
2458 vam->interface_event_display = enable;
2466 /* Note: non-static, called once to set up the initial intfc table */
2468 api_sw_interface_dump (vat_main_t * vam)
2470 vl_api_sw_interface_dump_t *mp;
2471 vl_api_control_ping_t *mp_ping;
2473 name_sort_t *nses = 0, *ns;
2474 sw_interface_subif_t *sub = NULL;
2477 /* Toss the old name table */
2479 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2481 vec_add2 (nses, ns, 1);
2482 ns->name = (u8 *)(p->key);
2483 ns->value = (u32) p->value[0];
2487 hash_free (vam->sw_if_index_by_interface_name);
2489 vec_foreach (ns, nses) vec_free (ns->name);
2493 vec_foreach (sub, vam->sw_if_subif_table)
2495 vec_free (sub->interface_name);
2497 vec_free (vam->sw_if_subif_table);
2499 /* recreate the interface name hash table */
2500 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
2503 * Ask for all interface names. Otherwise, the epic catalog of
2504 * name filters becomes ridiculously long, and vat ends up needing
2505 * to be taught about new interface types.
2507 M (SW_INTERFACE_DUMP, mp);
2510 /* Use a control ping for synchronization */
2511 MPING (CONTROL_PING, mp_ping);
2519 api_sw_interface_set_flags (vat_main_t * vam)
2521 unformat_input_t *i = vam->input;
2522 vl_api_sw_interface_set_flags_t *mp;
2524 u8 sw_if_index_set = 0;
2528 /* Parse args required to build the message */
2529 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2531 if (unformat (i, "admin-up"))
2533 else if (unformat (i, "admin-down"))
2536 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2537 sw_if_index_set = 1;
2538 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2539 sw_if_index_set = 1;
2544 if (sw_if_index_set == 0)
2546 errmsg ("missing interface name or sw_if_index");
2550 /* Construct the API message */
2551 M (SW_INTERFACE_SET_FLAGS, mp);
2552 mp->sw_if_index = ntohl (sw_if_index);
2553 mp->flags = ntohl ((admin_up) ? IF_STATUS_API_FLAG_ADMIN_UP : 0);
2558 /* Wait for a reply, return the good/bad news... */
2564 api_sw_interface_set_rx_mode (vat_main_t * vam)
2566 unformat_input_t *i = vam->input;
2567 vl_api_sw_interface_set_rx_mode_t *mp;
2569 u8 sw_if_index_set = 0;
2571 u8 queue_id_valid = 0;
2573 vnet_hw_if_rx_mode mode = VNET_HW_IF_RX_MODE_UNKNOWN;
2575 /* Parse args required to build the message */
2576 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2578 if (unformat (i, "queue %d", &queue_id))
2580 else if (unformat (i, "polling"))
2581 mode = VNET_HW_IF_RX_MODE_POLLING;
2582 else if (unformat (i, "interrupt"))
2583 mode = VNET_HW_IF_RX_MODE_INTERRUPT;
2584 else if (unformat (i, "adaptive"))
2585 mode = VNET_HW_IF_RX_MODE_ADAPTIVE;
2587 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2588 sw_if_index_set = 1;
2589 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2590 sw_if_index_set = 1;
2595 if (sw_if_index_set == 0)
2597 errmsg ("missing interface name or sw_if_index");
2600 if (mode == VNET_HW_IF_RX_MODE_UNKNOWN)
2602 errmsg ("missing rx-mode");
2606 /* Construct the API message */
2607 M (SW_INTERFACE_SET_RX_MODE, mp);
2608 mp->sw_if_index = ntohl (sw_if_index);
2609 mp->mode = (vl_api_rx_mode_t) mode;
2610 mp->queue_id_valid = queue_id_valid;
2611 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
2616 /* Wait for a reply, return the good/bad news... */
2622 api_sw_interface_set_rx_placement (vat_main_t * vam)
2624 unformat_input_t *i = vam->input;
2625 vl_api_sw_interface_set_rx_placement_t *mp;
2627 u8 sw_if_index_set = 0;
2630 u32 queue_id, thread_index;
2632 /* Parse args required to build the message */
2633 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2635 if (unformat (i, "queue %d", &queue_id))
2637 else if (unformat (i, "main"))
2639 else if (unformat (i, "worker %d", &thread_index))
2642 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2643 sw_if_index_set = 1;
2644 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2645 sw_if_index_set = 1;
2650 if (sw_if_index_set == 0)
2652 errmsg ("missing interface name or sw_if_index");
2658 /* Construct the API message */
2659 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
2660 mp->sw_if_index = ntohl (sw_if_index);
2661 mp->worker_id = ntohl (thread_index);
2662 mp->queue_id = ntohl (queue_id);
2663 mp->is_main = is_main;
2667 /* Wait for a reply, return the good/bad news... */
2672 static void vl_api_sw_interface_rx_placement_details_t_handler
2673 (vl_api_sw_interface_rx_placement_details_t * mp)
2675 vat_main_t *vam = &vat_main;
2676 u32 worker_id = ntohl (mp->worker_id);
2679 "\n%-11d %-11s %-6d %-5d %-9s",
2680 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
2681 worker_id, ntohl (mp->queue_id),
2683 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
2686 static void vl_api_sw_interface_rx_placement_details_t_handler_json
2687 (vl_api_sw_interface_rx_placement_details_t * mp)
2689 vat_main_t *vam = &vat_main;
2690 vat_json_node_t *node = NULL;
2692 if (VAT_JSON_ARRAY != vam->json_tree.type)
2694 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2695 vat_json_init_array (&vam->json_tree);
2697 node = vat_json_array_add (&vam->json_tree);
2699 vat_json_init_object (node);
2700 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2701 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
2702 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
2703 vat_json_object_add_uint (node, "mode", mp->mode);
2707 api_sw_interface_rx_placement_dump (vat_main_t * vam)
2709 unformat_input_t *i = vam->input;
2710 vl_api_sw_interface_rx_placement_dump_t *mp;
2711 vl_api_control_ping_t *mp_ping;
2714 u8 sw_if_index_set = 0;
2716 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2718 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2720 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2727 "\n%-11s %-11s %-6s %-5s %-4s",
2728 "sw_if_index", "main/worker", "thread", "queue", "mode");
2730 /* Dump Interface rx placement */
2731 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
2733 if (sw_if_index_set)
2734 mp->sw_if_index = htonl (sw_if_index);
2736 mp->sw_if_index = ~0;
2740 /* Use a control ping for synchronization */
2741 MPING (CONTROL_PING, mp_ping);
2749 api_sw_interface_clear_stats (vat_main_t * vam)
2751 unformat_input_t *i = vam->input;
2752 vl_api_sw_interface_clear_stats_t *mp;
2754 u8 sw_if_index_set = 0;
2757 /* Parse args required to build the message */
2758 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2760 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2761 sw_if_index_set = 1;
2762 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2763 sw_if_index_set = 1;
2768 /* Construct the API message */
2769 M (SW_INTERFACE_CLEAR_STATS, mp);
2771 if (sw_if_index_set == 1)
2772 mp->sw_if_index = ntohl (sw_if_index);
2774 mp->sw_if_index = ~0;
2779 /* Wait for a reply, return the good/bad news... */
2785 api_sw_interface_add_del_address (vat_main_t * vam)
2787 unformat_input_t *i = vam->input;
2788 vl_api_sw_interface_add_del_address_t *mp;
2790 u8 sw_if_index_set = 0;
2791 u8 is_add = 1, del_all = 0;
2792 u32 address_length = 0;
2793 u8 v4_address_set = 0;
2794 u8 v6_address_set = 0;
2795 ip4_address_t v4address;
2796 ip6_address_t v6address;
2799 /* Parse args required to build the message */
2800 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2802 if (unformat (i, "del-all"))
2804 else if (unformat (i, "del"))
2807 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2808 sw_if_index_set = 1;
2809 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2810 sw_if_index_set = 1;
2811 else if (unformat (i, "%U/%d",
2812 unformat_ip4_address, &v4address, &address_length))
2814 else if (unformat (i, "%U/%d",
2815 unformat_ip6_address, &v6address, &address_length))
2821 if (sw_if_index_set == 0)
2823 errmsg ("missing interface name or sw_if_index");
2826 if (v4_address_set && v6_address_set)
2828 errmsg ("both v4 and v6 addresses set");
2831 if (!v4_address_set && !v6_address_set && !del_all)
2833 errmsg ("no addresses set");
2837 /* Construct the API message */
2838 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
2840 mp->sw_if_index = ntohl (sw_if_index);
2841 mp->is_add = is_add;
2842 mp->del_all = del_all;
2845 mp->prefix.address.af = ADDRESS_IP6;
2846 clib_memcpy (mp->prefix.address.un.ip6, &v6address, sizeof (v6address));
2850 mp->prefix.address.af = ADDRESS_IP4;
2851 clib_memcpy (mp->prefix.address.un.ip4, &v4address, sizeof (v4address));
2853 mp->prefix.len = address_length;
2858 /* Wait for a reply, return good/bad news */
2864 api_sw_interface_set_mpls_enable (vat_main_t * vam)
2866 unformat_input_t *i = vam->input;
2867 vl_api_sw_interface_set_mpls_enable_t *mp;
2869 u8 sw_if_index_set = 0;
2873 /* Parse args required to build the message */
2874 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2876 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2877 sw_if_index_set = 1;
2878 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2879 sw_if_index_set = 1;
2880 else if (unformat (i, "disable"))
2882 else if (unformat (i, "dis"))
2888 if (sw_if_index_set == 0)
2890 errmsg ("missing interface name or sw_if_index");
2894 /* Construct the API message */
2895 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
2897 mp->sw_if_index = ntohl (sw_if_index);
2898 mp->enable = enable;
2903 /* Wait for a reply... */
2909 api_sw_interface_set_table (vat_main_t * vam)
2911 unformat_input_t *i = vam->input;
2912 vl_api_sw_interface_set_table_t *mp;
2913 u32 sw_if_index, vrf_id = 0;
2914 u8 sw_if_index_set = 0;
2918 /* Parse args required to build the message */
2919 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2921 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2922 sw_if_index_set = 1;
2923 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2924 sw_if_index_set = 1;
2925 else if (unformat (i, "vrf %d", &vrf_id))
2927 else if (unformat (i, "ipv6"))
2933 if (sw_if_index_set == 0)
2935 errmsg ("missing interface name or sw_if_index");
2939 /* Construct the API message */
2940 M (SW_INTERFACE_SET_TABLE, mp);
2942 mp->sw_if_index = ntohl (sw_if_index);
2943 mp->is_ipv6 = is_ipv6;
2944 mp->vrf_id = ntohl (vrf_id);
2949 /* Wait for a reply... */
2954 static void vl_api_sw_interface_get_table_reply_t_handler
2955 (vl_api_sw_interface_get_table_reply_t * mp)
2957 vat_main_t *vam = &vat_main;
2959 print (vam->ofp, "%d", ntohl (mp->vrf_id));
2961 vam->retval = ntohl (mp->retval);
2962 vam->result_ready = 1;
2966 static void vl_api_sw_interface_get_table_reply_t_handler_json
2967 (vl_api_sw_interface_get_table_reply_t * mp)
2969 vat_main_t *vam = &vat_main;
2970 vat_json_node_t node;
2972 vat_json_init_object (&node);
2973 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2974 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
2976 vat_json_print (vam->ofp, &node);
2977 vat_json_free (&node);
2979 vam->retval = ntohl (mp->retval);
2980 vam->result_ready = 1;
2984 api_sw_interface_get_table (vat_main_t * vam)
2986 unformat_input_t *i = vam->input;
2987 vl_api_sw_interface_get_table_t *mp;
2989 u8 sw_if_index_set = 0;
2993 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2995 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2996 sw_if_index_set = 1;
2997 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2998 sw_if_index_set = 1;
2999 else if (unformat (i, "ipv6"))
3005 if (sw_if_index_set == 0)
3007 errmsg ("missing interface name or sw_if_index");
3011 M (SW_INTERFACE_GET_TABLE, mp);
3012 mp->sw_if_index = htonl (sw_if_index);
3013 mp->is_ipv6 = is_ipv6;
3021 api_sw_interface_set_vpath (vat_main_t * vam)
3023 unformat_input_t *i = vam->input;
3024 vl_api_sw_interface_set_vpath_t *mp;
3025 u32 sw_if_index = 0;
3026 u8 sw_if_index_set = 0;
3030 /* Parse args required to build the message */
3031 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3033 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3034 sw_if_index_set = 1;
3035 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3036 sw_if_index_set = 1;
3037 else if (unformat (i, "enable"))
3039 else if (unformat (i, "disable"))
3045 if (sw_if_index_set == 0)
3047 errmsg ("missing interface name or sw_if_index");
3051 /* Construct the API message */
3052 M (SW_INTERFACE_SET_VPATH, mp);
3054 mp->sw_if_index = ntohl (sw_if_index);
3055 mp->enable = is_enable;
3060 /* Wait for a reply... */
3066 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
3068 unformat_input_t *i = vam->input;
3069 vl_api_sw_interface_set_l2_xconnect_t *mp;
3071 u8 rx_sw_if_index_set = 0;
3073 u8 tx_sw_if_index_set = 0;
3077 /* Parse args required to build the message */
3078 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3080 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
3081 rx_sw_if_index_set = 1;
3082 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
3083 tx_sw_if_index_set = 1;
3084 else if (unformat (i, "rx"))
3086 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3088 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
3090 rx_sw_if_index_set = 1;
3095 else if (unformat (i, "tx"))
3097 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3099 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
3101 tx_sw_if_index_set = 1;
3106 else if (unformat (i, "enable"))
3108 else if (unformat (i, "disable"))
3114 if (rx_sw_if_index_set == 0)
3116 errmsg ("missing rx interface name or rx_sw_if_index");
3120 if (enable && (tx_sw_if_index_set == 0))
3122 errmsg ("missing tx interface name or tx_sw_if_index");
3126 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
3128 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
3129 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
3130 mp->enable = enable;
3138 api_sw_interface_set_l2_bridge (vat_main_t * vam)
3140 unformat_input_t *i = vam->input;
3141 vl_api_sw_interface_set_l2_bridge_t *mp;
3142 vl_api_l2_port_type_t port_type;
3144 u8 rx_sw_if_index_set = 0;
3151 port_type = L2_API_PORT_TYPE_NORMAL;
3153 /* Parse args required to build the message */
3154 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3156 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
3157 rx_sw_if_index_set = 1;
3158 else if (unformat (i, "bd_id %d", &bd_id))
3162 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
3163 rx_sw_if_index_set = 1;
3164 else if (unformat (i, "shg %d", &shg))
3166 else if (unformat (i, "bvi"))
3167 port_type = L2_API_PORT_TYPE_BVI;
3168 else if (unformat (i, "uu-fwd"))
3169 port_type = L2_API_PORT_TYPE_UU_FWD;
3170 else if (unformat (i, "enable"))
3172 else if (unformat (i, "disable"))
3178 if (rx_sw_if_index_set == 0)
3180 errmsg ("missing rx interface name or sw_if_index");
3184 if (enable && (bd_id_set == 0))
3186 errmsg ("missing bridge domain");
3190 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
3192 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
3193 mp->bd_id = ntohl (bd_id);
3195 mp->port_type = ntohl (port_type);
3196 mp->enable = enable;
3204 api_bridge_domain_dump (vat_main_t * vam)
3206 unformat_input_t *i = vam->input;
3207 vl_api_bridge_domain_dump_t *mp;
3208 vl_api_control_ping_t *mp_ping;
3212 /* Parse args required to build the message */
3213 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3215 if (unformat (i, "bd_id %d", &bd_id))
3221 M (BRIDGE_DOMAIN_DUMP, mp);
3222 mp->bd_id = ntohl (bd_id);
3225 /* Use a control ping for synchronization */
3226 MPING (CONTROL_PING, mp_ping);
3234 api_bridge_domain_add_del (vat_main_t * vam)
3236 unformat_input_t *i = vam->input;
3237 vl_api_bridge_domain_add_del_t *mp;
3240 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
3245 /* Parse args required to build the message */
3246 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3248 if (unformat (i, "bd_id %d", &bd_id))
3250 else if (unformat (i, "flood %d", &flood))
3252 else if (unformat (i, "uu-flood %d", &uu_flood))
3254 else if (unformat (i, "forward %d", &forward))
3256 else if (unformat (i, "learn %d", &learn))
3258 else if (unformat (i, "arp-term %d", &arp_term))
3260 else if (unformat (i, "mac-age %d", &mac_age))
3262 else if (unformat (i, "bd-tag %s", &bd_tag))
3264 else if (unformat (i, "del"))
3267 flood = uu_flood = forward = learn = 0;
3275 errmsg ("missing bridge domain");
3282 errmsg ("mac age must be less than 256 ");
3287 if ((bd_tag) && (vec_len (bd_tag) > 63))
3289 errmsg ("bd-tag cannot be longer than 63");
3294 M (BRIDGE_DOMAIN_ADD_DEL, mp);
3296 mp->bd_id = ntohl (bd_id);
3298 mp->uu_flood = uu_flood;
3299 mp->forward = forward;
3301 mp->arp_term = arp_term;
3302 mp->is_add = is_add;
3303 mp->mac_age = (u8) mac_age;
3306 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
3307 mp->bd_tag[vec_len (bd_tag)] = 0;
3318 api_l2fib_flush_bd (vat_main_t * vam)
3320 unformat_input_t *i = vam->input;
3321 vl_api_l2fib_flush_bd_t *mp;
3325 /* Parse args required to build the message */
3326 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3328 if (unformat (i, "bd_id %d", &bd_id));
3335 errmsg ("missing bridge domain");
3339 M (L2FIB_FLUSH_BD, mp);
3341 mp->bd_id = htonl (bd_id);
3349 api_l2fib_flush_int (vat_main_t * vam)
3351 unformat_input_t *i = vam->input;
3352 vl_api_l2fib_flush_int_t *mp;
3353 u32 sw_if_index = ~0;
3356 /* Parse args required to build the message */
3357 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3359 if (unformat (i, "sw_if_index %d", &sw_if_index));
3361 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
3366 if (sw_if_index == ~0)
3368 errmsg ("missing interface name or sw_if_index");
3372 M (L2FIB_FLUSH_INT, mp);
3374 mp->sw_if_index = ntohl (sw_if_index);
3382 api_l2fib_add_del (vat_main_t * vam)
3384 unformat_input_t *i = vam->input;
3385 vl_api_l2fib_add_del_t *mp;
3391 u32 sw_if_index = 0;
3392 u8 sw_if_index_set = 0;
3401 /* Parse args required to build the message */
3402 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3404 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
3406 else if (unformat (i, "bd_id %d", &bd_id))
3408 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3409 sw_if_index_set = 1;
3410 else if (unformat (i, "sw_if"))
3412 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3415 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3416 sw_if_index_set = 1;
3421 else if (unformat (i, "static"))
3423 else if (unformat (i, "filter"))
3428 else if (unformat (i, "bvi"))
3433 else if (unformat (i, "del"))
3435 else if (unformat (i, "count %d", &count))
3443 errmsg ("missing mac address");
3449 errmsg ("missing bridge domain");
3453 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
3455 errmsg ("missing interface name or sw_if_index");
3461 /* Turn on async mode */
3462 vam->async_mode = 1;
3463 vam->async_errors = 0;
3464 before = vat_time_now (vam);
3467 for (j = 0; j < count; j++)
3469 M (L2FIB_ADD_DEL, mp);
3471 clib_memcpy (mp->mac, mac, 6);
3472 mp->bd_id = ntohl (bd_id);
3473 mp->is_add = is_add;
3474 mp->sw_if_index = ntohl (sw_if_index);
3478 mp->static_mac = static_mac;
3479 mp->filter_mac = filter_mac;
3480 mp->bvi_mac = bvi_mac;
3482 increment_mac_address (mac);
3489 vl_api_control_ping_t *mp_ping;
3492 /* Shut off async mode */
3493 vam->async_mode = 0;
3495 MPING (CONTROL_PING, mp_ping);
3498 timeout = vat_time_now (vam) + 1.0;
3499 while (vat_time_now (vam) < timeout)
3500 if (vam->result_ready == 1)
3505 if (vam->retval == -99)
3508 if (vam->async_errors > 0)
3510 errmsg ("%d asynchronous errors", vam->async_errors);
3513 vam->async_errors = 0;
3514 after = vat_time_now (vam);
3516 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
3517 count, after - before, count / (after - before));
3523 /* Wait for a reply... */
3527 /* Return the good/bad news */
3528 return (vam->retval);
3532 api_bridge_domain_set_mac_age (vat_main_t * vam)
3534 unformat_input_t *i = vam->input;
3535 vl_api_bridge_domain_set_mac_age_t *mp;
3540 /* Parse args required to build the message */
3541 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3543 if (unformat (i, "bd_id %d", &bd_id));
3544 else if (unformat (i, "mac-age %d", &mac_age));
3551 errmsg ("missing bridge domain");
3557 errmsg ("mac age must be less than 256 ");
3561 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
3563 mp->bd_id = htonl (bd_id);
3564 mp->mac_age = (u8) mac_age;
3572 api_l2_flags (vat_main_t * vam)
3574 unformat_input_t *i = vam->input;
3575 vl_api_l2_flags_t *mp;
3578 u8 sw_if_index_set = 0;
3582 /* Parse args required to build the message */
3583 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3585 if (unformat (i, "sw_if_index %d", &sw_if_index))
3586 sw_if_index_set = 1;
3587 else if (unformat (i, "sw_if"))
3589 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3592 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3593 sw_if_index_set = 1;
3598 else if (unformat (i, "learn"))
3600 else if (unformat (i, "forward"))
3602 else if (unformat (i, "flood"))
3604 else if (unformat (i, "uu-flood"))
3605 flags |= L2_UU_FLOOD;
3606 else if (unformat (i, "arp-term"))
3607 flags |= L2_ARP_TERM;
3608 else if (unformat (i, "off"))
3610 else if (unformat (i, "disable"))
3616 if (sw_if_index_set == 0)
3618 errmsg ("missing interface name or sw_if_index");
3624 mp->sw_if_index = ntohl (sw_if_index);
3625 mp->feature_bitmap = ntohl (flags);
3626 mp->is_set = is_set;
3634 api_bridge_flags (vat_main_t * vam)
3636 unformat_input_t *i = vam->input;
3637 vl_api_bridge_flags_t *mp;
3641 bd_flags_t flags = 0;
3644 /* Parse args required to build the message */
3645 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3647 if (unformat (i, "bd_id %d", &bd_id))
3649 else if (unformat (i, "learn"))
3650 flags |= BRIDGE_API_FLAG_LEARN;
3651 else if (unformat (i, "forward"))
3652 flags |= BRIDGE_API_FLAG_FWD;
3653 else if (unformat (i, "flood"))
3654 flags |= BRIDGE_API_FLAG_FLOOD;
3655 else if (unformat (i, "uu-flood"))
3656 flags |= BRIDGE_API_FLAG_UU_FLOOD;
3657 else if (unformat (i, "arp-term"))
3658 flags |= BRIDGE_API_FLAG_ARP_TERM;
3659 else if (unformat (i, "off"))
3661 else if (unformat (i, "disable"))
3669 errmsg ("missing bridge domain");
3673 M (BRIDGE_FLAGS, mp);
3675 mp->bd_id = ntohl (bd_id);
3676 mp->flags = ntohl (flags);
3677 mp->is_set = is_set;
3685 api_bd_ip_mac_add_del (vat_main_t * vam)
3687 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
3688 vl_api_mac_address_t mac = { 0 };
3689 unformat_input_t *i = vam->input;
3690 vl_api_bd_ip_mac_add_del_t *mp;
3699 /* Parse args required to build the message */
3700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3702 if (unformat (i, "bd_id %d", &bd_id))
3706 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
3710 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
3714 else if (unformat (i, "del"))
3722 errmsg ("missing bridge domain");
3725 else if (ip_set == 0)
3727 errmsg ("missing IP address");
3730 else if (mac_set == 0)
3732 errmsg ("missing MAC address");
3736 M (BD_IP_MAC_ADD_DEL, mp);
3738 mp->entry.bd_id = ntohl (bd_id);
3739 mp->is_add = is_add;
3741 clib_memcpy (&mp->entry.ip, &ip, sizeof (ip));
3742 clib_memcpy (&mp->entry.mac, &mac, sizeof (mac));
3750 api_bd_ip_mac_flush (vat_main_t * vam)
3752 unformat_input_t *i = vam->input;
3753 vl_api_bd_ip_mac_flush_t *mp;
3758 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3760 if (unformat (i, "bd_id %d", &bd_id))
3770 errmsg ("missing bridge domain");
3774 M (BD_IP_MAC_FLUSH, mp);
3776 mp->bd_id = ntohl (bd_id);
3783 static void vl_api_bd_ip_mac_details_t_handler
3784 (vl_api_bd_ip_mac_details_t * mp)
3786 vat_main_t *vam = &vat_main;
3790 ntohl (mp->entry.bd_id),
3791 format_vl_api_mac_address, mp->entry.mac,
3792 format_vl_api_address, &mp->entry.ip);
3795 static void vl_api_bd_ip_mac_details_t_handler_json
3796 (vl_api_bd_ip_mac_details_t * mp)
3798 vat_main_t *vam = &vat_main;
3799 vat_json_node_t *node = NULL;
3801 if (VAT_JSON_ARRAY != vam->json_tree.type)
3803 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3804 vat_json_init_array (&vam->json_tree);
3806 node = vat_json_array_add (&vam->json_tree);
3808 vat_json_init_object (node);
3809 vat_json_object_add_uint (node, "bd_id", ntohl (mp->entry.bd_id));
3810 vat_json_object_add_string_copy (node, "mac_address",
3811 format (0, "%U", format_vl_api_mac_address,
3815 ip = format (0, "%U", format_vl_api_address, &mp->entry.ip);
3816 vat_json_object_add_string_copy (node, "ip_address", ip);
3821 api_bd_ip_mac_dump (vat_main_t * vam)
3823 unformat_input_t *i = vam->input;
3824 vl_api_bd_ip_mac_dump_t *mp;
3825 vl_api_control_ping_t *mp_ping;
3830 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3832 if (unformat (i, "bd_id %d", &bd_id))
3841 "\n%-5s %-7s %-20s %-30s",
3842 "bd_id", "is_ipv6", "mac_address", "ip_address");
3844 /* Dump Bridge Domain Ip to Mac entries */
3845 M (BD_IP_MAC_DUMP, mp);
3848 mp->bd_id = htonl (bd_id);
3854 /* Use a control ping for synchronization */
3855 MPING (CONTROL_PING, mp_ping);
3863 unformat_vlib_pci_addr (unformat_input_t * input, va_list * args)
3865 vlib_pci_addr_t *addr = va_arg (*args, vlib_pci_addr_t *);
3868 if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
3871 addr->domain = x[0];
3874 addr->function = x[3];
3880 api_virtio_pci_create_v2 (vat_main_t * vam)
3882 unformat_input_t *i = vam->input;
3883 vl_api_virtio_pci_create_v2_t *mp;
3887 u64 features = (u64) ~ (0ULL);
3888 u32 virtio_flags = 0;
3891 clib_memset (mac_address, 0, sizeof (mac_address));
3893 /* Parse args required to build the message */
3894 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3896 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
3900 else if (unformat (i, "pci-addr %U", unformat_vlib_pci_addr, &pci_addr))
3902 else if (unformat (i, "features 0x%llx", &features))
3904 else if (unformat (i, "gso-enabled"))
3905 virtio_flags |= VIRTIO_API_FLAG_GSO;
3906 else if (unformat (i, "csum-offload-enabled"))
3907 virtio_flags |= VIRTIO_API_FLAG_CSUM_OFFLOAD;
3908 else if (unformat (i, "gro-coalesce"))
3909 virtio_flags |= VIRTIO_API_FLAG_GRO_COALESCE;
3910 else if (unformat (i, "packed"))
3911 virtio_flags |= VIRTIO_API_FLAG_PACKED;
3912 else if (unformat (i, "in-order"))
3913 virtio_flags |= VIRTIO_API_FLAG_IN_ORDER;
3914 else if (unformat (i, "buffering"))
3915 virtio_flags |= VIRTIO_API_FLAG_BUFFERING;
3922 errmsg ("pci address must be non zero. ");
3926 /* Construct the API message */
3927 M (VIRTIO_PCI_CREATE_V2, mp);
3929 mp->use_random_mac = random_mac;
3931 mp->pci_addr.domain = htons (((vlib_pci_addr_t) pci_addr).domain);
3932 mp->pci_addr.bus = ((vlib_pci_addr_t) pci_addr).bus;
3933 mp->pci_addr.slot = ((vlib_pci_addr_t) pci_addr).slot;
3934 mp->pci_addr.function = ((vlib_pci_addr_t) pci_addr).function;
3936 mp->features = clib_host_to_net_u64 (features);
3937 mp->virtio_flags = clib_host_to_net_u32 (virtio_flags);
3939 if (random_mac == 0)
3940 clib_memcpy (mp->mac_address, mac_address, 6);
3945 /* Wait for a reply... */
3951 api_virtio_pci_delete (vat_main_t * vam)
3953 unformat_input_t *i = vam->input;
3954 vl_api_virtio_pci_delete_t *mp;
3955 u32 sw_if_index = ~0;
3956 u8 sw_if_index_set = 0;
3959 /* Parse args required to build the message */
3960 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3962 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3963 sw_if_index_set = 1;
3964 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3965 sw_if_index_set = 1;
3970 if (sw_if_index_set == 0)
3972 errmsg ("missing vpp interface name. ");
3976 /* Construct the API message */
3977 M (VIRTIO_PCI_DELETE, mp);
3979 mp->sw_if_index = htonl (sw_if_index);
3984 /* Wait for a reply... */
3990 api_ip_table_add_del (vat_main_t * vam)
3992 unformat_input_t *i = vam->input;
3993 vl_api_ip_table_add_del_t *mp;
3999 /* Parse args required to build the message */
4000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4002 if (unformat (i, "ipv6"))
4004 else if (unformat (i, "del"))
4006 else if (unformat (i, "add"))
4008 else if (unformat (i, "table %d", &table_id))
4012 clib_warning ("parse error '%U'", format_unformat_error, i);
4019 errmsg ("missing table-ID");
4023 /* Construct the API message */
4024 M (IP_TABLE_ADD_DEL, mp);
4026 mp->table.table_id = ntohl (table_id);
4027 mp->table.is_ip6 = is_ipv6;
4028 mp->is_add = is_add;
4033 /* Wait for a reply... */
4040 unformat_fib_path (unformat_input_t * input, va_list * args)
4042 vat_main_t *vam = va_arg (*args, vat_main_t *);
4043 vl_api_fib_path_t *path = va_arg (*args, vl_api_fib_path_t *);
4044 u32 weight, preference;
4045 mpls_label_t out_label;
4047 clib_memset (path, 0, sizeof (*path));
4049 path->sw_if_index = ~0;
4053 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
4055 if (unformat (input, "%U %U",
4056 unformat_vl_api_ip4_address,
4057 &path->nh.address.ip4,
4058 api_unformat_sw_if_index, vam, &path->sw_if_index))
4060 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4062 else if (unformat (input, "%U %U",
4063 unformat_vl_api_ip6_address,
4064 &path->nh.address.ip6,
4065 api_unformat_sw_if_index, vam, &path->sw_if_index))
4067 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4069 else if (unformat (input, "weight %u", &weight))
4071 path->weight = weight;
4073 else if (unformat (input, "preference %u", &preference))
4075 path->preference = preference;
4077 else if (unformat (input, "%U next-hop-table %d",
4078 unformat_vl_api_ip4_address,
4079 &path->nh.address.ip4, &path->table_id))
4081 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4083 else if (unformat (input, "%U next-hop-table %d",
4084 unformat_vl_api_ip6_address,
4085 &path->nh.address.ip6, &path->table_id))
4087 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4089 else if (unformat (input, "%U",
4090 unformat_vl_api_ip4_address, &path->nh.address.ip4))
4093 * the recursive next-hops are by default in the default table
4096 path->sw_if_index = ~0;
4097 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4099 else if (unformat (input, "%U",
4100 unformat_vl_api_ip6_address, &path->nh.address.ip6))
4103 * the recursive next-hops are by default in the default table
4106 path->sw_if_index = ~0;
4107 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4109 else if (unformat (input, "resolve-via-host"))
4111 path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_HOST;
4113 else if (unformat (input, "resolve-via-attached"))
4115 path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_ATTACHED;
4117 else if (unformat (input, "ip4-lookup-in-table %d", &path->table_id))
4119 path->type = FIB_API_PATH_TYPE_LOCAL;
4120 path->sw_if_index = ~0;
4121 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4123 else if (unformat (input, "ip6-lookup-in-table %d", &path->table_id))
4125 path->type = FIB_API_PATH_TYPE_LOCAL;
4126 path->sw_if_index = ~0;
4127 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4129 else if (unformat (input, "sw_if_index %d", &path->sw_if_index))
4131 else if (unformat (input, "via-label %d", &path->nh.via_label))
4133 path->proto = FIB_API_PATH_NH_PROTO_MPLS;
4134 path->sw_if_index = ~0;
4136 else if (unformat (input, "l2-input-on %d", &path->sw_if_index))
4138 path->proto = FIB_API_PATH_NH_PROTO_ETHERNET;
4139 path->type = FIB_API_PATH_TYPE_INTERFACE_RX;
4141 else if (unformat (input, "local"))
4143 path->type = FIB_API_PATH_TYPE_LOCAL;
4145 else if (unformat (input, "out-labels"))
4147 while (unformat (input, "%d", &out_label))
4149 path->label_stack[path->n_labels].label = out_label;
4150 path->label_stack[path->n_labels].is_uniform = 0;
4151 path->label_stack[path->n_labels].ttl = 64;
4155 else if (unformat (input, "via"))
4157 /* new path, back up and return */
4158 unformat_put_input (input);
4159 unformat_put_input (input);
4160 unformat_put_input (input);
4161 unformat_put_input (input);
4170 path->proto = ntohl (path->proto);
4171 path->type = ntohl (path->type);
4172 path->flags = ntohl (path->flags);
4173 path->table_id = ntohl (path->table_id);
4174 path->sw_if_index = ntohl (path->sw_if_index);
4180 api_ip_route_add_del (vat_main_t * vam)
4182 unformat_input_t *i = vam->input;
4183 vl_api_ip_route_add_del_t *mp;
4186 u8 is_multipath = 0;
4189 vl_api_prefix_t pfx = { };
4190 vl_api_fib_path_t paths[8];
4194 u32 random_add_del = 0;
4195 u32 *random_vector = 0;
4196 u32 random_seed = 0xdeaddabe;
4198 /* Parse args required to build the message */
4199 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4201 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
4203 else if (unformat (i, "del"))
4205 else if (unformat (i, "add"))
4207 else if (unformat (i, "vrf %d", &vrf_id))
4209 else if (unformat (i, "count %d", &count))
4211 else if (unformat (i, "random"))
4213 else if (unformat (i, "multipath"))
4215 else if (unformat (i, "seed %d", &random_seed))
4219 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4222 if (8 == path_count)
4224 errmsg ("max 8 paths");
4230 clib_warning ("parse error '%U'", format_unformat_error, i);
4237 errmsg ("specify a path; via ...");
4240 if (prefix_set == 0)
4242 errmsg ("missing prefix");
4246 /* Generate a pile of unique, random routes */
4249 ip4_address_t *i = (ip4_address_t *) & paths[0].nh.address.ip4;
4250 u32 this_random_address;
4253 random_hash = hash_create (count, sizeof (uword));
4255 hash_set (random_hash, i->as_u32, 1);
4256 for (j = 0; j <= count; j++)
4260 this_random_address = random_u32 (&random_seed);
4261 this_random_address =
4262 clib_host_to_net_u32 (this_random_address);
4264 while (hash_get (random_hash, this_random_address));
4265 vec_add1 (random_vector, this_random_address);
4266 hash_set (random_hash, this_random_address, 1);
4268 hash_free (random_hash);
4269 set_ip4_address (&pfx.address, random_vector[0]);
4274 /* Turn on async mode */
4275 vam->async_mode = 1;
4276 vam->async_errors = 0;
4277 before = vat_time_now (vam);
4280 for (j = 0; j < count; j++)
4282 /* Construct the API message */
4283 M2 (IP_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4285 mp->is_add = is_add;
4286 mp->is_multipath = is_multipath;
4288 clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx));
4289 mp->route.table_id = ntohl (vrf_id);
4290 mp->route.n_paths = path_count;
4292 clib_memcpy (&mp->route.paths, &paths, sizeof (paths[0]) * path_count);
4295 set_ip4_address (&pfx.address, random_vector[j + 1]);
4297 increment_address (&pfx.address);
4300 /* If we receive SIGTERM, stop now... */
4305 /* When testing multiple add/del ops, use a control-ping to sync */
4308 vl_api_control_ping_t *mp_ping;
4312 /* Shut off async mode */
4313 vam->async_mode = 0;
4315 MPING (CONTROL_PING, mp_ping);
4318 timeout = vat_time_now (vam) + 1.0;
4319 while (vat_time_now (vam) < timeout)
4320 if (vam->result_ready == 1)
4325 if (vam->retval == -99)
4328 if (vam->async_errors > 0)
4330 errmsg ("%d asynchronous errors", vam->async_errors);
4333 vam->async_errors = 0;
4334 after = vat_time_now (vam);
4336 /* slim chance, but we might have eaten SIGTERM on the first iteration */
4340 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
4341 count, after - before, count / (after - before));
4347 /* Wait for a reply... */
4352 /* Return the good/bad news */
4353 return (vam->retval);
4357 api_ip_mroute_add_del (vat_main_t * vam)
4359 unformat_input_t *i = vam->input;
4360 u8 path_set = 0, prefix_set = 0, is_add = 1;
4361 vl_api_ip_mroute_add_del_t *mp;
4362 mfib_entry_flags_t eflags = 0;
4363 vl_api_mfib_path_t path;
4364 vl_api_mprefix_t pfx = { };
4368 /* Parse args required to build the message */
4369 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4371 if (unformat (i, "%U", unformat_vl_api_mprefix, &pfx))
4374 pfx.grp_address_length = htons (pfx.grp_address_length);
4376 else if (unformat (i, "del"))
4378 else if (unformat (i, "add"))
4380 else if (unformat (i, "vrf %d", &vrf_id))
4382 else if (unformat (i, "%U", unformat_mfib_itf_flags, &path.itf_flags))
4383 path.itf_flags = htonl (path.itf_flags);
4384 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
4386 else if (unformat (i, "via %U", unformat_fib_path, vam, &path.path))
4390 clib_warning ("parse error '%U'", format_unformat_error, i);
4395 if (prefix_set == 0)
4397 errmsg ("missing addresses\n");
4402 errmsg ("missing path\n");
4406 /* Construct the API message */
4407 M (IP_MROUTE_ADD_DEL, mp);
4409 mp->is_add = is_add;
4410 mp->is_multipath = 1;
4412 clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx));
4413 mp->route.table_id = htonl (vrf_id);
4414 mp->route.n_paths = 1;
4415 mp->route.entry_flags = htonl (eflags);
4417 clib_memcpy (&mp->route.paths, &path, sizeof (path));
4421 /* Wait for a reply... */
4427 api_mpls_table_add_del (vat_main_t * vam)
4429 unformat_input_t *i = vam->input;
4430 vl_api_mpls_table_add_del_t *mp;
4435 /* Parse args required to build the message */
4436 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4438 if (unformat (i, "table %d", &table_id))
4440 else if (unformat (i, "del"))
4442 else if (unformat (i, "add"))
4446 clib_warning ("parse error '%U'", format_unformat_error, i);
4453 errmsg ("missing table-ID");
4457 /* Construct the API message */
4458 M (MPLS_TABLE_ADD_DEL, mp);
4460 mp->mt_table.mt_table_id = ntohl (table_id);
4461 mp->mt_is_add = is_add;
4466 /* Wait for a reply... */
4473 api_mpls_route_add_del (vat_main_t * vam)
4475 u8 is_add = 1, path_count = 0, is_multipath = 0, is_eos = 0;
4476 mpls_label_t local_label = MPLS_LABEL_INVALID;
4477 unformat_input_t *i = vam->input;
4478 vl_api_mpls_route_add_del_t *mp;
4479 vl_api_fib_path_t paths[8];
4483 /* Parse args required to build the message */
4484 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4486 if (unformat (i, "%d", &local_label))
4488 else if (unformat (i, "eos"))
4490 else if (unformat (i, "non-eos"))
4492 else if (unformat (i, "del"))
4494 else if (unformat (i, "add"))
4496 else if (unformat (i, "multipath"))
4498 else if (unformat (i, "count %d", &count))
4502 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4505 if (8 == path_count)
4507 errmsg ("max 8 paths");
4513 clib_warning ("parse error '%U'", format_unformat_error, i);
4520 errmsg ("specify a path; via ...");
4524 if (MPLS_LABEL_INVALID == local_label)
4526 errmsg ("missing label");
4532 /* Turn on async mode */
4533 vam->async_mode = 1;
4534 vam->async_errors = 0;
4535 before = vat_time_now (vam);
4538 for (j = 0; j < count; j++)
4540 /* Construct the API message */
4541 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4543 mp->mr_is_add = is_add;
4544 mp->mr_is_multipath = is_multipath;
4546 mp->mr_route.mr_label = local_label;
4547 mp->mr_route.mr_eos = is_eos;
4548 mp->mr_route.mr_table_id = 0;
4549 mp->mr_route.mr_n_paths = path_count;
4551 clib_memcpy (&mp->mr_route.mr_paths, paths,
4552 sizeof (paths[0]) * path_count);
4558 /* If we receive SIGTERM, stop now... */
4563 /* When testing multiple add/del ops, use a control-ping to sync */
4566 vl_api_control_ping_t *mp_ping;
4570 /* Shut off async mode */
4571 vam->async_mode = 0;
4573 MPING (CONTROL_PING, mp_ping);
4576 timeout = vat_time_now (vam) + 1.0;
4577 while (vat_time_now (vam) < timeout)
4578 if (vam->result_ready == 1)
4583 if (vam->retval == -99)
4586 if (vam->async_errors > 0)
4588 errmsg ("%d asynchronous errors", vam->async_errors);
4591 vam->async_errors = 0;
4592 after = vat_time_now (vam);
4594 /* slim chance, but we might have eaten SIGTERM on the first iteration */
4598 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
4599 count, after - before, count / (after - before));
4605 /* Wait for a reply... */
4610 /* Return the good/bad news */
4611 return (vam->retval);
4616 api_mpls_ip_bind_unbind (vat_main_t * vam)
4618 unformat_input_t *i = vam->input;
4619 vl_api_mpls_ip_bind_unbind_t *mp;
4620 u32 ip_table_id = 0;
4622 vl_api_prefix_t pfx;
4624 mpls_label_t local_label = MPLS_LABEL_INVALID;
4627 /* Parse args required to build the message */
4628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4630 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
4632 else if (unformat (i, "%d", &local_label))
4634 else if (unformat (i, "table-id %d", &ip_table_id))
4636 else if (unformat (i, "unbind"))
4638 else if (unformat (i, "bind"))
4642 clib_warning ("parse error '%U'", format_unformat_error, i);
4649 errmsg ("IP prefix not set");
4653 if (MPLS_LABEL_INVALID == local_label)
4655 errmsg ("missing label");
4659 /* Construct the API message */
4660 M (MPLS_IP_BIND_UNBIND, mp);
4662 mp->mb_is_bind = is_bind;
4663 mp->mb_ip_table_id = ntohl (ip_table_id);
4664 mp->mb_mpls_table_id = 0;
4665 mp->mb_label = ntohl (local_label);
4666 clib_memcpy (&mp->mb_prefix, &pfx, sizeof (pfx));
4671 /* Wait for a reply... */
4678 api_mpls_tunnel_add_del (vat_main_t * vam)
4680 unformat_input_t *i = vam->input;
4681 vl_api_mpls_tunnel_add_del_t *mp;
4683 vl_api_fib_path_t paths[8];
4684 u32 sw_if_index = ~0;
4690 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4692 if (unformat (i, "add"))
4696 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
4698 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
4700 else if (unformat (i, "l2-only"))
4704 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4707 if (8 == path_count)
4709 errmsg ("max 8 paths");
4715 clib_warning ("parse error '%U'", format_unformat_error, i);
4720 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4722 mp->mt_is_add = is_add;
4723 mp->mt_tunnel.mt_sw_if_index = ntohl (sw_if_index);
4724 mp->mt_tunnel.mt_l2_only = l2_only;
4725 mp->mt_tunnel.mt_is_multicast = 0;
4726 mp->mt_tunnel.mt_n_paths = path_count;
4728 clib_memcpy (&mp->mt_tunnel.mt_paths, &paths,
4729 sizeof (paths[0]) * path_count);
4737 api_sw_interface_set_unnumbered (vat_main_t * vam)
4739 unformat_input_t *i = vam->input;
4740 vl_api_sw_interface_set_unnumbered_t *mp;
4742 u32 unnum_sw_index = ~0;
4744 u8 sw_if_index_set = 0;
4747 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4749 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4750 sw_if_index_set = 1;
4751 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4752 sw_if_index_set = 1;
4753 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
4755 else if (unformat (i, "del"))
4759 clib_warning ("parse error '%U'", format_unformat_error, i);
4764 if (sw_if_index_set == 0)
4766 errmsg ("missing interface name or sw_if_index");
4770 M (SW_INTERFACE_SET_UNNUMBERED, mp);
4772 mp->sw_if_index = ntohl (sw_if_index);
4773 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
4774 mp->is_add = is_add;
4783 api_create_vlan_subif (vat_main_t * vam)
4785 unformat_input_t *i = vam->input;
4786 vl_api_create_vlan_subif_t *mp;
4788 u8 sw_if_index_set = 0;
4793 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4795 if (unformat (i, "sw_if_index %d", &sw_if_index))
4796 sw_if_index_set = 1;
4798 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4799 sw_if_index_set = 1;
4800 else if (unformat (i, "vlan %d", &vlan_id))
4804 clib_warning ("parse error '%U'", format_unformat_error, i);
4809 if (sw_if_index_set == 0)
4811 errmsg ("missing interface name or sw_if_index");
4815 if (vlan_id_set == 0)
4817 errmsg ("missing vlan_id");
4820 M (CREATE_VLAN_SUBIF, mp);
4822 mp->sw_if_index = ntohl (sw_if_index);
4823 mp->vlan_id = ntohl (vlan_id);
4830 #define foreach_create_subif_bit \
4837 _(outer_vlan_id_any) \
4838 _(inner_vlan_id_any)
4840 #define foreach_create_subif_flag \
4845 _(4, "exact_match") \
4846 _(5, "default_sub") \
4847 _(6, "outer_vlan_id_any") \
4848 _(7, "inner_vlan_id_any")
4851 api_create_subif (vat_main_t * vam)
4853 unformat_input_t *i = vam->input;
4854 vl_api_create_subif_t *mp;
4856 u8 sw_if_index_set = 0;
4859 u32 __attribute__ ((unused)) no_tags = 0;
4860 u32 __attribute__ ((unused)) one_tag = 0;
4861 u32 __attribute__ ((unused)) two_tags = 0;
4862 u32 __attribute__ ((unused)) dot1ad = 0;
4863 u32 __attribute__ ((unused)) exact_match = 0;
4864 u32 __attribute__ ((unused)) default_sub = 0;
4865 u32 __attribute__ ((unused)) outer_vlan_id_any = 0;
4866 u32 __attribute__ ((unused)) inner_vlan_id_any = 0;
4868 u16 outer_vlan_id = 0;
4869 u16 inner_vlan_id = 0;
4872 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4874 if (unformat (i, "sw_if_index %d", &sw_if_index))
4875 sw_if_index_set = 1;
4877 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4878 sw_if_index_set = 1;
4879 else if (unformat (i, "sub_id %d", &sub_id))
4881 else if (unformat (i, "outer_vlan_id %d", &tmp))
4882 outer_vlan_id = tmp;
4883 else if (unformat (i, "inner_vlan_id %d", &tmp))
4884 inner_vlan_id = tmp;
4886 #define _(a) else if (unformat (i, #a)) a = 1 ;
4887 foreach_create_subif_bit
4891 clib_warning ("parse error '%U'", format_unformat_error, i);
4896 if (sw_if_index_set == 0)
4898 errmsg ("missing interface name or sw_if_index");
4902 if (sub_id_set == 0)
4904 errmsg ("missing sub_id");
4907 M (CREATE_SUBIF, mp);
4909 mp->sw_if_index = ntohl (sw_if_index);
4910 mp->sub_id = ntohl (sub_id);
4912 #define _(a,b) mp->sub_if_flags |= (1 << a);
4913 foreach_create_subif_flag;
4916 mp->outer_vlan_id = ntohs (outer_vlan_id);
4917 mp->inner_vlan_id = ntohs (inner_vlan_id);
4925 api_ip_table_replace_begin (vat_main_t * vam)
4927 unformat_input_t *i = vam->input;
4928 vl_api_ip_table_replace_begin_t *mp;
4933 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4935 if (unformat (i, "table %d", &table_id))
4937 else if (unformat (i, "ipv6"))
4941 clib_warning ("parse error '%U'", format_unformat_error, i);
4946 M (IP_TABLE_REPLACE_BEGIN, mp);
4948 mp->table.table_id = ntohl (table_id);
4949 mp->table.is_ip6 = is_ipv6;
4957 api_ip_table_flush (vat_main_t * vam)
4959 unformat_input_t *i = vam->input;
4960 vl_api_ip_table_flush_t *mp;
4965 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4967 if (unformat (i, "table %d", &table_id))
4969 else if (unformat (i, "ipv6"))
4973 clib_warning ("parse error '%U'", format_unformat_error, i);
4978 M (IP_TABLE_FLUSH, mp);
4980 mp->table.table_id = ntohl (table_id);
4981 mp->table.is_ip6 = is_ipv6;
4989 api_ip_table_replace_end (vat_main_t * vam)
4991 unformat_input_t *i = vam->input;
4992 vl_api_ip_table_replace_end_t *mp;
4997 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4999 if (unformat (i, "table %d", &table_id))
5001 else if (unformat (i, "ipv6"))
5005 clib_warning ("parse error '%U'", format_unformat_error, i);
5010 M (IP_TABLE_REPLACE_END, mp);
5012 mp->table.table_id = ntohl (table_id);
5013 mp->table.is_ip6 = is_ipv6;
5021 api_set_ip_flow_hash (vat_main_t * vam)
5023 unformat_input_t *i = vam->input;
5024 vl_api_set_ip_flow_hash_t *mp;
5036 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5038 if (unformat (i, "vrf %d", &vrf_id))
5040 else if (unformat (i, "ipv6"))
5042 else if (unformat (i, "src"))
5044 else if (unformat (i, "dst"))
5046 else if (unformat (i, "sport"))
5048 else if (unformat (i, "dport"))
5050 else if (unformat (i, "proto"))
5052 else if (unformat (i, "reverse"))
5057 clib_warning ("parse error '%U'", format_unformat_error, i);
5062 if (vrf_id_set == 0)
5064 errmsg ("missing vrf id");
5068 M (SET_IP_FLOW_HASH, mp);
5074 mp->reverse = reverse;
5075 mp->vrf_id = ntohl (vrf_id);
5076 mp->is_ipv6 = is_ipv6;
5084 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
5086 unformat_input_t *i = vam->input;
5087 vl_api_sw_interface_ip6_enable_disable_t *mp;
5089 u8 sw_if_index_set = 0;
5093 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5095 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5096 sw_if_index_set = 1;
5097 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5098 sw_if_index_set = 1;
5099 else if (unformat (i, "enable"))
5101 else if (unformat (i, "disable"))
5105 clib_warning ("parse error '%U'", format_unformat_error, i);
5110 if (sw_if_index_set == 0)
5112 errmsg ("missing interface name or sw_if_index");
5116 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
5118 mp->sw_if_index = ntohl (sw_if_index);
5119 mp->enable = enable;
5128 api_l2_patch_add_del (vat_main_t * vam)
5130 unformat_input_t *i = vam->input;
5131 vl_api_l2_patch_add_del_t *mp;
5133 u8 rx_sw_if_index_set = 0;
5135 u8 tx_sw_if_index_set = 0;
5139 /* Parse args required to build the message */
5140 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5142 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5143 rx_sw_if_index_set = 1;
5144 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5145 tx_sw_if_index_set = 1;
5146 else if (unformat (i, "rx"))
5148 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5150 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
5152 rx_sw_if_index_set = 1;
5157 else if (unformat (i, "tx"))
5159 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5161 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
5163 tx_sw_if_index_set = 1;
5168 else if (unformat (i, "del"))
5174 if (rx_sw_if_index_set == 0)
5176 errmsg ("missing rx interface name or rx_sw_if_index");
5180 if (tx_sw_if_index_set == 0)
5182 errmsg ("missing tx interface name or tx_sw_if_index");
5186 M (L2_PATCH_ADD_DEL, mp);
5188 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5189 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5190 mp->is_add = is_add;
5198 u8 localsid_addr[16];
5207 api_ioam_enable (vat_main_t * vam)
5209 unformat_input_t *input = vam->input;
5210 vl_api_ioam_enable_t *mp;
5212 int has_trace_option = 0;
5213 int has_pot_option = 0;
5214 int has_seqno_option = 0;
5215 int has_analyse_option = 0;
5218 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5220 if (unformat (input, "trace"))
5221 has_trace_option = 1;
5222 else if (unformat (input, "pot"))
5224 else if (unformat (input, "seqno"))
5225 has_seqno_option = 1;
5226 else if (unformat (input, "analyse"))
5227 has_analyse_option = 1;
5231 M (IOAM_ENABLE, mp);
5232 mp->id = htons (id);
5233 mp->seqno = has_seqno_option;
5234 mp->analyse = has_analyse_option;
5235 mp->pot_enable = has_pot_option;
5236 mp->trace_enable = has_trace_option;
5245 api_ioam_disable (vat_main_t * vam)
5247 vl_api_ioam_disable_t *mp;
5250 M (IOAM_DISABLE, mp);
5256 #define foreach_tcp_proto_field \
5260 #define foreach_udp_proto_field \
5264 #define foreach_ip4_proto_field \
5276 u16 src_port, dst_port;
5279 #if VPP_API_TEST_BUILTIN == 0
5281 unformat_tcp_mask (unformat_input_t * input, va_list * args)
5283 u8 **maskp = va_arg (*args, u8 **);
5285 u8 found_something = 0;
5288 #define _(a) u8 a=0;
5289 foreach_tcp_proto_field;
5292 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5295 #define _(a) else if (unformat (input, #a)) a=1;
5296 foreach_tcp_proto_field
5302 #define _(a) found_something += a;
5303 foreach_tcp_proto_field;
5306 if (found_something == 0)
5309 vec_validate (mask, sizeof (*tcp) - 1);
5311 tcp = (tcp_header_t *) mask;
5313 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
5314 foreach_tcp_proto_field;
5322 unformat_udp_mask (unformat_input_t * input, va_list * args)
5324 u8 **maskp = va_arg (*args, u8 **);
5326 u8 found_something = 0;
5329 #define _(a) u8 a=0;
5330 foreach_udp_proto_field;
5333 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5336 #define _(a) else if (unformat (input, #a)) a=1;
5337 foreach_udp_proto_field
5343 #define _(a) found_something += a;
5344 foreach_udp_proto_field;
5347 if (found_something == 0)
5350 vec_validate (mask, sizeof (*udp) - 1);
5352 udp = (udp_header_t *) mask;
5354 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
5355 foreach_udp_proto_field;
5363 unformat_l4_mask (unformat_input_t * input, va_list * args)
5365 u8 **maskp = va_arg (*args, u8 **);
5366 u16 src_port = 0, dst_port = 0;
5367 tcpudp_header_t *tcpudp;
5369 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5371 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
5373 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
5375 else if (unformat (input, "src_port"))
5377 else if (unformat (input, "dst_port"))
5383 if (!src_port && !dst_port)
5387 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
5389 tcpudp = (tcpudp_header_t *) mask;
5390 tcpudp->src_port = src_port;
5391 tcpudp->dst_port = dst_port;
5399 unformat_ip4_mask (unformat_input_t * input, va_list * args)
5401 u8 **maskp = va_arg (*args, u8 **);
5403 u8 found_something = 0;
5406 #define _(a) u8 a=0;
5407 foreach_ip4_proto_field;
5413 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5415 if (unformat (input, "version"))
5417 else if (unformat (input, "hdr_length"))
5419 else if (unformat (input, "src"))
5421 else if (unformat (input, "dst"))
5423 else if (unformat (input, "proto"))
5426 #define _(a) else if (unformat (input, #a)) a=1;
5427 foreach_ip4_proto_field
5433 #define _(a) found_something += a;
5434 foreach_ip4_proto_field;
5437 if (found_something == 0)
5440 vec_validate (mask, sizeof (*ip) - 1);
5442 ip = (ip4_header_t *) mask;
5444 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
5445 foreach_ip4_proto_field;
5448 ip->ip_version_and_header_length = 0;
5451 ip->ip_version_and_header_length |= 0xF0;
5454 ip->ip_version_and_header_length |= 0x0F;
5460 #define foreach_ip6_proto_field \
5468 unformat_ip6_mask (unformat_input_t * input, va_list * args)
5470 u8 **maskp = va_arg (*args, u8 **);
5472 u8 found_something = 0;
5474 u32 ip_version_traffic_class_and_flow_label;
5476 #define _(a) u8 a=0;
5477 foreach_ip6_proto_field;
5480 u8 traffic_class = 0;
5483 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5485 if (unformat (input, "version"))
5487 else if (unformat (input, "traffic-class"))
5489 else if (unformat (input, "flow-label"))
5491 else if (unformat (input, "src"))
5493 else if (unformat (input, "dst"))
5495 else if (unformat (input, "proto"))
5498 #define _(a) else if (unformat (input, #a)) a=1;
5499 foreach_ip6_proto_field
5505 #define _(a) found_something += a;
5506 foreach_ip6_proto_field;
5509 if (found_something == 0)
5512 vec_validate (mask, sizeof (*ip) - 1);
5514 ip = (ip6_header_t *) mask;
5516 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
5517 foreach_ip6_proto_field;
5520 ip_version_traffic_class_and_flow_label = 0;
5523 ip_version_traffic_class_and_flow_label |= 0xF0000000;
5526 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
5529 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
5531 ip->ip_version_traffic_class_and_flow_label =
5532 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
5539 unformat_l3_mask (unformat_input_t * input, va_list * args)
5541 u8 **maskp = va_arg (*args, u8 **);
5543 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5545 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
5547 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
5556 unformat_l2_mask (unformat_input_t * input, va_list * args)
5558 u8 **maskp = va_arg (*args, u8 **);
5573 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5575 if (unformat (input, "src"))
5577 else if (unformat (input, "dst"))
5579 else if (unformat (input, "proto"))
5581 else if (unformat (input, "tag1"))
5583 else if (unformat (input, "tag2"))
5585 else if (unformat (input, "ignore-tag1"))
5587 else if (unformat (input, "ignore-tag2"))
5589 else if (unformat (input, "cos1"))
5591 else if (unformat (input, "cos2"))
5593 else if (unformat (input, "dot1q"))
5595 else if (unformat (input, "dot1ad"))
5600 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
5601 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
5604 if (tag1 || ignore_tag1 || cos1 || dot1q)
5606 if (tag2 || ignore_tag2 || cos2 || dot1ad)
5609 vec_validate (mask, len - 1);
5612 clib_memset (mask, 0xff, 6);
5615 clib_memset (mask + 6, 0xff, 6);
5619 /* inner vlan tag */
5628 mask[21] = mask[20] = 0xff;
5649 mask[16] = mask[17] = 0xff;
5659 mask[12] = mask[13] = 0xff;
5666 unformat_classify_mask (unformat_input_t * input, va_list * args)
5668 u8 **maskp = va_arg (*args, u8 **);
5669 u32 *skipp = va_arg (*args, u32 *);
5670 u32 *matchp = va_arg (*args, u32 *);
5678 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5680 if (unformat (input, "hex %U", unformat_hex_string, &mask))
5682 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
5684 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
5686 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
5700 if (mask || l2 || l3 || l4)
5704 /* "With a free Ethernet header in every package" */
5706 vec_validate (l2, 13);
5710 vec_append (mask, l3);
5715 vec_append (mask, l4);
5720 /* Scan forward looking for the first significant mask octet */
5721 for (i = 0; i < vec_len (mask); i++)
5725 /* compute (skip, match) params */
5726 *skipp = i / sizeof (u32x4);
5727 vec_delete (mask, *skipp * sizeof (u32x4), 0);
5729 /* Pad mask to an even multiple of the vector size */
5730 while (vec_len (mask) % sizeof (u32x4))
5733 match = vec_len (mask) / sizeof (u32x4);
5735 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
5737 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
5738 if (*tmp || *(tmp + 1))
5743 clib_warning ("BUG: match 0");
5745 _vec_len (mask) = match * sizeof (u32x4);
5755 #endif /* VPP_API_TEST_BUILTIN */
5757 #define foreach_l2_next \
5759 _(ethernet, ETHERNET_INPUT) \
5764 unformat_l2_next_index (unformat_input_t * input, va_list * args)
5766 u32 *miss_next_indexp = va_arg (*args, u32 *);
5771 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
5775 if (unformat (input, "%d", &tmp))
5784 *miss_next_indexp = next_index;
5788 #define foreach_ip_next \
5794 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
5796 u32 *miss_next_indexp = va_arg (*args, u32 *);
5801 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
5805 if (unformat (input, "%d", &tmp))
5814 *miss_next_indexp = next_index;
5818 #define foreach_acl_next \
5822 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
5824 u32 *miss_next_indexp = va_arg (*args, u32 *);
5829 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
5833 if (unformat (input, "permit"))
5838 else if (unformat (input, "%d", &tmp))
5847 *miss_next_indexp = next_index;
5852 unformat_policer_precolor (unformat_input_t * input, va_list * args)
5854 u32 *r = va_arg (*args, u32 *);
5856 if (unformat (input, "conform-color"))
5857 *r = POLICE_CONFORM;
5858 else if (unformat (input, "exceed-color"))
5866 #if VPP_API_TEST_BUILTIN == 0
5868 unformat_l4_match (unformat_input_t * input, va_list * args)
5870 u8 **matchp = va_arg (*args, u8 **);
5872 u8 *proto_header = 0;
5878 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5880 if (unformat (input, "src_port %d", &src_port))
5882 else if (unformat (input, "dst_port %d", &dst_port))
5888 h.src_port = clib_host_to_net_u16 (src_port);
5889 h.dst_port = clib_host_to_net_u16 (dst_port);
5890 vec_validate (proto_header, sizeof (h) - 1);
5891 memcpy (proto_header, &h, sizeof (h));
5893 *matchp = proto_header;
5899 unformat_ip4_match (unformat_input_t * input, va_list * args)
5901 u8 **matchp = va_arg (*args, u8 **);
5908 int src = 0, dst = 0;
5909 ip4_address_t src_val, dst_val;
5916 int fragment_id = 0;
5917 u32 fragment_id_val;
5923 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5925 if (unformat (input, "version %d", &version_val))
5927 else if (unformat (input, "hdr_length %d", &hdr_length_val))
5929 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
5931 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
5933 else if (unformat (input, "proto %d", &proto_val))
5935 else if (unformat (input, "tos %d", &tos_val))
5937 else if (unformat (input, "length %d", &length_val))
5939 else if (unformat (input, "fragment_id %d", &fragment_id_val))
5941 else if (unformat (input, "ttl %d", &ttl_val))
5943 else if (unformat (input, "checksum %d", &checksum_val))
5949 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
5950 + ttl + checksum == 0)
5954 * Aligned because we use the real comparison functions
5956 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
5958 ip = (ip4_header_t *) match;
5960 /* These are realistically matched in practice */
5962 ip->src_address.as_u32 = src_val.as_u32;
5965 ip->dst_address.as_u32 = dst_val.as_u32;
5968 ip->protocol = proto_val;
5971 /* These are not, but they're included for completeness */
5973 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
5976 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
5982 ip->length = clib_host_to_net_u16 (length_val);
5988 ip->checksum = clib_host_to_net_u16 (checksum_val);
5995 unformat_ip6_match (unformat_input_t * input, va_list * args)
5997 u8 **matchp = va_arg (*args, u8 **);
6002 u8 traffic_class = 0;
6003 u32 traffic_class_val = 0;
6006 int src = 0, dst = 0;
6007 ip6_address_t src_val, dst_val;
6010 int payload_length = 0;
6011 u32 payload_length_val;
6014 u32 ip_version_traffic_class_and_flow_label;
6016 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6018 if (unformat (input, "version %d", &version_val))
6020 else if (unformat (input, "traffic_class %d", &traffic_class_val))
6022 else if (unformat (input, "flow_label %d", &flow_label_val))
6024 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
6026 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
6028 else if (unformat (input, "proto %d", &proto_val))
6030 else if (unformat (input, "payload_length %d", &payload_length_val))
6032 else if (unformat (input, "hop_limit %d", &hop_limit_val))
6038 if (version + traffic_class + flow_label + src + dst + proto +
6039 payload_length + hop_limit == 0)
6043 * Aligned because we use the real comparison functions
6045 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
6047 ip = (ip6_header_t *) match;
6050 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
6053 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
6056 ip->protocol = proto_val;
6058 ip_version_traffic_class_and_flow_label = 0;
6061 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
6064 ip_version_traffic_class_and_flow_label |=
6065 (traffic_class_val & 0xFF) << 20;
6068 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
6070 ip->ip_version_traffic_class_and_flow_label =
6071 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
6074 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
6077 ip->hop_limit = hop_limit_val;
6084 unformat_l3_match (unformat_input_t * input, va_list * args)
6086 u8 **matchp = va_arg (*args, u8 **);
6088 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6090 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
6092 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
6101 unformat_vlan_tag (unformat_input_t * input, va_list * args)
6103 u8 *tagp = va_arg (*args, u8 *);
6106 if (unformat (input, "%d", &tag))
6108 tagp[0] = (tag >> 8) & 0x0F;
6109 tagp[1] = tag & 0xFF;
6117 unformat_l2_match (unformat_input_t * input, va_list * args)
6119 u8 **matchp = va_arg (*args, u8 **);
6139 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6141 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
6144 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
6146 else if (unformat (input, "proto %U",
6147 unformat_ethernet_type_host_byte_order, &proto_val))
6149 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
6151 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
6153 else if (unformat (input, "ignore-tag1"))
6155 else if (unformat (input, "ignore-tag2"))
6157 else if (unformat (input, "cos1 %d", &cos1_val))
6159 else if (unformat (input, "cos2 %d", &cos2_val))
6164 if ((src + dst + proto + tag1 + tag2 +
6165 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
6168 if (tag1 || ignore_tag1 || cos1)
6170 if (tag2 || ignore_tag2 || cos2)
6173 vec_validate_aligned (match, len - 1, sizeof (u32x4));
6176 clib_memcpy (match, dst_val, 6);
6179 clib_memcpy (match + 6, src_val, 6);
6183 /* inner vlan tag */
6184 match[19] = tag2_val[1];
6185 match[18] = tag2_val[0];
6187 match[18] |= (cos2_val & 0x7) << 5;
6190 match[21] = proto_val & 0xff;
6191 match[20] = proto_val >> 8;
6195 match[15] = tag1_val[1];
6196 match[14] = tag1_val[0];
6199 match[14] |= (cos1_val & 0x7) << 5;
6205 match[15] = tag1_val[1];
6206 match[14] = tag1_val[0];
6209 match[17] = proto_val & 0xff;
6210 match[16] = proto_val >> 8;
6213 match[14] |= (cos1_val & 0x7) << 5;
6219 match[18] |= (cos2_val & 0x7) << 5;
6221 match[14] |= (cos1_val & 0x7) << 5;
6224 match[13] = proto_val & 0xff;
6225 match[12] = proto_val >> 8;
6233 unformat_qos_source (unformat_input_t * input, va_list * args)
6235 int *qs = va_arg (*args, int *);
6237 if (unformat (input, "ip"))
6238 *qs = QOS_SOURCE_IP;
6239 else if (unformat (input, "mpls"))
6240 *qs = QOS_SOURCE_MPLS;
6241 else if (unformat (input, "ext"))
6242 *qs = QOS_SOURCE_EXT;
6243 else if (unformat (input, "vlan"))
6244 *qs = QOS_SOURCE_VLAN;
6253 api_unformat_classify_match (unformat_input_t * input, va_list * args)
6255 u8 **matchp = va_arg (*args, u8 **);
6256 u32 skip_n_vectors = va_arg (*args, u32);
6257 u32 match_n_vectors = va_arg (*args, u32);
6264 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6266 if (unformat (input, "hex %U", unformat_hex_string, &match))
6268 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
6270 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
6272 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
6286 if (match || l2 || l3 || l4)
6290 /* "Win a free Ethernet header in every packet" */
6292 vec_validate_aligned (l2, 13, sizeof (u32x4));
6296 vec_append_aligned (match, l3, sizeof (u32x4));
6301 vec_append_aligned (match, l4, sizeof (u32x4));
6306 /* Make sure the vector is big enough even if key is all 0's */
6307 vec_validate_aligned
6308 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
6311 /* Set size, include skipped vectors */
6312 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
6323 api_get_node_index (vat_main_t * vam)
6325 unformat_input_t *i = vam->input;
6326 vl_api_get_node_index_t *mp;
6330 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6332 if (unformat (i, "node %s", &name))
6339 errmsg ("node name required");
6342 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
6344 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6348 M (GET_NODE_INDEX, mp);
6349 clib_memcpy (mp->node_name, name, vec_len (name));
6358 api_get_next_index (vat_main_t * vam)
6360 unformat_input_t *i = vam->input;
6361 vl_api_get_next_index_t *mp;
6362 u8 *node_name = 0, *next_node_name = 0;
6365 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6367 if (unformat (i, "node-name %s", &node_name))
6369 else if (unformat (i, "next-node-name %s", &next_node_name))
6375 errmsg ("node name required");
6378 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
6380 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6384 if (next_node_name == 0)
6386 errmsg ("next node name required");
6389 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
6391 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
6395 M (GET_NEXT_INDEX, mp);
6396 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
6397 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
6398 vec_free (node_name);
6399 vec_free (next_node_name);
6407 api_add_node_next (vat_main_t * vam)
6409 unformat_input_t *i = vam->input;
6410 vl_api_add_node_next_t *mp;
6415 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6417 if (unformat (i, "node %s", &name))
6419 else if (unformat (i, "next %s", &next))
6426 errmsg ("node name required");
6429 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
6431 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6436 errmsg ("next node required");
6439 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
6441 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
6445 M (ADD_NODE_NEXT, mp);
6446 clib_memcpy (mp->node_name, name, vec_len (name));
6447 clib_memcpy (mp->next_name, next, vec_len (next));
6456 static void vl_api_sw_interface_virtio_pci_details_t_handler
6457 (vl_api_sw_interface_virtio_pci_details_t * mp)
6459 vat_main_t *vam = &vat_main;
6474 addr.domain = ntohs (mp->pci_addr.domain);
6475 addr.bus = mp->pci_addr.bus;
6476 addr.slot = mp->pci_addr.slot;
6477 addr.function = mp->pci_addr.function;
6479 u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus,
6480 addr.slot, addr.function);
6483 "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx",
6484 pci_addr, ntohl (mp->sw_if_index),
6485 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
6486 format_ethernet_address, mp->mac_addr,
6487 clib_net_to_host_u64 (mp->features));
6488 vec_free (pci_addr);
6491 static void vl_api_sw_interface_virtio_pci_details_t_handler_json
6492 (vl_api_sw_interface_virtio_pci_details_t * mp)
6494 vat_main_t *vam = &vat_main;
6495 vat_json_node_t *node = NULL;
6496 vlib_pci_addr_t pci_addr;
6498 if (VAT_JSON_ARRAY != vam->json_tree.type)
6500 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6501 vat_json_init_array (&vam->json_tree);
6503 node = vat_json_array_add (&vam->json_tree);
6505 pci_addr.domain = ntohs (mp->pci_addr.domain);
6506 pci_addr.bus = mp->pci_addr.bus;
6507 pci_addr.slot = mp->pci_addr.slot;
6508 pci_addr.function = mp->pci_addr.function;
6510 vat_json_init_object (node);
6511 vat_json_object_add_uint (node, "pci-addr", pci_addr.as_u32);
6512 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6513 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
6514 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
6515 vat_json_object_add_uint (node, "features",
6516 clib_net_to_host_u64 (mp->features));
6517 vat_json_object_add_string_copy (node, "mac_addr",
6518 format (0, "%U", format_ethernet_address,
6523 api_sw_interface_virtio_pci_dump (vat_main_t * vam)
6525 vl_api_sw_interface_virtio_pci_dump_t *mp;
6526 vl_api_control_ping_t *mp_ping;
6530 "\n%-12s %-12s %-12s %-12s %-17s %-08s",
6531 "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz",
6532 "mac_addr", "features");
6534 /* Get list of tap interfaces */
6535 M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp);
6538 /* Use a control ping for synchronization */
6539 MPING (CONTROL_PING, mp_ping);
6547 api_l2_fib_clear_table (vat_main_t * vam)
6549 // unformat_input_t * i = vam->input;
6550 vl_api_l2_fib_clear_table_t *mp;
6553 M (L2_FIB_CLEAR_TABLE, mp);
6561 api_l2_interface_efp_filter (vat_main_t * vam)
6563 unformat_input_t *i = vam->input;
6564 vl_api_l2_interface_efp_filter_t *mp;
6567 u8 sw_if_index_set = 0;
6570 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6572 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6573 sw_if_index_set = 1;
6574 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6575 sw_if_index_set = 1;
6576 else if (unformat (i, "enable"))
6578 else if (unformat (i, "disable"))
6582 clib_warning ("parse error '%U'", format_unformat_error, i);
6587 if (sw_if_index_set == 0)
6589 errmsg ("missing sw_if_index");
6593 M (L2_INTERFACE_EFP_FILTER, mp);
6595 mp->sw_if_index = ntohl (sw_if_index);
6596 mp->enable_disable = enable;
6603 #define foreach_vtr_op \
6604 _("disable", L2_VTR_DISABLED) \
6605 _("push-1", L2_VTR_PUSH_1) \
6606 _("push-2", L2_VTR_PUSH_2) \
6607 _("pop-1", L2_VTR_POP_1) \
6608 _("pop-2", L2_VTR_POP_2) \
6609 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
6610 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
6611 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
6612 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
6615 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
6617 unformat_input_t *i = vam->input;
6618 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
6620 u8 sw_if_index_set = 0;
6628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6630 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6631 sw_if_index_set = 1;
6632 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6633 sw_if_index_set = 1;
6634 else if (unformat (i, "vtr_op %d", &vtr_op))
6636 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
6639 else if (unformat (i, "push_dot1q %d", &push_dot1q))
6641 else if (unformat (i, "tag1 %d", &tag1))
6643 else if (unformat (i, "tag2 %d", &tag2))
6647 clib_warning ("parse error '%U'", format_unformat_error, i);
6652 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
6654 errmsg ("missing vtr operation or sw_if_index");
6658 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
6659 mp->sw_if_index = ntohl (sw_if_index);
6660 mp->vtr_op = ntohl (vtr_op);
6661 mp->push_dot1q = ntohl (push_dot1q);
6662 mp->tag1 = ntohl (tag1);
6663 mp->tag2 = ntohl (tag2);
6671 api_create_vhost_user_if (vat_main_t * vam)
6673 unformat_input_t *i = vam->input;
6674 vl_api_create_vhost_user_if_t *mp;
6677 u8 file_name_set = 0;
6678 u32 custom_dev_instance = ~0;
6680 u8 use_custom_mac = 0;
6681 u8 disable_mrg_rxbuf = 0;
6682 u8 disable_indirect_desc = 0;
6685 u8 enable_packed = 0;
6688 /* Shut up coverity */
6689 clib_memset (hwaddr, 0, sizeof (hwaddr));
6691 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6693 if (unformat (i, "socket %s", &file_name))
6697 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
6699 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
6701 else if (unformat (i, "server"))
6703 else if (unformat (i, "disable_mrg_rxbuf"))
6704 disable_mrg_rxbuf = 1;
6705 else if (unformat (i, "disable_indirect_desc"))
6706 disable_indirect_desc = 1;
6707 else if (unformat (i, "gso"))
6709 else if (unformat (i, "packed"))
6711 else if (unformat (i, "tag %s", &tag))
6717 if (file_name_set == 0)
6719 errmsg ("missing socket file name");
6723 if (vec_len (file_name) > 255)
6725 errmsg ("socket file name too long");
6728 vec_add1 (file_name, 0);
6730 M (CREATE_VHOST_USER_IF, mp);
6732 mp->is_server = is_server;
6733 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
6734 mp->disable_indirect_desc = disable_indirect_desc;
6735 mp->enable_gso = enable_gso;
6736 mp->enable_packed = enable_packed;
6737 mp->custom_dev_instance = ntohl (custom_dev_instance);
6738 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
6739 vec_free (file_name);
6740 if (custom_dev_instance != ~0)
6743 mp->use_custom_mac = use_custom_mac;
6744 clib_memcpy (mp->mac_address, hwaddr, 6);
6746 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
6755 api_modify_vhost_user_if (vat_main_t * vam)
6757 unformat_input_t *i = vam->input;
6758 vl_api_modify_vhost_user_if_t *mp;
6761 u8 file_name_set = 0;
6762 u32 custom_dev_instance = ~0;
6763 u8 sw_if_index_set = 0;
6764 u32 sw_if_index = (u32) ~ 0;
6766 u8 enable_packed = 0;
6769 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6771 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6772 sw_if_index_set = 1;
6773 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6774 sw_if_index_set = 1;
6775 else if (unformat (i, "socket %s", &file_name))
6779 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
6781 else if (unformat (i, "server"))
6783 else if (unformat (i, "gso"))
6785 else if (unformat (i, "packed"))
6791 if (sw_if_index_set == 0)
6793 errmsg ("missing sw_if_index or interface name");
6797 if (file_name_set == 0)
6799 errmsg ("missing socket file name");
6803 if (vec_len (file_name) > 255)
6805 errmsg ("socket file name too long");
6808 vec_add1 (file_name, 0);
6810 M (MODIFY_VHOST_USER_IF, mp);
6812 mp->sw_if_index = ntohl (sw_if_index);
6813 mp->is_server = is_server;
6814 mp->enable_gso = enable_gso;
6815 mp->enable_packed = enable_packed;
6816 mp->custom_dev_instance = ntohl (custom_dev_instance);
6817 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
6818 vec_free (file_name);
6819 if (custom_dev_instance != ~0)
6828 api_create_vhost_user_if_v2 (vat_main_t * vam)
6830 unformat_input_t *i = vam->input;
6831 vl_api_create_vhost_user_if_v2_t *mp;
6834 u8 file_name_set = 0;
6835 u32 custom_dev_instance = ~0;
6837 u8 use_custom_mac = 0;
6838 u8 disable_mrg_rxbuf = 0;
6839 u8 disable_indirect_desc = 0;
6842 u8 enable_packed = 0;
6843 u8 enable_event_idx = 0;
6846 /* Shut up coverity */
6847 clib_memset (hwaddr, 0, sizeof (hwaddr));
6849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6851 if (unformat (i, "socket %s", &file_name))
6855 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
6857 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
6859 else if (unformat (i, "server"))
6861 else if (unformat (i, "disable_mrg_rxbuf"))
6862 disable_mrg_rxbuf = 1;
6863 else if (unformat (i, "disable_indirect_desc"))
6864 disable_indirect_desc = 1;
6865 else if (unformat (i, "gso"))
6867 else if (unformat (i, "packed"))
6869 else if (unformat (i, "event-idx"))
6870 enable_event_idx = 1;
6871 else if (unformat (i, "tag %s", &tag))
6877 if (file_name_set == 0)
6879 errmsg ("missing socket file name");
6883 if (vec_len (file_name) > 255)
6885 errmsg ("socket file name too long");
6888 vec_add1 (file_name, 0);
6890 M (CREATE_VHOST_USER_IF_V2, mp);
6892 mp->is_server = is_server;
6893 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
6894 mp->disable_indirect_desc = disable_indirect_desc;
6895 mp->enable_gso = enable_gso;
6896 mp->enable_packed = enable_packed;
6897 mp->enable_event_idx = enable_event_idx;
6898 mp->custom_dev_instance = ntohl (custom_dev_instance);
6899 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
6900 vec_free (file_name);
6901 if (custom_dev_instance != ~0)
6904 mp->use_custom_mac = use_custom_mac;
6905 clib_memcpy (mp->mac_address, hwaddr, 6);
6907 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
6916 api_modify_vhost_user_if_v2 (vat_main_t * vam)
6918 unformat_input_t *i = vam->input;
6919 vl_api_modify_vhost_user_if_v2_t *mp;
6922 u8 file_name_set = 0;
6923 u32 custom_dev_instance = ~0;
6924 u8 sw_if_index_set = 0;
6925 u32 sw_if_index = (u32) ~ 0;
6927 u8 enable_packed = 0;
6928 u8 enable_event_idx = 0;
6931 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6933 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6934 sw_if_index_set = 1;
6935 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6936 sw_if_index_set = 1;
6937 else if (unformat (i, "socket %s", &file_name))
6941 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
6943 else if (unformat (i, "server"))
6945 else if (unformat (i, "gso"))
6947 else if (unformat (i, "packed"))
6949 else if (unformat (i, "event-idx"))
6950 enable_event_idx = 1;
6955 if (sw_if_index_set == 0)
6957 errmsg ("missing sw_if_index or interface name");
6961 if (file_name_set == 0)
6963 errmsg ("missing socket file name");
6967 if (vec_len (file_name) > 255)
6969 errmsg ("socket file name too long");
6972 vec_add1 (file_name, 0);
6974 M (MODIFY_VHOST_USER_IF_V2, mp);
6976 mp->sw_if_index = ntohl (sw_if_index);
6977 mp->is_server = is_server;
6978 mp->enable_gso = enable_gso;
6979 mp->enable_packed = enable_packed;
6980 mp->enable_event_idx = enable_event_idx;
6981 mp->custom_dev_instance = ntohl (custom_dev_instance);
6982 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
6983 vec_free (file_name);
6984 if (custom_dev_instance != ~0)
6993 api_delete_vhost_user_if (vat_main_t * vam)
6995 unformat_input_t *i = vam->input;
6996 vl_api_delete_vhost_user_if_t *mp;
6997 u32 sw_if_index = ~0;
6998 u8 sw_if_index_set = 0;
7001 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7003 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7004 sw_if_index_set = 1;
7005 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7006 sw_if_index_set = 1;
7011 if (sw_if_index_set == 0)
7013 errmsg ("missing sw_if_index or interface name");
7018 M (DELETE_VHOST_USER_IF, mp);
7020 mp->sw_if_index = ntohl (sw_if_index);
7027 static void vl_api_sw_interface_vhost_user_details_t_handler
7028 (vl_api_sw_interface_vhost_user_details_t * mp)
7030 vat_main_t *vam = &vat_main;
7034 clib_net_to_host_u32 (mp->features_first_32) | ((u64)
7035 clib_net_to_host_u32
7036 (mp->features_last_32) <<
7039 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %16llx %6d %7d %s",
7040 (char *) mp->interface_name, ntohl (mp->sw_if_index),
7041 ntohl (mp->virtio_net_hdr_sz), features, mp->is_server,
7042 ntohl (mp->num_regions), (char *) mp->sock_filename);
7043 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
7046 static void vl_api_sw_interface_vhost_user_details_t_handler_json
7047 (vl_api_sw_interface_vhost_user_details_t * mp)
7049 vat_main_t *vam = &vat_main;
7050 vat_json_node_t *node = NULL;
7052 if (VAT_JSON_ARRAY != vam->json_tree.type)
7054 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7055 vat_json_init_array (&vam->json_tree);
7057 node = vat_json_array_add (&vam->json_tree);
7059 vat_json_init_object (node);
7060 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
7061 vat_json_object_add_string_copy (node, "interface_name",
7062 mp->interface_name);
7063 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
7064 ntohl (mp->virtio_net_hdr_sz));
7065 vat_json_object_add_uint (node, "features_first_32",
7066 clib_net_to_host_u32 (mp->features_first_32));
7067 vat_json_object_add_uint (node, "features_last_32",
7068 clib_net_to_host_u32 (mp->features_last_32));
7069 vat_json_object_add_uint (node, "is_server", mp->is_server);
7070 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
7071 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
7072 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
7076 api_sw_interface_vhost_user_dump (vat_main_t * vam)
7078 unformat_input_t *i = vam->input;
7079 vl_api_sw_interface_vhost_user_dump_t *mp;
7080 vl_api_control_ping_t *mp_ping;
7082 u32 sw_if_index = ~0;
7084 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7086 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7088 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7094 print (vam->ofp, "Interface name idx hdr_sz features "
7095 "server regions filename");
7097 /* Get list of vhost-user interfaces */
7098 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
7099 mp->sw_if_index = ntohl (sw_if_index);
7102 /* Use a control ping for synchronization */
7103 MPING (CONTROL_PING, mp_ping);
7111 api_show_version (vat_main_t * vam)
7113 vl_api_show_version_t *mp;
7116 M (SHOW_VERSION, mp);
7123 static void vl_api_l2_fib_table_details_t_handler
7124 (vl_api_l2_fib_table_details_t * mp)
7126 vat_main_t *vam = &vat_main;
7128 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
7130 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
7131 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
7135 static void vl_api_l2_fib_table_details_t_handler_json
7136 (vl_api_l2_fib_table_details_t * mp)
7138 vat_main_t *vam = &vat_main;
7139 vat_json_node_t *node = NULL;
7141 if (VAT_JSON_ARRAY != vam->json_tree.type)
7143 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7144 vat_json_init_array (&vam->json_tree);
7146 node = vat_json_array_add (&vam->json_tree);
7148 vat_json_init_object (node);
7149 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
7150 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
7151 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
7152 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
7153 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
7154 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
7158 api_l2_fib_table_dump (vat_main_t * vam)
7160 unformat_input_t *i = vam->input;
7161 vl_api_l2_fib_table_dump_t *mp;
7162 vl_api_control_ping_t *mp_ping;
7167 /* Parse args required to build the message */
7168 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7170 if (unformat (i, "bd_id %d", &bd_id))
7178 errmsg ("missing bridge domain");
7182 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
7184 /* Get list of l2 fib entries */
7185 M (L2_FIB_TABLE_DUMP, mp);
7187 mp->bd_id = ntohl (bd_id);
7190 /* Use a control ping for synchronization */
7191 MPING (CONTROL_PING, mp_ping);
7200 api_interface_name_renumber (vat_main_t * vam)
7202 unformat_input_t *line_input = vam->input;
7203 vl_api_interface_name_renumber_t *mp;
7204 u32 sw_if_index = ~0;
7205 u32 new_show_dev_instance = ~0;
7208 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
7210 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
7213 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
7215 else if (unformat (line_input, "new_show_dev_instance %d",
7216 &new_show_dev_instance))
7222 if (sw_if_index == ~0)
7224 errmsg ("missing interface name or sw_if_index");
7228 if (new_show_dev_instance == ~0)
7230 errmsg ("missing new_show_dev_instance");
7234 M (INTERFACE_NAME_RENUMBER, mp);
7236 mp->sw_if_index = ntohl (sw_if_index);
7237 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
7245 api_want_l2_macs_events (vat_main_t * vam)
7247 unformat_input_t *line_input = vam->input;
7248 vl_api_want_l2_macs_events_t *mp;
7249 u8 enable_disable = 1;
7251 u32 max_macs_in_event = 0;
7252 u32 learn_limit = 0;
7255 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
7257 if (unformat (line_input, "learn-limit %d", &learn_limit))
7259 else if (unformat (line_input, "scan-delay %d", &scan_delay))
7261 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
7263 else if (unformat (line_input, "disable"))
7269 M (WANT_L2_MACS_EVENTS, mp);
7270 mp->enable_disable = enable_disable;
7271 mp->pid = htonl (getpid ());
7272 mp->learn_limit = htonl (learn_limit);
7273 mp->scan_delay = (u8) scan_delay;
7274 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
7281 api_ip_address_dump (vat_main_t * vam)
7283 unformat_input_t *i = vam->input;
7284 vl_api_ip_address_dump_t *mp;
7285 vl_api_control_ping_t *mp_ping;
7286 u32 sw_if_index = ~0;
7287 u8 sw_if_index_set = 0;
7292 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7294 if (unformat (i, "sw_if_index %d", &sw_if_index))
7295 sw_if_index_set = 1;
7297 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7298 sw_if_index_set = 1;
7299 else if (unformat (i, "ipv4"))
7301 else if (unformat (i, "ipv6"))
7307 if (ipv4_set && ipv6_set)
7309 errmsg ("ipv4 and ipv6 flags cannot be both set");
7313 if ((!ipv4_set) && (!ipv6_set))
7315 errmsg ("no ipv4 nor ipv6 flag set");
7319 if (sw_if_index_set == 0)
7321 errmsg ("missing interface name or sw_if_index");
7325 vam->current_sw_if_index = sw_if_index;
7326 vam->is_ipv6 = ipv6_set;
7328 M (IP_ADDRESS_DUMP, mp);
7329 mp->sw_if_index = ntohl (sw_if_index);
7330 mp->is_ipv6 = ipv6_set;
7333 /* Use a control ping for synchronization */
7334 MPING (CONTROL_PING, mp_ping);
7342 api_ip_dump (vat_main_t * vam)
7344 vl_api_ip_dump_t *mp;
7345 vl_api_control_ping_t *mp_ping;
7346 unformat_input_t *in = vam->input;
7353 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
7355 if (unformat (in, "ipv4"))
7357 else if (unformat (in, "ipv6"))
7363 if (ipv4_set && ipv6_set)
7365 errmsg ("ipv4 and ipv6 flags cannot be both set");
7369 if ((!ipv4_set) && (!ipv6_set))
7371 errmsg ("no ipv4 nor ipv6 flag set");
7376 vam->is_ipv6 = is_ipv6;
7379 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
7381 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
7383 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
7386 mp->is_ipv6 = ipv6_set;
7389 /* Use a control ping for synchronization */
7390 MPING (CONTROL_PING, mp_ping);
7398 api_get_first_msg_id (vat_main_t * vam)
7400 vl_api_get_first_msg_id_t *mp;
7401 unformat_input_t *i = vam->input;
7406 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7408 if (unformat (i, "client %s", &name))
7416 errmsg ("missing client name");
7421 if (vec_len (name) > 63)
7423 errmsg ("client name too long");
7427 M (GET_FIRST_MSG_ID, mp);
7428 clib_memcpy (mp->name, name, vec_len (name));
7435 api_get_node_graph (vat_main_t * vam)
7437 vl_api_get_node_graph_t *mp;
7440 M (GET_NODE_GRAPH, mp);
7444 /* Wait for the reply */
7450 format_fib_api_path_nh_proto (u8 * s, va_list * args)
7452 vl_api_fib_path_nh_proto_t proto =
7453 va_arg (*args, vl_api_fib_path_nh_proto_t);
7457 case FIB_API_PATH_NH_PROTO_IP4:
7458 s = format (s, "ip4");
7460 case FIB_API_PATH_NH_PROTO_IP6:
7461 s = format (s, "ip6");
7463 case FIB_API_PATH_NH_PROTO_MPLS:
7464 s = format (s, "mpls");
7466 case FIB_API_PATH_NH_PROTO_BIER:
7467 s = format (s, "bier");
7469 case FIB_API_PATH_NH_PROTO_ETHERNET:
7470 s = format (s, "ethernet");
7478 format_vl_api_ip_address_union (u8 * s, va_list * args)
7480 vl_api_address_family_t af = va_arg (*args, int);
7481 const vl_api_address_union_t *u = va_arg (*args, vl_api_address_union_t *);
7486 s = format (s, "%U", format_ip4_address, u->ip4);
7489 s = format (s, "%U", format_ip6_address, u->ip6);
7496 format_vl_api_fib_path_type (u8 * s, va_list * args)
7498 vl_api_fib_path_type_t t = va_arg (*args, vl_api_fib_path_type_t);
7502 case FIB_API_PATH_TYPE_NORMAL:
7503 s = format (s, "normal");
7505 case FIB_API_PATH_TYPE_LOCAL:
7506 s = format (s, "local");
7508 case FIB_API_PATH_TYPE_DROP:
7509 s = format (s, "drop");
7511 case FIB_API_PATH_TYPE_UDP_ENCAP:
7512 s = format (s, "udp-encap");
7514 case FIB_API_PATH_TYPE_BIER_IMP:
7515 s = format (s, "bier-imp");
7517 case FIB_API_PATH_TYPE_ICMP_UNREACH:
7518 s = format (s, "unreach");
7520 case FIB_API_PATH_TYPE_ICMP_PROHIBIT:
7521 s = format (s, "prohibit");
7523 case FIB_API_PATH_TYPE_SOURCE_LOOKUP:
7524 s = format (s, "src-lookup");
7526 case FIB_API_PATH_TYPE_DVR:
7527 s = format (s, "dvr");
7529 case FIB_API_PATH_TYPE_INTERFACE_RX:
7530 s = format (s, "interface-rx");
7532 case FIB_API_PATH_TYPE_CLASSIFY:
7533 s = format (s, "classify");
7541 vl_api_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
7544 " weight %d, sw_if_index %d, type %U, afi %U, next_hop %U",
7545 ntohl (fp->weight), ntohl (fp->sw_if_index),
7546 format_vl_api_fib_path_type, fp->type,
7547 format_fib_api_path_nh_proto, fp->proto,
7548 format_vl_api_ip_address_union, &fp->nh.address);
7552 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
7553 vl_api_fib_path_t * fp)
7556 struct in6_addr ip6;
7558 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
7559 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
7560 vat_json_object_add_uint (node, "type", fp->type);
7561 vat_json_object_add_uint (node, "next_hop_proto", fp->proto);
7562 if (fp->proto == FIB_API_PATH_NH_PROTO_IP4)
7564 clib_memcpy (&ip4, &fp->nh.address.ip4, sizeof (ip4));
7565 vat_json_object_add_ip4 (node, "next_hop", ip4);
7567 else if (fp->proto == FIB_API_PATH_NH_PROTO_IP6)
7569 clib_memcpy (&ip6, &fp->nh.address.ip6, sizeof (ip6));
7570 vat_json_object_add_ip6 (node, "next_hop", ip6);
7575 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
7577 vat_main_t *vam = &vat_main;
7578 int count = ntohl (mp->mt_tunnel.mt_n_paths);
7579 vl_api_fib_path_t *fp;
7582 print (vam->ofp, "sw_if_index %d via:",
7583 ntohl (mp->mt_tunnel.mt_sw_if_index));
7584 fp = mp->mt_tunnel.mt_paths;
7585 for (i = 0; i < count; i++)
7587 vl_api_fib_path_print (vam, fp);
7591 print (vam->ofp, "");
7594 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
7595 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
7598 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
7600 vat_main_t *vam = &vat_main;
7601 vat_json_node_t *node = NULL;
7602 int count = ntohl (mp->mt_tunnel.mt_n_paths);
7603 vl_api_fib_path_t *fp;
7606 if (VAT_JSON_ARRAY != vam->json_tree.type)
7608 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7609 vat_json_init_array (&vam->json_tree);
7611 node = vat_json_array_add (&vam->json_tree);
7613 vat_json_init_object (node);
7614 vat_json_object_add_uint (node, "sw_if_index",
7615 ntohl (mp->mt_tunnel.mt_sw_if_index));
7617 vat_json_object_add_uint (node, "l2_only", mp->mt_tunnel.mt_l2_only);
7619 fp = mp->mt_tunnel.mt_paths;
7620 for (i = 0; i < count; i++)
7622 vl_api_mpls_fib_path_json_print (node, fp);
7628 api_mpls_tunnel_dump (vat_main_t * vam)
7630 vl_api_mpls_tunnel_dump_t *mp;
7631 vl_api_control_ping_t *mp_ping;
7634 M (MPLS_TUNNEL_DUMP, mp);
7638 /* Use a control ping for synchronization */
7639 MPING (CONTROL_PING, mp_ping);
7646 #define vl_api_mpls_table_details_t_endian vl_noop_handler
7647 #define vl_api_mpls_table_details_t_print vl_noop_handler
7651 vl_api_mpls_table_details_t_handler (vl_api_mpls_table_details_t * mp)
7653 vat_main_t *vam = &vat_main;
7655 print (vam->ofp, "table-id %d,", ntohl (mp->mt_table.mt_table_id));
7658 static void vl_api_mpls_table_details_t_handler_json
7659 (vl_api_mpls_table_details_t * mp)
7661 vat_main_t *vam = &vat_main;
7662 vat_json_node_t *node = NULL;
7664 if (VAT_JSON_ARRAY != vam->json_tree.type)
7666 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7667 vat_json_init_array (&vam->json_tree);
7669 node = vat_json_array_add (&vam->json_tree);
7671 vat_json_init_object (node);
7672 vat_json_object_add_uint (node, "table", ntohl (mp->mt_table.mt_table_id));
7676 api_mpls_table_dump (vat_main_t * vam)
7678 vl_api_mpls_table_dump_t *mp;
7679 vl_api_control_ping_t *mp_ping;
7682 M (MPLS_TABLE_DUMP, mp);
7685 /* Use a control ping for synchronization */
7686 MPING (CONTROL_PING, mp_ping);
7693 #define vl_api_mpls_route_details_t_endian vl_noop_handler
7694 #define vl_api_mpls_route_details_t_print vl_noop_handler
7697 vl_api_mpls_route_details_t_handler (vl_api_mpls_route_details_t * mp)
7699 vat_main_t *vam = &vat_main;
7700 int count = (int) clib_net_to_host_u32 (mp->mr_route.mr_n_paths);
7701 vl_api_fib_path_t *fp;
7705 "table-id %d, label %u, ess_bit %u",
7706 ntohl (mp->mr_route.mr_table_id),
7707 ntohl (mp->mr_route.mr_label), mp->mr_route.mr_eos);
7708 fp = mp->mr_route.mr_paths;
7709 for (i = 0; i < count; i++)
7711 vl_api_fib_path_print (vam, fp);
7716 static void vl_api_mpls_route_details_t_handler_json
7717 (vl_api_mpls_route_details_t * mp)
7719 vat_main_t *vam = &vat_main;
7720 int count = (int) clib_host_to_net_u32 (mp->mr_route.mr_n_paths);
7721 vat_json_node_t *node = NULL;
7722 vl_api_fib_path_t *fp;
7725 if (VAT_JSON_ARRAY != vam->json_tree.type)
7727 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7728 vat_json_init_array (&vam->json_tree);
7730 node = vat_json_array_add (&vam->json_tree);
7732 vat_json_init_object (node);
7733 vat_json_object_add_uint (node, "table", ntohl (mp->mr_route.mr_table_id));
7734 vat_json_object_add_uint (node, "s_bit", mp->mr_route.mr_eos);
7735 vat_json_object_add_uint (node, "label", ntohl (mp->mr_route.mr_label));
7736 vat_json_object_add_uint (node, "path_count", count);
7737 fp = mp->mr_route.mr_paths;
7738 for (i = 0; i < count; i++)
7740 vl_api_mpls_fib_path_json_print (node, fp);
7746 api_mpls_route_dump (vat_main_t * vam)
7748 unformat_input_t *input = vam->input;
7749 vl_api_mpls_route_dump_t *mp;
7750 vl_api_control_ping_t *mp_ping;
7754 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7756 if (unformat (input, "table_id %d", &table_id))
7763 errmsg ("missing table id");
7767 M (MPLS_ROUTE_DUMP, mp);
7769 mp->table.mt_table_id = ntohl (table_id);
7772 /* Use a control ping for synchronization */
7773 MPING (CONTROL_PING, mp_ping);
7780 #define vl_api_ip_table_details_t_endian vl_noop_handler
7781 #define vl_api_ip_table_details_t_print vl_noop_handler
7784 vl_api_ip_table_details_t_handler (vl_api_ip_table_details_t * mp)
7786 vat_main_t *vam = &vat_main;
7789 "%s; table-id %d, prefix %U/%d",
7790 mp->table.name, ntohl (mp->table.table_id));
7794 static void vl_api_ip_table_details_t_handler_json
7795 (vl_api_ip_table_details_t * mp)
7797 vat_main_t *vam = &vat_main;
7798 vat_json_node_t *node = NULL;
7800 if (VAT_JSON_ARRAY != vam->json_tree.type)
7802 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7803 vat_json_init_array (&vam->json_tree);
7805 node = vat_json_array_add (&vam->json_tree);
7807 vat_json_init_object (node);
7808 vat_json_object_add_uint (node, "table", ntohl (mp->table.table_id));
7812 api_ip_table_dump (vat_main_t * vam)
7814 vl_api_ip_table_dump_t *mp;
7815 vl_api_control_ping_t *mp_ping;
7818 M (IP_TABLE_DUMP, mp);
7821 /* Use a control ping for synchronization */
7822 MPING (CONTROL_PING, mp_ping);
7830 api_ip_mtable_dump (vat_main_t * vam)
7832 vl_api_ip_mtable_dump_t *mp;
7833 vl_api_control_ping_t *mp_ping;
7836 M (IP_MTABLE_DUMP, mp);
7839 /* Use a control ping for synchronization */
7840 MPING (CONTROL_PING, mp_ping);
7848 api_ip_mroute_dump (vat_main_t * vam)
7850 unformat_input_t *input = vam->input;
7851 vl_api_control_ping_t *mp_ping;
7852 vl_api_ip_mroute_dump_t *mp;
7857 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7859 if (unformat (input, "table_id %d", &table_id))
7861 else if (unformat (input, "ip6"))
7863 else if (unformat (input, "ip4"))
7870 errmsg ("missing table id");
7874 M (IP_MROUTE_DUMP, mp);
7875 mp->table.table_id = table_id;
7876 mp->table.is_ip6 = is_ip6;
7879 /* Use a control ping for synchronization */
7880 MPING (CONTROL_PING, mp_ping);
7887 #define vl_api_ip_route_details_t_endian vl_noop_handler
7888 #define vl_api_ip_route_details_t_print vl_noop_handler
7891 vl_api_ip_route_details_t_handler (vl_api_ip_route_details_t * mp)
7893 vat_main_t *vam = &vat_main;
7894 u8 count = mp->route.n_paths;
7895 vl_api_fib_path_t *fp;
7899 "table-id %d, prefix %U/%d",
7900 ntohl (mp->route.table_id),
7901 format_ip46_address, mp->route.prefix.address, mp->route.prefix.len);
7902 for (i = 0; i < count; i++)
7904 fp = &mp->route.paths[i];
7906 vl_api_fib_path_print (vam, fp);
7911 static void vl_api_ip_route_details_t_handler_json
7912 (vl_api_ip_route_details_t * mp)
7914 vat_main_t *vam = &vat_main;
7915 u8 count = mp->route.n_paths;
7916 vat_json_node_t *node = NULL;
7918 struct in6_addr ip6;
7919 vl_api_fib_path_t *fp;
7922 if (VAT_JSON_ARRAY != vam->json_tree.type)
7924 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7925 vat_json_init_array (&vam->json_tree);
7927 node = vat_json_array_add (&vam->json_tree);
7929 vat_json_init_object (node);
7930 vat_json_object_add_uint (node, "table", ntohl (mp->route.table_id));
7931 if (ADDRESS_IP6 == mp->route.prefix.address.af)
7933 clib_memcpy (&ip6, &mp->route.prefix.address.un.ip6, sizeof (ip6));
7934 vat_json_object_add_ip6 (node, "prefix", ip6);
7938 clib_memcpy (&ip4, &mp->route.prefix.address.un.ip4, sizeof (ip4));
7939 vat_json_object_add_ip4 (node, "prefix", ip4);
7941 vat_json_object_add_uint (node, "mask_length", mp->route.prefix.len);
7942 vat_json_object_add_uint (node, "path_count", count);
7943 for (i = 0; i < count; i++)
7945 fp = &mp->route.paths[i];
7946 vl_api_mpls_fib_path_json_print (node, fp);
7951 api_ip_route_dump (vat_main_t * vam)
7953 unformat_input_t *input = vam->input;
7954 vl_api_ip_route_dump_t *mp;
7955 vl_api_control_ping_t *mp_ping;
7961 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7963 if (unformat (input, "table_id %d", &table_id))
7965 else if (unformat (input, "ip6"))
7967 else if (unformat (input, "ip4"))
7974 errmsg ("missing table id");
7978 M (IP_ROUTE_DUMP, mp);
7980 mp->table.table_id = table_id;
7981 mp->table.is_ip6 = is_ip6;
7985 /* Use a control ping for synchronization */
7986 MPING (CONTROL_PING, mp_ping);
7994 api_sw_interface_span_enable_disable (vat_main_t * vam)
7996 unformat_input_t *i = vam->input;
7997 vl_api_sw_interface_span_enable_disable_t *mp;
7998 u32 src_sw_if_index = ~0;
7999 u32 dst_sw_if_index = ~0;
8004 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8007 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
8009 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
8013 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
8015 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
8017 else if (unformat (i, "disable"))
8019 else if (unformat (i, "rx"))
8021 else if (unformat (i, "tx"))
8023 else if (unformat (i, "both"))
8025 else if (unformat (i, "l2"))
8031 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
8033 mp->sw_if_index_from = htonl (src_sw_if_index);
8034 mp->sw_if_index_to = htonl (dst_sw_if_index);
8044 vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
8047 vat_main_t *vam = &vat_main;
8048 u8 *sw_if_from_name = 0;
8049 u8 *sw_if_to_name = 0;
8050 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
8051 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
8052 char *states[] = { "none", "rx", "tx", "both" };
8056 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
8058 if ((u32) p->value[0] == sw_if_index_from)
8060 sw_if_from_name = (u8 *)(p->key);
8064 if ((u32) p->value[0] == sw_if_index_to)
8066 sw_if_to_name = (u8 *)(p->key);
8067 if (sw_if_from_name)
8072 print (vam->ofp, "%20s => %20s (%s) %s",
8073 sw_if_from_name, sw_if_to_name, states[mp->state],
8074 mp->is_l2 ? "l2" : "device");
8078 vl_api_sw_interface_span_details_t_handler_json
8079 (vl_api_sw_interface_span_details_t * mp)
8081 vat_main_t *vam = &vat_main;
8082 vat_json_node_t *node = NULL;
8083 u8 *sw_if_from_name = 0;
8084 u8 *sw_if_to_name = 0;
8085 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
8086 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
8090 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
8092 if ((u32) p->value[0] == sw_if_index_from)
8094 sw_if_from_name = (u8 *)(p->key);
8098 if ((u32) p->value[0] == sw_if_index_to)
8100 sw_if_to_name = (u8 *)(p->key);
8101 if (sw_if_from_name)
8107 if (VAT_JSON_ARRAY != vam->json_tree.type)
8109 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8110 vat_json_init_array (&vam->json_tree);
8112 node = vat_json_array_add (&vam->json_tree);
8114 vat_json_init_object (node);
8115 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
8116 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
8117 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
8118 if (0 != sw_if_to_name)
8120 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
8122 vat_json_object_add_uint (node, "state", mp->state);
8123 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
8127 api_sw_interface_span_dump (vat_main_t * vam)
8129 unformat_input_t *input = vam->input;
8130 vl_api_sw_interface_span_dump_t *mp;
8131 vl_api_control_ping_t *mp_ping;
8135 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8137 if (unformat (input, "l2"))
8143 M (SW_INTERFACE_SPAN_DUMP, mp);
8147 /* Use a control ping for synchronization */
8148 MPING (CONTROL_PING, mp_ping);
8156 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
8158 unformat_input_t *input = vam->input;
8159 vl_api_ip_source_and_port_range_check_add_del_t *mp;
8162 u16 *high_ports = 0;
8165 vl_api_prefix_t prefix;
8172 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8174 if (unformat (input, "%U", unformat_vl_api_prefix, &prefix))
8176 else if (unformat (input, "vrf %d", &vrf_id))
8178 else if (unformat (input, "del"))
8180 else if (unformat (input, "port %d", &tmp))
8182 if (tmp == 0 || tmp > 65535)
8184 errmsg ("port %d out of range", tmp);
8188 this_hi = this_low + 1;
8189 vec_add1 (low_ports, this_low);
8190 vec_add1 (high_ports, this_hi);
8192 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
8194 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
8196 errmsg ("incorrect range parameters");
8200 /* Note: in debug CLI +1 is added to high before
8201 passing to real fn that does "the work"
8202 (ip_source_and_port_range_check_add_del).
8203 This fn is a wrapper around the binary API fn a
8204 control plane will call, which expects this increment
8205 to have occurred. Hence letting the binary API control
8206 plane fn do the increment for consistency between VAT
8207 and other control planes.
8210 vec_add1 (low_ports, this_low);
8211 vec_add1 (high_ports, this_hi);
8217 if (prefix_set == 0)
8219 errmsg ("<address>/<mask> not specified");
8225 errmsg ("VRF ID required, not specified");
8232 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
8236 if (vec_len (low_ports) == 0)
8238 errmsg ("At least one port or port range required");
8242 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
8244 mp->is_add = is_add;
8246 clib_memcpy (&mp->prefix, &prefix, sizeof (prefix));
8248 mp->number_of_ranges = vec_len (low_ports);
8250 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
8251 vec_free (low_ports);
8253 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
8254 vec_free (high_ports);
8256 mp->vrf_id = ntohl (vrf_id);
8264 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
8266 unformat_input_t *input = vam->input;
8267 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
8268 u32 sw_if_index = ~0;
8270 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
8271 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
8275 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8277 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8279 else if (unformat (input, "sw_if_index %d", &sw_if_index))
8281 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
8283 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
8285 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
8287 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
8289 else if (unformat (input, "del"))
8295 if (sw_if_index == ~0)
8297 errmsg ("Interface required but not specified");
8303 errmsg ("VRF ID required but not specified");
8307 if (tcp_out_vrf_id == 0
8308 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
8311 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
8315 /* Construct the API message */
8316 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
8318 mp->sw_if_index = ntohl (sw_if_index);
8319 mp->is_add = is_add;
8320 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
8321 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
8322 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
8323 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
8328 /* Wait for a reply... */
8334 api_delete_subif (vat_main_t * vam)
8336 unformat_input_t *i = vam->input;
8337 vl_api_delete_subif_t *mp;
8338 u32 sw_if_index = ~0;
8341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8343 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8345 if (unformat (i, "sw_if_index %d", &sw_if_index))
8351 if (sw_if_index == ~0)
8353 errmsg ("missing sw_if_index");
8357 /* Construct the API message */
8358 M (DELETE_SUBIF, mp);
8359 mp->sw_if_index = ntohl (sw_if_index);
8366 #define foreach_pbb_vtr_op \
8367 _("disable", L2_VTR_DISABLED) \
8368 _("pop", L2_VTR_POP_2) \
8369 _("push", L2_VTR_PUSH_2)
8372 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
8374 unformat_input_t *i = vam->input;
8375 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
8376 u32 sw_if_index = ~0, vtr_op = ~0;
8378 u8 dmac[6], smac[6];
8379 u8 dmac_set = 0, smac_set = 0;
8385 /* Shut up coverity */
8386 clib_memset (dmac, 0, sizeof (dmac));
8387 clib_memset (smac, 0, sizeof (smac));
8389 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8391 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8393 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8395 else if (unformat (i, "vtr_op %d", &vtr_op))
8397 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
8400 else if (unformat (i, "translate_pbb_stag"))
8402 if (unformat (i, "%d", &tmp))
8404 vtr_op = L2_VTR_TRANSLATE_2_1;
8410 ("translate_pbb_stag operation requires outer tag definition");
8414 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
8416 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
8418 else if (unformat (i, "sid %d", &sid))
8420 else if (unformat (i, "vlanid %d", &tmp))
8424 clib_warning ("parse error '%U'", format_unformat_error, i);
8429 if ((sw_if_index == ~0) || (vtr_op == ~0))
8431 errmsg ("missing sw_if_index or vtr operation");
8434 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
8435 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
8438 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
8442 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
8443 mp->sw_if_index = ntohl (sw_if_index);
8444 mp->vtr_op = ntohl (vtr_op);
8445 mp->outer_tag = ntohs (outer_tag);
8446 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
8447 clib_memcpy (mp->b_smac, smac, sizeof (smac));
8448 mp->b_vlanid = ntohs (vlanid);
8449 mp->i_sid = ntohl (sid);
8457 api_sw_interface_tag_add_del (vat_main_t * vam)
8459 unformat_input_t *i = vam->input;
8460 vl_api_sw_interface_tag_add_del_t *mp;
8461 u32 sw_if_index = ~0;
8466 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8468 if (unformat (i, "tag %s", &tag))
8470 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8472 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8474 else if (unformat (i, "del"))
8480 if (sw_if_index == ~0)
8482 errmsg ("missing interface name or sw_if_index");
8486 if (enable && (tag == 0))
8488 errmsg ("no tag specified");
8492 /* Construct the API message */
8493 M (SW_INTERFACE_TAG_ADD_DEL, mp);
8494 mp->sw_if_index = ntohl (sw_if_index);
8495 mp->is_add = enable;
8497 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
8506 api_sw_interface_add_del_mac_address (vat_main_t * vam)
8508 unformat_input_t *i = vam->input;
8509 vl_api_mac_address_t mac = { 0 };
8510 vl_api_sw_interface_add_del_mac_address_t *mp;
8511 u32 sw_if_index = ~0;
8516 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8518 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8520 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8522 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
8524 else if (unformat (i, "del"))
8530 if (sw_if_index == ~0)
8532 errmsg ("missing interface name or sw_if_index");
8538 errmsg ("missing MAC address");
8542 /* Construct the API message */
8543 M (SW_INTERFACE_ADD_DEL_MAC_ADDRESS, mp);
8544 mp->sw_if_index = ntohl (sw_if_index);
8545 mp->is_add = is_add;
8546 clib_memcpy (&mp->addr, &mac, sizeof (mac));
8553 static void vl_api_l2_xconnect_details_t_handler
8554 (vl_api_l2_xconnect_details_t * mp)
8556 vat_main_t *vam = &vat_main;
8558 print (vam->ofp, "%15d%15d",
8559 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
8562 static void vl_api_l2_xconnect_details_t_handler_json
8563 (vl_api_l2_xconnect_details_t * mp)
8565 vat_main_t *vam = &vat_main;
8566 vat_json_node_t *node = NULL;
8568 if (VAT_JSON_ARRAY != vam->json_tree.type)
8570 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8571 vat_json_init_array (&vam->json_tree);
8573 node = vat_json_array_add (&vam->json_tree);
8575 vat_json_init_object (node);
8576 vat_json_object_add_uint (node, "rx_sw_if_index",
8577 ntohl (mp->rx_sw_if_index));
8578 vat_json_object_add_uint (node, "tx_sw_if_index",
8579 ntohl (mp->tx_sw_if_index));
8583 api_l2_xconnect_dump (vat_main_t * vam)
8585 vl_api_l2_xconnect_dump_t *mp;
8586 vl_api_control_ping_t *mp_ping;
8589 if (!vam->json_output)
8591 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
8594 M (L2_XCONNECT_DUMP, mp);
8598 /* Use a control ping for synchronization */
8599 MPING (CONTROL_PING, mp_ping);
8607 api_hw_interface_set_mtu (vat_main_t * vam)
8609 unformat_input_t *i = vam->input;
8610 vl_api_hw_interface_set_mtu_t *mp;
8611 u32 sw_if_index = ~0;
8615 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8617 if (unformat (i, "mtu %d", &mtu))
8619 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8621 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8627 if (sw_if_index == ~0)
8629 errmsg ("missing interface name or sw_if_index");
8635 errmsg ("no mtu specified");
8639 /* Construct the API message */
8640 M (HW_INTERFACE_SET_MTU, mp);
8641 mp->sw_if_index = ntohl (sw_if_index);
8642 mp->mtu = ntohs ((u16) mtu);
8650 api_tcp_configure_src_addresses (vat_main_t * vam)
8652 vl_api_tcp_configure_src_addresses_t *mp;
8653 unformat_input_t *i = vam->input;
8654 vl_api_address_t first, last;
8659 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8661 if (unformat (i, "%U - %U",
8662 unformat_vl_api_address, &first,
8663 unformat_vl_api_address, &last))
8667 errmsg ("one range per message (range already set)");
8672 else if (unformat (i, "vrf %d", &vrf_id))
8680 errmsg ("address range not set");
8684 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
8686 mp->vrf_id = ntohl (vrf_id);
8687 clib_memcpy (&mp->first_address, &first, sizeof (first));
8688 clib_memcpy (&mp->last_address, &last, sizeof (last));
8695 static void vl_api_app_namespace_add_del_reply_t_handler
8696 (vl_api_app_namespace_add_del_reply_t * mp)
8698 vat_main_t *vam = &vat_main;
8699 i32 retval = ntohl (mp->retval);
8700 if (vam->async_mode)
8702 vam->async_errors += (retval < 0);
8706 vam->retval = retval;
8708 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
8709 vam->result_ready = 1;
8713 static void vl_api_app_namespace_add_del_reply_t_handler_json
8714 (vl_api_app_namespace_add_del_reply_t * mp)
8716 vat_main_t *vam = &vat_main;
8717 vat_json_node_t node;
8719 vat_json_init_object (&node);
8720 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
8721 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
8723 vat_json_print (vam->ofp, &node);
8724 vat_json_free (&node);
8726 vam->retval = ntohl (mp->retval);
8727 vam->result_ready = 1;
8731 api_app_namespace_add_del (vat_main_t * vam)
8733 vl_api_app_namespace_add_del_t *mp;
8734 unformat_input_t *i = vam->input;
8735 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
8736 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
8740 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8742 if (unformat (i, "id %_%v%_", &ns_id))
8744 else if (unformat (i, "secret %lu", &secret))
8746 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8747 sw_if_index_set = 1;
8748 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
8750 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
8755 if (!ns_id || !secret_set || !sw_if_index_set)
8757 errmsg ("namespace id, secret and sw_if_index must be set");
8760 if (vec_len (ns_id) > 64)
8762 errmsg ("namespace id too long");
8765 M (APP_NAMESPACE_ADD_DEL, mp);
8767 vl_api_vec_to_api_string (ns_id, &mp->namespace_id);
8768 mp->secret = clib_host_to_net_u64 (secret);
8769 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
8770 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
8771 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
8779 api_sock_init_shm (vat_main_t * vam)
8781 #if VPP_API_TEST_BUILTIN == 0
8782 unformat_input_t *i = vam->input;
8783 vl_api_shm_elem_config_t *config = 0;
8784 u64 size = 64 << 20;
8787 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8789 if (unformat (i, "size %U", unformat_memory_size, &size))
8796 * Canned custom ring allocator config.
8797 * Should probably parse all of this
8799 vec_validate (config, 6);
8800 config[0].type = VL_API_VLIB_RING;
8801 config[0].size = 256;
8802 config[0].count = 32;
8804 config[1].type = VL_API_VLIB_RING;
8805 config[1].size = 1024;
8806 config[1].count = 16;
8808 config[2].type = VL_API_VLIB_RING;
8809 config[2].size = 4096;
8810 config[2].count = 2;
8812 config[3].type = VL_API_CLIENT_RING;
8813 config[3].size = 256;
8814 config[3].count = 32;
8816 config[4].type = VL_API_CLIENT_RING;
8817 config[4].size = 1024;
8818 config[4].count = 16;
8820 config[5].type = VL_API_CLIENT_RING;
8821 config[5].size = 4096;
8822 config[5].count = 2;
8824 config[6].type = VL_API_QUEUE;
8825 config[6].count = 128;
8826 config[6].size = sizeof (uword);
8828 rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ );
8830 vam->client_index_invalid = 1;
8838 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
8840 vat_main_t *vam = &vat_main;
8841 fib_prefix_t lcl, rmt;
8843 ip_prefix_decode (&mp->lcl, &lcl);
8844 ip_prefix_decode (&mp->rmt, &rmt);
8846 if (lcl.fp_proto == FIB_PROTOCOL_IP4)
8849 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
8850 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
8851 mp->scope, format_ip4_address, &lcl.fp_addr.ip4, lcl.fp_len,
8852 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
8853 &rmt.fp_addr.ip4, rmt.fp_len,
8854 clib_net_to_host_u16 (mp->rmt_port),
8855 clib_net_to_host_u32 (mp->action_index), mp->tag);
8860 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
8861 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
8862 mp->scope, format_ip6_address, &lcl.fp_addr.ip6, lcl.fp_len,
8863 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
8864 &rmt.fp_addr.ip6, rmt.fp_len,
8865 clib_net_to_host_u16 (mp->rmt_port),
8866 clib_net_to_host_u32 (mp->action_index), mp->tag);
8871 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
8874 vat_main_t *vam = &vat_main;
8875 vat_json_node_t *node = NULL;
8876 struct in6_addr ip6;
8879 fib_prefix_t lcl, rmt;
8881 ip_prefix_decode (&mp->lcl, &lcl);
8882 ip_prefix_decode (&mp->rmt, &rmt);
8884 if (VAT_JSON_ARRAY != vam->json_tree.type)
8886 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8887 vat_json_init_array (&vam->json_tree);
8889 node = vat_json_array_add (&vam->json_tree);
8890 vat_json_init_object (node);
8892 vat_json_object_add_uint (node, "appns_index",
8893 clib_net_to_host_u32 (mp->appns_index));
8894 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
8895 vat_json_object_add_uint (node, "scope", mp->scope);
8896 vat_json_object_add_uint (node, "action_index",
8897 clib_net_to_host_u32 (mp->action_index));
8898 vat_json_object_add_uint (node, "lcl_port",
8899 clib_net_to_host_u16 (mp->lcl_port));
8900 vat_json_object_add_uint (node, "rmt_port",
8901 clib_net_to_host_u16 (mp->rmt_port));
8902 vat_json_object_add_uint (node, "lcl_plen", lcl.fp_len);
8903 vat_json_object_add_uint (node, "rmt_plen", rmt.fp_len);
8904 vat_json_object_add_string_copy (node, "tag", mp->tag);
8905 if (lcl.fp_proto == FIB_PROTOCOL_IP4)
8907 clib_memcpy (&ip4, &lcl.fp_addr.ip4, sizeof (ip4));
8908 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
8909 clib_memcpy (&ip4, &rmt.fp_addr.ip4, sizeof (ip4));
8910 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
8914 clib_memcpy (&ip6, &lcl.fp_addr.ip6, sizeof (ip6));
8915 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
8916 clib_memcpy (&ip6, &rmt.fp_addr.ip6, sizeof (ip6));
8917 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
8922 api_session_rule_add_del (vat_main_t * vam)
8924 vl_api_session_rule_add_del_t *mp;
8925 unformat_input_t *i = vam->input;
8926 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
8927 u32 appns_index = 0, scope = 0;
8928 ip4_address_t lcl_ip4, rmt_ip4;
8929 ip6_address_t lcl_ip6, rmt_ip6;
8930 u8 is_ip4 = 1, conn_set = 0;
8931 u8 is_add = 1, *tag = 0;
8933 fib_prefix_t lcl, rmt;
8935 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8937 if (unformat (i, "del"))
8939 else if (unformat (i, "add"))
8941 else if (unformat (i, "proto tcp"))
8943 else if (unformat (i, "proto udp"))
8945 else if (unformat (i, "appns %d", &appns_index))
8947 else if (unformat (i, "scope %d", &scope))
8949 else if (unformat (i, "tag %_%v%_", &tag))
8953 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
8954 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
8962 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
8963 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
8969 else if (unformat (i, "action %d", &action))
8974 if (proto == ~0 || !conn_set || action == ~0)
8976 errmsg ("transport proto, connection and action must be set");
8982 errmsg ("scope should be 0-3");
8986 M (SESSION_RULE_ADD_DEL, mp);
8988 clib_memset (&lcl, 0, sizeof (lcl));
8989 clib_memset (&rmt, 0, sizeof (rmt));
8992 ip_set (&lcl.fp_addr, &lcl_ip4, 1);
8993 ip_set (&rmt.fp_addr, &rmt_ip4, 1);
8994 lcl.fp_len = lcl_plen;
8995 rmt.fp_len = rmt_plen;
8999 ip_set (&lcl.fp_addr, &lcl_ip6, 0);
9000 ip_set (&rmt.fp_addr, &rmt_ip6, 0);
9001 lcl.fp_len = lcl_plen;
9002 rmt.fp_len = rmt_plen;
9006 ip_prefix_encode (&lcl, &mp->lcl);
9007 ip_prefix_encode (&rmt, &mp->rmt);
9008 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
9009 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
9010 mp->transport_proto =
9011 proto ? TRANSPORT_PROTO_API_UDP : TRANSPORT_PROTO_API_TCP;
9012 mp->action_index = clib_host_to_net_u32 (action);
9013 mp->appns_index = clib_host_to_net_u32 (appns_index);
9015 mp->is_add = is_add;
9018 clib_memcpy (mp->tag, tag, vec_len (tag));
9028 api_session_rules_dump (vat_main_t * vam)
9030 vl_api_session_rules_dump_t *mp;
9031 vl_api_control_ping_t *mp_ping;
9034 if (!vam->json_output)
9036 print (vam->ofp, "%=20s", "Session Rules");
9039 M (SESSION_RULES_DUMP, mp);
9043 /* Use a control ping for synchronization */
9044 MPING (CONTROL_PING, mp_ping);
9047 /* Wait for a reply... */
9053 api_ip_container_proxy_add_del (vat_main_t * vam)
9055 vl_api_ip_container_proxy_add_del_t *mp;
9056 unformat_input_t *i = vam->input;
9057 u32 sw_if_index = ~0;
9058 vl_api_prefix_t pfx = { };
9062 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9064 if (unformat (i, "del"))
9066 else if (unformat (i, "add"))
9068 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
9070 else if (unformat (i, "sw_if_index %u", &sw_if_index))
9075 if (sw_if_index == ~0 || pfx.len == 0)
9077 errmsg ("address and sw_if_index must be set");
9081 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
9083 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
9084 mp->is_add = is_add;
9085 clib_memcpy (&mp->pfx, &pfx, sizeof (pfx));
9093 q_or_quit (vat_main_t * vam)
9095 #if VPP_API_TEST_BUILTIN == 0
9096 longjmp (vam->jump_buf, 1);
9098 return 0; /* not so much */
9102 q (vat_main_t * vam)
9104 return q_or_quit (vam);
9108 quit (vat_main_t * vam)
9110 return q_or_quit (vam);
9114 comment (vat_main_t * vam)
9120 elog_save (vat_main_t * vam)
9122 #if VPP_API_TEST_BUILTIN == 0
9123 elog_main_t *em = &vam->elog_main;
9124 unformat_input_t *i = vam->input;
9125 char *file, *chroot_file;
9126 clib_error_t *error;
9128 if (!unformat (i, "%s", &file))
9130 errmsg ("expected file name, got `%U'", format_unformat_error, i);
9134 /* It's fairly hard to get "../oopsie" through unformat; just in case */
9135 if (strstr (file, "..") || index (file, '/'))
9137 errmsg ("illegal characters in filename '%s'", file);
9141 chroot_file = (char *) format (0, "/tmp/%s%c", file, 0);
9145 errmsg ("Saving %wd of %wd events to %s",
9146 elog_n_events_in_buffer (em),
9147 elog_buffer_capacity (em), chroot_file);
9149 error = elog_write_file (em, chroot_file, 1 /* flush ring */ );
9150 vec_free (chroot_file);
9153 clib_error_report (error);
9155 errmsg ("Use the vpp event loger...");
9162 elog_setup (vat_main_t * vam)
9164 #if VPP_API_TEST_BUILTIN == 0
9165 elog_main_t *em = &vam->elog_main;
9166 unformat_input_t *i = vam->input;
9167 u32 nevents = 128 << 10;
9169 (void) unformat (i, "nevents %d", &nevents);
9171 elog_init (em, nevents);
9172 vl_api_set_elog_main (em);
9173 vl_api_set_elog_trace_api_messages (1);
9174 errmsg ("Event logger initialized with %u events", nevents);
9176 errmsg ("Use the vpp event loger...");
9182 elog_enable (vat_main_t * vam)
9184 #if VPP_API_TEST_BUILTIN == 0
9185 elog_main_t *em = &vam->elog_main;
9187 elog_enable_disable (em, 1 /* enable */ );
9188 vl_api_set_elog_trace_api_messages (1);
9189 errmsg ("Event logger enabled...");
9191 errmsg ("Use the vpp event loger...");
9197 elog_disable (vat_main_t * vam)
9199 #if VPP_API_TEST_BUILTIN == 0
9200 elog_main_t *em = &vam->elog_main;
9202 elog_enable_disable (em, 0 /* enable */ );
9203 vl_api_set_elog_trace_api_messages (1);
9204 errmsg ("Event logger disabled...");
9206 errmsg ("Use the vpp event loger...");
9212 statseg (vat_main_t * vam)
9214 ssvm_private_t *ssvmp = &vam->stat_segment;
9215 ssvm_shared_header_t *shared_header = ssvmp->sh;
9216 vlib_counter_t **counters;
9217 u64 thread0_index1_packets;
9218 u64 thread0_index1_bytes;
9219 f64 vector_rate, input_rate;
9222 uword *counter_vector_by_name;
9223 if (vam->stat_segment_lockp == 0)
9225 errmsg ("Stat segment not mapped...");
9229 /* look up "/if/rx for sw_if_index 1 as a test */
9231 clib_spinlock_lock (vam->stat_segment_lockp);
9233 counter_vector_by_name = (uword *) shared_header->opaque[1];
9235 p = hash_get_mem (counter_vector_by_name, "/if/rx");
9238 clib_spinlock_unlock (vam->stat_segment_lockp);
9239 errmsg ("/if/tx not found?");
9243 /* Fish per-thread vector of combined counters from shared memory */
9244 counters = (vlib_counter_t **) p[0];
9246 if (vec_len (counters[0]) < 2)
9248 clib_spinlock_unlock (vam->stat_segment_lockp);
9249 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
9253 /* Read thread 0 sw_if_index 1 counter */
9254 thread0_index1_packets = counters[0][1].packets;
9255 thread0_index1_bytes = counters[0][1].bytes;
9257 p = hash_get_mem (counter_vector_by_name, "vector_rate");
9260 clib_spinlock_unlock (vam->stat_segment_lockp);
9261 errmsg ("vector_rate not found?");
9265 vector_rate = *(f64 *) (p[0]);
9266 p = hash_get_mem (counter_vector_by_name, "input_rate");
9269 clib_spinlock_unlock (vam->stat_segment_lockp);
9270 errmsg ("input_rate not found?");
9273 input_rate = *(f64 *) (p[0]);
9275 clib_spinlock_unlock (vam->stat_segment_lockp);
9277 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
9278 vector_rate, input_rate);
9279 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
9280 thread0_index1_packets, thread0_index1_bytes);
9286 cmd_cmp (void *a1, void *a2)
9291 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
9295 help (vat_main_t * vam)
9300 unformat_input_t *i = vam->input;
9303 if (unformat (i, "%s", &name))
9309 hs = hash_get_mem (vam->help_by_name, name);
9311 print (vam->ofp, "usage: %s %s", name, hs[0]);
9313 print (vam->ofp, "No such msg / command '%s'", name);
9318 print (vam->ofp, "Help is available for the following:");
9321 hash_foreach_pair (p, vam->function_by_name,
9323 vec_add1 (cmds, (u8 *)(p->key));
9327 vec_sort_with_function (cmds, cmd_cmp);
9329 for (j = 0; j < vec_len (cmds); j++)
9330 print (vam->ofp, "%s", cmds[j]);
9337 set (vat_main_t * vam)
9339 u8 *name = 0, *value = 0;
9340 unformat_input_t *i = vam->input;
9342 if (unformat (i, "%s", &name))
9344 /* The input buffer is a vector, not a string. */
9345 value = vec_dup (i->buffer);
9346 vec_delete (value, i->index, 0);
9347 /* Almost certainly has a trailing newline */
9348 if (value[vec_len (value) - 1] == '\n')
9349 value[vec_len (value) - 1] = 0;
9350 /* Make sure it's a proper string, one way or the other */
9351 vec_add1 (value, 0);
9352 (void) clib_macro_set_value (&vam->macro_main,
9353 (char *) name, (char *) value);
9356 errmsg ("usage: set <name> <value>");
9364 unset (vat_main_t * vam)
9368 if (unformat (vam->input, "%s", &name))
9369 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
9370 errmsg ("unset: %s wasn't set", name);
9383 macro_sort_cmp (void *a1, void *a2)
9385 macro_sort_t *s1 = a1;
9386 macro_sort_t *s2 = a2;
9388 return strcmp ((char *) (s1->name), (char *) (s2->name));
9392 dump_macro_table (vat_main_t * vam)
9394 macro_sort_t *sort_me = 0, *sm;
9399 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
9401 vec_add2 (sort_me, sm, 1);
9402 sm->name = (u8 *)(p->key);
9403 sm->value = (u8 *) (p->value[0]);
9407 vec_sort_with_function (sort_me, macro_sort_cmp);
9409 if (vec_len (sort_me))
9410 print (vam->ofp, "%-15s%s", "Name", "Value");
9412 print (vam->ofp, "The macro table is empty...");
9414 for (i = 0; i < vec_len (sort_me); i++)
9415 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
9420 dump_node_table (vat_main_t * vam)
9423 vlib_node_t *node, *next_node;
9425 if (vec_len (vam->graph_nodes) == 0)
9427 print (vam->ofp, "Node table empty, issue get_node_graph...");
9431 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
9433 node = vam->graph_nodes[0][i];
9434 print (vam->ofp, "[%d] %s", i, node->name);
9435 for (j = 0; j < vec_len (node->next_nodes); j++)
9437 if (node->next_nodes[j] != ~0)
9439 next_node = vam->graph_nodes[0][node->next_nodes[j]];
9440 print (vam->ofp, " [%d] %s", j, next_node->name);
9448 value_sort_cmp (void *a1, void *a2)
9450 name_sort_t *n1 = a1;
9451 name_sort_t *n2 = a2;
9453 if (n1->value < n2->value)
9455 if (n1->value > n2->value)
9462 dump_msg_api_table (vat_main_t * vam)
9464 api_main_t *am = vlibapi_get_main ();
9465 name_sort_t *nses = 0, *ns;
9470 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
9472 vec_add2 (nses, ns, 1);
9473 ns->name = (u8 *)(hp->key);
9474 ns->value = (u32) hp->value[0];
9478 vec_sort_with_function (nses, value_sort_cmp);
9480 for (i = 0; i < vec_len (nses); i++)
9481 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
9487 get_msg_id (vat_main_t * vam)
9492 if (unformat (vam->input, "%s", &name_and_crc))
9494 message_index = vl_msg_api_get_msg_index (name_and_crc);
9495 if (message_index == ~0)
9497 print (vam->ofp, " '%s' not found", name_and_crc);
9500 print (vam->ofp, " '%s' has message index %d",
9501 name_and_crc, message_index);
9504 errmsg ("name_and_crc required...");
9509 search_node_table (vat_main_t * vam)
9511 unformat_input_t *line_input = vam->input;
9514 vlib_node_t *node, *next_node;
9517 if (vam->graph_node_index_by_name == 0)
9519 print (vam->ofp, "Node table empty, issue get_node_graph...");
9523 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9525 if (unformat (line_input, "%s", &node_to_find))
9527 vec_add1 (node_to_find, 0);
9528 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
9531 print (vam->ofp, "%s not found...", node_to_find);
9534 node = vam->graph_nodes[0][p[0]];
9535 print (vam->ofp, "[%d] %s", p[0], node->name);
9536 for (j = 0; j < vec_len (node->next_nodes); j++)
9538 if (node->next_nodes[j] != ~0)
9540 next_node = vam->graph_nodes[0][node->next_nodes[j]];
9541 print (vam->ofp, " [%d] %s", j, next_node->name);
9548 clib_warning ("parse error '%U'", format_unformat_error,
9554 vec_free (node_to_find);
9563 script (vat_main_t * vam)
9565 #if (VPP_API_TEST_BUILTIN==0)
9567 char *save_current_file;
9568 unformat_input_t save_input;
9569 jmp_buf save_jump_buf;
9570 u32 save_line_number;
9572 FILE *new_fp, *save_ifp;
9574 if (unformat (vam->input, "%s", &s))
9576 new_fp = fopen ((char *) s, "r");
9579 errmsg ("Couldn't open script file %s", s);
9586 errmsg ("Missing script name");
9590 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
9591 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
9592 save_ifp = vam->ifp;
9593 save_line_number = vam->input_line_number;
9594 save_current_file = (char *) vam->current_file;
9596 vam->input_line_number = 0;
9598 vam->current_file = s;
9601 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
9602 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
9603 vam->ifp = save_ifp;
9604 vam->input_line_number = save_line_number;
9605 vam->current_file = (u8 *) save_current_file;
9610 clib_warning ("use the exec command...");
9616 echo (vat_main_t * vam)
9618 print (vam->ofp, "%v", vam->input->buffer);
9622 /* List of API message constructors, CLI names map to api_xxx */
9623 #define foreach_vpe_api_msg \
9624 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
9625 _(sw_interface_dump,"") \
9626 _(sw_interface_set_flags, \
9627 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
9628 _(sw_interface_add_del_address, \
9629 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
9630 _(sw_interface_set_rx_mode, \
9631 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
9632 _(sw_interface_set_rx_placement, \
9633 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
9634 _(sw_interface_rx_placement_dump, \
9635 "[<intfc> | sw_if_index <id>]") \
9636 _(sw_interface_set_table, \
9637 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
9638 _(sw_interface_set_mpls_enable, \
9639 "<intfc> | sw_if_index [disable | dis]") \
9640 _(sw_interface_set_vpath, \
9641 "<intfc> | sw_if_index <id> enable | disable") \
9642 _(sw_interface_set_l2_xconnect, \
9643 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
9644 "enable | disable") \
9645 _(sw_interface_set_l2_bridge, \
9646 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
9647 "[shg <split-horizon-group>] [bvi]\n" \
9648 "enable | disable") \
9649 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
9650 _(bridge_domain_add_del, \
9651 "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") \
9652 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
9654 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
9655 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
9656 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
9658 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
9660 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
9661 _(virtio_pci_create_v2, \
9662 "pci-addr <pci-address> [use_random_mac | hw-addr <mac-addr>] [features <hex-value>] [gso-enabled [gro-coalesce] | csum-offload-enabled] [packed] [in-order] [buffering]") \
9663 _(virtio_pci_delete, \
9664 "<vpp-if-name> | sw_if_index <id>") \
9665 _(sw_interface_virtio_pci_dump, "") \
9666 _(ip_table_add_del, \
9667 "table <n> [ipv6] [add | del]\n") \
9668 _(ip_route_add_del, \
9669 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
9670 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
9671 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
9672 "[multipath] [count <n>] [del]") \
9673 _(ip_mroute_add_del, \
9674 "<src> <grp>/<mask> [table-id <n>]\n" \
9675 "[<intfc> | sw_if_index <id>] [local] [del]") \
9676 _(mpls_table_add_del, \
9677 "table <n> [add | del]\n") \
9678 _(mpls_route_add_del, \
9679 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
9680 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
9681 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
9682 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
9683 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
9684 "[count <n>] [del]") \
9685 _(mpls_ip_bind_unbind, \
9686 "<label> <addr/len>") \
9687 _(mpls_tunnel_add_del, \
9688 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
9689 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
9690 "[l2-only] [out-label <n>]") \
9691 _(sw_interface_set_unnumbered, \
9692 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
9693 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
9694 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
9695 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
9696 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
9697 "[outer_vlan_id_any][inner_vlan_id_any]") \
9698 _(ip_table_replace_begin, "table <n> [ipv6]") \
9699 _(ip_table_flush, "table <n> [ipv6]") \
9700 _(ip_table_replace_end, "table <n> [ipv6]") \
9701 _(set_ip_flow_hash, \
9702 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
9703 _(sw_interface_ip6_enable_disable, \
9704 "<intfc> | sw_if_index <id> enable | disable") \
9705 _(l2_patch_add_del, \
9706 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
9707 "enable | disable") \
9708 _(get_node_index, "node <node-name") \
9709 _(add_node_next, "node <node-name> next <next-node-name>") \
9710 _(l2_fib_clear_table, "") \
9711 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
9712 _(l2_interface_vlan_tag_rewrite, \
9713 "<intfc> | sw_if_index <nn> \n" \
9714 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
9715 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
9716 _(create_vhost_user_if, \
9717 "socket <filename> [server] [renumber <dev_instance>] " \
9718 "[disable_mrg_rxbuf] [disable_indirect_desc] [gso] " \
9719 "[mac <mac_address>] [packed]") \
9720 _(modify_vhost_user_if, \
9721 "<intfc> | sw_if_index <nn> socket <filename>\n" \
9722 "[server] [renumber <dev_instance>] [gso] [packed]") \
9723 _(create_vhost_user_if_v2, \
9724 "socket <filename> [server] [renumber <dev_instance>] " \
9725 "[disable_mrg_rxbuf] [disable_indirect_desc] [gso] " \
9726 "[mac <mac_address>] [packed] [event-idx]") \
9727 _(modify_vhost_user_if_v2, \
9728 "<intfc> | sw_if_index <nn> socket <filename>\n" \
9729 "[server] [renumber <dev_instance>] [gso] [packed] [event-idx]")\
9730 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
9731 _(sw_interface_vhost_user_dump, "<intfc> | sw_if_index <nn>") \
9732 _(show_version, "") \
9733 _(show_threads, "") \
9734 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
9735 _(interface_name_renumber, \
9736 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
9737 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
9738 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
9739 _(ip_dump, "ipv4 | ipv6") \
9740 _(delete_loopback,"sw_if_index <nn>") \
9741 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
9742 _(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
9743 _(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
9744 _(want_interface_events, "enable|disable") \
9745 _(get_first_msg_id, "client <name>") \
9746 _(get_node_graph, " ") \
9747 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
9748 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
9749 _(ioam_disable, "") \
9750 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
9751 _(mpls_table_dump, "") \
9752 _(mpls_route_dump, "table-id <ID>") \
9753 _(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
9754 _(sw_interface_span_dump, "[l2]") \
9755 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
9756 _(ip_source_and_port_range_check_add_del, \
9757 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
9758 _(ip_source_and_port_range_check_interface_add_del, \
9759 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
9760 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
9761 _(delete_subif,"<intfc> | sw_if_index <nn>") \
9762 _(l2_interface_pbb_tag_rewrite, \
9763 "<intfc> | sw_if_index <nn> \n" \
9764 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
9765 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
9766 _(ip_table_dump, "") \
9767 _(ip_route_dump, "table-id [ip4|ip6]") \
9768 _(ip_mtable_dump, "") \
9769 _(ip_mroute_dump, "table-id [ip4|ip6]") \
9770 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
9772 _(sw_interface_add_del_mac_address, "<intfc> | sw_if_index <nn> " \
9773 "mac <mac-address> [del]") \
9774 _(l2_xconnect_dump, "") \
9775 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
9776 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
9777 _(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
9778 _(sock_init_shm, "size <nnn>") \
9779 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
9780 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
9781 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
9782 _(session_rules_dump, "") \
9783 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
9785 /* List of command functions, CLI names map directly to functions */
9786 #define foreach_cli_function \
9787 _(comment, "usage: comment <ignore-rest-of-line>") \
9788 _(dump_interface_table, "usage: dump_interface_table") \
9789 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
9790 _(dump_ipv4_table, "usage: dump_ipv4_table") \
9791 _(dump_ipv6_table, "usage: dump_ipv6_table") \
9792 _(dump_macro_table, "usage: dump_macro_table ") \
9793 _(dump_node_table, "usage: dump_node_table") \
9794 _(dump_msg_api_table, "usage: dump_msg_api_table") \
9795 _(elog_setup, "usage: elog_setup [nevents, default 128K]") \
9796 _(elog_disable, "usage: elog_disable") \
9797 _(elog_enable, "usage: elog_enable") \
9798 _(elog_save, "usage: elog_save <filename>") \
9799 _(get_msg_id, "usage: get_msg_id name_and_crc") \
9800 _(echo, "usage: echo <message>") \
9801 _(exec, "usage: exec <vpe-debug-CLI-command>") \
9802 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
9803 _(help, "usage: help") \
9804 _(q, "usage: quit") \
9805 _(quit, "usage: quit") \
9806 _(search_node_table, "usage: search_node_table <name>...") \
9807 _(set, "usage: set <variable-name> <value>") \
9808 _(script, "usage: script <file-name>") \
9809 _(statseg, "usage: statseg") \
9810 _(unset, "usage: unset <variable-name>")
9813 static void vl_api_##n##_t_handler_uni \
9814 (vl_api_##n##_t * mp) \
9816 vat_main_t * vam = &vat_main; \
9817 if (vam->json_output) { \
9818 vl_api_##n##_t_handler_json(mp); \
9820 vl_api_##n##_t_handler(mp); \
9823 foreach_vpe_api_reply_msg;
9824 #if VPP_API_TEST_BUILTIN == 0
9825 foreach_standalone_reply_msg;
9830 vat_api_hookup (vat_main_t * vam)
9833 vl_msg_api_set_handlers(VL_API_##N, #n, \
9834 vl_api_##n##_t_handler_uni, \
9836 vl_api_##n##_t_endian, \
9837 vl_api_##n##_t_print, \
9838 sizeof(vl_api_##n##_t), 1);
9839 foreach_vpe_api_reply_msg;
9840 #if VPP_API_TEST_BUILTIN == 0
9841 foreach_standalone_reply_msg;
9845 #if (VPP_API_TEST_BUILTIN==0)
9846 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
9848 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
9850 vam->function_by_name = hash_create_string (0, sizeof (uword));
9852 vam->help_by_name = hash_create_string (0, sizeof (uword));
9855 /* API messages we can send */
9856 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
9857 foreach_vpe_api_msg;
9861 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
9862 foreach_vpe_api_msg;
9866 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
9867 foreach_cli_function;
9871 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
9872 foreach_cli_function;
9876 #if VPP_API_TEST_BUILTIN
9877 static clib_error_t *
9878 vat_api_hookup_shim (vlib_main_t * vm)
9880 vat_api_hookup (&vat_main);
9884 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
9888 * fd.io coding-style-patch-verification: ON
9891 * eval: (c-set-style "gnu")