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_ip_address_details_t_handler
1622 (vl_api_ip_address_details_t * mp)
1624 vat_main_t *vam = &vat_main;
1625 static ip_address_details_t empty_ip_address_details = { {0} };
1626 ip_address_details_t *address = NULL;
1627 ip_details_t *current_ip_details = NULL;
1628 ip_details_t *details = NULL;
1630 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1632 if (!details || vam->current_sw_if_index >= vec_len (details)
1633 || !details[vam->current_sw_if_index].present)
1635 errmsg ("ip address details arrived but not stored");
1636 errmsg ("ip_dump should be called first");
1640 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1642 #define addresses (current_ip_details->addr)
1644 vec_validate_init_empty (addresses, vec_len (addresses),
1645 empty_ip_address_details);
1647 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1649 clib_memcpy (&address->ip, &mp->prefix.address.un, sizeof (address->ip));
1650 address->prefix_length = mp->prefix.len;
1654 static void vl_api_ip_address_details_t_handler_json
1655 (vl_api_ip_address_details_t * mp)
1657 vat_main_t *vam = &vat_main;
1658 vat_json_node_t *node = NULL;
1660 if (VAT_JSON_ARRAY != vam->json_tree.type)
1662 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1663 vat_json_init_array (&vam->json_tree);
1665 node = vat_json_array_add (&vam->json_tree);
1667 vat_json_init_object (node);
1668 vat_json_object_add_prefix (node, &mp->prefix);
1672 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1674 vat_main_t *vam = &vat_main;
1675 static ip_details_t empty_ip_details = { 0 };
1676 ip_details_t *ip = NULL;
1677 u32 sw_if_index = ~0;
1679 sw_if_index = ntohl (mp->sw_if_index);
1681 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1682 sw_if_index, empty_ip_details);
1684 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1691 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1693 vat_main_t *vam = &vat_main;
1695 if (VAT_JSON_ARRAY != vam->json_tree.type)
1697 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1698 vat_json_init_array (&vam->json_tree);
1700 vat_json_array_add_uint (&vam->json_tree,
1701 clib_net_to_host_u32 (mp->sw_if_index));
1704 static void vl_api_get_first_msg_id_reply_t_handler
1705 (vl_api_get_first_msg_id_reply_t * mp)
1707 vat_main_t *vam = &vat_main;
1708 i32 retval = ntohl (mp->retval);
1710 if (vam->async_mode)
1712 vam->async_errors += (retval < 0);
1716 vam->retval = retval;
1717 vam->result_ready = 1;
1721 errmsg ("first message id %d", ntohs (mp->first_msg_id));
1725 static void vl_api_get_first_msg_id_reply_t_handler_json
1726 (vl_api_get_first_msg_id_reply_t * mp)
1728 vat_main_t *vam = &vat_main;
1729 vat_json_node_t node;
1731 vat_json_init_object (&node);
1732 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1733 vat_json_object_add_uint (&node, "first_msg_id",
1734 (uint) ntohs (mp->first_msg_id));
1736 vat_json_print (vam->ofp, &node);
1737 vat_json_free (&node);
1739 vam->retval = ntohl (mp->retval);
1740 vam->result_ready = 1;
1743 static void vl_api_get_node_graph_reply_t_handler
1744 (vl_api_get_node_graph_reply_t * mp)
1746 vat_main_t *vam = &vat_main;
1747 i32 retval = ntohl (mp->retval);
1748 u8 *pvt_copy, *reply;
1753 if (vam->async_mode)
1755 vam->async_errors += (retval < 0);
1759 vam->retval = retval;
1760 vam->result_ready = 1;
1763 /* "Should never happen..." */
1767 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1768 pvt_copy = vec_dup (reply);
1770 /* Toss the shared-memory original... */
1771 oldheap = vl_msg_push_heap ();
1775 vl_msg_pop_heap (oldheap);
1777 if (vam->graph_nodes)
1779 hash_free (vam->graph_node_index_by_name);
1781 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
1783 node = vam->graph_nodes[0][i];
1784 vec_free (node->name);
1785 vec_free (node->next_nodes);
1788 vec_free (vam->graph_nodes[0]);
1789 vec_free (vam->graph_nodes);
1792 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
1793 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
1794 vec_free (pvt_copy);
1796 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
1798 node = vam->graph_nodes[0][i];
1799 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
1803 static void vl_api_get_node_graph_reply_t_handler_json
1804 (vl_api_get_node_graph_reply_t * mp)
1806 vat_main_t *vam = &vat_main;
1808 vat_json_node_t node;
1811 /* $$$$ make this real? */
1812 vat_json_init_object (&node);
1813 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1814 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
1816 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
1818 /* Toss the shared-memory original... */
1819 oldheap = vl_msg_push_heap ();
1823 vl_msg_pop_heap (oldheap);
1825 vat_json_print (vam->ofp, &node);
1826 vat_json_free (&node);
1828 vam->retval = ntohl (mp->retval);
1829 vam->result_ready = 1;
1832 /* Format hex dump. */
1834 format_hex_bytes (u8 * s, va_list * va)
1836 u8 *bytes = va_arg (*va, u8 *);
1837 int n_bytes = va_arg (*va, int);
1840 /* Print short or long form depending on byte count. */
1841 uword short_form = n_bytes <= 32;
1842 u32 indent = format_get_indent (s);
1847 for (i = 0; i < n_bytes; i++)
1849 if (!short_form && (i % 32) == 0)
1850 s = format (s, "%08x: ", i);
1851 s = format (s, "%02x", bytes[i]);
1852 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
1853 s = format (s, "\n%U", format_white_space, indent);
1860 * Generate boilerplate reply handlers, which
1861 * dig the return value out of the xxx_reply_t API message,
1862 * stick it into vam->retval, and set vam->result_ready
1864 * Could also do this by pointing N message decode slots at
1865 * a single function, but that could break in subtle ways.
1868 #define foreach_standard_reply_retval_handler \
1869 _(sw_interface_set_flags_reply) \
1870 _(sw_interface_add_del_address_reply) \
1871 _(sw_interface_set_rx_mode_reply) \
1872 _(sw_interface_set_rx_placement_reply) \
1873 _(sw_interface_set_table_reply) \
1874 _(sw_interface_set_mpls_enable_reply) \
1875 _(sw_interface_set_vpath_reply) \
1876 _(sw_interface_set_l2_bridge_reply) \
1877 _(bridge_domain_add_del_reply) \
1878 _(sw_interface_set_l2_xconnect_reply) \
1879 _(l2fib_add_del_reply) \
1880 _(l2fib_flush_int_reply) \
1881 _(l2fib_flush_bd_reply) \
1882 _(ip_route_add_del_reply) \
1883 _(ip_table_add_del_reply) \
1884 _(ip_table_replace_begin_reply) \
1885 _(ip_table_flush_reply) \
1886 _(ip_table_replace_end_reply) \
1887 _(ip_mroute_add_del_reply) \
1888 _(mpls_route_add_del_reply) \
1889 _(mpls_table_add_del_reply) \
1890 _(mpls_ip_bind_unbind_reply) \
1891 _(sw_interface_set_unnumbered_reply) \
1892 _(set_ip_flow_hash_reply) \
1893 _(sw_interface_ip6_enable_disable_reply) \
1894 _(l2_patch_add_del_reply) \
1895 _(l2_fib_clear_table_reply) \
1896 _(l2_interface_efp_filter_reply) \
1897 _(l2_interface_vlan_tag_rewrite_reply) \
1898 _(want_l2_macs_events_reply) \
1899 _(delete_loopback_reply) \
1900 _(bd_ip_mac_add_del_reply) \
1901 _(bd_ip_mac_flush_reply) \
1902 _(want_interface_events_reply) \
1903 _(sw_interface_clear_stats_reply) \
1904 _(ioam_enable_reply) \
1905 _(ioam_disable_reply) \
1906 _(ip_source_and_port_range_check_add_del_reply) \
1907 _(ip_source_and_port_range_check_interface_add_del_reply)\
1908 _(delete_subif_reply) \
1909 _(l2_interface_pbb_tag_rewrite_reply) \
1910 _(sw_interface_tag_add_del_reply) \
1911 _(sw_interface_add_del_mac_address_reply) \
1912 _(hw_interface_set_mtu_reply) \
1913 _(session_rule_add_del_reply) \
1914 _(ip_container_proxy_add_del_reply) \
1917 static void vl_api_##n##_t_handler \
1918 (vl_api_##n##_t * mp) \
1920 vat_main_t * vam = &vat_main; \
1921 i32 retval = ntohl(mp->retval); \
1922 if (vam->async_mode) { \
1923 vam->async_errors += (retval < 0); \
1925 vam->retval = retval; \
1926 vam->result_ready = 1; \
1929 foreach_standard_reply_retval_handler;
1933 static void vl_api_##n##_t_handler_json \
1934 (vl_api_##n##_t * mp) \
1936 vat_main_t * vam = &vat_main; \
1937 vat_json_node_t node; \
1938 vat_json_init_object(&node); \
1939 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
1940 vat_json_print(vam->ofp, &node); \
1941 vam->retval = ntohl(mp->retval); \
1942 vam->result_ready = 1; \
1944 foreach_standard_reply_retval_handler;
1948 * Table of message reply handlers, must include boilerplate handlers
1952 #define foreach_vpe_api_reply_msg \
1953 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
1954 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
1955 _(SW_INTERFACE_DETAILS, sw_interface_details) \
1956 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
1957 _(CONTROL_PING_REPLY, control_ping_reply) \
1958 _(CLI_REPLY, cli_reply) \
1959 _(CLI_INBAND_REPLY, cli_inband_reply) \
1960 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
1961 sw_interface_add_del_address_reply) \
1962 _(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
1963 _(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
1964 _(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
1965 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
1966 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
1967 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
1968 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
1969 sw_interface_set_l2_xconnect_reply) \
1970 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
1971 sw_interface_set_l2_bridge_reply) \
1972 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
1973 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
1974 _(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
1975 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
1976 _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
1977 _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
1978 _(L2_FLAGS_REPLY, l2_flags_reply) \
1979 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
1980 _(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \
1981 _(VIRTIO_PCI_CREATE_V2_REPLY, virtio_pci_create_v2_reply) \
1982 _(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
1983 _(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
1984 _(IP_ROUTE_ADD_DEL_REPLY, ip_route_add_del_reply) \
1985 _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
1986 _(IP_TABLE_REPLACE_BEGIN_REPLY, ip_table_replace_begin_reply) \
1987 _(IP_TABLE_FLUSH_REPLY, ip_table_flush_reply) \
1988 _(IP_TABLE_REPLACE_END_REPLY, ip_table_replace_end_reply) \
1989 _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
1990 _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
1991 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
1992 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
1993 _(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
1994 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
1995 sw_interface_set_unnumbered_reply) \
1996 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
1997 _(CREATE_SUBIF_REPLY, create_subif_reply) \
1998 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
1999 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
2000 sw_interface_ip6_enable_disable_reply) \
2001 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
2002 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
2003 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
2004 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
2005 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
2006 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
2007 _(SHOW_VERSION_REPLY, show_version_reply) \
2008 _(SHOW_THREADS_REPLY, show_threads_reply) \
2009 _(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
2010 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
2011 _(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
2012 _(L2_MACS_EVENT, l2_macs_event) \
2013 _(IP_ADDRESS_DETAILS, ip_address_details) \
2014 _(IP_DETAILS, ip_details) \
2015 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
2016 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
2017 _(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
2018 _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
2019 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
2020 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
2021 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
2022 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
2023 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
2024 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
2025 _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
2026 _(MPLS_TABLE_DETAILS, mpls_table_details) \
2027 _(MPLS_ROUTE_DETAILS, mpls_route_details) \
2028 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
2029 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
2030 ip_source_and_port_range_check_add_del_reply) \
2031 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
2032 ip_source_and_port_range_check_interface_add_del_reply) \
2033 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
2034 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
2035 _(IP_TABLE_DETAILS, ip_table_details) \
2036 _(IP_ROUTE_DETAILS, ip_route_details) \
2037 _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
2038 _(SW_INTERFACE_ADD_DEL_MAC_ADDRESS_REPLY, sw_interface_add_del_mac_address_reply) \
2039 _(L2_XCONNECT_DETAILS, l2_xconnect_details) \
2040 _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
2041 _(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
2042 _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
2043 _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
2044 _(SESSION_RULES_DETAILS, session_rules_details) \
2045 _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
2047 #define foreach_standalone_reply_msg \
2048 _(SW_INTERFACE_EVENT, sw_interface_event)
2056 #define STR_VTR_OP_CASE(op) \
2057 case L2_VTR_ ## op: \
2061 str_vtr_op (u32 vtr_op)
2065 STR_VTR_OP_CASE (DISABLED);
2066 STR_VTR_OP_CASE (PUSH_1);
2067 STR_VTR_OP_CASE (PUSH_2);
2068 STR_VTR_OP_CASE (POP_1);
2069 STR_VTR_OP_CASE (POP_2);
2070 STR_VTR_OP_CASE (TRANSLATE_1_1);
2071 STR_VTR_OP_CASE (TRANSLATE_1_2);
2072 STR_VTR_OP_CASE (TRANSLATE_2_1);
2073 STR_VTR_OP_CASE (TRANSLATE_2_2);
2080 dump_sub_interface_table (vat_main_t * vam)
2082 const sw_interface_subif_t *sub = NULL;
2084 if (vam->json_output)
2087 ("JSON output supported only for VPE API calls and dump_stats_table");
2092 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
2093 "Interface", "sw_if_index",
2094 "sub id", "dot1ad", "tags", "outer id",
2095 "inner id", "exact", "default", "outer any", "inner any");
2097 vec_foreach (sub, vam->sw_if_subif_table)
2100 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
2101 sub->interface_name,
2103 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
2104 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
2105 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
2106 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
2107 if (sub->vtr_op != L2_VTR_DISABLED)
2110 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
2111 "tag1: %d tag2: %d ]",
2112 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
2113 sub->vtr_tag1, sub->vtr_tag2);
2121 name_sort_cmp (void *a1, void *a2)
2123 name_sort_t *n1 = a1;
2124 name_sort_t *n2 = a2;
2126 return strcmp ((char *) n1->name, (char *) n2->name);
2130 dump_interface_table (vat_main_t * vam)
2133 name_sort_t *nses = 0, *ns;
2135 if (vam->json_output)
2138 ("JSON output supported only for VPE API calls and dump_stats_table");
2143 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2145 vec_add2 (nses, ns, 1);
2146 ns->name = (u8 *)(p->key);
2147 ns->value = (u32) p->value[0];
2151 vec_sort_with_function (nses, name_sort_cmp);
2153 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
2154 vec_foreach (ns, nses)
2156 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
2163 dump_ip_table (vat_main_t * vam, int is_ipv6)
2165 const ip_details_t *det = NULL;
2166 const ip_address_details_t *address = NULL;
2169 print (vam->ofp, "%-12s", "sw_if_index");
2171 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
2178 print (vam->ofp, "%-12d", i);
2179 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
2184 vec_foreach (address, det->addr)
2188 is_ipv6 ? format_ip6_address : format_ip4_address,
2189 address->ip, address->prefix_length);
2197 dump_ipv4_table (vat_main_t * vam)
2199 if (vam->json_output)
2202 ("JSON output supported only for VPE API calls and dump_stats_table");
2206 return dump_ip_table (vam, 0);
2210 dump_ipv6_table (vat_main_t * vam)
2212 if (vam->json_output)
2215 ("JSON output supported only for VPE API calls and dump_stats_table");
2219 return dump_ip_table (vam, 1);
2223 * Pass CLI buffers directly in the CLI_INBAND API message,
2224 * instead of an additional shared memory area.
2227 exec_inband (vat_main_t * vam)
2229 vl_api_cli_inband_t *mp;
2230 unformat_input_t *i = vam->input;
2233 if (vec_len (i->buffer) == 0)
2236 if (vam->exec_mode == 0 && unformat (i, "mode"))
2241 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
2248 * In order for the CLI command to work, it
2249 * must be a vector ending in \n, not a C-string ending
2252 M2 (CLI_INBAND, mp, vec_len (vam->input->buffer));
2253 vl_api_vec_to_api_string (vam->input->buffer, &mp->cmd);
2257 /* json responses may or may not include a useful reply... */
2258 if (vec_len (vam->cmd_reply))
2259 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
2264 exec (vat_main_t * vam)
2266 return exec_inband (vam);
2270 api_create_loopback (vat_main_t * vam)
2272 unformat_input_t *i = vam->input;
2273 vl_api_create_loopback_t *mp;
2274 vl_api_create_loopback_instance_t *mp_lbi;
2277 u8 is_specified = 0;
2278 u32 user_instance = 0;
2281 clib_memset (mac_address, 0, sizeof (mac_address));
2283 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2285 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
2287 if (unformat (i, "instance %d", &user_instance))
2295 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
2296 mp_lbi->is_specified = is_specified;
2298 mp_lbi->user_instance = htonl (user_instance);
2300 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
2305 /* Construct the API message */
2306 M (CREATE_LOOPBACK, mp);
2308 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
2317 api_delete_loopback (vat_main_t * vam)
2319 unformat_input_t *i = vam->input;
2320 vl_api_delete_loopback_t *mp;
2321 u32 sw_if_index = ~0;
2324 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2326 if (unformat (i, "sw_if_index %d", &sw_if_index))
2332 if (sw_if_index == ~0)
2334 errmsg ("missing sw_if_index");
2338 /* Construct the API message */
2339 M (DELETE_LOOPBACK, mp);
2340 mp->sw_if_index = ntohl (sw_if_index);
2348 api_want_interface_events (vat_main_t * vam)
2350 unformat_input_t *i = vam->input;
2351 vl_api_want_interface_events_t *mp;
2355 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2357 if (unformat (i, "enable"))
2359 else if (unformat (i, "disable"))
2367 errmsg ("missing enable|disable");
2371 M (WANT_INTERFACE_EVENTS, mp);
2372 mp->enable_disable = enable;
2374 vam->interface_event_display = enable;
2382 /* Note: non-static, called once to set up the initial intfc table */
2384 api_sw_interface_dump (vat_main_t * vam)
2386 vl_api_sw_interface_dump_t *mp;
2387 vl_api_control_ping_t *mp_ping;
2389 name_sort_t *nses = 0, *ns;
2390 sw_interface_subif_t *sub = NULL;
2393 /* Toss the old name table */
2395 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2397 vec_add2 (nses, ns, 1);
2398 ns->name = (u8 *)(p->key);
2399 ns->value = (u32) p->value[0];
2403 hash_free (vam->sw_if_index_by_interface_name);
2405 vec_foreach (ns, nses) vec_free (ns->name);
2409 vec_foreach (sub, vam->sw_if_subif_table)
2411 vec_free (sub->interface_name);
2413 vec_free (vam->sw_if_subif_table);
2415 /* recreate the interface name hash table */
2416 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
2419 * Ask for all interface names. Otherwise, the epic catalog of
2420 * name filters becomes ridiculously long, and vat ends up needing
2421 * to be taught about new interface types.
2423 M (SW_INTERFACE_DUMP, mp);
2426 /* Use a control ping for synchronization */
2427 MPING (CONTROL_PING, mp_ping);
2435 api_sw_interface_set_flags (vat_main_t * vam)
2437 unformat_input_t *i = vam->input;
2438 vl_api_sw_interface_set_flags_t *mp;
2440 u8 sw_if_index_set = 0;
2444 /* Parse args required to build the message */
2445 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2447 if (unformat (i, "admin-up"))
2449 else if (unformat (i, "admin-down"))
2452 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2453 sw_if_index_set = 1;
2454 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2455 sw_if_index_set = 1;
2460 if (sw_if_index_set == 0)
2462 errmsg ("missing interface name or sw_if_index");
2466 /* Construct the API message */
2467 M (SW_INTERFACE_SET_FLAGS, mp);
2468 mp->sw_if_index = ntohl (sw_if_index);
2469 mp->flags = ntohl ((admin_up) ? IF_STATUS_API_FLAG_ADMIN_UP : 0);
2474 /* Wait for a reply, return the good/bad news... */
2480 api_sw_interface_set_rx_mode (vat_main_t * vam)
2482 unformat_input_t *i = vam->input;
2483 vl_api_sw_interface_set_rx_mode_t *mp;
2485 u8 sw_if_index_set = 0;
2487 u8 queue_id_valid = 0;
2489 vnet_hw_if_rx_mode mode = VNET_HW_IF_RX_MODE_UNKNOWN;
2491 /* Parse args required to build the message */
2492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2494 if (unformat (i, "queue %d", &queue_id))
2496 else if (unformat (i, "polling"))
2497 mode = VNET_HW_IF_RX_MODE_POLLING;
2498 else if (unformat (i, "interrupt"))
2499 mode = VNET_HW_IF_RX_MODE_INTERRUPT;
2500 else if (unformat (i, "adaptive"))
2501 mode = VNET_HW_IF_RX_MODE_ADAPTIVE;
2503 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2504 sw_if_index_set = 1;
2505 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2506 sw_if_index_set = 1;
2511 if (sw_if_index_set == 0)
2513 errmsg ("missing interface name or sw_if_index");
2516 if (mode == VNET_HW_IF_RX_MODE_UNKNOWN)
2518 errmsg ("missing rx-mode");
2522 /* Construct the API message */
2523 M (SW_INTERFACE_SET_RX_MODE, mp);
2524 mp->sw_if_index = ntohl (sw_if_index);
2525 mp->mode = (vl_api_rx_mode_t) mode;
2526 mp->queue_id_valid = queue_id_valid;
2527 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
2532 /* Wait for a reply, return the good/bad news... */
2538 api_sw_interface_set_rx_placement (vat_main_t * vam)
2540 unformat_input_t *i = vam->input;
2541 vl_api_sw_interface_set_rx_placement_t *mp;
2543 u8 sw_if_index_set = 0;
2546 u32 queue_id, thread_index;
2548 /* Parse args required to build the message */
2549 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2551 if (unformat (i, "queue %d", &queue_id))
2553 else if (unformat (i, "main"))
2555 else if (unformat (i, "worker %d", &thread_index))
2558 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2559 sw_if_index_set = 1;
2560 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2561 sw_if_index_set = 1;
2566 if (sw_if_index_set == 0)
2568 errmsg ("missing interface name or sw_if_index");
2574 /* Construct the API message */
2575 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
2576 mp->sw_if_index = ntohl (sw_if_index);
2577 mp->worker_id = ntohl (thread_index);
2578 mp->queue_id = ntohl (queue_id);
2579 mp->is_main = is_main;
2583 /* Wait for a reply, return the good/bad news... */
2588 static void vl_api_sw_interface_rx_placement_details_t_handler
2589 (vl_api_sw_interface_rx_placement_details_t * mp)
2591 vat_main_t *vam = &vat_main;
2592 u32 worker_id = ntohl (mp->worker_id);
2595 "\n%-11d %-11s %-6d %-5d %-9s",
2596 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
2597 worker_id, ntohl (mp->queue_id),
2599 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
2602 static void vl_api_sw_interface_rx_placement_details_t_handler_json
2603 (vl_api_sw_interface_rx_placement_details_t * mp)
2605 vat_main_t *vam = &vat_main;
2606 vat_json_node_t *node = NULL;
2608 if (VAT_JSON_ARRAY != vam->json_tree.type)
2610 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2611 vat_json_init_array (&vam->json_tree);
2613 node = vat_json_array_add (&vam->json_tree);
2615 vat_json_init_object (node);
2616 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2617 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
2618 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
2619 vat_json_object_add_uint (node, "mode", mp->mode);
2623 api_sw_interface_rx_placement_dump (vat_main_t * vam)
2625 unformat_input_t *i = vam->input;
2626 vl_api_sw_interface_rx_placement_dump_t *mp;
2627 vl_api_control_ping_t *mp_ping;
2630 u8 sw_if_index_set = 0;
2632 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2634 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2636 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2643 "\n%-11s %-11s %-6s %-5s %-4s",
2644 "sw_if_index", "main/worker", "thread", "queue", "mode");
2646 /* Dump Interface rx placement */
2647 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
2649 if (sw_if_index_set)
2650 mp->sw_if_index = htonl (sw_if_index);
2652 mp->sw_if_index = ~0;
2656 /* Use a control ping for synchronization */
2657 MPING (CONTROL_PING, mp_ping);
2665 api_sw_interface_clear_stats (vat_main_t * vam)
2667 unformat_input_t *i = vam->input;
2668 vl_api_sw_interface_clear_stats_t *mp;
2670 u8 sw_if_index_set = 0;
2673 /* Parse args required to build the message */
2674 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2676 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2677 sw_if_index_set = 1;
2678 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2679 sw_if_index_set = 1;
2684 /* Construct the API message */
2685 M (SW_INTERFACE_CLEAR_STATS, mp);
2687 if (sw_if_index_set == 1)
2688 mp->sw_if_index = ntohl (sw_if_index);
2690 mp->sw_if_index = ~0;
2695 /* Wait for a reply, return the good/bad news... */
2701 api_sw_interface_add_del_address (vat_main_t * vam)
2703 unformat_input_t *i = vam->input;
2704 vl_api_sw_interface_add_del_address_t *mp;
2706 u8 sw_if_index_set = 0;
2707 u8 is_add = 1, del_all = 0;
2708 u32 address_length = 0;
2709 u8 v4_address_set = 0;
2710 u8 v6_address_set = 0;
2711 ip4_address_t v4address;
2712 ip6_address_t v6address;
2715 /* Parse args required to build the message */
2716 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2718 if (unformat (i, "del-all"))
2720 else if (unformat (i, "del"))
2723 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2724 sw_if_index_set = 1;
2725 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2726 sw_if_index_set = 1;
2727 else if (unformat (i, "%U/%d",
2728 unformat_ip4_address, &v4address, &address_length))
2730 else if (unformat (i, "%U/%d",
2731 unformat_ip6_address, &v6address, &address_length))
2737 if (sw_if_index_set == 0)
2739 errmsg ("missing interface name or sw_if_index");
2742 if (v4_address_set && v6_address_set)
2744 errmsg ("both v4 and v6 addresses set");
2747 if (!v4_address_set && !v6_address_set && !del_all)
2749 errmsg ("no addresses set");
2753 /* Construct the API message */
2754 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
2756 mp->sw_if_index = ntohl (sw_if_index);
2757 mp->is_add = is_add;
2758 mp->del_all = del_all;
2761 mp->prefix.address.af = ADDRESS_IP6;
2762 clib_memcpy (mp->prefix.address.un.ip6, &v6address, sizeof (v6address));
2766 mp->prefix.address.af = ADDRESS_IP4;
2767 clib_memcpy (mp->prefix.address.un.ip4, &v4address, sizeof (v4address));
2769 mp->prefix.len = address_length;
2774 /* Wait for a reply, return good/bad news */
2780 api_sw_interface_set_mpls_enable (vat_main_t * vam)
2782 unformat_input_t *i = vam->input;
2783 vl_api_sw_interface_set_mpls_enable_t *mp;
2785 u8 sw_if_index_set = 0;
2789 /* Parse args required to build the message */
2790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2792 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2793 sw_if_index_set = 1;
2794 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2795 sw_if_index_set = 1;
2796 else if (unformat (i, "disable"))
2798 else if (unformat (i, "dis"))
2804 if (sw_if_index_set == 0)
2806 errmsg ("missing interface name or sw_if_index");
2810 /* Construct the API message */
2811 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
2813 mp->sw_if_index = ntohl (sw_if_index);
2814 mp->enable = enable;
2819 /* Wait for a reply... */
2825 api_sw_interface_set_table (vat_main_t * vam)
2827 unformat_input_t *i = vam->input;
2828 vl_api_sw_interface_set_table_t *mp;
2829 u32 sw_if_index, vrf_id = 0;
2830 u8 sw_if_index_set = 0;
2834 /* Parse args required to build the message */
2835 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2837 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2838 sw_if_index_set = 1;
2839 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2840 sw_if_index_set = 1;
2841 else if (unformat (i, "vrf %d", &vrf_id))
2843 else if (unformat (i, "ipv6"))
2849 if (sw_if_index_set == 0)
2851 errmsg ("missing interface name or sw_if_index");
2855 /* Construct the API message */
2856 M (SW_INTERFACE_SET_TABLE, mp);
2858 mp->sw_if_index = ntohl (sw_if_index);
2859 mp->is_ipv6 = is_ipv6;
2860 mp->vrf_id = ntohl (vrf_id);
2865 /* Wait for a reply... */
2870 static void vl_api_sw_interface_get_table_reply_t_handler
2871 (vl_api_sw_interface_get_table_reply_t * mp)
2873 vat_main_t *vam = &vat_main;
2875 print (vam->ofp, "%d", ntohl (mp->vrf_id));
2877 vam->retval = ntohl (mp->retval);
2878 vam->result_ready = 1;
2882 static void vl_api_sw_interface_get_table_reply_t_handler_json
2883 (vl_api_sw_interface_get_table_reply_t * mp)
2885 vat_main_t *vam = &vat_main;
2886 vat_json_node_t node;
2888 vat_json_init_object (&node);
2889 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2890 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
2892 vat_json_print (vam->ofp, &node);
2893 vat_json_free (&node);
2895 vam->retval = ntohl (mp->retval);
2896 vam->result_ready = 1;
2900 api_sw_interface_get_table (vat_main_t * vam)
2902 unformat_input_t *i = vam->input;
2903 vl_api_sw_interface_get_table_t *mp;
2905 u8 sw_if_index_set = 0;
2909 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2911 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2912 sw_if_index_set = 1;
2913 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2914 sw_if_index_set = 1;
2915 else if (unformat (i, "ipv6"))
2921 if (sw_if_index_set == 0)
2923 errmsg ("missing interface name or sw_if_index");
2927 M (SW_INTERFACE_GET_TABLE, mp);
2928 mp->sw_if_index = htonl (sw_if_index);
2929 mp->is_ipv6 = is_ipv6;
2937 api_sw_interface_set_vpath (vat_main_t * vam)
2939 unformat_input_t *i = vam->input;
2940 vl_api_sw_interface_set_vpath_t *mp;
2941 u32 sw_if_index = 0;
2942 u8 sw_if_index_set = 0;
2946 /* Parse args required to build the message */
2947 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2949 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2950 sw_if_index_set = 1;
2951 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2952 sw_if_index_set = 1;
2953 else if (unformat (i, "enable"))
2955 else if (unformat (i, "disable"))
2961 if (sw_if_index_set == 0)
2963 errmsg ("missing interface name or sw_if_index");
2967 /* Construct the API message */
2968 M (SW_INTERFACE_SET_VPATH, mp);
2970 mp->sw_if_index = ntohl (sw_if_index);
2971 mp->enable = is_enable;
2976 /* Wait for a reply... */
2982 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
2984 unformat_input_t *i = vam->input;
2985 vl_api_sw_interface_set_l2_xconnect_t *mp;
2987 u8 rx_sw_if_index_set = 0;
2989 u8 tx_sw_if_index_set = 0;
2993 /* Parse args required to build the message */
2994 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2996 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
2997 rx_sw_if_index_set = 1;
2998 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
2999 tx_sw_if_index_set = 1;
3000 else if (unformat (i, "rx"))
3002 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3004 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
3006 rx_sw_if_index_set = 1;
3011 else if (unformat (i, "tx"))
3013 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3015 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
3017 tx_sw_if_index_set = 1;
3022 else if (unformat (i, "enable"))
3024 else if (unformat (i, "disable"))
3030 if (rx_sw_if_index_set == 0)
3032 errmsg ("missing rx interface name or rx_sw_if_index");
3036 if (enable && (tx_sw_if_index_set == 0))
3038 errmsg ("missing tx interface name or tx_sw_if_index");
3042 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
3044 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
3045 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
3046 mp->enable = enable;
3054 api_sw_interface_set_l2_bridge (vat_main_t * vam)
3056 unformat_input_t *i = vam->input;
3057 vl_api_sw_interface_set_l2_bridge_t *mp;
3058 vl_api_l2_port_type_t port_type;
3060 u8 rx_sw_if_index_set = 0;
3067 port_type = L2_API_PORT_TYPE_NORMAL;
3069 /* Parse args required to build the message */
3070 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3072 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
3073 rx_sw_if_index_set = 1;
3074 else if (unformat (i, "bd_id %d", &bd_id))
3078 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
3079 rx_sw_if_index_set = 1;
3080 else if (unformat (i, "shg %d", &shg))
3082 else if (unformat (i, "bvi"))
3083 port_type = L2_API_PORT_TYPE_BVI;
3084 else if (unformat (i, "uu-fwd"))
3085 port_type = L2_API_PORT_TYPE_UU_FWD;
3086 else if (unformat (i, "enable"))
3088 else if (unformat (i, "disable"))
3094 if (rx_sw_if_index_set == 0)
3096 errmsg ("missing rx interface name or sw_if_index");
3100 if (enable && (bd_id_set == 0))
3102 errmsg ("missing bridge domain");
3106 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
3108 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
3109 mp->bd_id = ntohl (bd_id);
3111 mp->port_type = ntohl (port_type);
3112 mp->enable = enable;
3120 api_bridge_domain_dump (vat_main_t * vam)
3122 unformat_input_t *i = vam->input;
3123 vl_api_bridge_domain_dump_t *mp;
3124 vl_api_control_ping_t *mp_ping;
3128 /* Parse args required to build the message */
3129 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3131 if (unformat (i, "bd_id %d", &bd_id))
3137 M (BRIDGE_DOMAIN_DUMP, mp);
3138 mp->bd_id = ntohl (bd_id);
3141 /* Use a control ping for synchronization */
3142 MPING (CONTROL_PING, mp_ping);
3150 api_bridge_domain_add_del (vat_main_t * vam)
3152 unformat_input_t *i = vam->input;
3153 vl_api_bridge_domain_add_del_t *mp;
3156 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
3161 /* Parse args required to build the message */
3162 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3164 if (unformat (i, "bd_id %d", &bd_id))
3166 else if (unformat (i, "flood %d", &flood))
3168 else if (unformat (i, "uu-flood %d", &uu_flood))
3170 else if (unformat (i, "forward %d", &forward))
3172 else if (unformat (i, "learn %d", &learn))
3174 else if (unformat (i, "arp-term %d", &arp_term))
3176 else if (unformat (i, "mac-age %d", &mac_age))
3178 else if (unformat (i, "bd-tag %s", &bd_tag))
3180 else if (unformat (i, "del"))
3183 flood = uu_flood = forward = learn = 0;
3191 errmsg ("missing bridge domain");
3198 errmsg ("mac age must be less than 256 ");
3203 if ((bd_tag) && (vec_len (bd_tag) > 63))
3205 errmsg ("bd-tag cannot be longer than 63");
3210 M (BRIDGE_DOMAIN_ADD_DEL, mp);
3212 mp->bd_id = ntohl (bd_id);
3214 mp->uu_flood = uu_flood;
3215 mp->forward = forward;
3217 mp->arp_term = arp_term;
3218 mp->is_add = is_add;
3219 mp->mac_age = (u8) mac_age;
3222 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
3223 mp->bd_tag[vec_len (bd_tag)] = 0;
3234 api_l2fib_flush_bd (vat_main_t * vam)
3236 unformat_input_t *i = vam->input;
3237 vl_api_l2fib_flush_bd_t *mp;
3241 /* Parse args required to build the message */
3242 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3244 if (unformat (i, "bd_id %d", &bd_id));
3251 errmsg ("missing bridge domain");
3255 M (L2FIB_FLUSH_BD, mp);
3257 mp->bd_id = htonl (bd_id);
3265 api_l2fib_flush_int (vat_main_t * vam)
3267 unformat_input_t *i = vam->input;
3268 vl_api_l2fib_flush_int_t *mp;
3269 u32 sw_if_index = ~0;
3272 /* Parse args required to build the message */
3273 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3275 if (unformat (i, "sw_if_index %d", &sw_if_index));
3277 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
3282 if (sw_if_index == ~0)
3284 errmsg ("missing interface name or sw_if_index");
3288 M (L2FIB_FLUSH_INT, mp);
3290 mp->sw_if_index = ntohl (sw_if_index);
3298 api_l2fib_add_del (vat_main_t * vam)
3300 unformat_input_t *i = vam->input;
3301 vl_api_l2fib_add_del_t *mp;
3307 u32 sw_if_index = 0;
3308 u8 sw_if_index_set = 0;
3317 /* Parse args required to build the message */
3318 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3320 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
3322 else if (unformat (i, "bd_id %d", &bd_id))
3324 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3325 sw_if_index_set = 1;
3326 else if (unformat (i, "sw_if"))
3328 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3331 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3332 sw_if_index_set = 1;
3337 else if (unformat (i, "static"))
3339 else if (unformat (i, "filter"))
3344 else if (unformat (i, "bvi"))
3349 else if (unformat (i, "del"))
3351 else if (unformat (i, "count %d", &count))
3359 errmsg ("missing mac address");
3365 errmsg ("missing bridge domain");
3369 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
3371 errmsg ("missing interface name or sw_if_index");
3377 /* Turn on async mode */
3378 vam->async_mode = 1;
3379 vam->async_errors = 0;
3380 before = vat_time_now (vam);
3383 for (j = 0; j < count; j++)
3385 M (L2FIB_ADD_DEL, mp);
3387 clib_memcpy (mp->mac, mac, 6);
3388 mp->bd_id = ntohl (bd_id);
3389 mp->is_add = is_add;
3390 mp->sw_if_index = ntohl (sw_if_index);
3394 mp->static_mac = static_mac;
3395 mp->filter_mac = filter_mac;
3396 mp->bvi_mac = bvi_mac;
3398 increment_mac_address (mac);
3405 vl_api_control_ping_t *mp_ping;
3408 /* Shut off async mode */
3409 vam->async_mode = 0;
3411 MPING (CONTROL_PING, mp_ping);
3414 timeout = vat_time_now (vam) + 1.0;
3415 while (vat_time_now (vam) < timeout)
3416 if (vam->result_ready == 1)
3421 if (vam->retval == -99)
3424 if (vam->async_errors > 0)
3426 errmsg ("%d asynchronous errors", vam->async_errors);
3429 vam->async_errors = 0;
3430 after = vat_time_now (vam);
3432 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
3433 count, after - before, count / (after - before));
3439 /* Wait for a reply... */
3443 /* Return the good/bad news */
3444 return (vam->retval);
3448 api_bridge_domain_set_mac_age (vat_main_t * vam)
3450 unformat_input_t *i = vam->input;
3451 vl_api_bridge_domain_set_mac_age_t *mp;
3456 /* Parse args required to build the message */
3457 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3459 if (unformat (i, "bd_id %d", &bd_id));
3460 else if (unformat (i, "mac-age %d", &mac_age));
3467 errmsg ("missing bridge domain");
3473 errmsg ("mac age must be less than 256 ");
3477 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
3479 mp->bd_id = htonl (bd_id);
3480 mp->mac_age = (u8) mac_age;
3488 api_l2_flags (vat_main_t * vam)
3490 unformat_input_t *i = vam->input;
3491 vl_api_l2_flags_t *mp;
3494 u8 sw_if_index_set = 0;
3498 /* Parse args required to build the message */
3499 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3501 if (unformat (i, "sw_if_index %d", &sw_if_index))
3502 sw_if_index_set = 1;
3503 else if (unformat (i, "sw_if"))
3505 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3508 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3509 sw_if_index_set = 1;
3514 else if (unformat (i, "learn"))
3516 else if (unformat (i, "forward"))
3518 else if (unformat (i, "flood"))
3520 else if (unformat (i, "uu-flood"))
3521 flags |= L2_UU_FLOOD;
3522 else if (unformat (i, "arp-term"))
3523 flags |= L2_ARP_TERM;
3524 else if (unformat (i, "off"))
3526 else if (unformat (i, "disable"))
3532 if (sw_if_index_set == 0)
3534 errmsg ("missing interface name or sw_if_index");
3540 mp->sw_if_index = ntohl (sw_if_index);
3541 mp->feature_bitmap = ntohl (flags);
3542 mp->is_set = is_set;
3550 api_bridge_flags (vat_main_t * vam)
3552 unformat_input_t *i = vam->input;
3553 vl_api_bridge_flags_t *mp;
3557 bd_flags_t flags = 0;
3560 /* Parse args required to build the message */
3561 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3563 if (unformat (i, "bd_id %d", &bd_id))
3565 else if (unformat (i, "learn"))
3566 flags |= BRIDGE_API_FLAG_LEARN;
3567 else if (unformat (i, "forward"))
3568 flags |= BRIDGE_API_FLAG_FWD;
3569 else if (unformat (i, "flood"))
3570 flags |= BRIDGE_API_FLAG_FLOOD;
3571 else if (unformat (i, "uu-flood"))
3572 flags |= BRIDGE_API_FLAG_UU_FLOOD;
3573 else if (unformat (i, "arp-term"))
3574 flags |= BRIDGE_API_FLAG_ARP_TERM;
3575 else if (unformat (i, "off"))
3577 else if (unformat (i, "disable"))
3585 errmsg ("missing bridge domain");
3589 M (BRIDGE_FLAGS, mp);
3591 mp->bd_id = ntohl (bd_id);
3592 mp->flags = ntohl (flags);
3593 mp->is_set = is_set;
3601 api_bd_ip_mac_add_del (vat_main_t * vam)
3603 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
3604 vl_api_mac_address_t mac = { 0 };
3605 unformat_input_t *i = vam->input;
3606 vl_api_bd_ip_mac_add_del_t *mp;
3615 /* Parse args required to build the message */
3616 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3618 if (unformat (i, "bd_id %d", &bd_id))
3622 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
3626 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
3630 else if (unformat (i, "del"))
3638 errmsg ("missing bridge domain");
3641 else if (ip_set == 0)
3643 errmsg ("missing IP address");
3646 else if (mac_set == 0)
3648 errmsg ("missing MAC address");
3652 M (BD_IP_MAC_ADD_DEL, mp);
3654 mp->entry.bd_id = ntohl (bd_id);
3655 mp->is_add = is_add;
3657 clib_memcpy (&mp->entry.ip, &ip, sizeof (ip));
3658 clib_memcpy (&mp->entry.mac, &mac, sizeof (mac));
3666 api_bd_ip_mac_flush (vat_main_t * vam)
3668 unformat_input_t *i = vam->input;
3669 vl_api_bd_ip_mac_flush_t *mp;
3674 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3676 if (unformat (i, "bd_id %d", &bd_id))
3686 errmsg ("missing bridge domain");
3690 M (BD_IP_MAC_FLUSH, mp);
3692 mp->bd_id = ntohl (bd_id);
3699 static void vl_api_bd_ip_mac_details_t_handler
3700 (vl_api_bd_ip_mac_details_t * mp)
3702 vat_main_t *vam = &vat_main;
3706 ntohl (mp->entry.bd_id),
3707 format_vl_api_mac_address, mp->entry.mac,
3708 format_vl_api_address, &mp->entry.ip);
3711 static void vl_api_bd_ip_mac_details_t_handler_json
3712 (vl_api_bd_ip_mac_details_t * mp)
3714 vat_main_t *vam = &vat_main;
3715 vat_json_node_t *node = NULL;
3717 if (VAT_JSON_ARRAY != vam->json_tree.type)
3719 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3720 vat_json_init_array (&vam->json_tree);
3722 node = vat_json_array_add (&vam->json_tree);
3724 vat_json_init_object (node);
3725 vat_json_object_add_uint (node, "bd_id", ntohl (mp->entry.bd_id));
3726 vat_json_object_add_string_copy (node, "mac_address",
3727 format (0, "%U", format_vl_api_mac_address,
3731 ip = format (0, "%U", format_vl_api_address, &mp->entry.ip);
3732 vat_json_object_add_string_copy (node, "ip_address", ip);
3737 api_bd_ip_mac_dump (vat_main_t * vam)
3739 unformat_input_t *i = vam->input;
3740 vl_api_bd_ip_mac_dump_t *mp;
3741 vl_api_control_ping_t *mp_ping;
3746 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3748 if (unformat (i, "bd_id %d", &bd_id))
3757 "\n%-5s %-7s %-20s %-30s",
3758 "bd_id", "is_ipv6", "mac_address", "ip_address");
3760 /* Dump Bridge Domain Ip to Mac entries */
3761 M (BD_IP_MAC_DUMP, mp);
3764 mp->bd_id = htonl (bd_id);
3770 /* Use a control ping for synchronization */
3771 MPING (CONTROL_PING, mp_ping);
3779 unformat_vlib_pci_addr (unformat_input_t * input, va_list * args)
3781 vlib_pci_addr_t *addr = va_arg (*args, vlib_pci_addr_t *);
3784 if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
3787 addr->domain = x[0];
3790 addr->function = x[3];
3796 api_virtio_pci_create_v2 (vat_main_t * vam)
3798 unformat_input_t *i = vam->input;
3799 vl_api_virtio_pci_create_v2_t *mp;
3803 u64 features = (u64) ~ (0ULL);
3804 u32 virtio_flags = 0;
3807 clib_memset (mac_address, 0, sizeof (mac_address));
3809 /* Parse args required to build the message */
3810 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3812 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
3816 else if (unformat (i, "pci-addr %U", unformat_vlib_pci_addr, &pci_addr))
3818 else if (unformat (i, "features 0x%llx", &features))
3820 else if (unformat (i, "gso-enabled"))
3821 virtio_flags |= VIRTIO_API_FLAG_GSO;
3822 else if (unformat (i, "csum-offload-enabled"))
3823 virtio_flags |= VIRTIO_API_FLAG_CSUM_OFFLOAD;
3824 else if (unformat (i, "gro-coalesce"))
3825 virtio_flags |= VIRTIO_API_FLAG_GRO_COALESCE;
3826 else if (unformat (i, "packed"))
3827 virtio_flags |= VIRTIO_API_FLAG_PACKED;
3828 else if (unformat (i, "in-order"))
3829 virtio_flags |= VIRTIO_API_FLAG_IN_ORDER;
3830 else if (unformat (i, "buffering"))
3831 virtio_flags |= VIRTIO_API_FLAG_BUFFERING;
3838 errmsg ("pci address must be non zero. ");
3842 /* Construct the API message */
3843 M (VIRTIO_PCI_CREATE_V2, mp);
3845 mp->use_random_mac = random_mac;
3847 mp->pci_addr.domain = htons (((vlib_pci_addr_t) pci_addr).domain);
3848 mp->pci_addr.bus = ((vlib_pci_addr_t) pci_addr).bus;
3849 mp->pci_addr.slot = ((vlib_pci_addr_t) pci_addr).slot;
3850 mp->pci_addr.function = ((vlib_pci_addr_t) pci_addr).function;
3852 mp->features = clib_host_to_net_u64 (features);
3853 mp->virtio_flags = clib_host_to_net_u32 (virtio_flags);
3855 if (random_mac == 0)
3856 clib_memcpy (mp->mac_address, mac_address, 6);
3861 /* Wait for a reply... */
3867 api_virtio_pci_delete (vat_main_t * vam)
3869 unformat_input_t *i = vam->input;
3870 vl_api_virtio_pci_delete_t *mp;
3871 u32 sw_if_index = ~0;
3872 u8 sw_if_index_set = 0;
3875 /* Parse args required to build the message */
3876 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3878 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
3879 sw_if_index_set = 1;
3880 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3881 sw_if_index_set = 1;
3886 if (sw_if_index_set == 0)
3888 errmsg ("missing vpp interface name. ");
3892 /* Construct the API message */
3893 M (VIRTIO_PCI_DELETE, mp);
3895 mp->sw_if_index = htonl (sw_if_index);
3900 /* Wait for a reply... */
3906 api_ip_table_add_del (vat_main_t * vam)
3908 unformat_input_t *i = vam->input;
3909 vl_api_ip_table_add_del_t *mp;
3915 /* Parse args required to build the message */
3916 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3918 if (unformat (i, "ipv6"))
3920 else if (unformat (i, "del"))
3922 else if (unformat (i, "add"))
3924 else if (unformat (i, "table %d", &table_id))
3928 clib_warning ("parse error '%U'", format_unformat_error, i);
3935 errmsg ("missing table-ID");
3939 /* Construct the API message */
3940 M (IP_TABLE_ADD_DEL, mp);
3942 mp->table.table_id = ntohl (table_id);
3943 mp->table.is_ip6 = is_ipv6;
3944 mp->is_add = is_add;
3949 /* Wait for a reply... */
3956 unformat_fib_path (unformat_input_t * input, va_list * args)
3958 vat_main_t *vam = va_arg (*args, vat_main_t *);
3959 vl_api_fib_path_t *path = va_arg (*args, vl_api_fib_path_t *);
3960 u32 weight, preference;
3961 mpls_label_t out_label;
3963 clib_memset (path, 0, sizeof (*path));
3965 path->sw_if_index = ~0;
3969 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
3971 if (unformat (input, "%U %U",
3972 unformat_vl_api_ip4_address,
3973 &path->nh.address.ip4,
3974 api_unformat_sw_if_index, vam, &path->sw_if_index))
3976 path->proto = FIB_API_PATH_NH_PROTO_IP4;
3978 else if (unformat (input, "%U %U",
3979 unformat_vl_api_ip6_address,
3980 &path->nh.address.ip6,
3981 api_unformat_sw_if_index, vam, &path->sw_if_index))
3983 path->proto = FIB_API_PATH_NH_PROTO_IP6;
3985 else if (unformat (input, "weight %u", &weight))
3987 path->weight = weight;
3989 else if (unformat (input, "preference %u", &preference))
3991 path->preference = preference;
3993 else if (unformat (input, "%U next-hop-table %d",
3994 unformat_vl_api_ip4_address,
3995 &path->nh.address.ip4, &path->table_id))
3997 path->proto = FIB_API_PATH_NH_PROTO_IP4;
3999 else if (unformat (input, "%U next-hop-table %d",
4000 unformat_vl_api_ip6_address,
4001 &path->nh.address.ip6, &path->table_id))
4003 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4005 else if (unformat (input, "%U",
4006 unformat_vl_api_ip4_address, &path->nh.address.ip4))
4009 * the recursive next-hops are by default in the default table
4012 path->sw_if_index = ~0;
4013 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4015 else if (unformat (input, "%U",
4016 unformat_vl_api_ip6_address, &path->nh.address.ip6))
4019 * the recursive next-hops are by default in the default table
4022 path->sw_if_index = ~0;
4023 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4025 else if (unformat (input, "resolve-via-host"))
4027 path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_HOST;
4029 else if (unformat (input, "resolve-via-attached"))
4031 path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_ATTACHED;
4033 else if (unformat (input, "ip4-lookup-in-table %d", &path->table_id))
4035 path->type = FIB_API_PATH_TYPE_LOCAL;
4036 path->sw_if_index = ~0;
4037 path->proto = FIB_API_PATH_NH_PROTO_IP4;
4039 else if (unformat (input, "ip6-lookup-in-table %d", &path->table_id))
4041 path->type = FIB_API_PATH_TYPE_LOCAL;
4042 path->sw_if_index = ~0;
4043 path->proto = FIB_API_PATH_NH_PROTO_IP6;
4045 else if (unformat (input, "sw_if_index %d", &path->sw_if_index))
4047 else if (unformat (input, "via-label %d", &path->nh.via_label))
4049 path->proto = FIB_API_PATH_NH_PROTO_MPLS;
4050 path->sw_if_index = ~0;
4052 else if (unformat (input, "l2-input-on %d", &path->sw_if_index))
4054 path->proto = FIB_API_PATH_NH_PROTO_ETHERNET;
4055 path->type = FIB_API_PATH_TYPE_INTERFACE_RX;
4057 else if (unformat (input, "local"))
4059 path->type = FIB_API_PATH_TYPE_LOCAL;
4061 else if (unformat (input, "out-labels"))
4063 while (unformat (input, "%d", &out_label))
4065 path->label_stack[path->n_labels].label = out_label;
4066 path->label_stack[path->n_labels].is_uniform = 0;
4067 path->label_stack[path->n_labels].ttl = 64;
4071 else if (unformat (input, "via"))
4073 /* new path, back up and return */
4074 unformat_put_input (input);
4075 unformat_put_input (input);
4076 unformat_put_input (input);
4077 unformat_put_input (input);
4086 path->proto = ntohl (path->proto);
4087 path->type = ntohl (path->type);
4088 path->flags = ntohl (path->flags);
4089 path->table_id = ntohl (path->table_id);
4090 path->sw_if_index = ntohl (path->sw_if_index);
4096 api_ip_route_add_del (vat_main_t * vam)
4098 unformat_input_t *i = vam->input;
4099 vl_api_ip_route_add_del_t *mp;
4102 u8 is_multipath = 0;
4105 vl_api_prefix_t pfx = { };
4106 vl_api_fib_path_t paths[8];
4110 u32 random_add_del = 0;
4111 u32 *random_vector = 0;
4112 u32 random_seed = 0xdeaddabe;
4114 /* Parse args required to build the message */
4115 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4117 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
4119 else if (unformat (i, "del"))
4121 else if (unformat (i, "add"))
4123 else if (unformat (i, "vrf %d", &vrf_id))
4125 else if (unformat (i, "count %d", &count))
4127 else if (unformat (i, "random"))
4129 else if (unformat (i, "multipath"))
4131 else if (unformat (i, "seed %d", &random_seed))
4135 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4138 if (8 == path_count)
4140 errmsg ("max 8 paths");
4146 clib_warning ("parse error '%U'", format_unformat_error, i);
4153 errmsg ("specify a path; via ...");
4156 if (prefix_set == 0)
4158 errmsg ("missing prefix");
4162 /* Generate a pile of unique, random routes */
4165 ip4_address_t *i = (ip4_address_t *) & paths[0].nh.address.ip4;
4166 u32 this_random_address;
4169 random_hash = hash_create (count, sizeof (uword));
4171 hash_set (random_hash, i->as_u32, 1);
4172 for (j = 0; j <= count; j++)
4176 this_random_address = random_u32 (&random_seed);
4177 this_random_address =
4178 clib_host_to_net_u32 (this_random_address);
4180 while (hash_get (random_hash, this_random_address));
4181 vec_add1 (random_vector, this_random_address);
4182 hash_set (random_hash, this_random_address, 1);
4184 hash_free (random_hash);
4185 set_ip4_address (&pfx.address, random_vector[0]);
4190 /* Turn on async mode */
4191 vam->async_mode = 1;
4192 vam->async_errors = 0;
4193 before = vat_time_now (vam);
4196 for (j = 0; j < count; j++)
4198 /* Construct the API message */
4199 M2 (IP_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4201 mp->is_add = is_add;
4202 mp->is_multipath = is_multipath;
4204 clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx));
4205 mp->route.table_id = ntohl (vrf_id);
4206 mp->route.n_paths = path_count;
4208 clib_memcpy (&mp->route.paths, &paths, sizeof (paths[0]) * path_count);
4211 set_ip4_address (&pfx.address, random_vector[j + 1]);
4213 increment_address (&pfx.address);
4216 /* If we receive SIGTERM, stop now... */
4221 /* When testing multiple add/del ops, use a control-ping to sync */
4224 vl_api_control_ping_t *mp_ping;
4228 /* Shut off async mode */
4229 vam->async_mode = 0;
4231 MPING (CONTROL_PING, mp_ping);
4234 timeout = vat_time_now (vam) + 1.0;
4235 while (vat_time_now (vam) < timeout)
4236 if (vam->result_ready == 1)
4241 if (vam->retval == -99)
4244 if (vam->async_errors > 0)
4246 errmsg ("%d asynchronous errors", vam->async_errors);
4249 vam->async_errors = 0;
4250 after = vat_time_now (vam);
4252 /* slim chance, but we might have eaten SIGTERM on the first iteration */
4256 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
4257 count, after - before, count / (after - before));
4263 /* Wait for a reply... */
4268 /* Return the good/bad news */
4269 return (vam->retval);
4273 api_ip_mroute_add_del (vat_main_t * vam)
4275 unformat_input_t *i = vam->input;
4276 u8 path_set = 0, prefix_set = 0, is_add = 1;
4277 vl_api_ip_mroute_add_del_t *mp;
4278 mfib_entry_flags_t eflags = 0;
4279 vl_api_mfib_path_t path;
4280 vl_api_mprefix_t pfx = { };
4284 /* Parse args required to build the message */
4285 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4287 if (unformat (i, "%U", unformat_vl_api_mprefix, &pfx))
4290 pfx.grp_address_length = htons (pfx.grp_address_length);
4292 else if (unformat (i, "del"))
4294 else if (unformat (i, "add"))
4296 else if (unformat (i, "vrf %d", &vrf_id))
4298 else if (unformat (i, "%U", unformat_mfib_itf_flags, &path.itf_flags))
4299 path.itf_flags = htonl (path.itf_flags);
4300 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
4302 else if (unformat (i, "via %U", unformat_fib_path, vam, &path.path))
4306 clib_warning ("parse error '%U'", format_unformat_error, i);
4311 if (prefix_set == 0)
4313 errmsg ("missing addresses\n");
4318 errmsg ("missing path\n");
4322 /* Construct the API message */
4323 M (IP_MROUTE_ADD_DEL, mp);
4325 mp->is_add = is_add;
4326 mp->is_multipath = 1;
4328 clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx));
4329 mp->route.table_id = htonl (vrf_id);
4330 mp->route.n_paths = 1;
4331 mp->route.entry_flags = htonl (eflags);
4333 clib_memcpy (&mp->route.paths, &path, sizeof (path));
4337 /* Wait for a reply... */
4343 api_mpls_table_add_del (vat_main_t * vam)
4345 unformat_input_t *i = vam->input;
4346 vl_api_mpls_table_add_del_t *mp;
4351 /* Parse args required to build the message */
4352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4354 if (unformat (i, "table %d", &table_id))
4356 else if (unformat (i, "del"))
4358 else if (unformat (i, "add"))
4362 clib_warning ("parse error '%U'", format_unformat_error, i);
4369 errmsg ("missing table-ID");
4373 /* Construct the API message */
4374 M (MPLS_TABLE_ADD_DEL, mp);
4376 mp->mt_table.mt_table_id = ntohl (table_id);
4377 mp->mt_is_add = is_add;
4382 /* Wait for a reply... */
4389 api_mpls_route_add_del (vat_main_t * vam)
4391 u8 is_add = 1, path_count = 0, is_multipath = 0, is_eos = 0;
4392 mpls_label_t local_label = MPLS_LABEL_INVALID;
4393 unformat_input_t *i = vam->input;
4394 vl_api_mpls_route_add_del_t *mp;
4395 vl_api_fib_path_t paths[8];
4399 /* Parse args required to build the message */
4400 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4402 if (unformat (i, "%d", &local_label))
4404 else if (unformat (i, "eos"))
4406 else if (unformat (i, "non-eos"))
4408 else if (unformat (i, "del"))
4410 else if (unformat (i, "add"))
4412 else if (unformat (i, "multipath"))
4414 else if (unformat (i, "count %d", &count))
4418 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4421 if (8 == path_count)
4423 errmsg ("max 8 paths");
4429 clib_warning ("parse error '%U'", format_unformat_error, i);
4436 errmsg ("specify a path; via ...");
4440 if (MPLS_LABEL_INVALID == local_label)
4442 errmsg ("missing label");
4448 /* Turn on async mode */
4449 vam->async_mode = 1;
4450 vam->async_errors = 0;
4451 before = vat_time_now (vam);
4454 for (j = 0; j < count; j++)
4456 /* Construct the API message */
4457 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4459 mp->mr_is_add = is_add;
4460 mp->mr_is_multipath = is_multipath;
4462 mp->mr_route.mr_label = local_label;
4463 mp->mr_route.mr_eos = is_eos;
4464 mp->mr_route.mr_table_id = 0;
4465 mp->mr_route.mr_n_paths = path_count;
4467 clib_memcpy (&mp->mr_route.mr_paths, paths,
4468 sizeof (paths[0]) * path_count);
4474 /* If we receive SIGTERM, stop now... */
4479 /* When testing multiple add/del ops, use a control-ping to sync */
4482 vl_api_control_ping_t *mp_ping;
4486 /* Shut off async mode */
4487 vam->async_mode = 0;
4489 MPING (CONTROL_PING, mp_ping);
4492 timeout = vat_time_now (vam) + 1.0;
4493 while (vat_time_now (vam) < timeout)
4494 if (vam->result_ready == 1)
4499 if (vam->retval == -99)
4502 if (vam->async_errors > 0)
4504 errmsg ("%d asynchronous errors", vam->async_errors);
4507 vam->async_errors = 0;
4508 after = vat_time_now (vam);
4510 /* slim chance, but we might have eaten SIGTERM on the first iteration */
4514 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
4515 count, after - before, count / (after - before));
4521 /* Wait for a reply... */
4526 /* Return the good/bad news */
4527 return (vam->retval);
4532 api_mpls_ip_bind_unbind (vat_main_t * vam)
4534 unformat_input_t *i = vam->input;
4535 vl_api_mpls_ip_bind_unbind_t *mp;
4536 u32 ip_table_id = 0;
4538 vl_api_prefix_t pfx;
4540 mpls_label_t local_label = MPLS_LABEL_INVALID;
4543 /* Parse args required to build the message */
4544 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4546 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
4548 else if (unformat (i, "%d", &local_label))
4550 else if (unformat (i, "table-id %d", &ip_table_id))
4552 else if (unformat (i, "unbind"))
4554 else if (unformat (i, "bind"))
4558 clib_warning ("parse error '%U'", format_unformat_error, i);
4565 errmsg ("IP prefix not set");
4569 if (MPLS_LABEL_INVALID == local_label)
4571 errmsg ("missing label");
4575 /* Construct the API message */
4576 M (MPLS_IP_BIND_UNBIND, mp);
4578 mp->mb_is_bind = is_bind;
4579 mp->mb_ip_table_id = ntohl (ip_table_id);
4580 mp->mb_mpls_table_id = 0;
4581 mp->mb_label = ntohl (local_label);
4582 clib_memcpy (&mp->mb_prefix, &pfx, sizeof (pfx));
4587 /* Wait for a reply... */
4594 api_mpls_tunnel_add_del (vat_main_t * vam)
4596 unformat_input_t *i = vam->input;
4597 vl_api_mpls_tunnel_add_del_t *mp;
4599 vl_api_fib_path_t paths[8];
4600 u32 sw_if_index = ~0;
4606 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4608 if (unformat (i, "add"))
4612 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
4614 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
4616 else if (unformat (i, "l2-only"))
4620 (i, "via %U", unformat_fib_path, vam, &paths[path_count]))
4623 if (8 == path_count)
4625 errmsg ("max 8 paths");
4631 clib_warning ("parse error '%U'", format_unformat_error, i);
4636 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count);
4638 mp->mt_is_add = is_add;
4639 mp->mt_tunnel.mt_sw_if_index = ntohl (sw_if_index);
4640 mp->mt_tunnel.mt_l2_only = l2_only;
4641 mp->mt_tunnel.mt_is_multicast = 0;
4642 mp->mt_tunnel.mt_n_paths = path_count;
4644 clib_memcpy (&mp->mt_tunnel.mt_paths, &paths,
4645 sizeof (paths[0]) * path_count);
4653 api_sw_interface_set_unnumbered (vat_main_t * vam)
4655 unformat_input_t *i = vam->input;
4656 vl_api_sw_interface_set_unnumbered_t *mp;
4658 u32 unnum_sw_index = ~0;
4660 u8 sw_if_index_set = 0;
4663 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4665 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4666 sw_if_index_set = 1;
4667 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4668 sw_if_index_set = 1;
4669 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
4671 else if (unformat (i, "del"))
4675 clib_warning ("parse error '%U'", format_unformat_error, i);
4680 if (sw_if_index_set == 0)
4682 errmsg ("missing interface name or sw_if_index");
4686 M (SW_INTERFACE_SET_UNNUMBERED, mp);
4688 mp->sw_if_index = ntohl (sw_if_index);
4689 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
4690 mp->is_add = is_add;
4699 api_create_vlan_subif (vat_main_t * vam)
4701 unformat_input_t *i = vam->input;
4702 vl_api_create_vlan_subif_t *mp;
4704 u8 sw_if_index_set = 0;
4709 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4711 if (unformat (i, "sw_if_index %d", &sw_if_index))
4712 sw_if_index_set = 1;
4714 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4715 sw_if_index_set = 1;
4716 else if (unformat (i, "vlan %d", &vlan_id))
4720 clib_warning ("parse error '%U'", format_unformat_error, i);
4725 if (sw_if_index_set == 0)
4727 errmsg ("missing interface name or sw_if_index");
4731 if (vlan_id_set == 0)
4733 errmsg ("missing vlan_id");
4736 M (CREATE_VLAN_SUBIF, mp);
4738 mp->sw_if_index = ntohl (sw_if_index);
4739 mp->vlan_id = ntohl (vlan_id);
4746 #define foreach_create_subif_bit \
4753 _(outer_vlan_id_any) \
4754 _(inner_vlan_id_any)
4756 #define foreach_create_subif_flag \
4761 _(4, "exact_match") \
4762 _(5, "default_sub") \
4763 _(6, "outer_vlan_id_any") \
4764 _(7, "inner_vlan_id_any")
4767 api_create_subif (vat_main_t * vam)
4769 unformat_input_t *i = vam->input;
4770 vl_api_create_subif_t *mp;
4772 u8 sw_if_index_set = 0;
4775 u32 __attribute__ ((unused)) no_tags = 0;
4776 u32 __attribute__ ((unused)) one_tag = 0;
4777 u32 __attribute__ ((unused)) two_tags = 0;
4778 u32 __attribute__ ((unused)) dot1ad = 0;
4779 u32 __attribute__ ((unused)) exact_match = 0;
4780 u32 __attribute__ ((unused)) default_sub = 0;
4781 u32 __attribute__ ((unused)) outer_vlan_id_any = 0;
4782 u32 __attribute__ ((unused)) inner_vlan_id_any = 0;
4784 u16 outer_vlan_id = 0;
4785 u16 inner_vlan_id = 0;
4788 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4790 if (unformat (i, "sw_if_index %d", &sw_if_index))
4791 sw_if_index_set = 1;
4793 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
4794 sw_if_index_set = 1;
4795 else if (unformat (i, "sub_id %d", &sub_id))
4797 else if (unformat (i, "outer_vlan_id %d", &tmp))
4798 outer_vlan_id = tmp;
4799 else if (unformat (i, "inner_vlan_id %d", &tmp))
4800 inner_vlan_id = tmp;
4802 #define _(a) else if (unformat (i, #a)) a = 1 ;
4803 foreach_create_subif_bit
4807 clib_warning ("parse error '%U'", format_unformat_error, i);
4812 if (sw_if_index_set == 0)
4814 errmsg ("missing interface name or sw_if_index");
4818 if (sub_id_set == 0)
4820 errmsg ("missing sub_id");
4823 M (CREATE_SUBIF, mp);
4825 mp->sw_if_index = ntohl (sw_if_index);
4826 mp->sub_id = ntohl (sub_id);
4828 #define _(a,b) mp->sub_if_flags |= (1 << a);
4829 foreach_create_subif_flag;
4832 mp->outer_vlan_id = ntohs (outer_vlan_id);
4833 mp->inner_vlan_id = ntohs (inner_vlan_id);
4841 api_ip_table_replace_begin (vat_main_t * vam)
4843 unformat_input_t *i = vam->input;
4844 vl_api_ip_table_replace_begin_t *mp;
4849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4851 if (unformat (i, "table %d", &table_id))
4853 else if (unformat (i, "ipv6"))
4857 clib_warning ("parse error '%U'", format_unformat_error, i);
4862 M (IP_TABLE_REPLACE_BEGIN, mp);
4864 mp->table.table_id = ntohl (table_id);
4865 mp->table.is_ip6 = is_ipv6;
4873 api_ip_table_flush (vat_main_t * vam)
4875 unformat_input_t *i = vam->input;
4876 vl_api_ip_table_flush_t *mp;
4881 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4883 if (unformat (i, "table %d", &table_id))
4885 else if (unformat (i, "ipv6"))
4889 clib_warning ("parse error '%U'", format_unformat_error, i);
4894 M (IP_TABLE_FLUSH, mp);
4896 mp->table.table_id = ntohl (table_id);
4897 mp->table.is_ip6 = is_ipv6;
4905 api_ip_table_replace_end (vat_main_t * vam)
4907 unformat_input_t *i = vam->input;
4908 vl_api_ip_table_replace_end_t *mp;
4913 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4915 if (unformat (i, "table %d", &table_id))
4917 else if (unformat (i, "ipv6"))
4921 clib_warning ("parse error '%U'", format_unformat_error, i);
4926 M (IP_TABLE_REPLACE_END, mp);
4928 mp->table.table_id = ntohl (table_id);
4929 mp->table.is_ip6 = is_ipv6;
4937 api_set_ip_flow_hash (vat_main_t * vam)
4939 unformat_input_t *i = vam->input;
4940 vl_api_set_ip_flow_hash_t *mp;
4952 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4954 if (unformat (i, "vrf %d", &vrf_id))
4956 else if (unformat (i, "ipv6"))
4958 else if (unformat (i, "src"))
4960 else if (unformat (i, "dst"))
4962 else if (unformat (i, "sport"))
4964 else if (unformat (i, "dport"))
4966 else if (unformat (i, "proto"))
4968 else if (unformat (i, "reverse"))
4973 clib_warning ("parse error '%U'", format_unformat_error, i);
4978 if (vrf_id_set == 0)
4980 errmsg ("missing vrf id");
4984 M (SET_IP_FLOW_HASH, mp);
4990 mp->reverse = reverse;
4991 mp->vrf_id = ntohl (vrf_id);
4992 mp->is_ipv6 = is_ipv6;
5000 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
5002 unformat_input_t *i = vam->input;
5003 vl_api_sw_interface_ip6_enable_disable_t *mp;
5005 u8 sw_if_index_set = 0;
5009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5011 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5012 sw_if_index_set = 1;
5013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5014 sw_if_index_set = 1;
5015 else if (unformat (i, "enable"))
5017 else if (unformat (i, "disable"))
5021 clib_warning ("parse error '%U'", format_unformat_error, i);
5026 if (sw_if_index_set == 0)
5028 errmsg ("missing interface name or sw_if_index");
5032 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
5034 mp->sw_if_index = ntohl (sw_if_index);
5035 mp->enable = enable;
5044 api_l2_patch_add_del (vat_main_t * vam)
5046 unformat_input_t *i = vam->input;
5047 vl_api_l2_patch_add_del_t *mp;
5049 u8 rx_sw_if_index_set = 0;
5051 u8 tx_sw_if_index_set = 0;
5055 /* Parse args required to build the message */
5056 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5058 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5059 rx_sw_if_index_set = 1;
5060 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5061 tx_sw_if_index_set = 1;
5062 else if (unformat (i, "rx"))
5064 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5066 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
5068 rx_sw_if_index_set = 1;
5073 else if (unformat (i, "tx"))
5075 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5077 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
5079 tx_sw_if_index_set = 1;
5084 else if (unformat (i, "del"))
5090 if (rx_sw_if_index_set == 0)
5092 errmsg ("missing rx interface name or rx_sw_if_index");
5096 if (tx_sw_if_index_set == 0)
5098 errmsg ("missing tx interface name or tx_sw_if_index");
5102 M (L2_PATCH_ADD_DEL, mp);
5104 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5105 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5106 mp->is_add = is_add;
5114 u8 localsid_addr[16];
5123 api_ioam_enable (vat_main_t * vam)
5125 unformat_input_t *input = vam->input;
5126 vl_api_ioam_enable_t *mp;
5128 int has_trace_option = 0;
5129 int has_pot_option = 0;
5130 int has_seqno_option = 0;
5131 int has_analyse_option = 0;
5134 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5136 if (unformat (input, "trace"))
5137 has_trace_option = 1;
5138 else if (unformat (input, "pot"))
5140 else if (unformat (input, "seqno"))
5141 has_seqno_option = 1;
5142 else if (unformat (input, "analyse"))
5143 has_analyse_option = 1;
5147 M (IOAM_ENABLE, mp);
5148 mp->id = htons (id);
5149 mp->seqno = has_seqno_option;
5150 mp->analyse = has_analyse_option;
5151 mp->pot_enable = has_pot_option;
5152 mp->trace_enable = has_trace_option;
5161 api_ioam_disable (vat_main_t * vam)
5163 vl_api_ioam_disable_t *mp;
5166 M (IOAM_DISABLE, mp);
5172 #define foreach_tcp_proto_field \
5176 #define foreach_udp_proto_field \
5180 #define foreach_ip4_proto_field \
5192 u16 src_port, dst_port;
5195 #if VPP_API_TEST_BUILTIN == 0
5197 unformat_tcp_mask (unformat_input_t * input, va_list * args)
5199 u8 **maskp = va_arg (*args, u8 **);
5201 u8 found_something = 0;
5204 #define _(a) u8 a=0;
5205 foreach_tcp_proto_field;
5208 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5211 #define _(a) else if (unformat (input, #a)) a=1;
5212 foreach_tcp_proto_field
5218 #define _(a) found_something += a;
5219 foreach_tcp_proto_field;
5222 if (found_something == 0)
5225 vec_validate (mask, sizeof (*tcp) - 1);
5227 tcp = (tcp_header_t *) mask;
5229 #define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
5230 foreach_tcp_proto_field;
5238 unformat_udp_mask (unformat_input_t * input, va_list * args)
5240 u8 **maskp = va_arg (*args, u8 **);
5242 u8 found_something = 0;
5245 #define _(a) u8 a=0;
5246 foreach_udp_proto_field;
5249 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5252 #define _(a) else if (unformat (input, #a)) a=1;
5253 foreach_udp_proto_field
5259 #define _(a) found_something += a;
5260 foreach_udp_proto_field;
5263 if (found_something == 0)
5266 vec_validate (mask, sizeof (*udp) - 1);
5268 udp = (udp_header_t *) mask;
5270 #define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
5271 foreach_udp_proto_field;
5279 unformat_l4_mask (unformat_input_t * input, va_list * args)
5281 u8 **maskp = va_arg (*args, u8 **);
5282 u16 src_port = 0, dst_port = 0;
5283 tcpudp_header_t *tcpudp;
5285 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5287 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
5289 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
5291 else if (unformat (input, "src_port"))
5293 else if (unformat (input, "dst_port"))
5299 if (!src_port && !dst_port)
5303 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
5305 tcpudp = (tcpudp_header_t *) mask;
5306 tcpudp->src_port = src_port;
5307 tcpudp->dst_port = dst_port;
5315 unformat_ip4_mask (unformat_input_t * input, va_list * args)
5317 u8 **maskp = va_arg (*args, u8 **);
5319 u8 found_something = 0;
5322 #define _(a) u8 a=0;
5323 foreach_ip4_proto_field;
5329 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5331 if (unformat (input, "version"))
5333 else if (unformat (input, "hdr_length"))
5335 else if (unformat (input, "src"))
5337 else if (unformat (input, "dst"))
5339 else if (unformat (input, "proto"))
5342 #define _(a) else if (unformat (input, #a)) a=1;
5343 foreach_ip4_proto_field
5349 #define _(a) found_something += a;
5350 foreach_ip4_proto_field;
5353 if (found_something == 0)
5356 vec_validate (mask, sizeof (*ip) - 1);
5358 ip = (ip4_header_t *) mask;
5360 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
5361 foreach_ip4_proto_field;
5364 ip->ip_version_and_header_length = 0;
5367 ip->ip_version_and_header_length |= 0xF0;
5370 ip->ip_version_and_header_length |= 0x0F;
5376 #define foreach_ip6_proto_field \
5384 unformat_ip6_mask (unformat_input_t * input, va_list * args)
5386 u8 **maskp = va_arg (*args, u8 **);
5388 u8 found_something = 0;
5390 u32 ip_version_traffic_class_and_flow_label;
5392 #define _(a) u8 a=0;
5393 foreach_ip6_proto_field;
5396 u8 traffic_class = 0;
5399 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5401 if (unformat (input, "version"))
5403 else if (unformat (input, "traffic-class"))
5405 else if (unformat (input, "flow-label"))
5407 else if (unformat (input, "src"))
5409 else if (unformat (input, "dst"))
5411 else if (unformat (input, "proto"))
5414 #define _(a) else if (unformat (input, #a)) a=1;
5415 foreach_ip6_proto_field
5421 #define _(a) found_something += a;
5422 foreach_ip6_proto_field;
5425 if (found_something == 0)
5428 vec_validate (mask, sizeof (*ip) - 1);
5430 ip = (ip6_header_t *) mask;
5432 #define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
5433 foreach_ip6_proto_field;
5436 ip_version_traffic_class_and_flow_label = 0;
5439 ip_version_traffic_class_and_flow_label |= 0xF0000000;
5442 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
5445 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
5447 ip->ip_version_traffic_class_and_flow_label =
5448 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
5455 unformat_l3_mask (unformat_input_t * input, va_list * args)
5457 u8 **maskp = va_arg (*args, u8 **);
5459 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5461 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
5463 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
5472 unformat_l2_mask (unformat_input_t * input, va_list * args)
5474 u8 **maskp = va_arg (*args, u8 **);
5489 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5491 if (unformat (input, "src"))
5493 else if (unformat (input, "dst"))
5495 else if (unformat (input, "proto"))
5497 else if (unformat (input, "tag1"))
5499 else if (unformat (input, "tag2"))
5501 else if (unformat (input, "ignore-tag1"))
5503 else if (unformat (input, "ignore-tag2"))
5505 else if (unformat (input, "cos1"))
5507 else if (unformat (input, "cos2"))
5509 else if (unformat (input, "dot1q"))
5511 else if (unformat (input, "dot1ad"))
5516 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
5517 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
5520 if (tag1 || ignore_tag1 || cos1 || dot1q)
5522 if (tag2 || ignore_tag2 || cos2 || dot1ad)
5525 vec_validate (mask, len - 1);
5528 clib_memset (mask, 0xff, 6);
5531 clib_memset (mask + 6, 0xff, 6);
5535 /* inner vlan tag */
5544 mask[21] = mask[20] = 0xff;
5565 mask[16] = mask[17] = 0xff;
5575 mask[12] = mask[13] = 0xff;
5582 unformat_classify_mask (unformat_input_t * input, va_list * args)
5584 u8 **maskp = va_arg (*args, u8 **);
5585 u32 *skipp = va_arg (*args, u32 *);
5586 u32 *matchp = va_arg (*args, u32 *);
5594 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5596 if (unformat (input, "hex %U", unformat_hex_string, &mask))
5598 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
5600 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
5602 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
5616 if (mask || l2 || l3 || l4)
5620 /* "With a free Ethernet header in every package" */
5622 vec_validate (l2, 13);
5626 vec_append (mask, l3);
5631 vec_append (mask, l4);
5636 /* Scan forward looking for the first significant mask octet */
5637 for (i = 0; i < vec_len (mask); i++)
5641 /* compute (skip, match) params */
5642 *skipp = i / sizeof (u32x4);
5643 vec_delete (mask, *skipp * sizeof (u32x4), 0);
5645 /* Pad mask to an even multiple of the vector size */
5646 while (vec_len (mask) % sizeof (u32x4))
5649 match = vec_len (mask) / sizeof (u32x4);
5651 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
5653 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
5654 if (*tmp || *(tmp + 1))
5659 clib_warning ("BUG: match 0");
5661 _vec_len (mask) = match * sizeof (u32x4);
5671 #endif /* VPP_API_TEST_BUILTIN */
5673 #define foreach_l2_next \
5675 _(ethernet, ETHERNET_INPUT) \
5680 unformat_l2_next_index (unformat_input_t * input, va_list * args)
5682 u32 *miss_next_indexp = va_arg (*args, u32 *);
5687 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
5691 if (unformat (input, "%d", &tmp))
5700 *miss_next_indexp = next_index;
5704 #define foreach_ip_next \
5710 api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
5712 u32 *miss_next_indexp = va_arg (*args, u32 *);
5717 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
5721 if (unformat (input, "%d", &tmp))
5730 *miss_next_indexp = next_index;
5734 #define foreach_acl_next \
5738 api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
5740 u32 *miss_next_indexp = va_arg (*args, u32 *);
5745 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
5749 if (unformat (input, "permit"))
5754 else if (unformat (input, "%d", &tmp))
5763 *miss_next_indexp = next_index;
5768 unformat_policer_precolor (unformat_input_t * input, va_list * args)
5770 u32 *r = va_arg (*args, u32 *);
5772 if (unformat (input, "conform-color"))
5773 *r = POLICE_CONFORM;
5774 else if (unformat (input, "exceed-color"))
5782 #if VPP_API_TEST_BUILTIN == 0
5784 unformat_l4_match (unformat_input_t * input, va_list * args)
5786 u8 **matchp = va_arg (*args, u8 **);
5788 u8 *proto_header = 0;
5794 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5796 if (unformat (input, "src_port %d", &src_port))
5798 else if (unformat (input, "dst_port %d", &dst_port))
5804 h.src_port = clib_host_to_net_u16 (src_port);
5805 h.dst_port = clib_host_to_net_u16 (dst_port);
5806 vec_validate (proto_header, sizeof (h) - 1);
5807 memcpy (proto_header, &h, sizeof (h));
5809 *matchp = proto_header;
5815 unformat_ip4_match (unformat_input_t * input, va_list * args)
5817 u8 **matchp = va_arg (*args, u8 **);
5824 int src = 0, dst = 0;
5825 ip4_address_t src_val, dst_val;
5832 int fragment_id = 0;
5833 u32 fragment_id_val;
5839 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5841 if (unformat (input, "version %d", &version_val))
5843 else if (unformat (input, "hdr_length %d", &hdr_length_val))
5845 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
5847 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
5849 else if (unformat (input, "proto %d", &proto_val))
5851 else if (unformat (input, "tos %d", &tos_val))
5853 else if (unformat (input, "length %d", &length_val))
5855 else if (unformat (input, "fragment_id %d", &fragment_id_val))
5857 else if (unformat (input, "ttl %d", &ttl_val))
5859 else if (unformat (input, "checksum %d", &checksum_val))
5865 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
5866 + ttl + checksum == 0)
5870 * Aligned because we use the real comparison functions
5872 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
5874 ip = (ip4_header_t *) match;
5876 /* These are realistically matched in practice */
5878 ip->src_address.as_u32 = src_val.as_u32;
5881 ip->dst_address.as_u32 = dst_val.as_u32;
5884 ip->protocol = proto_val;
5887 /* These are not, but they're included for completeness */
5889 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
5892 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
5898 ip->length = clib_host_to_net_u16 (length_val);
5904 ip->checksum = clib_host_to_net_u16 (checksum_val);
5911 unformat_ip6_match (unformat_input_t * input, va_list * args)
5913 u8 **matchp = va_arg (*args, u8 **);
5918 u8 traffic_class = 0;
5919 u32 traffic_class_val = 0;
5922 int src = 0, dst = 0;
5923 ip6_address_t src_val, dst_val;
5926 int payload_length = 0;
5927 u32 payload_length_val;
5930 u32 ip_version_traffic_class_and_flow_label;
5932 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5934 if (unformat (input, "version %d", &version_val))
5936 else if (unformat (input, "traffic_class %d", &traffic_class_val))
5938 else if (unformat (input, "flow_label %d", &flow_label_val))
5940 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
5942 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
5944 else if (unformat (input, "proto %d", &proto_val))
5946 else if (unformat (input, "payload_length %d", &payload_length_val))
5948 else if (unformat (input, "hop_limit %d", &hop_limit_val))
5954 if (version + traffic_class + flow_label + src + dst + proto +
5955 payload_length + hop_limit == 0)
5959 * Aligned because we use the real comparison functions
5961 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
5963 ip = (ip6_header_t *) match;
5966 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
5969 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
5972 ip->protocol = proto_val;
5974 ip_version_traffic_class_and_flow_label = 0;
5977 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
5980 ip_version_traffic_class_and_flow_label |=
5981 (traffic_class_val & 0xFF) << 20;
5984 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
5986 ip->ip_version_traffic_class_and_flow_label =
5987 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
5990 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
5993 ip->hop_limit = hop_limit_val;
6000 unformat_l3_match (unformat_input_t * input, va_list * args)
6002 u8 **matchp = va_arg (*args, u8 **);
6004 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6006 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
6008 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
6017 unformat_vlan_tag (unformat_input_t * input, va_list * args)
6019 u8 *tagp = va_arg (*args, u8 *);
6022 if (unformat (input, "%d", &tag))
6024 tagp[0] = (tag >> 8) & 0x0F;
6025 tagp[1] = tag & 0xFF;
6033 unformat_l2_match (unformat_input_t * input, va_list * args)
6035 u8 **matchp = va_arg (*args, u8 **);
6055 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6057 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
6060 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
6062 else if (unformat (input, "proto %U",
6063 unformat_ethernet_type_host_byte_order, &proto_val))
6065 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
6067 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
6069 else if (unformat (input, "ignore-tag1"))
6071 else if (unformat (input, "ignore-tag2"))
6073 else if (unformat (input, "cos1 %d", &cos1_val))
6075 else if (unformat (input, "cos2 %d", &cos2_val))
6080 if ((src + dst + proto + tag1 + tag2 +
6081 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
6084 if (tag1 || ignore_tag1 || cos1)
6086 if (tag2 || ignore_tag2 || cos2)
6089 vec_validate_aligned (match, len - 1, sizeof (u32x4));
6092 clib_memcpy (match, dst_val, 6);
6095 clib_memcpy (match + 6, src_val, 6);
6099 /* inner vlan tag */
6100 match[19] = tag2_val[1];
6101 match[18] = tag2_val[0];
6103 match[18] |= (cos2_val & 0x7) << 5;
6106 match[21] = proto_val & 0xff;
6107 match[20] = proto_val >> 8;
6111 match[15] = tag1_val[1];
6112 match[14] = tag1_val[0];
6115 match[14] |= (cos1_val & 0x7) << 5;
6121 match[15] = tag1_val[1];
6122 match[14] = tag1_val[0];
6125 match[17] = proto_val & 0xff;
6126 match[16] = proto_val >> 8;
6129 match[14] |= (cos1_val & 0x7) << 5;
6135 match[18] |= (cos2_val & 0x7) << 5;
6137 match[14] |= (cos1_val & 0x7) << 5;
6140 match[13] = proto_val & 0xff;
6141 match[12] = proto_val >> 8;
6149 unformat_qos_source (unformat_input_t * input, va_list * args)
6151 int *qs = va_arg (*args, int *);
6153 if (unformat (input, "ip"))
6154 *qs = QOS_SOURCE_IP;
6155 else if (unformat (input, "mpls"))
6156 *qs = QOS_SOURCE_MPLS;
6157 else if (unformat (input, "ext"))
6158 *qs = QOS_SOURCE_EXT;
6159 else if (unformat (input, "vlan"))
6160 *qs = QOS_SOURCE_VLAN;
6169 api_unformat_classify_match (unformat_input_t * input, va_list * args)
6171 u8 **matchp = va_arg (*args, u8 **);
6172 u32 skip_n_vectors = va_arg (*args, u32);
6173 u32 match_n_vectors = va_arg (*args, u32);
6180 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6182 if (unformat (input, "hex %U", unformat_hex_string, &match))
6184 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
6186 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
6188 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
6202 if (match || l2 || l3 || l4)
6206 /* "Win a free Ethernet header in every packet" */
6208 vec_validate_aligned (l2, 13, sizeof (u32x4));
6212 vec_append_aligned (match, l3, sizeof (u32x4));
6217 vec_append_aligned (match, l4, sizeof (u32x4));
6222 /* Make sure the vector is big enough even if key is all 0's */
6223 vec_validate_aligned
6224 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
6227 /* Set size, include skipped vectors */
6228 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
6239 api_get_node_index (vat_main_t * vam)
6241 unformat_input_t *i = vam->input;
6242 vl_api_get_node_index_t *mp;
6246 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6248 if (unformat (i, "node %s", &name))
6255 errmsg ("node name required");
6258 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
6260 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6264 M (GET_NODE_INDEX, mp);
6265 clib_memcpy (mp->node_name, name, vec_len (name));
6274 api_get_next_index (vat_main_t * vam)
6276 unformat_input_t *i = vam->input;
6277 vl_api_get_next_index_t *mp;
6278 u8 *node_name = 0, *next_node_name = 0;
6281 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6283 if (unformat (i, "node-name %s", &node_name))
6285 else if (unformat (i, "next-node-name %s", &next_node_name))
6291 errmsg ("node name required");
6294 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
6296 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6300 if (next_node_name == 0)
6302 errmsg ("next node name required");
6305 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
6307 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
6311 M (GET_NEXT_INDEX, mp);
6312 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
6313 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
6314 vec_free (node_name);
6315 vec_free (next_node_name);
6323 api_add_node_next (vat_main_t * vam)
6325 unformat_input_t *i = vam->input;
6326 vl_api_add_node_next_t *mp;
6331 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6333 if (unformat (i, "node %s", &name))
6335 else if (unformat (i, "next %s", &next))
6342 errmsg ("node name required");
6345 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
6347 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
6352 errmsg ("next node required");
6355 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
6357 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
6361 M (ADD_NODE_NEXT, mp);
6362 clib_memcpy (mp->node_name, name, vec_len (name));
6363 clib_memcpy (mp->next_name, next, vec_len (next));
6372 static void vl_api_sw_interface_virtio_pci_details_t_handler
6373 (vl_api_sw_interface_virtio_pci_details_t * mp)
6375 vat_main_t *vam = &vat_main;
6390 addr.domain = ntohs (mp->pci_addr.domain);
6391 addr.bus = mp->pci_addr.bus;
6392 addr.slot = mp->pci_addr.slot;
6393 addr.function = mp->pci_addr.function;
6395 u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus,
6396 addr.slot, addr.function);
6399 "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx",
6400 pci_addr, ntohl (mp->sw_if_index),
6401 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
6402 format_ethernet_address, mp->mac_addr,
6403 clib_net_to_host_u64 (mp->features));
6404 vec_free (pci_addr);
6407 static void vl_api_sw_interface_virtio_pci_details_t_handler_json
6408 (vl_api_sw_interface_virtio_pci_details_t * mp)
6410 vat_main_t *vam = &vat_main;
6411 vat_json_node_t *node = NULL;
6412 vlib_pci_addr_t pci_addr;
6414 if (VAT_JSON_ARRAY != vam->json_tree.type)
6416 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6417 vat_json_init_array (&vam->json_tree);
6419 node = vat_json_array_add (&vam->json_tree);
6421 pci_addr.domain = ntohs (mp->pci_addr.domain);
6422 pci_addr.bus = mp->pci_addr.bus;
6423 pci_addr.slot = mp->pci_addr.slot;
6424 pci_addr.function = mp->pci_addr.function;
6426 vat_json_init_object (node);
6427 vat_json_object_add_uint (node, "pci-addr", pci_addr.as_u32);
6428 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6429 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
6430 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
6431 vat_json_object_add_uint (node, "features",
6432 clib_net_to_host_u64 (mp->features));
6433 vat_json_object_add_string_copy (node, "mac_addr",
6434 format (0, "%U", format_ethernet_address,
6439 api_sw_interface_virtio_pci_dump (vat_main_t * vam)
6441 vl_api_sw_interface_virtio_pci_dump_t *mp;
6442 vl_api_control_ping_t *mp_ping;
6446 "\n%-12s %-12s %-12s %-12s %-17s %-08s",
6447 "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz",
6448 "mac_addr", "features");
6450 /* Get list of tap interfaces */
6451 M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp);
6454 /* Use a control ping for synchronization */
6455 MPING (CONTROL_PING, mp_ping);
6463 api_l2_fib_clear_table (vat_main_t * vam)
6465 // unformat_input_t * i = vam->input;
6466 vl_api_l2_fib_clear_table_t *mp;
6469 M (L2_FIB_CLEAR_TABLE, mp);
6477 api_l2_interface_efp_filter (vat_main_t * vam)
6479 unformat_input_t *i = vam->input;
6480 vl_api_l2_interface_efp_filter_t *mp;
6483 u8 sw_if_index_set = 0;
6486 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6488 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6489 sw_if_index_set = 1;
6490 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6491 sw_if_index_set = 1;
6492 else if (unformat (i, "enable"))
6494 else if (unformat (i, "disable"))
6498 clib_warning ("parse error '%U'", format_unformat_error, i);
6503 if (sw_if_index_set == 0)
6505 errmsg ("missing sw_if_index");
6509 M (L2_INTERFACE_EFP_FILTER, mp);
6511 mp->sw_if_index = ntohl (sw_if_index);
6512 mp->enable_disable = enable;
6519 #define foreach_vtr_op \
6520 _("disable", L2_VTR_DISABLED) \
6521 _("push-1", L2_VTR_PUSH_1) \
6522 _("push-2", L2_VTR_PUSH_2) \
6523 _("pop-1", L2_VTR_POP_1) \
6524 _("pop-2", L2_VTR_POP_2) \
6525 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
6526 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
6527 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
6528 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
6531 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
6533 unformat_input_t *i = vam->input;
6534 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
6536 u8 sw_if_index_set = 0;
6544 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6546 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6547 sw_if_index_set = 1;
6548 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6549 sw_if_index_set = 1;
6550 else if (unformat (i, "vtr_op %d", &vtr_op))
6552 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
6555 else if (unformat (i, "push_dot1q %d", &push_dot1q))
6557 else if (unformat (i, "tag1 %d", &tag1))
6559 else if (unformat (i, "tag2 %d", &tag2))
6563 clib_warning ("parse error '%U'", format_unformat_error, i);
6568 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
6570 errmsg ("missing vtr operation or sw_if_index");
6574 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
6575 mp->sw_if_index = ntohl (sw_if_index);
6576 mp->vtr_op = ntohl (vtr_op);
6577 mp->push_dot1q = ntohl (push_dot1q);
6578 mp->tag1 = ntohl (tag1);
6579 mp->tag2 = ntohl (tag2);
6587 api_show_version (vat_main_t *vam)
6589 vl_api_show_version_t *mp;
6592 M (SHOW_VERSION, mp);
6600 vl_api_l2_fib_table_details_t_handler (vl_api_l2_fib_table_details_t *mp)
6602 vat_main_t *vam = &vat_main;
6605 "%3" PRIu32 " %U %3" PRIu32 " %d %d %d",
6606 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
6607 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac, mp->bvi_mac);
6611 vl_api_l2_fib_table_details_t_handler_json (vl_api_l2_fib_table_details_t *mp)
6613 vat_main_t *vam = &vat_main;
6614 vat_json_node_t *node = NULL;
6616 if (VAT_JSON_ARRAY != vam->json_tree.type)
6618 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6619 vat_json_init_array (&vam->json_tree);
6621 node = vat_json_array_add (&vam->json_tree);
6623 vat_json_init_object (node);
6624 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
6625 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
6626 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6627 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
6628 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
6629 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
6633 api_l2_fib_table_dump (vat_main_t *vam)
6635 unformat_input_t *i = vam->input;
6636 vl_api_l2_fib_table_dump_t *mp;
6637 vl_api_control_ping_t *mp_ping;
6642 /* Parse args required to build the message */
6643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6645 if (unformat (i, "bd_id %d", &bd_id))
6653 errmsg ("missing bridge domain");
6657 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
6659 /* Get list of l2 fib entries */
6660 M (L2_FIB_TABLE_DUMP, mp);
6662 mp->bd_id = ntohl (bd_id);
6665 /* Use a control ping for synchronization */
6666 MPING (CONTROL_PING, mp_ping);
6674 api_interface_name_renumber (vat_main_t *vam)
6676 unformat_input_t *line_input = vam->input;
6677 vl_api_interface_name_renumber_t *mp;
6678 u32 sw_if_index = ~0;
6679 u32 new_show_dev_instance = ~0;
6682 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
6684 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
6687 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
6689 else if (unformat (line_input, "new_show_dev_instance %d",
6690 &new_show_dev_instance))
6696 if (sw_if_index == ~0)
6698 errmsg ("missing interface name or sw_if_index");
6702 if (new_show_dev_instance == ~0)
6704 errmsg ("missing new_show_dev_instance");
6708 M (INTERFACE_NAME_RENUMBER, mp);
6710 mp->sw_if_index = ntohl (sw_if_index);
6711 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
6719 api_want_l2_macs_events (vat_main_t *vam)
6721 unformat_input_t *line_input = vam->input;
6722 vl_api_want_l2_macs_events_t *mp;
6723 u8 enable_disable = 1;
6725 u32 max_macs_in_event = 0;
6726 u32 learn_limit = 0;
6729 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
6731 if (unformat (line_input, "learn-limit %d", &learn_limit))
6733 else if (unformat (line_input, "scan-delay %d", &scan_delay))
6735 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
6737 else if (unformat (line_input, "disable"))
6743 M (WANT_L2_MACS_EVENTS, mp);
6744 mp->enable_disable = enable_disable;
6745 mp->pid = htonl (getpid ());
6746 mp->learn_limit = htonl (learn_limit);
6747 mp->scan_delay = (u8) scan_delay;
6748 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
6755 api_ip_address_dump (vat_main_t *vam)
6757 unformat_input_t *i = vam->input;
6758 vl_api_ip_address_dump_t *mp;
6759 vl_api_control_ping_t *mp_ping;
6760 u32 sw_if_index = ~0;
6761 u8 sw_if_index_set = 0;
6766 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6768 if (unformat (i, "sw_if_index %d", &sw_if_index))
6769 sw_if_index_set = 1;
6770 else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6771 sw_if_index_set = 1;
6772 else if (unformat (i, "ipv4"))
6774 else if (unformat (i, "ipv6"))
6780 if (ipv4_set && ipv6_set)
6782 errmsg ("ipv4 and ipv6 flags cannot be both set");
6786 if ((!ipv4_set) && (!ipv6_set))
6788 errmsg ("no ipv4 nor ipv6 flag set");
6792 if (sw_if_index_set == 0)
6794 errmsg ("missing interface name or sw_if_index");
6798 vam->current_sw_if_index = sw_if_index;
6799 vam->is_ipv6 = ipv6_set;
6801 M (IP_ADDRESS_DUMP, mp);
6802 mp->sw_if_index = ntohl (sw_if_index);
6803 mp->is_ipv6 = ipv6_set;
6806 /* Use a control ping for synchronization */
6807 MPING (CONTROL_PING, mp_ping);
6815 api_ip_dump (vat_main_t * vam)
6817 vl_api_ip_dump_t *mp;
6818 vl_api_control_ping_t *mp_ping;
6819 unformat_input_t *in = vam->input;
6826 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
6828 if (unformat (in, "ipv4"))
6830 else if (unformat (in, "ipv6"))
6836 if (ipv4_set && ipv6_set)
6838 errmsg ("ipv4 and ipv6 flags cannot be both set");
6842 if ((!ipv4_set) && (!ipv6_set))
6844 errmsg ("no ipv4 nor ipv6 flag set");
6849 vam->is_ipv6 = is_ipv6;
6852 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
6854 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
6856 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
6859 mp->is_ipv6 = ipv6_set;
6862 /* Use a control ping for synchronization */
6863 MPING (CONTROL_PING, mp_ping);
6871 api_get_first_msg_id (vat_main_t * vam)
6873 vl_api_get_first_msg_id_t *mp;
6874 unformat_input_t *i = vam->input;
6879 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6881 if (unformat (i, "client %s", &name))
6889 errmsg ("missing client name");
6894 if (vec_len (name) > 63)
6896 errmsg ("client name too long");
6900 M (GET_FIRST_MSG_ID, mp);
6901 clib_memcpy (mp->name, name, vec_len (name));
6908 api_get_node_graph (vat_main_t * vam)
6910 vl_api_get_node_graph_t *mp;
6913 M (GET_NODE_GRAPH, mp);
6917 /* Wait for the reply */
6923 format_fib_api_path_nh_proto (u8 * s, va_list * args)
6925 vl_api_fib_path_nh_proto_t proto =
6926 va_arg (*args, vl_api_fib_path_nh_proto_t);
6930 case FIB_API_PATH_NH_PROTO_IP4:
6931 s = format (s, "ip4");
6933 case FIB_API_PATH_NH_PROTO_IP6:
6934 s = format (s, "ip6");
6936 case FIB_API_PATH_NH_PROTO_MPLS:
6937 s = format (s, "mpls");
6939 case FIB_API_PATH_NH_PROTO_BIER:
6940 s = format (s, "bier");
6942 case FIB_API_PATH_NH_PROTO_ETHERNET:
6943 s = format (s, "ethernet");
6951 format_vl_api_ip_address_union (u8 * s, va_list * args)
6953 vl_api_address_family_t af = va_arg (*args, int);
6954 const vl_api_address_union_t *u = va_arg (*args, vl_api_address_union_t *);
6959 s = format (s, "%U", format_ip4_address, u->ip4);
6962 s = format (s, "%U", format_ip6_address, u->ip6);
6969 format_vl_api_fib_path_type (u8 * s, va_list * args)
6971 vl_api_fib_path_type_t t = va_arg (*args, vl_api_fib_path_type_t);
6975 case FIB_API_PATH_TYPE_NORMAL:
6976 s = format (s, "normal");
6978 case FIB_API_PATH_TYPE_LOCAL:
6979 s = format (s, "local");
6981 case FIB_API_PATH_TYPE_DROP:
6982 s = format (s, "drop");
6984 case FIB_API_PATH_TYPE_UDP_ENCAP:
6985 s = format (s, "udp-encap");
6987 case FIB_API_PATH_TYPE_BIER_IMP:
6988 s = format (s, "bier-imp");
6990 case FIB_API_PATH_TYPE_ICMP_UNREACH:
6991 s = format (s, "unreach");
6993 case FIB_API_PATH_TYPE_ICMP_PROHIBIT:
6994 s = format (s, "prohibit");
6996 case FIB_API_PATH_TYPE_SOURCE_LOOKUP:
6997 s = format (s, "src-lookup");
6999 case FIB_API_PATH_TYPE_DVR:
7000 s = format (s, "dvr");
7002 case FIB_API_PATH_TYPE_INTERFACE_RX:
7003 s = format (s, "interface-rx");
7005 case FIB_API_PATH_TYPE_CLASSIFY:
7006 s = format (s, "classify");
7014 vl_api_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
7017 " weight %d, sw_if_index %d, type %U, afi %U, next_hop %U",
7018 ntohl (fp->weight), ntohl (fp->sw_if_index),
7019 format_vl_api_fib_path_type, fp->type,
7020 format_fib_api_path_nh_proto, fp->proto,
7021 format_vl_api_ip_address_union, &fp->nh.address);
7025 vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
7026 vl_api_fib_path_t * fp)
7029 struct in6_addr ip6;
7031 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
7032 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
7033 vat_json_object_add_uint (node, "type", fp->type);
7034 vat_json_object_add_uint (node, "next_hop_proto", fp->proto);
7035 if (fp->proto == FIB_API_PATH_NH_PROTO_IP4)
7037 clib_memcpy (&ip4, &fp->nh.address.ip4, sizeof (ip4));
7038 vat_json_object_add_ip4 (node, "next_hop", ip4);
7040 else if (fp->proto == FIB_API_PATH_NH_PROTO_IP6)
7042 clib_memcpy (&ip6, &fp->nh.address.ip6, sizeof (ip6));
7043 vat_json_object_add_ip6 (node, "next_hop", ip6);
7048 vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
7050 vat_main_t *vam = &vat_main;
7051 int count = ntohl (mp->mt_tunnel.mt_n_paths);
7052 vl_api_fib_path_t *fp;
7055 print (vam->ofp, "sw_if_index %d via:",
7056 ntohl (mp->mt_tunnel.mt_sw_if_index));
7057 fp = mp->mt_tunnel.mt_paths;
7058 for (i = 0; i < count; i++)
7060 vl_api_fib_path_print (vam, fp);
7064 print (vam->ofp, "");
7067 #define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
7068 #define vl_api_mpls_tunnel_details_t_print vl_noop_handler
7071 vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
7073 vat_main_t *vam = &vat_main;
7074 vat_json_node_t *node = NULL;
7075 int count = ntohl (mp->mt_tunnel.mt_n_paths);
7076 vl_api_fib_path_t *fp;
7079 if (VAT_JSON_ARRAY != vam->json_tree.type)
7081 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7082 vat_json_init_array (&vam->json_tree);
7084 node = vat_json_array_add (&vam->json_tree);
7086 vat_json_init_object (node);
7087 vat_json_object_add_uint (node, "sw_if_index",
7088 ntohl (mp->mt_tunnel.mt_sw_if_index));
7090 vat_json_object_add_uint (node, "l2_only", mp->mt_tunnel.mt_l2_only);
7092 fp = mp->mt_tunnel.mt_paths;
7093 for (i = 0; i < count; i++)
7095 vl_api_mpls_fib_path_json_print (node, fp);
7101 api_mpls_tunnel_dump (vat_main_t * vam)
7103 vl_api_mpls_tunnel_dump_t *mp;
7104 vl_api_control_ping_t *mp_ping;
7107 M (MPLS_TUNNEL_DUMP, mp);
7111 /* Use a control ping for synchronization */
7112 MPING (CONTROL_PING, mp_ping);
7119 #define vl_api_mpls_table_details_t_endian vl_noop_handler
7120 #define vl_api_mpls_table_details_t_print vl_noop_handler
7124 vl_api_mpls_table_details_t_handler (vl_api_mpls_table_details_t * mp)
7126 vat_main_t *vam = &vat_main;
7128 print (vam->ofp, "table-id %d,", ntohl (mp->mt_table.mt_table_id));
7131 static void vl_api_mpls_table_details_t_handler_json
7132 (vl_api_mpls_table_details_t * mp)
7134 vat_main_t *vam = &vat_main;
7135 vat_json_node_t *node = NULL;
7137 if (VAT_JSON_ARRAY != vam->json_tree.type)
7139 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7140 vat_json_init_array (&vam->json_tree);
7142 node = vat_json_array_add (&vam->json_tree);
7144 vat_json_init_object (node);
7145 vat_json_object_add_uint (node, "table", ntohl (mp->mt_table.mt_table_id));
7149 api_mpls_table_dump (vat_main_t * vam)
7151 vl_api_mpls_table_dump_t *mp;
7152 vl_api_control_ping_t *mp_ping;
7155 M (MPLS_TABLE_DUMP, mp);
7158 /* Use a control ping for synchronization */
7159 MPING (CONTROL_PING, mp_ping);
7166 #define vl_api_mpls_route_details_t_endian vl_noop_handler
7167 #define vl_api_mpls_route_details_t_print vl_noop_handler
7170 vl_api_mpls_route_details_t_handler (vl_api_mpls_route_details_t * mp)
7172 vat_main_t *vam = &vat_main;
7173 int count = (int) clib_net_to_host_u32 (mp->mr_route.mr_n_paths);
7174 vl_api_fib_path_t *fp;
7178 "table-id %d, label %u, ess_bit %u",
7179 ntohl (mp->mr_route.mr_table_id),
7180 ntohl (mp->mr_route.mr_label), mp->mr_route.mr_eos);
7181 fp = mp->mr_route.mr_paths;
7182 for (i = 0; i < count; i++)
7184 vl_api_fib_path_print (vam, fp);
7189 static void vl_api_mpls_route_details_t_handler_json
7190 (vl_api_mpls_route_details_t * mp)
7192 vat_main_t *vam = &vat_main;
7193 int count = (int) clib_host_to_net_u32 (mp->mr_route.mr_n_paths);
7194 vat_json_node_t *node = NULL;
7195 vl_api_fib_path_t *fp;
7198 if (VAT_JSON_ARRAY != vam->json_tree.type)
7200 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7201 vat_json_init_array (&vam->json_tree);
7203 node = vat_json_array_add (&vam->json_tree);
7205 vat_json_init_object (node);
7206 vat_json_object_add_uint (node, "table", ntohl (mp->mr_route.mr_table_id));
7207 vat_json_object_add_uint (node, "s_bit", mp->mr_route.mr_eos);
7208 vat_json_object_add_uint (node, "label", ntohl (mp->mr_route.mr_label));
7209 vat_json_object_add_uint (node, "path_count", count);
7210 fp = mp->mr_route.mr_paths;
7211 for (i = 0; i < count; i++)
7213 vl_api_mpls_fib_path_json_print (node, fp);
7219 api_mpls_route_dump (vat_main_t * vam)
7221 unformat_input_t *input = vam->input;
7222 vl_api_mpls_route_dump_t *mp;
7223 vl_api_control_ping_t *mp_ping;
7227 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7229 if (unformat (input, "table_id %d", &table_id))
7236 errmsg ("missing table id");
7240 M (MPLS_ROUTE_DUMP, mp);
7242 mp->table.mt_table_id = ntohl (table_id);
7245 /* Use a control ping for synchronization */
7246 MPING (CONTROL_PING, mp_ping);
7253 #define vl_api_ip_table_details_t_endian vl_noop_handler
7254 #define vl_api_ip_table_details_t_print vl_noop_handler
7257 vl_api_ip_table_details_t_handler (vl_api_ip_table_details_t * mp)
7259 vat_main_t *vam = &vat_main;
7262 "%s; table-id %d, prefix %U/%d",
7263 mp->table.name, ntohl (mp->table.table_id));
7267 static void vl_api_ip_table_details_t_handler_json
7268 (vl_api_ip_table_details_t * mp)
7270 vat_main_t *vam = &vat_main;
7271 vat_json_node_t *node = NULL;
7273 if (VAT_JSON_ARRAY != vam->json_tree.type)
7275 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7276 vat_json_init_array (&vam->json_tree);
7278 node = vat_json_array_add (&vam->json_tree);
7280 vat_json_init_object (node);
7281 vat_json_object_add_uint (node, "table", ntohl (mp->table.table_id));
7285 api_ip_table_dump (vat_main_t * vam)
7287 vl_api_ip_table_dump_t *mp;
7288 vl_api_control_ping_t *mp_ping;
7291 M (IP_TABLE_DUMP, mp);
7294 /* Use a control ping for synchronization */
7295 MPING (CONTROL_PING, mp_ping);
7303 api_ip_mtable_dump (vat_main_t * vam)
7305 vl_api_ip_mtable_dump_t *mp;
7306 vl_api_control_ping_t *mp_ping;
7309 M (IP_MTABLE_DUMP, mp);
7312 /* Use a control ping for synchronization */
7313 MPING (CONTROL_PING, mp_ping);
7321 api_ip_mroute_dump (vat_main_t * vam)
7323 unformat_input_t *input = vam->input;
7324 vl_api_control_ping_t *mp_ping;
7325 vl_api_ip_mroute_dump_t *mp;
7330 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7332 if (unformat (input, "table_id %d", &table_id))
7334 else if (unformat (input, "ip6"))
7336 else if (unformat (input, "ip4"))
7343 errmsg ("missing table id");
7347 M (IP_MROUTE_DUMP, mp);
7348 mp->table.table_id = table_id;
7349 mp->table.is_ip6 = is_ip6;
7352 /* Use a control ping for synchronization */
7353 MPING (CONTROL_PING, mp_ping);
7360 #define vl_api_ip_route_details_t_endian vl_noop_handler
7361 #define vl_api_ip_route_details_t_print vl_noop_handler
7364 vl_api_ip_route_details_t_handler (vl_api_ip_route_details_t * mp)
7366 vat_main_t *vam = &vat_main;
7367 u8 count = mp->route.n_paths;
7368 vl_api_fib_path_t *fp;
7372 "table-id %d, prefix %U/%d",
7373 ntohl (mp->route.table_id),
7374 format_ip46_address, mp->route.prefix.address, mp->route.prefix.len);
7375 for (i = 0; i < count; i++)
7377 fp = &mp->route.paths[i];
7379 vl_api_fib_path_print (vam, fp);
7384 static void vl_api_ip_route_details_t_handler_json
7385 (vl_api_ip_route_details_t * mp)
7387 vat_main_t *vam = &vat_main;
7388 u8 count = mp->route.n_paths;
7389 vat_json_node_t *node = NULL;
7391 struct in6_addr ip6;
7392 vl_api_fib_path_t *fp;
7395 if (VAT_JSON_ARRAY != vam->json_tree.type)
7397 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7398 vat_json_init_array (&vam->json_tree);
7400 node = vat_json_array_add (&vam->json_tree);
7402 vat_json_init_object (node);
7403 vat_json_object_add_uint (node, "table", ntohl (mp->route.table_id));
7404 if (ADDRESS_IP6 == mp->route.prefix.address.af)
7406 clib_memcpy (&ip6, &mp->route.prefix.address.un.ip6, sizeof (ip6));
7407 vat_json_object_add_ip6 (node, "prefix", ip6);
7411 clib_memcpy (&ip4, &mp->route.prefix.address.un.ip4, sizeof (ip4));
7412 vat_json_object_add_ip4 (node, "prefix", ip4);
7414 vat_json_object_add_uint (node, "mask_length", mp->route.prefix.len);
7415 vat_json_object_add_uint (node, "path_count", count);
7416 for (i = 0; i < count; i++)
7418 fp = &mp->route.paths[i];
7419 vl_api_mpls_fib_path_json_print (node, fp);
7424 api_ip_route_dump (vat_main_t * vam)
7426 unformat_input_t *input = vam->input;
7427 vl_api_ip_route_dump_t *mp;
7428 vl_api_control_ping_t *mp_ping;
7434 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7436 if (unformat (input, "table_id %d", &table_id))
7438 else if (unformat (input, "ip6"))
7440 else if (unformat (input, "ip4"))
7447 errmsg ("missing table id");
7451 M (IP_ROUTE_DUMP, mp);
7453 mp->table.table_id = table_id;
7454 mp->table.is_ip6 = is_ip6;
7458 /* Use a control ping for synchronization */
7459 MPING (CONTROL_PING, mp_ping);
7467 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
7469 unformat_input_t *input = vam->input;
7470 vl_api_ip_source_and_port_range_check_add_del_t *mp;
7473 u16 *high_ports = 0;
7476 vl_api_prefix_t prefix;
7483 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7485 if (unformat (input, "%U", unformat_vl_api_prefix, &prefix))
7487 else if (unformat (input, "vrf %d", &vrf_id))
7489 else if (unformat (input, "del"))
7491 else if (unformat (input, "port %d", &tmp))
7493 if (tmp == 0 || tmp > 65535)
7495 errmsg ("port %d out of range", tmp);
7499 this_hi = this_low + 1;
7500 vec_add1 (low_ports, this_low);
7501 vec_add1 (high_ports, this_hi);
7503 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
7505 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
7507 errmsg ("incorrect range parameters");
7511 /* Note: in debug CLI +1 is added to high before
7512 passing to real fn that does "the work"
7513 (ip_source_and_port_range_check_add_del).
7514 This fn is a wrapper around the binary API fn a
7515 control plane will call, which expects this increment
7516 to have occurred. Hence letting the binary API control
7517 plane fn do the increment for consistency between VAT
7518 and other control planes.
7521 vec_add1 (low_ports, this_low);
7522 vec_add1 (high_ports, this_hi);
7528 if (prefix_set == 0)
7530 errmsg ("<address>/<mask> not specified");
7536 errmsg ("VRF ID required, not specified");
7543 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
7547 if (vec_len (low_ports) == 0)
7549 errmsg ("At least one port or port range required");
7553 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
7555 mp->is_add = is_add;
7557 clib_memcpy (&mp->prefix, &prefix, sizeof (prefix));
7559 mp->number_of_ranges = vec_len (low_ports);
7561 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
7562 vec_free (low_ports);
7564 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
7565 vec_free (high_ports);
7567 mp->vrf_id = ntohl (vrf_id);
7575 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
7577 unformat_input_t *input = vam->input;
7578 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
7579 u32 sw_if_index = ~0;
7581 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
7582 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
7586 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7588 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7590 else if (unformat (input, "sw_if_index %d", &sw_if_index))
7592 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
7594 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
7596 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
7598 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
7600 else if (unformat (input, "del"))
7606 if (sw_if_index == ~0)
7608 errmsg ("Interface required but not specified");
7614 errmsg ("VRF ID required but not specified");
7618 if (tcp_out_vrf_id == 0
7619 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
7622 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
7626 /* Construct the API message */
7627 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
7629 mp->sw_if_index = ntohl (sw_if_index);
7630 mp->is_add = is_add;
7631 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
7632 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
7633 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
7634 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
7639 /* Wait for a reply... */
7645 api_delete_subif (vat_main_t * vam)
7647 unformat_input_t *i = vam->input;
7648 vl_api_delete_subif_t *mp;
7649 u32 sw_if_index = ~0;
7652 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7654 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7656 if (unformat (i, "sw_if_index %d", &sw_if_index))
7662 if (sw_if_index == ~0)
7664 errmsg ("missing sw_if_index");
7668 /* Construct the API message */
7669 M (DELETE_SUBIF, mp);
7670 mp->sw_if_index = ntohl (sw_if_index);
7677 #define foreach_pbb_vtr_op \
7678 _("disable", L2_VTR_DISABLED) \
7679 _("pop", L2_VTR_POP_2) \
7680 _("push", L2_VTR_PUSH_2)
7683 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
7685 unformat_input_t *i = vam->input;
7686 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
7687 u32 sw_if_index = ~0, vtr_op = ~0;
7689 u8 dmac[6], smac[6];
7690 u8 dmac_set = 0, smac_set = 0;
7696 /* Shut up coverity */
7697 clib_memset (dmac, 0, sizeof (dmac));
7698 clib_memset (smac, 0, sizeof (smac));
7700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7702 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7704 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7706 else if (unformat (i, "vtr_op %d", &vtr_op))
7708 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
7711 else if (unformat (i, "translate_pbb_stag"))
7713 if (unformat (i, "%d", &tmp))
7715 vtr_op = L2_VTR_TRANSLATE_2_1;
7721 ("translate_pbb_stag operation requires outer tag definition");
7725 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
7727 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
7729 else if (unformat (i, "sid %d", &sid))
7731 else if (unformat (i, "vlanid %d", &tmp))
7735 clib_warning ("parse error '%U'", format_unformat_error, i);
7740 if ((sw_if_index == ~0) || (vtr_op == ~0))
7742 errmsg ("missing sw_if_index or vtr operation");
7745 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
7746 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
7749 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
7753 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
7754 mp->sw_if_index = ntohl (sw_if_index);
7755 mp->vtr_op = ntohl (vtr_op);
7756 mp->outer_tag = ntohs (outer_tag);
7757 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
7758 clib_memcpy (mp->b_smac, smac, sizeof (smac));
7759 mp->b_vlanid = ntohs (vlanid);
7760 mp->i_sid = ntohl (sid);
7768 api_sw_interface_tag_add_del (vat_main_t * vam)
7770 unformat_input_t *i = vam->input;
7771 vl_api_sw_interface_tag_add_del_t *mp;
7772 u32 sw_if_index = ~0;
7777 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7779 if (unformat (i, "tag %s", &tag))
7781 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7783 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7785 else if (unformat (i, "del"))
7791 if (sw_if_index == ~0)
7793 errmsg ("missing interface name or sw_if_index");
7797 if (enable && (tag == 0))
7799 errmsg ("no tag specified");
7803 /* Construct the API message */
7804 M (SW_INTERFACE_TAG_ADD_DEL, mp);
7805 mp->sw_if_index = ntohl (sw_if_index);
7806 mp->is_add = enable;
7808 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
7817 api_sw_interface_add_del_mac_address (vat_main_t * vam)
7819 unformat_input_t *i = vam->input;
7820 vl_api_mac_address_t mac = { 0 };
7821 vl_api_sw_interface_add_del_mac_address_t *mp;
7822 u32 sw_if_index = ~0;
7827 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7829 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7831 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7833 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
7835 else if (unformat (i, "del"))
7841 if (sw_if_index == ~0)
7843 errmsg ("missing interface name or sw_if_index");
7849 errmsg ("missing MAC address");
7853 /* Construct the API message */
7854 M (SW_INTERFACE_ADD_DEL_MAC_ADDRESS, mp);
7855 mp->sw_if_index = ntohl (sw_if_index);
7856 mp->is_add = is_add;
7857 clib_memcpy (&mp->addr, &mac, sizeof (mac));
7864 static void vl_api_l2_xconnect_details_t_handler
7865 (vl_api_l2_xconnect_details_t * mp)
7867 vat_main_t *vam = &vat_main;
7869 print (vam->ofp, "%15d%15d",
7870 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
7873 static void vl_api_l2_xconnect_details_t_handler_json
7874 (vl_api_l2_xconnect_details_t * mp)
7876 vat_main_t *vam = &vat_main;
7877 vat_json_node_t *node = NULL;
7879 if (VAT_JSON_ARRAY != vam->json_tree.type)
7881 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7882 vat_json_init_array (&vam->json_tree);
7884 node = vat_json_array_add (&vam->json_tree);
7886 vat_json_init_object (node);
7887 vat_json_object_add_uint (node, "rx_sw_if_index",
7888 ntohl (mp->rx_sw_if_index));
7889 vat_json_object_add_uint (node, "tx_sw_if_index",
7890 ntohl (mp->tx_sw_if_index));
7894 api_l2_xconnect_dump (vat_main_t * vam)
7896 vl_api_l2_xconnect_dump_t *mp;
7897 vl_api_control_ping_t *mp_ping;
7900 if (!vam->json_output)
7902 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
7905 M (L2_XCONNECT_DUMP, mp);
7909 /* Use a control ping for synchronization */
7910 MPING (CONTROL_PING, mp_ping);
7918 api_hw_interface_set_mtu (vat_main_t * vam)
7920 unformat_input_t *i = vam->input;
7921 vl_api_hw_interface_set_mtu_t *mp;
7922 u32 sw_if_index = ~0;
7926 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7928 if (unformat (i, "mtu %d", &mtu))
7930 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7932 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7938 if (sw_if_index == ~0)
7940 errmsg ("missing interface name or sw_if_index");
7946 errmsg ("no mtu specified");
7950 /* Construct the API message */
7951 M (HW_INTERFACE_SET_MTU, mp);
7952 mp->sw_if_index = ntohl (sw_if_index);
7953 mp->mtu = ntohs ((u16) mtu);
7960 static void vl_api_app_namespace_add_del_reply_t_handler
7961 (vl_api_app_namespace_add_del_reply_t * mp)
7963 vat_main_t *vam = &vat_main;
7964 i32 retval = ntohl (mp->retval);
7965 if (vam->async_mode)
7967 vam->async_errors += (retval < 0);
7971 vam->retval = retval;
7973 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
7974 vam->result_ready = 1;
7978 static void vl_api_app_namespace_add_del_reply_t_handler_json
7979 (vl_api_app_namespace_add_del_reply_t * mp)
7981 vat_main_t *vam = &vat_main;
7982 vat_json_node_t node;
7984 vat_json_init_object (&node);
7985 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
7986 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
7988 vat_json_print (vam->ofp, &node);
7989 vat_json_free (&node);
7991 vam->retval = ntohl (mp->retval);
7992 vam->result_ready = 1;
7996 api_app_namespace_add_del (vat_main_t * vam)
7998 vl_api_app_namespace_add_del_t *mp;
7999 unformat_input_t *i = vam->input;
8000 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
8001 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
8005 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8007 if (unformat (i, "id %_%v%_", &ns_id))
8009 else if (unformat (i, "secret %lu", &secret))
8011 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8012 sw_if_index_set = 1;
8013 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
8015 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
8020 if (!ns_id || !secret_set || !sw_if_index_set)
8022 errmsg ("namespace id, secret and sw_if_index must be set");
8025 if (vec_len (ns_id) > 64)
8027 errmsg ("namespace id too long");
8030 M (APP_NAMESPACE_ADD_DEL, mp);
8032 vl_api_vec_to_api_string (ns_id, &mp->namespace_id);
8033 mp->secret = clib_host_to_net_u64 (secret);
8034 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
8035 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
8036 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
8044 api_sock_init_shm (vat_main_t * vam)
8046 #if VPP_API_TEST_BUILTIN == 0
8047 unformat_input_t *i = vam->input;
8048 vl_api_shm_elem_config_t *config = 0;
8049 u64 size = 64 << 20;
8052 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8054 if (unformat (i, "size %U", unformat_memory_size, &size))
8061 * Canned custom ring allocator config.
8062 * Should probably parse all of this
8064 vec_validate (config, 6);
8065 config[0].type = VL_API_VLIB_RING;
8066 config[0].size = 256;
8067 config[0].count = 32;
8069 config[1].type = VL_API_VLIB_RING;
8070 config[1].size = 1024;
8071 config[1].count = 16;
8073 config[2].type = VL_API_VLIB_RING;
8074 config[2].size = 4096;
8075 config[2].count = 2;
8077 config[3].type = VL_API_CLIENT_RING;
8078 config[3].size = 256;
8079 config[3].count = 32;
8081 config[4].type = VL_API_CLIENT_RING;
8082 config[4].size = 1024;
8083 config[4].count = 16;
8085 config[5].type = VL_API_CLIENT_RING;
8086 config[5].size = 4096;
8087 config[5].count = 2;
8089 config[6].type = VL_API_QUEUE;
8090 config[6].count = 128;
8091 config[6].size = sizeof (uword);
8093 rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ );
8095 vam->client_index_invalid = 1;
8103 vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
8105 vat_main_t *vam = &vat_main;
8106 fib_prefix_t lcl, rmt;
8108 ip_prefix_decode (&mp->lcl, &lcl);
8109 ip_prefix_decode (&mp->rmt, &rmt);
8111 if (lcl.fp_proto == FIB_PROTOCOL_IP4)
8114 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
8115 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
8116 mp->scope, format_ip4_address, &lcl.fp_addr.ip4, lcl.fp_len,
8117 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
8118 &rmt.fp_addr.ip4, rmt.fp_len,
8119 clib_net_to_host_u16 (mp->rmt_port),
8120 clib_net_to_host_u32 (mp->action_index), mp->tag);
8125 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
8126 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
8127 mp->scope, format_ip6_address, &lcl.fp_addr.ip6, lcl.fp_len,
8128 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
8129 &rmt.fp_addr.ip6, rmt.fp_len,
8130 clib_net_to_host_u16 (mp->rmt_port),
8131 clib_net_to_host_u32 (mp->action_index), mp->tag);
8136 vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
8139 vat_main_t *vam = &vat_main;
8140 vat_json_node_t *node = NULL;
8141 struct in6_addr ip6;
8144 fib_prefix_t lcl, rmt;
8146 ip_prefix_decode (&mp->lcl, &lcl);
8147 ip_prefix_decode (&mp->rmt, &rmt);
8149 if (VAT_JSON_ARRAY != vam->json_tree.type)
8151 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
8152 vat_json_init_array (&vam->json_tree);
8154 node = vat_json_array_add (&vam->json_tree);
8155 vat_json_init_object (node);
8157 vat_json_object_add_uint (node, "appns_index",
8158 clib_net_to_host_u32 (mp->appns_index));
8159 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
8160 vat_json_object_add_uint (node, "scope", mp->scope);
8161 vat_json_object_add_uint (node, "action_index",
8162 clib_net_to_host_u32 (mp->action_index));
8163 vat_json_object_add_uint (node, "lcl_port",
8164 clib_net_to_host_u16 (mp->lcl_port));
8165 vat_json_object_add_uint (node, "rmt_port",
8166 clib_net_to_host_u16 (mp->rmt_port));
8167 vat_json_object_add_uint (node, "lcl_plen", lcl.fp_len);
8168 vat_json_object_add_uint (node, "rmt_plen", rmt.fp_len);
8169 vat_json_object_add_string_copy (node, "tag", mp->tag);
8170 if (lcl.fp_proto == FIB_PROTOCOL_IP4)
8172 clib_memcpy (&ip4, &lcl.fp_addr.ip4, sizeof (ip4));
8173 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
8174 clib_memcpy (&ip4, &rmt.fp_addr.ip4, sizeof (ip4));
8175 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
8179 clib_memcpy (&ip6, &lcl.fp_addr.ip6, sizeof (ip6));
8180 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
8181 clib_memcpy (&ip6, &rmt.fp_addr.ip6, sizeof (ip6));
8182 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
8187 api_session_rule_add_del (vat_main_t * vam)
8189 vl_api_session_rule_add_del_t *mp;
8190 unformat_input_t *i = vam->input;
8191 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
8192 u32 appns_index = 0, scope = 0;
8193 ip4_address_t lcl_ip4, rmt_ip4;
8194 ip6_address_t lcl_ip6, rmt_ip6;
8195 u8 is_ip4 = 1, conn_set = 0;
8196 u8 is_add = 1, *tag = 0;
8198 fib_prefix_t lcl, rmt;
8200 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8202 if (unformat (i, "del"))
8204 else if (unformat (i, "add"))
8206 else if (unformat (i, "proto tcp"))
8208 else if (unformat (i, "proto udp"))
8210 else if (unformat (i, "appns %d", &appns_index))
8212 else if (unformat (i, "scope %d", &scope))
8214 else if (unformat (i, "tag %_%v%_", &tag))
8218 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
8219 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
8227 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
8228 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
8234 else if (unformat (i, "action %d", &action))
8239 if (proto == ~0 || !conn_set || action == ~0)
8241 errmsg ("transport proto, connection and action must be set");
8247 errmsg ("scope should be 0-3");
8251 M (SESSION_RULE_ADD_DEL, mp);
8253 clib_memset (&lcl, 0, sizeof (lcl));
8254 clib_memset (&rmt, 0, sizeof (rmt));
8257 ip_set (&lcl.fp_addr, &lcl_ip4, 1);
8258 ip_set (&rmt.fp_addr, &rmt_ip4, 1);
8259 lcl.fp_len = lcl_plen;
8260 rmt.fp_len = rmt_plen;
8264 ip_set (&lcl.fp_addr, &lcl_ip6, 0);
8265 ip_set (&rmt.fp_addr, &rmt_ip6, 0);
8266 lcl.fp_len = lcl_plen;
8267 rmt.fp_len = rmt_plen;
8271 ip_prefix_encode (&lcl, &mp->lcl);
8272 ip_prefix_encode (&rmt, &mp->rmt);
8273 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
8274 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
8275 mp->transport_proto =
8276 proto ? TRANSPORT_PROTO_API_UDP : TRANSPORT_PROTO_API_TCP;
8277 mp->action_index = clib_host_to_net_u32 (action);
8278 mp->appns_index = clib_host_to_net_u32 (appns_index);
8280 mp->is_add = is_add;
8283 clib_memcpy (mp->tag, tag, vec_len (tag));
8293 api_session_rules_dump (vat_main_t * vam)
8295 vl_api_session_rules_dump_t *mp;
8296 vl_api_control_ping_t *mp_ping;
8299 if (!vam->json_output)
8301 print (vam->ofp, "%=20s", "Session Rules");
8304 M (SESSION_RULES_DUMP, mp);
8308 /* Use a control ping for synchronization */
8309 MPING (CONTROL_PING, mp_ping);
8312 /* Wait for a reply... */
8318 api_ip_container_proxy_add_del (vat_main_t * vam)
8320 vl_api_ip_container_proxy_add_del_t *mp;
8321 unformat_input_t *i = vam->input;
8322 u32 sw_if_index = ~0;
8323 vl_api_prefix_t pfx = { };
8327 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8329 if (unformat (i, "del"))
8331 else if (unformat (i, "add"))
8333 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
8335 else if (unformat (i, "sw_if_index %u", &sw_if_index))
8340 if (sw_if_index == ~0 || pfx.len == 0)
8342 errmsg ("address and sw_if_index must be set");
8346 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
8348 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
8349 mp->is_add = is_add;
8350 clib_memcpy (&mp->pfx, &pfx, sizeof (pfx));
8358 q_or_quit (vat_main_t * vam)
8360 #if VPP_API_TEST_BUILTIN == 0
8361 longjmp (vam->jump_buf, 1);
8363 return 0; /* not so much */
8367 q (vat_main_t * vam)
8369 return q_or_quit (vam);
8373 quit (vat_main_t * vam)
8375 return q_or_quit (vam);
8379 comment (vat_main_t * vam)
8385 elog_save (vat_main_t * vam)
8387 #if VPP_API_TEST_BUILTIN == 0
8388 elog_main_t *em = &vam->elog_main;
8389 unformat_input_t *i = vam->input;
8390 char *file, *chroot_file;
8391 clib_error_t *error;
8393 if (!unformat (i, "%s", &file))
8395 errmsg ("expected file name, got `%U'", format_unformat_error, i);
8399 /* It's fairly hard to get "../oopsie" through unformat; just in case */
8400 if (strstr (file, "..") || index (file, '/'))
8402 errmsg ("illegal characters in filename '%s'", file);
8406 chroot_file = (char *) format (0, "/tmp/%s%c", file, 0);
8410 errmsg ("Saving %wd of %wd events to %s",
8411 elog_n_events_in_buffer (em),
8412 elog_buffer_capacity (em), chroot_file);
8414 error = elog_write_file (em, chroot_file, 1 /* flush ring */ );
8415 vec_free (chroot_file);
8418 clib_error_report (error);
8420 errmsg ("Use the vpp event loger...");
8427 elog_setup (vat_main_t * vam)
8429 #if VPP_API_TEST_BUILTIN == 0
8430 elog_main_t *em = &vam->elog_main;
8431 unformat_input_t *i = vam->input;
8432 u32 nevents = 128 << 10;
8434 (void) unformat (i, "nevents %d", &nevents);
8436 elog_init (em, nevents);
8437 vl_api_set_elog_main (em);
8438 vl_api_set_elog_trace_api_messages (1);
8439 errmsg ("Event logger initialized with %u events", nevents);
8441 errmsg ("Use the vpp event loger...");
8447 elog_enable (vat_main_t * vam)
8449 #if VPP_API_TEST_BUILTIN == 0
8450 elog_main_t *em = &vam->elog_main;
8452 elog_enable_disable (em, 1 /* enable */ );
8453 vl_api_set_elog_trace_api_messages (1);
8454 errmsg ("Event logger enabled...");
8456 errmsg ("Use the vpp event loger...");
8462 elog_disable (vat_main_t * vam)
8464 #if VPP_API_TEST_BUILTIN == 0
8465 elog_main_t *em = &vam->elog_main;
8467 elog_enable_disable (em, 0 /* enable */ );
8468 vl_api_set_elog_trace_api_messages (1);
8469 errmsg ("Event logger disabled...");
8471 errmsg ("Use the vpp event loger...");
8477 statseg (vat_main_t * vam)
8479 ssvm_private_t *ssvmp = &vam->stat_segment;
8480 ssvm_shared_header_t *shared_header = ssvmp->sh;
8481 vlib_counter_t **counters;
8482 u64 thread0_index1_packets;
8483 u64 thread0_index1_bytes;
8484 f64 vector_rate, input_rate;
8487 uword *counter_vector_by_name;
8488 if (vam->stat_segment_lockp == 0)
8490 errmsg ("Stat segment not mapped...");
8494 /* look up "/if/rx for sw_if_index 1 as a test */
8496 clib_spinlock_lock (vam->stat_segment_lockp);
8498 counter_vector_by_name = (uword *) shared_header->opaque[1];
8500 p = hash_get_mem (counter_vector_by_name, "/if/rx");
8503 clib_spinlock_unlock (vam->stat_segment_lockp);
8504 errmsg ("/if/tx not found?");
8508 /* Fish per-thread vector of combined counters from shared memory */
8509 counters = (vlib_counter_t **) p[0];
8511 if (vec_len (counters[0]) < 2)
8513 clib_spinlock_unlock (vam->stat_segment_lockp);
8514 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
8518 /* Read thread 0 sw_if_index 1 counter */
8519 thread0_index1_packets = counters[0][1].packets;
8520 thread0_index1_bytes = counters[0][1].bytes;
8522 p = hash_get_mem (counter_vector_by_name, "vector_rate");
8525 clib_spinlock_unlock (vam->stat_segment_lockp);
8526 errmsg ("vector_rate not found?");
8530 vector_rate = *(f64 *) (p[0]);
8531 p = hash_get_mem (counter_vector_by_name, "input_rate");
8534 clib_spinlock_unlock (vam->stat_segment_lockp);
8535 errmsg ("input_rate not found?");
8538 input_rate = *(f64 *) (p[0]);
8540 clib_spinlock_unlock (vam->stat_segment_lockp);
8542 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
8543 vector_rate, input_rate);
8544 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
8545 thread0_index1_packets, thread0_index1_bytes);
8551 cmd_cmp (void *a1, void *a2)
8556 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
8560 help (vat_main_t * vam)
8565 unformat_input_t *i = vam->input;
8568 if (unformat (i, "%s", &name))
8574 hs = hash_get_mem (vam->help_by_name, name);
8576 print (vam->ofp, "usage: %s %s", name, hs[0]);
8578 print (vam->ofp, "No such msg / command '%s'", name);
8583 print (vam->ofp, "Help is available for the following:");
8586 hash_foreach_pair (p, vam->function_by_name,
8588 vec_add1 (cmds, (u8 *)(p->key));
8592 vec_sort_with_function (cmds, cmd_cmp);
8594 for (j = 0; j < vec_len (cmds); j++)
8595 print (vam->ofp, "%s", cmds[j]);
8602 set (vat_main_t * vam)
8604 u8 *name = 0, *value = 0;
8605 unformat_input_t *i = vam->input;
8607 if (unformat (i, "%s", &name))
8609 /* The input buffer is a vector, not a string. */
8610 value = vec_dup (i->buffer);
8611 vec_delete (value, i->index, 0);
8612 /* Almost certainly has a trailing newline */
8613 if (value[vec_len (value) - 1] == '\n')
8614 value[vec_len (value) - 1] = 0;
8615 /* Make sure it's a proper string, one way or the other */
8616 vec_add1 (value, 0);
8617 (void) clib_macro_set_value (&vam->macro_main,
8618 (char *) name, (char *) value);
8621 errmsg ("usage: set <name> <value>");
8629 unset (vat_main_t * vam)
8633 if (unformat (vam->input, "%s", &name))
8634 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
8635 errmsg ("unset: %s wasn't set", name);
8648 macro_sort_cmp (void *a1, void *a2)
8650 macro_sort_t *s1 = a1;
8651 macro_sort_t *s2 = a2;
8653 return strcmp ((char *) (s1->name), (char *) (s2->name));
8657 dump_macro_table (vat_main_t * vam)
8659 macro_sort_t *sort_me = 0, *sm;
8664 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
8666 vec_add2 (sort_me, sm, 1);
8667 sm->name = (u8 *)(p->key);
8668 sm->value = (u8 *) (p->value[0]);
8672 vec_sort_with_function (sort_me, macro_sort_cmp);
8674 if (vec_len (sort_me))
8675 print (vam->ofp, "%-15s%s", "Name", "Value");
8677 print (vam->ofp, "The macro table is empty...");
8679 for (i = 0; i < vec_len (sort_me); i++)
8680 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
8685 dump_node_table (vat_main_t * vam)
8688 vlib_node_t *node, *next_node;
8690 if (vec_len (vam->graph_nodes) == 0)
8692 print (vam->ofp, "Node table empty, issue get_node_graph...");
8696 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
8698 node = vam->graph_nodes[0][i];
8699 print (vam->ofp, "[%d] %s", i, node->name);
8700 for (j = 0; j < vec_len (node->next_nodes); j++)
8702 if (node->next_nodes[j] != ~0)
8704 next_node = vam->graph_nodes[0][node->next_nodes[j]];
8705 print (vam->ofp, " [%d] %s", j, next_node->name);
8713 value_sort_cmp (void *a1, void *a2)
8715 name_sort_t *n1 = a1;
8716 name_sort_t *n2 = a2;
8718 if (n1->value < n2->value)
8720 if (n1->value > n2->value)
8727 dump_msg_api_table (vat_main_t * vam)
8729 api_main_t *am = vlibapi_get_main ();
8730 name_sort_t *nses = 0, *ns;
8735 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
8737 vec_add2 (nses, ns, 1);
8738 ns->name = (u8 *)(hp->key);
8739 ns->value = (u32) hp->value[0];
8743 vec_sort_with_function (nses, value_sort_cmp);
8745 for (i = 0; i < vec_len (nses); i++)
8746 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
8752 get_msg_id (vat_main_t * vam)
8757 if (unformat (vam->input, "%s", &name_and_crc))
8759 message_index = vl_msg_api_get_msg_index (name_and_crc);
8760 if (message_index == ~0)
8762 print (vam->ofp, " '%s' not found", name_and_crc);
8765 print (vam->ofp, " '%s' has message index %d",
8766 name_and_crc, message_index);
8769 errmsg ("name_and_crc required...");
8774 search_node_table (vat_main_t * vam)
8776 unformat_input_t *line_input = vam->input;
8779 vlib_node_t *node, *next_node;
8782 if (vam->graph_node_index_by_name == 0)
8784 print (vam->ofp, "Node table empty, issue get_node_graph...");
8788 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
8790 if (unformat (line_input, "%s", &node_to_find))
8792 vec_add1 (node_to_find, 0);
8793 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
8796 print (vam->ofp, "%s not found...", node_to_find);
8799 node = vam->graph_nodes[0][p[0]];
8800 print (vam->ofp, "[%d] %s", p[0], node->name);
8801 for (j = 0; j < vec_len (node->next_nodes); j++)
8803 if (node->next_nodes[j] != ~0)
8805 next_node = vam->graph_nodes[0][node->next_nodes[j]];
8806 print (vam->ofp, " [%d] %s", j, next_node->name);
8813 clib_warning ("parse error '%U'", format_unformat_error,
8819 vec_free (node_to_find);
8828 script (vat_main_t * vam)
8830 #if (VPP_API_TEST_BUILTIN==0)
8832 char *save_current_file;
8833 unformat_input_t save_input;
8834 jmp_buf save_jump_buf;
8835 u32 save_line_number;
8837 FILE *new_fp, *save_ifp;
8839 if (unformat (vam->input, "%s", &s))
8841 new_fp = fopen ((char *) s, "r");
8844 errmsg ("Couldn't open script file %s", s);
8851 errmsg ("Missing script name");
8855 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
8856 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
8857 save_ifp = vam->ifp;
8858 save_line_number = vam->input_line_number;
8859 save_current_file = (char *) vam->current_file;
8861 vam->input_line_number = 0;
8863 vam->current_file = s;
8866 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
8867 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
8868 vam->ifp = save_ifp;
8869 vam->input_line_number = save_line_number;
8870 vam->current_file = (u8 *) save_current_file;
8875 clib_warning ("use the exec command...");
8881 echo (vat_main_t * vam)
8883 print (vam->ofp, "%v", vam->input->buffer);
8887 /* List of API message constructors, CLI names map to api_xxx */
8888 #define foreach_vpe_api_msg \
8889 _(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
8890 _(sw_interface_dump,"") \
8891 _(sw_interface_set_flags, \
8892 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
8893 _(sw_interface_add_del_address, \
8894 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
8895 _(sw_interface_set_rx_mode, \
8896 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
8897 _(sw_interface_set_rx_placement, \
8898 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
8899 _(sw_interface_rx_placement_dump, \
8900 "[<intfc> | sw_if_index <id>]") \
8901 _(sw_interface_set_table, \
8902 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
8903 _(sw_interface_set_mpls_enable, \
8904 "<intfc> | sw_if_index [disable | dis]") \
8905 _(sw_interface_set_vpath, \
8906 "<intfc> | sw_if_index <id> enable | disable") \
8907 _(sw_interface_set_l2_xconnect, \
8908 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
8909 "enable | disable") \
8910 _(sw_interface_set_l2_bridge, \
8911 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
8912 "[shg <split-horizon-group>] [bvi]\n" \
8913 "enable | disable") \
8914 _(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
8915 _(bridge_domain_add_del, \
8916 "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") \
8917 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
8919 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
8920 _(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
8921 _(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
8923 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
8925 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
8926 _(virtio_pci_create_v2, \
8927 "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]") \
8928 _(virtio_pci_delete, \
8929 "<vpp-if-name> | sw_if_index <id>") \
8930 _(sw_interface_virtio_pci_dump, "") \
8931 _(ip_table_add_del, \
8932 "table <n> [ipv6] [add | del]\n") \
8933 _(ip_route_add_del, \
8934 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
8935 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
8936 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
8937 "[multipath] [count <n>] [del]") \
8938 _(ip_mroute_add_del, \
8939 "<src> <grp>/<mask> [table-id <n>]\n" \
8940 "[<intfc> | sw_if_index <id>] [local] [del]") \
8941 _(mpls_table_add_del, \
8942 "table <n> [add | del]\n") \
8943 _(mpls_route_add_del, \
8944 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
8945 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
8946 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
8947 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
8948 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
8949 "[count <n>] [del]") \
8950 _(mpls_ip_bind_unbind, \
8951 "<label> <addr/len>") \
8952 _(mpls_tunnel_add_del, \
8953 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
8954 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
8955 "[l2-only] [out-label <n>]") \
8956 _(sw_interface_set_unnumbered, \
8957 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
8958 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
8959 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
8960 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
8961 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
8962 "[outer_vlan_id_any][inner_vlan_id_any]") \
8963 _(ip_table_replace_begin, "table <n> [ipv6]") \
8964 _(ip_table_flush, "table <n> [ipv6]") \
8965 _(ip_table_replace_end, "table <n> [ipv6]") \
8966 _(set_ip_flow_hash, \
8967 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
8968 _(sw_interface_ip6_enable_disable, \
8969 "<intfc> | sw_if_index <id> enable | disable") \
8970 _(l2_patch_add_del, \
8971 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
8972 "enable | disable") \
8973 _(get_node_index, "node <node-name") \
8974 _(add_node_next, "node <node-name> next <next-node-name>") \
8975 _(l2_fib_clear_table, "") \
8976 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
8977 _(l2_interface_vlan_tag_rewrite, \
8978 "<intfc> | sw_if_index <nn> \n" \
8979 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
8980 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
8981 _(show_version, "") \
8982 _(show_threads, "") \
8983 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
8984 _(interface_name_renumber, \
8985 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
8986 _(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
8987 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
8988 _(ip_dump, "ipv4 | ipv6") \
8989 _(delete_loopback,"sw_if_index <nn>") \
8990 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
8991 _(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
8992 _(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
8993 _(want_interface_events, "enable|disable") \
8994 _(get_first_msg_id, "client <name>") \
8995 _(get_node_graph, " ") \
8996 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
8997 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
8998 _(ioam_disable, "") \
8999 _(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
9000 _(mpls_table_dump, "") \
9001 _(mpls_route_dump, "table-id <ID>") \
9002 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
9003 _(ip_source_and_port_range_check_add_del, \
9004 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
9005 _(ip_source_and_port_range_check_interface_add_del, \
9006 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
9007 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
9008 _(delete_subif,"<intfc> | sw_if_index <nn>") \
9009 _(l2_interface_pbb_tag_rewrite, \
9010 "<intfc> | sw_if_index <nn> \n" \
9011 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
9012 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
9013 _(ip_table_dump, "") \
9014 _(ip_route_dump, "table-id [ip4|ip6]") \
9015 _(ip_mtable_dump, "") \
9016 _(ip_mroute_dump, "table-id [ip4|ip6]") \
9017 _(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
9019 _(sw_interface_add_del_mac_address, "<intfc> | sw_if_index <nn> " \
9020 "mac <mac-address> [del]") \
9021 _(l2_xconnect_dump, "") \
9022 _(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
9023 _(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
9024 _(sock_init_shm, "size <nnn>") \
9025 _(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
9026 _(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
9027 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
9028 _(session_rules_dump, "") \
9029 _(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
9031 /* List of command functions, CLI names map directly to functions */
9032 #define foreach_cli_function \
9033 _(comment, "usage: comment <ignore-rest-of-line>") \
9034 _(dump_interface_table, "usage: dump_interface_table") \
9035 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
9036 _(dump_ipv4_table, "usage: dump_ipv4_table") \
9037 _(dump_ipv6_table, "usage: dump_ipv6_table") \
9038 _(dump_macro_table, "usage: dump_macro_table ") \
9039 _(dump_node_table, "usage: dump_node_table") \
9040 _(dump_msg_api_table, "usage: dump_msg_api_table") \
9041 _(elog_setup, "usage: elog_setup [nevents, default 128K]") \
9042 _(elog_disable, "usage: elog_disable") \
9043 _(elog_enable, "usage: elog_enable") \
9044 _(elog_save, "usage: elog_save <filename>") \
9045 _(get_msg_id, "usage: get_msg_id name_and_crc") \
9046 _(echo, "usage: echo <message>") \
9047 _(exec, "usage: exec <vpe-debug-CLI-command>") \
9048 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
9049 _(help, "usage: help") \
9050 _(q, "usage: quit") \
9051 _(quit, "usage: quit") \
9052 _(search_node_table, "usage: search_node_table <name>...") \
9053 _(set, "usage: set <variable-name> <value>") \
9054 _(script, "usage: script <file-name>") \
9055 _(statseg, "usage: statseg") \
9056 _(unset, "usage: unset <variable-name>")
9059 static void vl_api_##n##_t_handler_uni \
9060 (vl_api_##n##_t * mp) \
9062 vat_main_t * vam = &vat_main; \
9063 if (vam->json_output) { \
9064 vl_api_##n##_t_handler_json(mp); \
9066 vl_api_##n##_t_handler(mp); \
9069 foreach_vpe_api_reply_msg;
9070 #if VPP_API_TEST_BUILTIN == 0
9071 foreach_standalone_reply_msg;
9076 vat_api_hookup (vat_main_t * vam)
9079 vl_msg_api_set_handlers(VL_API_##N, #n, \
9080 vl_api_##n##_t_handler_uni, \
9082 vl_api_##n##_t_endian, \
9083 vl_api_##n##_t_print, \
9084 sizeof(vl_api_##n##_t), 1);
9085 foreach_vpe_api_reply_msg;
9086 #if VPP_API_TEST_BUILTIN == 0
9087 foreach_standalone_reply_msg;
9091 #if (VPP_API_TEST_BUILTIN==0)
9092 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
9094 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
9096 vam->function_by_name = hash_create_string (0, sizeof (uword));
9098 vam->help_by_name = hash_create_string (0, sizeof (uword));
9101 /* API messages we can send */
9102 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
9103 foreach_vpe_api_msg;
9107 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
9108 foreach_vpe_api_msg;
9112 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
9113 foreach_cli_function;
9117 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
9118 foreach_cli_function;
9122 #if VPP_API_TEST_BUILTIN
9123 static clib_error_t *
9124 vat_api_hookup_shim (vlib_main_t * vm)
9126 vat_api_hookup (&vat_main);
9130 VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
9134 * fd.io coding-style-patch-verification: ON
9137 * eval: (c-set-style "gnu")