2 *------------------------------------------------------------------
5 * Copyright (c) 2014 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 <vlibapi/api.h>
22 #include <vlibmemory/api.h>
23 #include <vlibsocket/api.h>
24 #include <vnet/ip/ip.h>
25 #include <vnet/sr/sr_packet.h>
26 #include <vnet/l2/l2_input.h>
27 #include <vnet/l2tp/l2tp.h>
28 #include <vnet/vxlan/vxlan.h>
29 #include <vnet/gre/gre.h>
30 #include <vnet/vxlan-gpe/vxlan_gpe.h>
31 #include <vnet/lisp-gpe/lisp_gpe.h>
33 #include <vpp-api/vpe_msg_enum.h>
34 #include <vnet/l2/l2_classify.h>
35 #include <vnet/l2/l2_vtr.h>
36 #include <vnet/classify/input_acl.h>
37 #include <vnet/classify/policer_classify.h>
38 #include <vnet/mpls-gre/mpls.h>
40 #include <vnet/ipsec/ipsec.h>
41 #include <vnet/ipsec/ikev2.h>
45 #include <vnet/map/map.h>
46 #include <vnet/cop/cop.h>
47 #include <vnet/ip/ip6_hop_by_hop.h>
48 #include <vnet/ip/ip_source_and_port_range_check.h>
49 #include <vnet/policer/xlate.h>
50 #include <vnet/policer/policer.h>
51 #include <vnet/policer/police.h>
53 #include "vat/json_format.h"
57 #define vl_typedefs /* define message structures */
58 #include <vpp-api/vpe_all_api_h.h>
61 /* declare message handlers for each api */
63 #define vl_endianfun /* define message structures */
64 #include <vpp-api/vpe_all_api_h.h>
67 /* instantiate all the print functions we know about */
68 #define vl_print(handle, ...)
70 #include <vpp-api/vpe_all_api_h.h>
74 unformat_sw_if_index (unformat_input_t * input, va_list * args)
76 vat_main_t *vam = va_arg (*args, vat_main_t *);
77 u32 *result = va_arg (*args, u32 *);
81 if (!unformat (input, "%s", &if_name))
84 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
91 /* Parse an IP4 address %d.%d.%d.%d. */
93 unformat_ip4_address (unformat_input_t * input, va_list * args)
95 u8 *result = va_arg (*args, u8 *);
98 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
101 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
114 unformat_ethernet_address (unformat_input_t * input, va_list * args)
116 u8 *result = va_arg (*args, u8 *);
119 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
120 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
124 for (i = 0; i < 6; i++)
125 if (a[i] >= (1 << 8))
128 for (i = 0; i < 6; i++)
134 /* Returns ethernet type as an int in host byte order. */
136 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
139 u16 *result = va_arg (*args, u16 *);
143 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
145 if (type >= (1 << 16))
153 /* Parse an IP6 address. */
155 unformat_ip6_address (unformat_input_t * input, va_list * args)
157 ip6_address_t *result = va_arg (*args, ip6_address_t *);
159 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
160 uword c, n_colon, double_colon_index;
162 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
163 double_colon_index = ARRAY_LEN (hex_quads);
164 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
167 if (c >= '0' && c <= '9')
169 else if (c >= 'a' && c <= 'f')
170 hex_digit = c + 10 - 'a';
171 else if (c >= 'A' && c <= 'F')
172 hex_digit = c + 10 - 'A';
173 else if (c == ':' && n_colon < 2)
177 unformat_put_input (input);
181 /* Too many hex quads. */
182 if (n_hex_quads >= ARRAY_LEN (hex_quads))
187 hex_quad = (hex_quad << 4) | hex_digit;
189 /* Hex quad must fit in 16 bits. */
190 if (n_hex_digits >= 4)
197 /* Save position of :: */
200 /* More than one :: ? */
201 if (double_colon_index < ARRAY_LEN (hex_quads))
203 double_colon_index = n_hex_quads;
206 if (n_colon > 0 && n_hex_digits > 0)
208 hex_quads[n_hex_quads++] = hex_quad;
214 if (n_hex_digits > 0)
215 hex_quads[n_hex_quads++] = hex_quad;
220 /* Expand :: to appropriate number of zero hex quads. */
221 if (double_colon_index < ARRAY_LEN (hex_quads))
223 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
225 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
226 hex_quads[n_zero + i] = hex_quads[i];
228 for (i = 0; i < n_zero; i++)
229 hex_quads[double_colon_index + i] = 0;
231 n_hex_quads = ARRAY_LEN (hex_quads);
234 /* Too few hex quads given. */
235 if (n_hex_quads < ARRAY_LEN (hex_quads))
238 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
239 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
246 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
249 u32 *r = va_arg (*args, u32 *);
252 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
253 foreach_ipsec_policy_action
264 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
267 u32 *r = va_arg (*args, u32 *);
270 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
271 foreach_ipsec_crypto_alg
282 format_ipsec_crypto_alg (u8 * s, va_list * args)
285 u32 i = va_arg (*args, u32);
290 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
291 foreach_ipsec_crypto_alg
294 return format (s, "unknown");
296 return format (s, "%s", t);
298 return format (s, "Unimplemented");
303 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
306 u32 *r = va_arg (*args, u32 *);
309 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
310 foreach_ipsec_integ_alg
321 format_ipsec_integ_alg (u8 * s, va_list * args)
324 u32 i = va_arg (*args, u32);
329 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
330 foreach_ipsec_integ_alg
333 return format (s, "unknown");
335 return format (s, "%s", t);
337 return format (s, "Unsupported");
342 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
345 u32 *r = va_arg (*args, u32 *);
348 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
349 foreach_ikev2_auth_method
360 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
363 u32 *r = va_arg (*args, u32 *);
366 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
367 foreach_ikev2_id_type
378 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
380 u8 *r = va_arg (*args, u8 *);
382 if (unformat (input, "kbps"))
383 *r = SSE2_QOS_RATE_KBPS;
384 else if (unformat (input, "pps"))
385 *r = SSE2_QOS_RATE_PPS;
392 unformat_policer_round_type (unformat_input_t * input, va_list * args)
394 u8 *r = va_arg (*args, u8 *);
396 if (unformat (input, "closest"))
397 *r = SSE2_QOS_ROUND_TO_CLOSEST;
398 else if (unformat (input, "up"))
399 *r = SSE2_QOS_ROUND_TO_UP;
400 else if (unformat (input, "down"))
401 *r = SSE2_QOS_ROUND_TO_DOWN;
408 unformat_policer_type (unformat_input_t * input, va_list * args)
410 u8 *r = va_arg (*args, u8 *);
412 if (unformat (input, "1r2c"))
413 *r = SSE2_QOS_POLICER_TYPE_1R2C;
414 else if (unformat (input, "1r3c"))
415 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
416 else if (unformat (input, "2r3c-2698"))
417 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
418 else if (unformat (input, "2r3c-4115"))
419 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
420 else if (unformat (input, "2r3c-mef5cf1"))
421 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
428 unformat_dscp (unformat_input_t * input, va_list * va)
430 u8 *r = va_arg (*va, u8 *);
433 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
442 unformat_policer_action_type (unformat_input_t * input, va_list * va)
444 sse2_qos_pol_action_params_st *a
445 = va_arg (*va, sse2_qos_pol_action_params_st *);
447 if (unformat (input, "drop"))
448 a->action_type = SSE2_QOS_ACTION_DROP;
449 else if (unformat (input, "transmit"))
450 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
451 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
452 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
459 unformat_classify_table_type (unformat_input_t * input, va_list * va)
461 u32 *r = va_arg (*va, u32 *);
464 if (unformat (input, "ip4"))
465 tid = POLICER_CLASSIFY_TABLE_IP4;
466 else if (unformat (input, "ip6"))
467 tid = POLICER_CLASSIFY_TABLE_IP6;
468 else if (unformat (input, "l2"))
469 tid = POLICER_CLASSIFY_TABLE_L2;
478 format_ip4_address (u8 * s, va_list * args)
480 u8 *a = va_arg (*args, u8 *);
481 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
485 format_ip6_address (u8 * s, va_list * args)
487 ip6_address_t *a = va_arg (*args, ip6_address_t *);
488 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
490 i_max_n_zero = ARRAY_LEN (a->as_u16);
492 i_first_zero = i_max_n_zero;
494 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
496 u32 is_zero = a->as_u16[i] == 0;
497 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
503 if ((!is_zero && n_zeros > max_n_zeros)
504 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
506 i_max_n_zero = i_first_zero;
507 max_n_zeros = n_zeros;
508 i_first_zero = ARRAY_LEN (a->as_u16);
513 last_double_colon = 0;
514 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
516 if (i == i_max_n_zero && max_n_zeros > 1)
518 s = format (s, "::");
519 i += max_n_zeros - 1;
520 last_double_colon = 1;
524 s = format (s, "%s%x",
525 (last_double_colon || i == 0) ? "" : ":",
526 clib_net_to_host_u16 (a->as_u16[i]));
527 last_double_colon = 0;
534 /* Format an IP46 address. */
536 format_ip46_address (u8 * s, va_list * args)
538 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
539 ip46_type_t type = va_arg (*args, ip46_type_t);
545 is_ip4 = ip46_address_is_ip4 (ip46);
556 format (s, "%U", format_ip4_address, &ip46->ip4) :
557 format (s, "%U", format_ip6_address, &ip46->ip6);
561 format_ethernet_address (u8 * s, va_list * args)
563 u8 *a = va_arg (*args, u8 *);
565 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
566 a[0], a[1], a[2], a[3], a[4], a[5]);
570 increment_v4_address (ip4_address_t * a)
574 v = ntohl (a->as_u32) + 1;
575 a->as_u32 = ntohl (v);
579 increment_v6_address (ip6_address_t * a)
583 v0 = clib_net_to_host_u64 (a->as_u64[0]);
584 v1 = clib_net_to_host_u64 (a->as_u64[1]);
589 a->as_u64[0] = clib_net_to_host_u64 (v0);
590 a->as_u64[1] = clib_net_to_host_u64 (v1);
594 increment_mac_address (u64 * mac)
598 tmp = clib_net_to_host_u64 (tmp);
599 tmp += 1 << 16; /* skip unused (least significant) octets */
600 tmp = clib_host_to_net_u64 (tmp);
604 static void vl_api_create_loopback_reply_t_handler
605 (vl_api_create_loopback_reply_t * mp)
607 vat_main_t *vam = &vat_main;
608 i32 retval = ntohl (mp->retval);
610 vam->retval = retval;
611 vam->regenerate_interface_table = 1;
612 vam->sw_if_index = ntohl (mp->sw_if_index);
613 vam->result_ready = 1;
616 static void vl_api_create_loopback_reply_t_handler_json
617 (vl_api_create_loopback_reply_t * mp)
619 vat_main_t *vam = &vat_main;
620 vat_json_node_t node;
622 vat_json_init_object (&node);
623 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
624 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
626 vat_json_print (vam->ofp, &node);
627 vat_json_free (&node);
628 vam->retval = ntohl (mp->retval);
629 vam->result_ready = 1;
632 static void vl_api_af_packet_create_reply_t_handler
633 (vl_api_af_packet_create_reply_t * mp)
635 vat_main_t *vam = &vat_main;
636 i32 retval = ntohl (mp->retval);
638 vam->retval = retval;
639 vam->regenerate_interface_table = 1;
640 vam->sw_if_index = ntohl (mp->sw_if_index);
641 vam->result_ready = 1;
644 static void vl_api_af_packet_create_reply_t_handler_json
645 (vl_api_af_packet_create_reply_t * mp)
647 vat_main_t *vam = &vat_main;
648 vat_json_node_t node;
650 vat_json_init_object (&node);
651 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
652 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
654 vat_json_print (vam->ofp, &node);
655 vat_json_free (&node);
657 vam->retval = ntohl (mp->retval);
658 vam->result_ready = 1;
661 static void vl_api_create_vlan_subif_reply_t_handler
662 (vl_api_create_vlan_subif_reply_t * mp)
664 vat_main_t *vam = &vat_main;
665 i32 retval = ntohl (mp->retval);
667 vam->retval = retval;
668 vam->regenerate_interface_table = 1;
669 vam->sw_if_index = ntohl (mp->sw_if_index);
670 vam->result_ready = 1;
673 static void vl_api_create_vlan_subif_reply_t_handler_json
674 (vl_api_create_vlan_subif_reply_t * mp)
676 vat_main_t *vam = &vat_main;
677 vat_json_node_t node;
679 vat_json_init_object (&node);
680 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
681 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
683 vat_json_print (vam->ofp, &node);
684 vat_json_free (&node);
686 vam->retval = ntohl (mp->retval);
687 vam->result_ready = 1;
690 static void vl_api_create_subif_reply_t_handler
691 (vl_api_create_subif_reply_t * mp)
693 vat_main_t *vam = &vat_main;
694 i32 retval = ntohl (mp->retval);
696 vam->retval = retval;
697 vam->regenerate_interface_table = 1;
698 vam->sw_if_index = ntohl (mp->sw_if_index);
699 vam->result_ready = 1;
702 static void vl_api_create_subif_reply_t_handler_json
703 (vl_api_create_subif_reply_t * mp)
705 vat_main_t *vam = &vat_main;
706 vat_json_node_t node;
708 vat_json_init_object (&node);
709 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
710 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
712 vat_json_print (vam->ofp, &node);
713 vat_json_free (&node);
715 vam->retval = ntohl (mp->retval);
716 vam->result_ready = 1;
719 static void vl_api_interface_name_renumber_reply_t_handler
720 (vl_api_interface_name_renumber_reply_t * mp)
722 vat_main_t *vam = &vat_main;
723 i32 retval = ntohl (mp->retval);
725 vam->retval = retval;
726 vam->regenerate_interface_table = 1;
727 vam->result_ready = 1;
730 static void vl_api_interface_name_renumber_reply_t_handler_json
731 (vl_api_interface_name_renumber_reply_t * mp)
733 vat_main_t *vam = &vat_main;
734 vat_json_node_t node;
736 vat_json_init_object (&node);
737 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
739 vat_json_print (vam->ofp, &node);
740 vat_json_free (&node);
742 vam->retval = ntohl (mp->retval);
743 vam->result_ready = 1;
747 * Special-case: build the interface table, maintain
748 * the next loopback sw_if_index vbl.
750 static void vl_api_sw_interface_details_t_handler
751 (vl_api_sw_interface_details_t * mp)
753 vat_main_t *vam = &vat_main;
754 u8 *s = format (0, "%s%c", mp->interface_name, 0);
756 hash_set_mem (vam->sw_if_index_by_interface_name, s,
757 ntohl (mp->sw_if_index));
759 /* In sub interface case, fill the sub interface table entry */
760 if (mp->sw_if_index != mp->sup_sw_if_index)
762 sw_interface_subif_t *sub = NULL;
764 vec_add2 (vam->sw_if_subif_table, sub, 1);
766 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
767 strncpy ((char *) sub->interface_name, (char *) s,
768 vec_len (sub->interface_name));
769 sub->sw_if_index = ntohl (mp->sw_if_index);
770 sub->sub_id = ntohl (mp->sub_id);
772 sub->sub_dot1ad = mp->sub_dot1ad;
773 sub->sub_number_of_tags = mp->sub_number_of_tags;
774 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
775 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
776 sub->sub_exact_match = mp->sub_exact_match;
777 sub->sub_default = mp->sub_default;
778 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
779 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
781 /* vlan tag rewrite */
782 sub->vtr_op = ntohl (mp->vtr_op);
783 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
784 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
785 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
789 static void vl_api_sw_interface_details_t_handler_json
790 (vl_api_sw_interface_details_t * mp)
792 vat_main_t *vam = &vat_main;
793 vat_json_node_t *node = NULL;
795 if (VAT_JSON_ARRAY != vam->json_tree.type)
797 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
798 vat_json_init_array (&vam->json_tree);
800 node = vat_json_array_add (&vam->json_tree);
802 vat_json_init_object (node);
803 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
804 vat_json_object_add_uint (node, "sup_sw_if_index",
805 ntohl (mp->sup_sw_if_index));
806 vat_json_object_add_uint (node, "l2_address_length",
807 ntohl (mp->l2_address_length));
808 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
809 sizeof (mp->l2_address));
810 vat_json_object_add_string_copy (node, "interface_name",
812 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
813 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
814 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
815 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
816 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
817 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
818 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
819 vat_json_object_add_uint (node, "sub_number_of_tags",
820 mp->sub_number_of_tags);
821 vat_json_object_add_uint (node, "sub_outer_vlan_id",
822 ntohs (mp->sub_outer_vlan_id));
823 vat_json_object_add_uint (node, "sub_inner_vlan_id",
824 ntohs (mp->sub_inner_vlan_id));
825 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
826 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
827 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
828 mp->sub_outer_vlan_id_any);
829 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
830 mp->sub_inner_vlan_id_any);
831 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
832 vat_json_object_add_uint (node, "vtr_push_dot1q",
833 ntohl (mp->vtr_push_dot1q));
834 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
835 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
838 static void vl_api_sw_interface_set_flags_t_handler
839 (vl_api_sw_interface_set_flags_t * mp)
841 vat_main_t *vam = &vat_main;
842 if (vam->interface_event_display)
843 errmsg ("interface flags: sw_if_index %d %s %s\n",
844 ntohl (mp->sw_if_index),
845 mp->admin_up_down ? "admin-up" : "admin-down",
846 mp->link_up_down ? "link-up" : "link-down");
849 static void vl_api_sw_interface_set_flags_t_handler_json
850 (vl_api_sw_interface_set_flags_t * mp)
852 /* JSON output not supported */
856 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
858 vat_main_t *vam = &vat_main;
859 i32 retval = ntohl (mp->retval);
861 vam->retval = retval;
862 vam->shmem_result = (u8 *) mp->reply_in_shmem;
863 vam->result_ready = 1;
867 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
869 vat_main_t *vam = &vat_main;
870 vat_json_node_t node;
871 api_main_t *am = &api_main;
875 vat_json_init_object (&node);
876 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
877 vat_json_object_add_uint (&node, "reply_in_shmem",
878 ntohl (mp->reply_in_shmem));
879 /* Toss the shared-memory original... */
880 pthread_mutex_lock (&am->vlib_rp->mutex);
881 oldheap = svm_push_data_heap (am->vlib_rp);
883 reply = (u8 *) (mp->reply_in_shmem);
886 svm_pop_heap (oldheap);
887 pthread_mutex_unlock (&am->vlib_rp->mutex);
889 vat_json_print (vam->ofp, &node);
890 vat_json_free (&node);
892 vam->retval = ntohl (mp->retval);
893 vam->result_ready = 1;
897 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
899 vat_main_t *vam = &vat_main;
900 i32 retval = ntohl (mp->retval);
902 vam->retval = retval;
903 vam->cmd_reply = mp->reply;
904 vam->result_ready = 1;
908 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
910 vat_main_t *vam = &vat_main;
911 vat_json_node_t node;
913 vat_json_init_object (&node);
914 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
915 vat_json_object_add_string_copy (&node, "reply", mp->reply);
917 vat_json_print (vam->ofp, &node);
918 vat_json_free (&node);
920 vam->retval = ntohl (mp->retval);
921 vam->result_ready = 1;
924 static void vl_api_classify_add_del_table_reply_t_handler
925 (vl_api_classify_add_del_table_reply_t * mp)
927 vat_main_t *vam = &vat_main;
928 i32 retval = ntohl (mp->retval);
931 vam->async_errors += (retval < 0);
935 vam->retval = retval;
937 ((mp->new_table_index != 0xFFFFFFFF) ||
938 (mp->skip_n_vectors != 0xFFFFFFFF) ||
939 (mp->match_n_vectors != 0xFFFFFFFF)))
941 * Note: this is just barely thread-safe, depends on
942 * the main thread spinning waiting for an answer...
944 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
945 ntohl (mp->new_table_index),
946 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
947 vam->result_ready = 1;
951 static void vl_api_classify_add_del_table_reply_t_handler_json
952 (vl_api_classify_add_del_table_reply_t * mp)
954 vat_main_t *vam = &vat_main;
955 vat_json_node_t node;
957 vat_json_init_object (&node);
958 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
959 vat_json_object_add_uint (&node, "new_table_index",
960 ntohl (mp->new_table_index));
961 vat_json_object_add_uint (&node, "skip_n_vectors",
962 ntohl (mp->skip_n_vectors));
963 vat_json_object_add_uint (&node, "match_n_vectors",
964 ntohl (mp->match_n_vectors));
966 vat_json_print (vam->ofp, &node);
967 vat_json_free (&node);
969 vam->retval = ntohl (mp->retval);
970 vam->result_ready = 1;
973 static void vl_api_get_node_index_reply_t_handler
974 (vl_api_get_node_index_reply_t * mp)
976 vat_main_t *vam = &vat_main;
977 i32 retval = ntohl (mp->retval);
980 vam->async_errors += (retval < 0);
984 vam->retval = retval;
986 errmsg ("node index %d\n", ntohl (mp->node_index));
987 vam->result_ready = 1;
991 static void vl_api_get_node_index_reply_t_handler_json
992 (vl_api_get_node_index_reply_t * mp)
994 vat_main_t *vam = &vat_main;
995 vat_json_node_t node;
997 vat_json_init_object (&node);
998 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
999 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1001 vat_json_print (vam->ofp, &node);
1002 vat_json_free (&node);
1004 vam->retval = ntohl (mp->retval);
1005 vam->result_ready = 1;
1008 static void vl_api_get_next_index_reply_t_handler
1009 (vl_api_get_next_index_reply_t * mp)
1011 vat_main_t *vam = &vat_main;
1012 i32 retval = ntohl (mp->retval);
1013 if (vam->async_mode)
1015 vam->async_errors += (retval < 0);
1019 vam->retval = retval;
1021 errmsg ("next node index %d\n", ntohl (mp->next_index));
1022 vam->result_ready = 1;
1026 static void vl_api_get_next_index_reply_t_handler_json
1027 (vl_api_get_next_index_reply_t * mp)
1029 vat_main_t *vam = &vat_main;
1030 vat_json_node_t node;
1032 vat_json_init_object (&node);
1033 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1034 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1036 vat_json_print (vam->ofp, &node);
1037 vat_json_free (&node);
1039 vam->retval = ntohl (mp->retval);
1040 vam->result_ready = 1;
1043 static void vl_api_add_node_next_reply_t_handler
1044 (vl_api_add_node_next_reply_t * mp)
1046 vat_main_t *vam = &vat_main;
1047 i32 retval = ntohl (mp->retval);
1048 if (vam->async_mode)
1050 vam->async_errors += (retval < 0);
1054 vam->retval = retval;
1056 errmsg ("next index %d\n", ntohl (mp->next_index));
1057 vam->result_ready = 1;
1061 static void vl_api_add_node_next_reply_t_handler_json
1062 (vl_api_add_node_next_reply_t * mp)
1064 vat_main_t *vam = &vat_main;
1065 vat_json_node_t node;
1067 vat_json_init_object (&node);
1068 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1069 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1071 vat_json_print (vam->ofp, &node);
1072 vat_json_free (&node);
1074 vam->retval = ntohl (mp->retval);
1075 vam->result_ready = 1;
1078 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
1079 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1081 vat_main_t *vam = &vat_main;
1082 i32 retval = ntohl (mp->retval);
1083 u32 sw_if_index = ntohl (mp->tunnel_sw_if_index);
1085 if (retval >= 0 && sw_if_index != (u32) ~ 0)
1087 errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
1089 vam->retval = retval;
1090 vam->result_ready = 1;
1093 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
1094 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1096 vat_main_t *vam = &vat_main;
1097 vat_json_node_t node;
1099 vat_json_init_object (&node);
1100 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1101 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1102 ntohl (mp->tunnel_sw_if_index));
1104 vat_json_print (vam->ofp, &node);
1105 vat_json_free (&node);
1107 vam->retval = ntohl (mp->retval);
1108 vam->result_ready = 1;
1112 static void vl_api_show_version_reply_t_handler
1113 (vl_api_show_version_reply_t * mp)
1115 vat_main_t *vam = &vat_main;
1116 i32 retval = ntohl (mp->retval);
1120 errmsg (" program: %s\n", mp->program);
1121 errmsg (" version: %s\n", mp->version);
1122 errmsg (" build date: %s\n", mp->build_date);
1123 errmsg ("build directory: %s\n", mp->build_directory);
1125 vam->retval = retval;
1126 vam->result_ready = 1;
1129 static void vl_api_show_version_reply_t_handler_json
1130 (vl_api_show_version_reply_t * mp)
1132 vat_main_t *vam = &vat_main;
1133 vat_json_node_t node;
1135 vat_json_init_object (&node);
1136 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1137 vat_json_object_add_string_copy (&node, "program", mp->program);
1138 vat_json_object_add_string_copy (&node, "version", mp->version);
1139 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1140 vat_json_object_add_string_copy (&node, "build_directory",
1141 mp->build_directory);
1143 vat_json_print (vam->ofp, &node);
1144 vat_json_free (&node);
1146 vam->retval = ntohl (mp->retval);
1147 vam->result_ready = 1;
1151 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1153 vat_main_t *vam = &vat_main;
1154 errmsg ("arp %s event: address %U new mac %U sw_if_index %d\n",
1155 mp->mac_ip ? "mac/ip binding" : "address resolution",
1156 format_ip4_address, &mp->address,
1157 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1161 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1163 /* JSON output not supported */
1167 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1169 vat_main_t *vam = &vat_main;
1170 errmsg ("ip6 nd %s event: address %U new mac %U sw_if_index %d\n",
1171 mp->mac_ip ? "mac/ip binding" : "address resolution",
1172 format_ip6_address, mp->address,
1173 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1177 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1179 /* JSON output not supported */
1183 * Special-case: build the bridge domain table, maintain
1184 * the next bd id vbl.
1186 static void vl_api_bridge_domain_details_t_handler
1187 (vl_api_bridge_domain_details_t * mp)
1189 vat_main_t *vam = &vat_main;
1190 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1192 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1193 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1195 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1196 ntohl (mp->bd_id), mp->learn, mp->forward,
1197 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1200 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1204 static void vl_api_bridge_domain_details_t_handler_json
1205 (vl_api_bridge_domain_details_t * mp)
1207 vat_main_t *vam = &vat_main;
1208 vat_json_node_t *node, *array = NULL;
1210 if (VAT_JSON_ARRAY != vam->json_tree.type)
1212 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1213 vat_json_init_array (&vam->json_tree);
1215 node = vat_json_array_add (&vam->json_tree);
1217 vat_json_init_object (node);
1218 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1219 vat_json_object_add_uint (node, "flood", mp->flood);
1220 vat_json_object_add_uint (node, "forward", mp->forward);
1221 vat_json_object_add_uint (node, "learn", mp->learn);
1222 vat_json_object_add_uint (node, "bvi_sw_if_index",
1223 ntohl (mp->bvi_sw_if_index));
1224 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1225 array = vat_json_object_add (node, "sw_if");
1226 vat_json_init_array (array);
1230 * Special-case: build the bridge domain sw if table.
1232 static void vl_api_bridge_domain_sw_if_details_t_handler
1233 (vl_api_bridge_domain_sw_if_details_t * mp)
1235 vat_main_t *vam = &vat_main;
1240 sw_if_index = ntohl (mp->sw_if_index);
1242 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1244 if ((u32) p->value[0] == sw_if_index)
1246 sw_if_name = (u8 *)(p->key);
1252 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1253 mp->shg, sw_if_name ? (char *) sw_if_name :
1254 "sw_if_index not found!");
1257 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1258 (vl_api_bridge_domain_sw_if_details_t * mp)
1260 vat_main_t *vam = &vat_main;
1261 vat_json_node_t *node = NULL;
1262 uword last_index = 0;
1264 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1265 ASSERT (vec_len (vam->json_tree.array) >= 1);
1266 last_index = vec_len (vam->json_tree.array) - 1;
1267 node = &vam->json_tree.array[last_index];
1268 node = vat_json_object_get_element (node, "sw_if");
1269 ASSERT (NULL != node);
1270 node = vat_json_array_add (node);
1272 vat_json_init_object (node);
1273 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1274 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1275 vat_json_object_add_uint (node, "shg", mp->shg);
1278 static void vl_api_control_ping_reply_t_handler
1279 (vl_api_control_ping_reply_t * mp)
1281 vat_main_t *vam = &vat_main;
1282 i32 retval = ntohl (mp->retval);
1283 if (vam->async_mode)
1285 vam->async_errors += (retval < 0);
1289 vam->retval = retval;
1290 vam->result_ready = 1;
1294 static void vl_api_control_ping_reply_t_handler_json
1295 (vl_api_control_ping_reply_t * mp)
1297 vat_main_t *vam = &vat_main;
1298 i32 retval = ntohl (mp->retval);
1300 if (VAT_JSON_NONE != vam->json_tree.type)
1302 vat_json_print (vam->ofp, &vam->json_tree);
1303 vat_json_free (&vam->json_tree);
1304 vam->json_tree.type = VAT_JSON_NONE;
1309 vat_json_init_array (&vam->json_tree);
1310 vat_json_print (vam->ofp, &vam->json_tree);
1311 vam->json_tree.type = VAT_JSON_NONE;
1314 vam->retval = retval;
1315 vam->result_ready = 1;
1318 static void vl_api_noprint_control_ping_reply_t_handler
1319 (vl_api_noprint_control_ping_reply_t * mp)
1321 vat_main_t *vam = &vat_main;
1322 i32 retval = ntohl (mp->retval);
1323 if (vam->async_mode)
1325 vam->async_errors += (retval < 0);
1329 vam->retval = retval;
1330 vam->result_ready = 1;
1334 static void vl_api_noprint_control_ping_reply_t_handler_json
1335 (vl_api_noprint_control_ping_reply_t * mp)
1337 vat_main_t *vam = &vat_main;
1338 i32 retval = ntohl (mp->retval);
1340 if (vam->noprint_msg)
1342 vam->retval = retval;
1343 vam->result_ready = 1;
1347 if (VAT_JSON_NONE != vam->json_tree.type)
1349 vat_json_print (vam->ofp, &vam->json_tree);
1350 vat_json_free (&vam->json_tree);
1351 vam->json_tree.type = VAT_JSON_NONE;
1356 vat_json_init_array (&vam->json_tree);
1357 vat_json_print (vam->ofp, &vam->json_tree);
1358 vam->json_tree.type = VAT_JSON_NONE;
1361 vam->retval = retval;
1362 vam->result_ready = 1;
1366 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1368 vat_main_t *vam = &vat_main;
1369 i32 retval = ntohl (mp->retval);
1370 if (vam->async_mode)
1372 vam->async_errors += (retval < 0);
1376 vam->retval = retval;
1377 vam->result_ready = 1;
1381 static void vl_api_l2_flags_reply_t_handler_json
1382 (vl_api_l2_flags_reply_t * mp)
1384 vat_main_t *vam = &vat_main;
1385 vat_json_node_t node;
1387 vat_json_init_object (&node);
1388 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1389 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1390 ntohl (mp->resulting_feature_bitmap));
1392 vat_json_print (vam->ofp, &node);
1393 vat_json_free (&node);
1395 vam->retval = ntohl (mp->retval);
1396 vam->result_ready = 1;
1399 static void vl_api_bridge_flags_reply_t_handler
1400 (vl_api_bridge_flags_reply_t * mp)
1402 vat_main_t *vam = &vat_main;
1403 i32 retval = ntohl (mp->retval);
1404 if (vam->async_mode)
1406 vam->async_errors += (retval < 0);
1410 vam->retval = retval;
1411 vam->result_ready = 1;
1415 static void vl_api_bridge_flags_reply_t_handler_json
1416 (vl_api_bridge_flags_reply_t * mp)
1418 vat_main_t *vam = &vat_main;
1419 vat_json_node_t node;
1421 vat_json_init_object (&node);
1422 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1423 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1424 ntohl (mp->resulting_feature_bitmap));
1426 vat_json_print (vam->ofp, &node);
1427 vat_json_free (&node);
1429 vam->retval = ntohl (mp->retval);
1430 vam->result_ready = 1;
1433 static void vl_api_tap_connect_reply_t_handler
1434 (vl_api_tap_connect_reply_t * mp)
1436 vat_main_t *vam = &vat_main;
1437 i32 retval = ntohl (mp->retval);
1438 if (vam->async_mode)
1440 vam->async_errors += (retval < 0);
1444 vam->retval = retval;
1445 vam->sw_if_index = ntohl (mp->sw_if_index);
1446 vam->result_ready = 1;
1451 static void vl_api_tap_connect_reply_t_handler_json
1452 (vl_api_tap_connect_reply_t * mp)
1454 vat_main_t *vam = &vat_main;
1455 vat_json_node_t node;
1457 vat_json_init_object (&node);
1458 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1459 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1461 vat_json_print (vam->ofp, &node);
1462 vat_json_free (&node);
1464 vam->retval = ntohl (mp->retval);
1465 vam->result_ready = 1;
1470 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1472 vat_main_t *vam = &vat_main;
1473 i32 retval = ntohl (mp->retval);
1474 if (vam->async_mode)
1476 vam->async_errors += (retval < 0);
1480 vam->retval = retval;
1481 vam->sw_if_index = ntohl (mp->sw_if_index);
1482 vam->result_ready = 1;
1486 static void vl_api_tap_modify_reply_t_handler_json
1487 (vl_api_tap_modify_reply_t * mp)
1489 vat_main_t *vam = &vat_main;
1490 vat_json_node_t node;
1492 vat_json_init_object (&node);
1493 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1494 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1496 vat_json_print (vam->ofp, &node);
1497 vat_json_free (&node);
1499 vam->retval = ntohl (mp->retval);
1500 vam->result_ready = 1;
1504 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1506 vat_main_t *vam = &vat_main;
1507 i32 retval = ntohl (mp->retval);
1508 if (vam->async_mode)
1510 vam->async_errors += (retval < 0);
1514 vam->retval = retval;
1515 vam->result_ready = 1;
1519 static void vl_api_tap_delete_reply_t_handler_json
1520 (vl_api_tap_delete_reply_t * mp)
1522 vat_main_t *vam = &vat_main;
1523 vat_json_node_t node;
1525 vat_json_init_object (&node);
1526 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1528 vat_json_print (vam->ofp, &node);
1529 vat_json_free (&node);
1531 vam->retval = ntohl (mp->retval);
1532 vam->result_ready = 1;
1535 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1536 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1538 vat_main_t *vam = &vat_main;
1539 i32 retval = ntohl (mp->retval);
1540 if (vam->async_mode)
1542 vam->async_errors += (retval < 0);
1546 vam->retval = retval;
1547 vam->result_ready = 1;
1551 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1552 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1554 vat_main_t *vam = &vat_main;
1555 vat_json_node_t node;
1557 vat_json_init_object (&node);
1558 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1559 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1560 ntohl (mp->tunnel_sw_if_index));
1562 vat_json_print (vam->ofp, &node);
1563 vat_json_free (&node);
1565 vam->retval = ntohl (mp->retval);
1566 vam->result_ready = 1;
1569 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1570 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1572 vat_main_t *vam = &vat_main;
1573 i32 retval = ntohl (mp->retval);
1574 if (vam->async_mode)
1576 vam->async_errors += (retval < 0);
1580 vam->retval = retval;
1581 vam->sw_if_index = ntohl (mp->sw_if_index);
1582 vam->result_ready = 1;
1586 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1587 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1589 vat_main_t *vam = &vat_main;
1590 vat_json_node_t node;
1592 vat_json_init_object (&node);
1593 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1594 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1596 vat_json_print (vam->ofp, &node);
1597 vat_json_free (&node);
1599 vam->retval = ntohl (mp->retval);
1600 vam->result_ready = 1;
1604 static void vl_api_lisp_add_del_locator_set_reply_t_handler
1605 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1607 vat_main_t *vam = &vat_main;
1608 i32 retval = ntohl (mp->retval);
1609 if (vam->async_mode)
1611 vam->async_errors += (retval < 0);
1615 vam->retval = retval;
1616 vam->result_ready = 1;
1620 static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1621 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1623 vat_main_t *vam = &vat_main;
1624 vat_json_node_t node;
1626 vat_json_init_object (&node);
1627 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1628 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1630 vat_json_print (vam->ofp, &node);
1631 vat_json_free (&node);
1633 vam->retval = ntohl (mp->retval);
1634 vam->result_ready = 1;
1637 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1638 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1640 vat_main_t *vam = &vat_main;
1641 i32 retval = ntohl (mp->retval);
1642 if (vam->async_mode)
1644 vam->async_errors += (retval < 0);
1648 vam->retval = retval;
1649 vam->sw_if_index = ntohl (mp->sw_if_index);
1650 vam->result_ready = 1;
1654 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1655 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1657 vat_main_t *vam = &vat_main;
1658 vat_json_node_t node;
1660 vat_json_init_object (&node);
1661 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1662 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1664 vat_json_print (vam->ofp, &node);
1665 vat_json_free (&node);
1667 vam->retval = ntohl (mp->retval);
1668 vam->result_ready = 1;
1671 static void vl_api_gre_add_del_tunnel_reply_t_handler
1672 (vl_api_gre_add_del_tunnel_reply_t * mp)
1674 vat_main_t *vam = &vat_main;
1675 i32 retval = ntohl (mp->retval);
1676 if (vam->async_mode)
1678 vam->async_errors += (retval < 0);
1682 vam->retval = retval;
1683 vam->sw_if_index = ntohl (mp->sw_if_index);
1684 vam->result_ready = 1;
1688 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1689 (vl_api_gre_add_del_tunnel_reply_t * mp)
1691 vat_main_t *vam = &vat_main;
1692 vat_json_node_t node;
1694 vat_json_init_object (&node);
1695 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1696 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1698 vat_json_print (vam->ofp, &node);
1699 vat_json_free (&node);
1701 vam->retval = ntohl (mp->retval);
1702 vam->result_ready = 1;
1705 static void vl_api_create_vhost_user_if_reply_t_handler
1706 (vl_api_create_vhost_user_if_reply_t * mp)
1708 vat_main_t *vam = &vat_main;
1709 i32 retval = ntohl (mp->retval);
1710 if (vam->async_mode)
1712 vam->async_errors += (retval < 0);
1716 vam->retval = retval;
1717 vam->sw_if_index = ntohl (mp->sw_if_index);
1718 vam->result_ready = 1;
1722 static void vl_api_create_vhost_user_if_reply_t_handler_json
1723 (vl_api_create_vhost_user_if_reply_t * mp)
1725 vat_main_t *vam = &vat_main;
1726 vat_json_node_t node;
1728 vat_json_init_object (&node);
1729 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1730 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1732 vat_json_print (vam->ofp, &node);
1733 vat_json_free (&node);
1735 vam->retval = ntohl (mp->retval);
1736 vam->result_ready = 1;
1739 static void vl_api_ip_address_details_t_handler
1740 (vl_api_ip_address_details_t * mp)
1742 vat_main_t *vam = &vat_main;
1743 static ip_address_details_t empty_ip_address_details = { {0} };
1744 ip_address_details_t *address = NULL;
1745 ip_details_t *current_ip_details = NULL;
1746 ip_details_t *details = NULL;
1748 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1750 if (!details || vam->current_sw_if_index >= vec_len (details)
1751 || !details[vam->current_sw_if_index].present)
1753 errmsg ("ip address details arrived but not stored\n");
1754 errmsg ("ip_dump should be called first\n");
1758 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1760 #define addresses (current_ip_details->addr)
1762 vec_validate_init_empty (addresses, vec_len (addresses),
1763 empty_ip_address_details);
1765 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1767 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1768 address->prefix_length = mp->prefix_length;
1772 static void vl_api_ip_address_details_t_handler_json
1773 (vl_api_ip_address_details_t * mp)
1775 vat_main_t *vam = &vat_main;
1776 vat_json_node_t *node = NULL;
1777 struct in6_addr ip6;
1780 if (VAT_JSON_ARRAY != vam->json_tree.type)
1782 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1783 vat_json_init_array (&vam->json_tree);
1785 node = vat_json_array_add (&vam->json_tree);
1787 vat_json_init_object (node);
1790 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1791 vat_json_object_add_ip6 (node, "ip", ip6);
1795 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1796 vat_json_object_add_ip4 (node, "ip", ip4);
1798 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1802 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1804 vat_main_t *vam = &vat_main;
1805 static ip_details_t empty_ip_details = { 0 };
1806 ip_details_t *ip = NULL;
1807 u32 sw_if_index = ~0;
1809 sw_if_index = ntohl (mp->sw_if_index);
1811 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1812 sw_if_index, empty_ip_details);
1814 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1821 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1823 vat_main_t *vam = &vat_main;
1825 if (VAT_JSON_ARRAY != vam->json_tree.type)
1827 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1828 vat_json_init_array (&vam->json_tree);
1830 vat_json_array_add_uint (&vam->json_tree,
1831 clib_net_to_host_u32 (mp->sw_if_index));
1834 static void vl_api_map_domain_details_t_handler_json
1835 (vl_api_map_domain_details_t * mp)
1837 vat_json_node_t *node = NULL;
1838 vat_main_t *vam = &vat_main;
1839 struct in6_addr ip6;
1842 if (VAT_JSON_ARRAY != vam->json_tree.type)
1844 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1845 vat_json_init_array (&vam->json_tree);
1848 node = vat_json_array_add (&vam->json_tree);
1849 vat_json_init_object (node);
1851 vat_json_object_add_uint (node, "domain_index",
1852 clib_net_to_host_u32 (mp->domain_index));
1853 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1854 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1855 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1856 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1857 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1858 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1859 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1860 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1861 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1862 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1863 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1864 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1865 vat_json_object_add_uint (node, "flags", mp->flags);
1866 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1867 vat_json_object_add_int (node, "is_translation", mp->is_translation);
1870 static void vl_api_map_domain_details_t_handler
1871 (vl_api_map_domain_details_t * mp)
1873 vat_main_t *vam = &vat_main;
1875 if (mp->is_translation)
1878 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1879 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1880 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1881 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1882 clib_net_to_host_u32 (mp->domain_index));
1887 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1888 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1889 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1890 format_ip6_address, mp->ip6_src,
1891 clib_net_to_host_u32 (mp->domain_index));
1893 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1894 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1895 mp->is_translation ? "map-t" : "");
1898 static void vl_api_map_rule_details_t_handler_json
1899 (vl_api_map_rule_details_t * mp)
1901 struct in6_addr ip6;
1902 vat_json_node_t *node = NULL;
1903 vat_main_t *vam = &vat_main;
1905 if (VAT_JSON_ARRAY != vam->json_tree.type)
1907 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1908 vat_json_init_array (&vam->json_tree);
1911 node = vat_json_array_add (&vam->json_tree);
1912 vat_json_init_object (node);
1914 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
1915 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1916 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
1920 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
1922 vat_main_t *vam = &vat_main;
1923 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1924 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
1928 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
1930 vat_main_t *vam = &vat_main;
1931 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1932 "router_addr %U host_mac %U\n",
1933 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1934 format_ip4_address, &mp->host_address,
1935 format_ip4_address, &mp->router_address,
1936 format_ethernet_address, mp->host_mac);
1939 static void vl_api_dhcp_compl_event_t_handler_json
1940 (vl_api_dhcp_compl_event_t * mp)
1942 /* JSON output not supported */
1946 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1949 vat_main_t *vam = &vat_main;
1950 static u64 default_counter = 0;
1952 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1954 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1955 sw_if_index, default_counter);
1956 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1960 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1961 interface_counter_t counter)
1963 vat_main_t *vam = &vat_main;
1964 static interface_counter_t default_counter = { 0, };
1966 vec_validate_init_empty (vam->combined_interface_counters,
1967 vnet_counter_type, NULL);
1968 vec_validate_init_empty (vam->combined_interface_counters
1969 [vnet_counter_type], sw_if_index, default_counter);
1970 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1973 static void vl_api_vnet_interface_counters_t_handler
1974 (vl_api_vnet_interface_counters_t * mp)
1979 static void vl_api_vnet_interface_counters_t_handler_json
1980 (vl_api_vnet_interface_counters_t * mp)
1982 interface_counter_t counter;
1987 u32 first_sw_if_index;
1990 count = ntohl (mp->count);
1991 first_sw_if_index = ntohl (mp->first_sw_if_index);
1993 if (!mp->is_combined)
1995 v_packets = (u64 *) & mp->data;
1996 for (i = 0; i < count; i++)
1999 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
2000 set_simple_interface_counter (mp->vnet_counter_type,
2001 first_sw_if_index + i, packets);
2007 v = (vlib_counter_t *) & mp->data;
2008 for (i = 0; i < count; i++)
2011 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
2013 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
2014 set_combined_interface_counter (mp->vnet_counter_type,
2015 first_sw_if_index + i, counter);
2022 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2024 vat_main_t *vam = &vat_main;
2027 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
2029 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
2038 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2040 vat_main_t *vam = &vat_main;
2043 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2045 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2053 static void vl_api_vnet_ip4_fib_counters_t_handler
2054 (vl_api_vnet_ip4_fib_counters_t * mp)
2059 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2060 (vl_api_vnet_ip4_fib_counters_t * mp)
2062 vat_main_t *vam = &vat_main;
2063 vl_api_ip4_fib_counter_t *v;
2064 ip4_fib_counter_t *counter;
2071 vrf_id = ntohl (mp->vrf_id);
2072 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2073 if (~0 == vrf_index)
2075 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2076 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2077 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2078 vec_validate (vam->ip4_fib_counters, vrf_index);
2079 vam->ip4_fib_counters[vrf_index] = NULL;
2082 vec_free (vam->ip4_fib_counters[vrf_index]);
2083 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2084 count = ntohl (mp->count);
2085 for (i = 0; i < count; i++)
2087 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2088 counter = &vam->ip4_fib_counters[vrf_index][i];
2089 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2090 counter->address = ip4;
2091 counter->address_length = v->address_length;
2092 counter->packets = clib_net_to_host_u64 (v->packets);
2093 counter->bytes = clib_net_to_host_u64 (v->bytes);
2098 static void vl_api_vnet_ip6_fib_counters_t_handler
2099 (vl_api_vnet_ip6_fib_counters_t * mp)
2104 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2105 (vl_api_vnet_ip6_fib_counters_t * mp)
2107 vat_main_t *vam = &vat_main;
2108 vl_api_ip6_fib_counter_t *v;
2109 ip6_fib_counter_t *counter;
2110 struct in6_addr ip6;
2116 vrf_id = ntohl (mp->vrf_id);
2117 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2118 if (~0 == vrf_index)
2120 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2121 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2122 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2123 vec_validate (vam->ip6_fib_counters, vrf_index);
2124 vam->ip6_fib_counters[vrf_index] = NULL;
2127 vec_free (vam->ip6_fib_counters[vrf_index]);
2128 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2129 count = ntohl (mp->count);
2130 for (i = 0; i < count; i++)
2132 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2133 counter = &vam->ip6_fib_counters[vrf_index][i];
2134 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2135 counter->address = ip6;
2136 counter->address_length = v->address_length;
2137 counter->packets = clib_net_to_host_u64 (v->packets);
2138 counter->bytes = clib_net_to_host_u64 (v->bytes);
2143 static void vl_api_get_first_msg_id_reply_t_handler
2144 (vl_api_get_first_msg_id_reply_t * mp)
2146 vat_main_t *vam = &vat_main;
2147 i32 retval = ntohl (mp->retval);
2149 if (vam->async_mode)
2151 vam->async_errors += (retval < 0);
2155 vam->retval = retval;
2156 vam->result_ready = 1;
2160 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
2164 static void vl_api_get_first_msg_id_reply_t_handler_json
2165 (vl_api_get_first_msg_id_reply_t * mp)
2167 vat_main_t *vam = &vat_main;
2168 vat_json_node_t node;
2170 vat_json_init_object (&node);
2171 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2172 vat_json_object_add_uint (&node, "first_msg_id",
2173 (uint) ntohs (mp->first_msg_id));
2175 vat_json_print (vam->ofp, &node);
2176 vat_json_free (&node);
2178 vam->retval = ntohl (mp->retval);
2179 vam->result_ready = 1;
2182 static void vl_api_get_node_graph_reply_t_handler
2183 (vl_api_get_node_graph_reply_t * mp)
2185 vat_main_t *vam = &vat_main;
2186 api_main_t *am = &api_main;
2187 i32 retval = ntohl (mp->retval);
2188 u8 *pvt_copy, *reply;
2193 if (vam->async_mode)
2195 vam->async_errors += (retval < 0);
2199 vam->retval = retval;
2200 vam->result_ready = 1;
2203 /* "Should never happen..." */
2207 reply = (u8 *) (mp->reply_in_shmem);
2208 pvt_copy = vec_dup (reply);
2210 /* Toss the shared-memory original... */
2211 pthread_mutex_lock (&am->vlib_rp->mutex);
2212 oldheap = svm_push_data_heap (am->vlib_rp);
2216 svm_pop_heap (oldheap);
2217 pthread_mutex_unlock (&am->vlib_rp->mutex);
2219 if (vam->graph_nodes)
2221 hash_free (vam->graph_node_index_by_name);
2223 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2225 node = vam->graph_nodes[i];
2226 vec_free (node->name);
2227 vec_free (node->next_nodes);
2230 vec_free (vam->graph_nodes);
2233 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2234 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2235 vec_free (pvt_copy);
2237 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2239 node = vam->graph_nodes[i];
2240 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2244 static void vl_api_get_node_graph_reply_t_handler_json
2245 (vl_api_get_node_graph_reply_t * mp)
2247 vat_main_t *vam = &vat_main;
2248 api_main_t *am = &api_main;
2250 vat_json_node_t node;
2253 /* $$$$ make this real? */
2254 vat_json_init_object (&node);
2255 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2256 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2258 reply = (u8 *) (mp->reply_in_shmem);
2260 /* Toss the shared-memory original... */
2261 pthread_mutex_lock (&am->vlib_rp->mutex);
2262 oldheap = svm_push_data_heap (am->vlib_rp);
2266 svm_pop_heap (oldheap);
2267 pthread_mutex_unlock (&am->vlib_rp->mutex);
2269 vat_json_print (vam->ofp, &node);
2270 vat_json_free (&node);
2272 vam->retval = ntohl (mp->retval);
2273 vam->result_ready = 1;
2277 vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
2279 vat_main_t *vam = &vat_main;
2283 memset (&loc, 0, sizeof (loc));
2284 if (vam->noprint_msg)
2286 loc.local = mp->local;
2287 loc.priority = mp->priority;
2288 loc.weight = mp->weight;
2291 loc.sw_if_index = ntohl (mp->sw_if_index);
2295 loc.is_ipv6 = mp->is_ipv6;
2296 clib_memcpy (loc.ip_address, mp->ip_address,
2297 sizeof (loc.ip_address));
2299 vec_add1 (vam->locator_msg, loc);
2305 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
2306 ntohl (mp->sw_if_index),
2307 mp->priority, mp->weight);
2311 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
2312 mp->is_ipv6 ? format_ip6_address :
2314 mp->ip_address, mp->priority, mp->weight);
2317 fformat (vam->ofp, "%s", tmp_str);
2324 vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2327 vat_main_t *vam = &vat_main;
2328 vat_json_node_t *node = NULL;
2330 struct in6_addr ip6;
2333 memset (&loc, 0, sizeof (loc));
2334 if (vam->noprint_msg)
2336 loc.local = mp->local;
2337 loc.priority = mp->priority;
2338 loc.weight = mp->weight;
2341 loc.sw_if_index = ntohl (mp->sw_if_index);
2345 loc.is_ipv6 = mp->is_ipv6;
2346 clib_memcpy (loc.ip_address, mp->ip_address,
2347 sizeof (loc.ip_address));
2349 vec_add1 (vam->locator_msg, loc);
2353 if (VAT_JSON_ARRAY != vam->json_tree.type)
2355 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2356 vat_json_init_array (&vam->json_tree);
2358 node = vat_json_array_add (&vam->json_tree);
2360 vat_json_init_object (node);
2364 vat_json_object_add_uint (node, "locator_index",
2365 ntohl (mp->sw_if_index));
2371 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2372 vat_json_object_add_ip6 (node, "locator", ip6);
2376 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2377 vat_json_object_add_ip4 (node, "locator", ip4);
2380 vat_json_object_add_uint (node, "priority", mp->priority);
2381 vat_json_object_add_uint (node, "weight", mp->weight);
2385 vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2388 vat_main_t *vam = &vat_main;
2389 locator_set_msg_t ls;
2391 ls.locator_set_index = ntohl (mp->locator_set_index);
2392 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2393 vec_add1 (vam->locator_set_msg, ls);
2397 vl_api_lisp_locator_set_details_t_handler_json
2398 (vl_api_lisp_locator_set_details_t * mp)
2400 vat_main_t *vam = &vat_main;
2401 locator_set_msg_t ls;
2403 ls.locator_set_index = ntohl (mp->locator_set_index);
2404 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2405 vec_add1 (vam->locator_set_msg, ls);
2409 add_lisp_eid_table_entry (vat_main_t * vam,
2410 vl_api_lisp_eid_table_details_t * mp)
2412 eid_table_t eid_table;
2414 memset (&eid_table, 0, sizeof (eid_table));
2415 eid_table.is_local = mp->is_local;
2416 eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index);
2417 eid_table.eid_type = mp->eid_type;
2418 eid_table.vni = clib_net_to_host_u32 (mp->vni);
2419 eid_table.eid_prefix_len = mp->eid_prefix_len;
2420 eid_table.ttl = clib_net_to_host_u32 (mp->ttl);
2421 eid_table.action = mp->action;
2422 eid_table.authoritative = mp->authoritative;
2423 clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
2424 vec_add1 (vam->eid_tables, eid_table);
2428 vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2430 vat_main_t *vam = &vat_main;
2431 add_lisp_eid_table_entry (vam, mp);
2435 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2438 vat_main_t *vam = &vat_main;
2439 add_lisp_eid_table_entry (vam, mp);
2443 vl_api_lisp_eid_table_map_details_t_handler
2444 (vl_api_lisp_eid_table_map_details_t * mp)
2446 vat_main_t *vam = &vat_main;
2448 u8 *line = format (0, "%=10d%=10d",
2449 clib_net_to_host_u32 (mp->vni),
2450 clib_net_to_host_u32 (mp->dp_table));
2451 fformat (vam->ofp, "%v\n", line);
2456 vl_api_lisp_eid_table_map_details_t_handler_json
2457 (vl_api_lisp_eid_table_map_details_t * mp)
2459 vat_main_t *vam = &vat_main;
2460 vat_json_node_t *node = NULL;
2462 if (VAT_JSON_ARRAY != vam->json_tree.type)
2464 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2465 vat_json_init_array (&vam->json_tree);
2467 node = vat_json_array_add (&vam->json_tree);
2468 vat_json_init_object (node);
2469 vat_json_object_add_uint (node, "dp_table",
2470 clib_net_to_host_u32 (mp->dp_table));
2471 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2475 vl_api_lisp_eid_table_vni_details_t_handler
2476 (vl_api_lisp_eid_table_vni_details_t * mp)
2478 vat_main_t *vam = &vat_main;
2480 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2481 fformat (vam->ofp, "%v\n", line);
2486 vl_api_lisp_eid_table_vni_details_t_handler_json
2487 (vl_api_lisp_eid_table_vni_details_t * mp)
2489 vat_main_t *vam = &vat_main;
2490 vat_json_node_t *node = NULL;
2492 if (VAT_JSON_ARRAY != vam->json_tree.type)
2494 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2495 vat_json_init_array (&vam->json_tree);
2497 node = vat_json_array_add (&vam->json_tree);
2498 vat_json_init_object (node);
2499 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2503 format_decap_next (u8 * s, va_list * args)
2505 u32 next_index = va_arg (*args, u32);
2509 case LISP_GPE_INPUT_NEXT_DROP:
2510 return format (s, "drop");
2511 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2512 return format (s, "ip4");
2513 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2514 return format (s, "ip6");
2516 return format (s, "unknown %d", next_index);
2522 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2525 vat_main_t *vam = &vat_main;
2527 u8 *flag_str = NULL;
2529 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
2531 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2532 foreach_lisp_gpe_flag_bit;
2535 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2536 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2538 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2540 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2542 ntohl (mp->encap_fib_id),
2543 ntohl (mp->decap_fib_id),
2544 format_decap_next, ntohl (mp->dcap_next),
2546 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
2552 vl_api_lisp_gpe_tunnel_details_t_handler_json
2553 (vl_api_lisp_gpe_tunnel_details_t * mp)
2555 vat_main_t *vam = &vat_main;
2556 vat_json_node_t *node = NULL;
2557 struct in6_addr ip6;
2561 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
2563 if (VAT_JSON_ARRAY != vam->json_tree.type)
2565 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2566 vat_json_init_array (&vam->json_tree);
2568 node = vat_json_array_add (&vam->json_tree);
2570 vat_json_init_object (node);
2571 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2574 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2575 vat_json_object_add_ip6 (node, "source address", ip6);
2576 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2577 vat_json_object_add_ip6 (node, "destination address", ip6);
2581 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2582 vat_json_object_add_ip4 (node, "source address", ip4);
2583 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2584 vat_json_object_add_ip4 (node, "destination address", ip4);
2586 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2587 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2588 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2589 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2590 vat_json_object_add_uint (node, "flags", mp->flags);
2591 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2592 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2593 vat_json_object_add_uint (node, "res", mp->res);
2594 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
2596 vec_free (next_decap_str);
2600 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2603 vat_main_t *vam = &vat_main;
2605 fformat (vam->ofp, "%=20U\n",
2606 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2611 vl_api_lisp_map_resolver_details_t_handler_json
2612 (vl_api_lisp_map_resolver_details_t * mp)
2614 vat_main_t *vam = &vat_main;
2615 vat_json_node_t *node = NULL;
2616 struct in6_addr ip6;
2619 if (VAT_JSON_ARRAY != vam->json_tree.type)
2621 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2622 vat_json_init_array (&vam->json_tree);
2624 node = vat_json_array_add (&vam->json_tree);
2626 vat_json_init_object (node);
2629 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2630 vat_json_object_add_ip6 (node, "map resolver", ip6);
2634 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2635 vat_json_object_add_ip4 (node, "map resolver", ip4);
2640 vl_api_show_lisp_status_reply_t_handler
2641 (vl_api_show_lisp_status_reply_t * mp)
2643 vat_main_t *vam = &vat_main;
2644 i32 retval = ntohl (mp->retval);
2648 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2649 mp->feature_status ? "enabled" : "disabled",
2650 mp->gpe_status ? "enabled" : "disabled");
2653 vam->retval = retval;
2654 vam->result_ready = 1;
2658 vl_api_show_lisp_status_reply_t_handler_json
2659 (vl_api_show_lisp_status_reply_t * mp)
2661 vat_main_t *vam = &vat_main;
2662 vat_json_node_t node;
2663 u8 *gpe_status = NULL;
2664 u8 *feature_status = NULL;
2666 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2667 feature_status = format (0, "%s",
2668 mp->feature_status ? "enabled" : "disabled");
2669 vec_add1 (gpe_status, 0);
2670 vec_add1 (feature_status, 0);
2672 vat_json_init_object (&node);
2673 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2674 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
2676 vec_free (gpe_status);
2677 vec_free (feature_status);
2679 vat_json_print (vam->ofp, &node);
2680 vat_json_free (&node);
2682 vam->retval = ntohl (mp->retval);
2683 vam->result_ready = 1;
2687 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2688 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2690 vat_main_t *vam = &vat_main;
2691 i32 retval = ntohl (mp->retval);
2695 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
2698 vam->retval = retval;
2699 vam->result_ready = 1;
2703 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2704 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2706 vat_main_t *vam = &vat_main;
2707 vat_json_node_t *node = NULL;
2709 if (VAT_JSON_ARRAY != vam->json_tree.type)
2711 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2712 vat_json_init_array (&vam->json_tree);
2714 node = vat_json_array_add (&vam->json_tree);
2716 vat_json_init_object (node);
2717 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
2719 vat_json_print (vam->ofp, node);
2720 vat_json_free (node);
2722 vam->retval = ntohl (mp->retval);
2723 vam->result_ready = 1;
2727 vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2729 vat_main_t *vam = &vat_main;
2730 i32 retval = ntohl (mp->retval);
2734 fformat (vam->ofp, "%-20s%-16s\n",
2735 mp->status ? "enabled" : "disabled",
2736 mp->status ? (char *) mp->locator_set_name : "");
2739 vam->retval = retval;
2740 vam->result_ready = 1;
2744 vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2747 vat_main_t *vam = &vat_main;
2748 vat_json_node_t node;
2751 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2752 vec_add1 (status, 0);
2754 vat_json_init_object (&node);
2755 vat_json_object_add_string_copy (&node, "status", status);
2758 vat_json_object_add_string_copy (&node, "locator_set",
2759 mp->locator_set_name);
2764 vat_json_print (vam->ofp, &node);
2765 vat_json_free (&node);
2767 vam->retval = ntohl (mp->retval);
2768 vam->result_ready = 1;
2772 format_policer_type (u8 * s, va_list * va)
2774 u32 i = va_arg (*va, u32);
2776 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2777 s = format (s, "1r2c");
2778 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2779 s = format (s, "1r3c");
2780 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2781 s = format (s, "2r3c-2698");
2782 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2783 s = format (s, "2r3c-4115");
2784 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2785 s = format (s, "2r3c-mef5cf1");
2787 s = format (s, "ILLEGAL");
2792 format_policer_rate_type (u8 * s, va_list * va)
2794 u32 i = va_arg (*va, u32);
2796 if (i == SSE2_QOS_RATE_KBPS)
2797 s = format (s, "kbps");
2798 else if (i == SSE2_QOS_RATE_PPS)
2799 s = format (s, "pps");
2801 s = format (s, "ILLEGAL");
2806 format_policer_round_type (u8 * s, va_list * va)
2808 u32 i = va_arg (*va, u32);
2810 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2811 s = format (s, "closest");
2812 else if (i == SSE2_QOS_ROUND_TO_UP)
2813 s = format (s, "up");
2814 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2815 s = format (s, "down");
2817 s = format (s, "ILLEGAL");
2822 format_policer_action_type (u8 * s, va_list * va)
2824 u32 i = va_arg (*va, u32);
2826 if (i == SSE2_QOS_ACTION_DROP)
2827 s = format (s, "drop");
2828 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2829 s = format (s, "transmit");
2830 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2831 s = format (s, "mark-and-transmit");
2833 s = format (s, "ILLEGAL");
2838 format_dscp (u8 * s, va_list * va)
2840 u32 i = va_arg (*va, u32);
2845 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2849 return format (s, "ILLEGAL");
2851 s = format (s, "%s", t);
2856 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
2858 vat_main_t *vam = &vat_main;
2859 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
2861 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2862 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2864 conform_dscp_str = format (0, "");
2866 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2867 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2869 exceed_dscp_str = format (0, "");
2871 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2872 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2874 violate_dscp_str = format (0, "");
2876 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2877 "rate type %U, round type %U, %s rate, %s color-aware, "
2878 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2879 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2880 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2882 format_policer_type, mp->type,
2885 clib_net_to_host_u64 (mp->cb),
2886 clib_net_to_host_u64 (mp->eb),
2887 format_policer_rate_type, mp->rate_type,
2888 format_policer_round_type, mp->round_type,
2889 mp->single_rate ? "single" : "dual",
2890 mp->color_aware ? "is" : "not",
2891 ntohl (mp->cir_tokens_per_period),
2892 ntohl (mp->pir_tokens_per_period),
2894 ntohl (mp->current_limit),
2895 ntohl (mp->current_bucket),
2896 ntohl (mp->extended_limit),
2897 ntohl (mp->extended_bucket),
2898 clib_net_to_host_u64 (mp->last_update_time),
2899 format_policer_action_type, mp->conform_action_type,
2901 format_policer_action_type, mp->exceed_action_type,
2903 format_policer_action_type, mp->violate_action_type,
2906 vec_free (conform_dscp_str);
2907 vec_free (exceed_dscp_str);
2908 vec_free (violate_dscp_str);
2911 static void vl_api_policer_details_t_handler_json
2912 (vl_api_policer_details_t * mp)
2914 vat_main_t *vam = &vat_main;
2915 vat_json_node_t *node;
2916 u8 *rate_type_str, *round_type_str, *type_str;
2917 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
2919 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
2921 format (0, "%U", format_policer_round_type, mp->round_type);
2922 type_str = format (0, "%U", format_policer_type, mp->type);
2923 conform_action_str = format (0, "%U", format_policer_action_type,
2924 mp->conform_action_type);
2925 exceed_action_str = format (0, "%U", format_policer_action_type,
2926 mp->exceed_action_type);
2927 violate_action_str = format (0, "%U", format_policer_action_type,
2928 mp->violate_action_type);
2930 if (VAT_JSON_ARRAY != vam->json_tree.type)
2932 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2933 vat_json_init_array (&vam->json_tree);
2935 node = vat_json_array_add (&vam->json_tree);
2937 vat_json_init_object (node);
2938 vat_json_object_add_string_copy (node, "name", mp->name);
2939 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
2940 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
2941 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
2942 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
2943 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
2944 vat_json_object_add_string_copy (node, "round_type", round_type_str);
2945 vat_json_object_add_string_copy (node, "type", type_str);
2946 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
2947 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
2948 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
2949 vat_json_object_add_uint (node, "cir_tokens_per_period",
2950 ntohl (mp->cir_tokens_per_period));
2951 vat_json_object_add_uint (node, "eir_tokens_per_period",
2952 ntohl (mp->pir_tokens_per_period));
2953 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
2954 vat_json_object_add_uint (node, "current_bucket",
2955 ntohl (mp->current_bucket));
2956 vat_json_object_add_uint (node, "extended_limit",
2957 ntohl (mp->extended_limit));
2958 vat_json_object_add_uint (node, "extended_bucket",
2959 ntohl (mp->extended_bucket));
2960 vat_json_object_add_uint (node, "last_update_time",
2961 ntohl (mp->last_update_time));
2962 vat_json_object_add_string_copy (node, "conform_action",
2963 conform_action_str);
2964 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2966 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2967 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
2968 vec_free (dscp_str);
2970 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
2971 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2973 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2974 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
2975 vec_free (dscp_str);
2977 vat_json_object_add_string_copy (node, "violate_action",
2978 violate_action_str);
2979 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2981 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2982 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
2983 vec_free (dscp_str);
2986 vec_free (rate_type_str);
2987 vec_free (round_type_str);
2988 vec_free (type_str);
2989 vec_free (conform_action_str);
2990 vec_free (exceed_action_str);
2991 vec_free (violate_action_str);
2995 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
2998 vat_main_t *vam = &vat_main;
2999 int i, count = ntohl (mp->count);
3002 fformat (vam->ofp, "classify table ids (%d) : ", count);
3003 for (i = 0; i < count; i++)
3005 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
3006 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
3008 vam->retval = ntohl (mp->retval);
3009 vam->result_ready = 1;
3013 vl_api_classify_table_ids_reply_t_handler_json
3014 (vl_api_classify_table_ids_reply_t * mp)
3016 vat_main_t *vam = &vat_main;
3017 int i, count = ntohl (mp->count);
3021 vat_json_node_t node;
3023 vat_json_init_object (&node);
3024 for (i = 0; i < count; i++)
3026 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
3028 vat_json_print (vam->ofp, &node);
3029 vat_json_free (&node);
3031 vam->retval = ntohl (mp->retval);
3032 vam->result_ready = 1;
3036 vl_api_classify_table_by_interface_reply_t_handler
3037 (vl_api_classify_table_by_interface_reply_t * mp)
3039 vat_main_t *vam = &vat_main;
3042 table_id = ntohl (mp->l2_table_id);
3044 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3046 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3047 table_id = ntohl (mp->ip4_table_id);
3049 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3051 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3052 table_id = ntohl (mp->ip6_table_id);
3054 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3056 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3057 vam->retval = ntohl (mp->retval);
3058 vam->result_ready = 1;
3062 vl_api_classify_table_by_interface_reply_t_handler_json
3063 (vl_api_classify_table_by_interface_reply_t * mp)
3065 vat_main_t *vam = &vat_main;
3066 vat_json_node_t node;
3068 vat_json_init_object (&node);
3070 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3071 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3072 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3074 vat_json_print (vam->ofp, &node);
3075 vat_json_free (&node);
3077 vam->retval = ntohl (mp->retval);
3078 vam->result_ready = 1;
3081 static void vl_api_policer_add_del_reply_t_handler
3082 (vl_api_policer_add_del_reply_t * mp)
3084 vat_main_t *vam = &vat_main;
3085 i32 retval = ntohl (mp->retval);
3086 if (vam->async_mode)
3088 vam->async_errors += (retval < 0);
3092 vam->retval = retval;
3093 vam->result_ready = 1;
3094 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3096 * Note: this is just barely thread-safe, depends on
3097 * the main thread spinning waiting for an answer...
3099 errmsg ("policer index %d\n", ntohl (mp->policer_index));
3103 static void vl_api_policer_add_del_reply_t_handler_json
3104 (vl_api_policer_add_del_reply_t * mp)
3106 vat_main_t *vam = &vat_main;
3107 vat_json_node_t node;
3109 vat_json_init_object (&node);
3110 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3111 vat_json_object_add_uint (&node, "policer_index",
3112 ntohl (mp->policer_index));
3114 vat_json_print (vam->ofp, &node);
3115 vat_json_free (&node);
3117 vam->retval = ntohl (mp->retval);
3118 vam->result_ready = 1;
3121 /* Format hex dump. */
3123 format_hex_bytes (u8 * s, va_list * va)
3125 u8 *bytes = va_arg (*va, u8 *);
3126 int n_bytes = va_arg (*va, int);
3129 /* Print short or long form depending on byte count. */
3130 uword short_form = n_bytes <= 32;
3131 uword indent = format_get_indent (s);
3136 for (i = 0; i < n_bytes; i++)
3138 if (!short_form && (i % 32) == 0)
3139 s = format (s, "%08x: ", i);
3140 s = format (s, "%02x", bytes[i]);
3141 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3142 s = format (s, "\n%U", format_white_space, indent);
3149 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3152 vat_main_t *vam = &vat_main;
3153 i32 retval = ntohl (mp->retval);
3156 fformat (vam->ofp, "classify table info :\n");
3157 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3158 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3159 ntohl (mp->miss_next_index));
3160 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3161 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3162 ntohl (mp->match_n_vectors));
3163 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3164 ntohl (mp->mask_length));
3166 vam->retval = retval;
3167 vam->result_ready = 1;
3171 vl_api_classify_table_info_reply_t_handler_json
3172 (vl_api_classify_table_info_reply_t * mp)
3174 vat_main_t *vam = &vat_main;
3175 vat_json_node_t node;
3177 i32 retval = ntohl (mp->retval);
3180 vat_json_init_object (&node);
3182 vat_json_object_add_int (&node, "sessions",
3183 ntohl (mp->active_sessions));
3184 vat_json_object_add_int (&node, "nexttbl",
3185 ntohl (mp->next_table_index));
3186 vat_json_object_add_int (&node, "nextnode",
3187 ntohl (mp->miss_next_index));
3188 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3189 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3190 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3191 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3192 ntohl (mp->mask_length), 0);
3193 vat_json_object_add_string_copy (&node, "mask", s);
3195 vat_json_print (vam->ofp, &node);
3196 vat_json_free (&node);
3198 vam->retval = ntohl (mp->retval);
3199 vam->result_ready = 1;
3203 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3206 vat_main_t *vam = &vat_main;
3208 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3209 ntohl (mp->hit_next_index), ntohl (mp->advance),
3210 ntohl (mp->opaque_index));
3211 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3212 ntohl (mp->match_length));
3216 vl_api_classify_session_details_t_handler_json
3217 (vl_api_classify_session_details_t * mp)
3219 vat_main_t *vam = &vat_main;
3220 vat_json_node_t *node = NULL;
3222 if (VAT_JSON_ARRAY != vam->json_tree.type)
3224 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3225 vat_json_init_array (&vam->json_tree);
3227 node = vat_json_array_add (&vam->json_tree);
3229 vat_json_init_object (node);
3230 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3231 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3232 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3234 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3236 vat_json_object_add_string_copy (node, "match", s);
3239 static void vl_api_pg_create_interface_reply_t_handler
3240 (vl_api_pg_create_interface_reply_t * mp)
3242 vat_main_t *vam = &vat_main;
3244 vam->retval = ntohl (mp->retval);
3245 vam->result_ready = 1;
3248 static void vl_api_pg_create_interface_reply_t_handler_json
3249 (vl_api_pg_create_interface_reply_t * mp)
3251 vat_main_t *vam = &vat_main;
3252 vat_json_node_t node;
3254 i32 retval = ntohl (mp->retval);
3257 vat_json_init_object (&node);
3259 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
3261 vat_json_print (vam->ofp, &node);
3262 vat_json_free (&node);
3264 vam->retval = ntohl (mp->retval);
3265 vam->result_ready = 1;
3268 static void vl_api_policer_classify_details_t_handler
3269 (vl_api_policer_classify_details_t * mp)
3271 vat_main_t *vam = &vat_main;
3273 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3274 ntohl (mp->table_index));
3277 static void vl_api_policer_classify_details_t_handler_json
3278 (vl_api_policer_classify_details_t * mp)
3280 vat_main_t *vam = &vat_main;
3281 vat_json_node_t *node;
3283 if (VAT_JSON_ARRAY != vam->json_tree.type)
3285 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3286 vat_json_init_array (&vam->json_tree);
3288 node = vat_json_array_add (&vam->json_tree);
3290 vat_json_init_object (node);
3291 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3292 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3295 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3296 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3298 vat_main_t *vam = &vat_main;
3299 i32 retval = ntohl (mp->retval);
3300 if (vam->async_mode)
3302 vam->async_errors += (retval < 0);
3306 vam->retval = retval;
3307 vam->sw_if_index = ntohl (mp->sw_if_index);
3308 vam->result_ready = 1;
3312 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3313 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3315 vat_main_t *vam = &vat_main;
3316 vat_json_node_t node;
3318 vat_json_init_object (&node);
3319 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3320 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3322 vat_json_print (vam->ofp, &node);
3323 vat_json_free (&node);
3325 vam->retval = ntohl (mp->retval);
3326 vam->result_ready = 1;
3329 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3330 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3331 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3332 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
3335 * Generate boilerplate reply handlers, which
3336 * dig the return value out of the xxx_reply_t API message,
3337 * stick it into vam->retval, and set vam->result_ready
3339 * Could also do this by pointing N message decode slots at
3340 * a single function, but that could break in subtle ways.
3343 #define foreach_standard_reply_retval_handler \
3344 _(sw_interface_set_flags_reply) \
3345 _(sw_interface_add_del_address_reply) \
3346 _(sw_interface_set_table_reply) \
3347 _(sw_interface_set_vpath_reply) \
3348 _(sw_interface_set_l2_bridge_reply) \
3349 _(bridge_domain_add_del_reply) \
3350 _(sw_interface_set_l2_xconnect_reply) \
3351 _(l2fib_add_del_reply) \
3352 _(ip_add_del_route_reply) \
3353 _(proxy_arp_add_del_reply) \
3354 _(proxy_arp_intfc_enable_disable_reply) \
3355 _(mpls_add_del_encap_reply) \
3356 _(mpls_add_del_decap_reply) \
3357 _(mpls_ethernet_add_del_tunnel_2_reply) \
3358 _(sw_interface_set_unnumbered_reply) \
3359 _(ip_neighbor_add_del_reply) \
3360 _(reset_vrf_reply) \
3361 _(oam_add_del_reply) \
3362 _(reset_fib_reply) \
3363 _(dhcp_proxy_config_reply) \
3364 _(dhcp_proxy_config_2_reply) \
3365 _(dhcp_proxy_set_vss_reply) \
3366 _(dhcp_client_config_reply) \
3367 _(set_ip_flow_hash_reply) \
3368 _(sw_interface_ip6_enable_disable_reply) \
3369 _(sw_interface_ip6_set_link_local_address_reply) \
3370 _(sw_interface_ip6nd_ra_prefix_reply) \
3371 _(sw_interface_ip6nd_ra_config_reply) \
3372 _(set_arp_neighbor_limit_reply) \
3373 _(l2_patch_add_del_reply) \
3374 _(sr_tunnel_add_del_reply) \
3375 _(sr_policy_add_del_reply) \
3376 _(sr_multicast_map_add_del_reply) \
3377 _(classify_add_del_session_reply) \
3378 _(classify_set_interface_ip_table_reply) \
3379 _(classify_set_interface_l2_tables_reply) \
3380 _(l2tpv3_set_tunnel_cookies_reply) \
3381 _(l2tpv3_interface_enable_disable_reply) \
3382 _(l2tpv3_set_lookup_key_reply) \
3383 _(l2_fib_clear_table_reply) \
3384 _(l2_interface_efp_filter_reply) \
3385 _(l2_interface_vlan_tag_rewrite_reply) \
3386 _(modify_vhost_user_if_reply) \
3387 _(delete_vhost_user_if_reply) \
3388 _(want_ip4_arp_events_reply) \
3389 _(want_ip6_nd_events_reply) \
3390 _(input_acl_set_interface_reply) \
3391 _(ipsec_spd_add_del_reply) \
3392 _(ipsec_interface_add_del_spd_reply) \
3393 _(ipsec_spd_add_del_entry_reply) \
3394 _(ipsec_sad_add_del_entry_reply) \
3395 _(ipsec_sa_set_key_reply) \
3396 _(ikev2_profile_add_del_reply) \
3397 _(ikev2_profile_set_auth_reply) \
3398 _(ikev2_profile_set_id_reply) \
3399 _(ikev2_profile_set_ts_reply) \
3400 _(ikev2_set_local_key_reply) \
3401 _(delete_loopback_reply) \
3402 _(bd_ip_mac_add_del_reply) \
3403 _(map_del_domain_reply) \
3404 _(map_add_del_rule_reply) \
3405 _(want_interface_events_reply) \
3406 _(want_stats_reply) \
3407 _(cop_interface_enable_disable_reply) \
3408 _(cop_whitelist_enable_disable_reply) \
3409 _(sw_interface_clear_stats_reply) \
3410 _(ioam_enable_reply) \
3411 _(ioam_disable_reply) \
3412 _(lisp_add_del_locator_reply) \
3413 _(lisp_add_del_local_eid_reply) \
3414 _(lisp_add_del_remote_mapping_reply) \
3415 _(lisp_add_del_adjacency_reply) \
3416 _(lisp_gpe_add_del_fwd_entry_reply) \
3417 _(lisp_add_del_map_resolver_reply) \
3418 _(lisp_gpe_enable_disable_reply) \
3419 _(lisp_gpe_add_del_iface_reply) \
3420 _(lisp_enable_disable_reply) \
3421 _(lisp_pitr_set_locator_set_reply) \
3422 _(lisp_add_del_map_request_itr_rlocs_reply) \
3423 _(lisp_eid_table_add_del_map_reply) \
3424 _(vxlan_gpe_add_del_tunnel_reply) \
3425 _(af_packet_delete_reply) \
3426 _(policer_classify_set_interface_reply) \
3427 _(netmap_create_reply) \
3428 _(netmap_delete_reply) \
3429 _(set_ipfix_exporter_reply) \
3430 _(set_ipfix_classify_stream_reply) \
3431 _(ipfix_classify_table_add_del_reply) \
3432 _(pg_capture_reply) \
3433 _(pg_enable_disable_reply) \
3434 _(ip_source_and_port_range_check_add_del_reply) \
3435 _(ip_source_and_port_range_check_interface_add_del_reply)\
3436 _(delete_subif_reply)
3439 static void vl_api_##n##_t_handler \
3440 (vl_api_##n##_t * mp) \
3442 vat_main_t * vam = &vat_main; \
3443 i32 retval = ntohl(mp->retval); \
3444 if (vam->async_mode) { \
3445 vam->async_errors += (retval < 0); \
3447 vam->retval = retval; \
3448 vam->result_ready = 1; \
3451 foreach_standard_reply_retval_handler;
3455 static void vl_api_##n##_t_handler_json \
3456 (vl_api_##n##_t * mp) \
3458 vat_main_t * vam = &vat_main; \
3459 vat_json_node_t node; \
3460 vat_json_init_object(&node); \
3461 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3462 vat_json_print(vam->ofp, &node); \
3463 vam->retval = ntohl(mp->retval); \
3464 vam->result_ready = 1; \
3466 foreach_standard_reply_retval_handler;
3470 * Table of message reply handlers, must include boilerplate handlers
3474 #define foreach_vpe_api_reply_msg \
3475 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3476 _(SW_INTERFACE_DETAILS, sw_interface_details) \
3477 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3478 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3479 _(CONTROL_PING_REPLY, control_ping_reply) \
3480 _(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply) \
3481 _(CLI_REPLY, cli_reply) \
3482 _(CLI_INBAND_REPLY, cli_inband_reply) \
3483 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3484 sw_interface_add_del_address_reply) \
3485 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
3486 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3487 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3488 sw_interface_set_l2_xconnect_reply) \
3489 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3490 sw_interface_set_l2_bridge_reply) \
3491 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3492 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3493 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3494 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3495 _(L2_FLAGS_REPLY, l2_flags_reply) \
3496 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3497 _(TAP_CONNECT_REPLY, tap_connect_reply) \
3498 _(TAP_MODIFY_REPLY, tap_modify_reply) \
3499 _(TAP_DELETE_REPLY, tap_delete_reply) \
3500 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3501 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
3502 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3503 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3504 proxy_arp_intfc_enable_disable_reply) \
3505 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
3506 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
3507 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
3508 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3509 mpls_ethernet_add_del_tunnel_reply) \
3510 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3511 mpls_ethernet_add_del_tunnel_2_reply) \
3512 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3513 sw_interface_set_unnumbered_reply) \
3514 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3515 _(RESET_VRF_REPLY, reset_vrf_reply) \
3516 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3517 _(CREATE_SUBIF_REPLY, create_subif_reply) \
3518 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3519 _(RESET_FIB_REPLY, reset_fib_reply) \
3520 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3521 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3522 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3523 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3524 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3525 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3526 sw_interface_ip6_enable_disable_reply) \
3527 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3528 sw_interface_ip6_set_link_local_address_reply) \
3529 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3530 sw_interface_ip6nd_ra_prefix_reply) \
3531 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3532 sw_interface_ip6nd_ra_config_reply) \
3533 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3534 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3535 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
3536 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3537 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
3538 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3539 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3540 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3541 classify_set_interface_ip_table_reply) \
3542 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3543 classify_set_interface_l2_tables_reply) \
3544 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3545 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3546 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3547 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3548 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3549 l2tpv3_interface_enable_disable_reply) \
3550 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3551 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3552 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
3553 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
3554 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3555 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
3556 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3557 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3558 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3559 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3560 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3561 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3562 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3563 _(SHOW_VERSION_REPLY, show_version_reply) \
3564 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
3565 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3566 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
3567 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3568 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3569 _(IP4_ARP_EVENT, ip4_arp_event) \
3570 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
3571 _(IP6_ND_EVENT, ip6_nd_event) \
3572 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3573 _(IP_ADDRESS_DETAILS, ip_address_details) \
3574 _(IP_DETAILS, ip_details) \
3575 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3576 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3577 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3578 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3579 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
3580 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3581 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3582 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3583 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3584 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
3585 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3586 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3587 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
3588 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3589 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3590 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3591 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3592 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
3593 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
3594 _(MAP_DOMAIN_DETAILS, map_domain_details) \
3595 _(MAP_RULE_DETAILS, map_rule_details) \
3596 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3597 _(WANT_STATS_REPLY, want_stats_reply) \
3598 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3599 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
3600 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
3601 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
3602 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
3603 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
3604 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
3605 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3606 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3607 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
3608 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3609 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
3610 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3611 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
3612 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
3613 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
3614 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
3615 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
3616 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3617 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
3618 _(LISP_LOCATOR_DETAILS, lisp_locator_details) \
3619 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
3620 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
3621 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
3622 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
3623 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
3624 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
3625 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3626 lisp_add_del_map_request_itr_rlocs_reply) \
3627 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3628 lisp_get_map_request_itr_rlocs_reply) \
3629 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
3630 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
3631 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
3632 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
3633 _(POLICER_DETAILS, policer_details) \
3634 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3635 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
3636 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
3637 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
3638 _(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
3639 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3640 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
3641 _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
3642 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3643 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3644 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
3645 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
3646 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
3647 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
3648 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
3649 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
3650 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
3651 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
3652 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3653 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3654 _(PG_CAPTURE_REPLY, pg_capture_reply) \
3655 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3656 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3657 ip_source_and_port_range_check_add_del_reply) \
3658 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
3659 ip_source_and_port_range_check_interface_add_del_reply) \
3660 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
3661 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
3662 _(DELETE_SUBIF_REPLY, delete_subif_reply)
3664 /* M: construct, but don't yet send a message */
3668 vam->result_ready = 0; \
3669 mp = vl_msg_api_alloc(sizeof(*mp)); \
3670 memset (mp, 0, sizeof (*mp)); \
3671 mp->_vl_msg_id = ntohs (VL_API_##T); \
3672 mp->client_index = vam->my_client_index; \
3677 vam->result_ready = 0; \
3678 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3679 memset (mp, 0, sizeof (*mp)); \
3680 mp->_vl_msg_id = ntohs (VL_API_##T); \
3681 mp->client_index = vam->my_client_index; \
3685 /* S: send a message */
3686 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3688 /* W: wait for results, with timeout */
3691 timeout = vat_time_now (vam) + 1.0; \
3693 while (vat_time_now (vam) < timeout) { \
3694 if (vam->result_ready == 1) { \
3695 return (vam->retval); \
3701 /* W2: wait for results, with timeout */
3704 timeout = vat_time_now (vam) + 1.0; \
3706 while (vat_time_now (vam) < timeout) { \
3707 if (vam->result_ready == 1) { \
3709 return (vam->retval); \
3715 /* W_L: wait for results, with timeout */
3718 timeout = vat_time_now (vam) + 1.0; \
3720 while (vat_time_now (vam) < timeout) { \
3721 if (vam->result_ready == 1) { \
3723 return (vam->retval); \
3726 vam->noprint_msg = 0; \
3737 #define STR_VTR_OP_CASE(op) \
3738 case L2_VTR_ ## op: \
3742 str_vtr_op (u32 vtr_op)
3746 STR_VTR_OP_CASE (DISABLED);
3747 STR_VTR_OP_CASE (PUSH_1);
3748 STR_VTR_OP_CASE (PUSH_2);
3749 STR_VTR_OP_CASE (POP_1);
3750 STR_VTR_OP_CASE (POP_2);
3751 STR_VTR_OP_CASE (TRANSLATE_1_1);
3752 STR_VTR_OP_CASE (TRANSLATE_1_2);
3753 STR_VTR_OP_CASE (TRANSLATE_2_1);
3754 STR_VTR_OP_CASE (TRANSLATE_2_2);
3761 dump_sub_interface_table (vat_main_t * vam)
3763 const sw_interface_subif_t *sub = NULL;
3765 if (vam->json_output)
3768 ("JSON output supported only for VPE API calls and dump_stats_table");
3773 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3774 "Interface", "sw_if_index",
3775 "sub id", "dot1ad", "tags", "outer id",
3776 "inner id", "exact", "default", "outer any", "inner any");
3778 vec_foreach (sub, vam->sw_if_subif_table)
3781 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3782 sub->interface_name,
3784 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3785 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3786 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3787 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3788 if (sub->vtr_op != L2_VTR_DISABLED)
3791 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3792 "tag1: %d tag2: %d ]\n",
3793 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3794 sub->vtr_tag1, sub->vtr_tag2);
3802 name_sort_cmp (void *a1, void *a2)
3804 name_sort_t *n1 = a1;
3805 name_sort_t *n2 = a2;
3807 return strcmp ((char *) n1->name, (char *) n2->name);
3811 dump_interface_table (vat_main_t * vam)
3814 name_sort_t *nses = 0, *ns;
3816 if (vam->json_output)
3819 ("JSON output supported only for VPE API calls and dump_stats_table");
3824 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3826 vec_add2 (nses, ns, 1);
3827 ns->name = (u8 *)(p->key);
3828 ns->value = (u32) p->value[0];
3832 vec_sort_with_function (nses, name_sort_cmp);
3834 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3835 vec_foreach (ns, nses)
3837 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3844 dump_ip_table (vat_main_t * vam, int is_ipv6)
3846 const ip_details_t *det = NULL;
3847 const ip_address_details_t *address = NULL;
3850 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3852 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3859 fformat (vam->ofp, "%-12d\n", i);
3861 " %-30s%-13s\n", "Address", "Prefix length");
3866 vec_foreach (address, det->addr)
3870 is_ipv6 ? format_ip6_address : format_ip4_address,
3871 address->ip, address->prefix_length);
3879 dump_ipv4_table (vat_main_t * vam)
3881 if (vam->json_output)
3884 ("JSON output supported only for VPE API calls and dump_stats_table");
3888 return dump_ip_table (vam, 0);
3892 dump_ipv6_table (vat_main_t * vam)
3894 if (vam->json_output)
3897 ("JSON output supported only for VPE API calls and dump_stats_table");
3901 return dump_ip_table (vam, 1);
3905 counter_type_to_str (u8 counter_type, u8 is_combined)
3909 switch (counter_type)
3911 case VNET_INTERFACE_COUNTER_DROP:
3913 case VNET_INTERFACE_COUNTER_PUNT:
3915 case VNET_INTERFACE_COUNTER_IP4:
3917 case VNET_INTERFACE_COUNTER_IP6:
3919 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
3921 case VNET_INTERFACE_COUNTER_RX_MISS:
3923 case VNET_INTERFACE_COUNTER_RX_ERROR:
3925 case VNET_INTERFACE_COUNTER_TX_ERROR:
3928 return "INVALID-COUNTER-TYPE";
3933 switch (counter_type)
3935 case VNET_INTERFACE_COUNTER_RX:
3937 case VNET_INTERFACE_COUNTER_TX:
3940 return "INVALID-COUNTER-TYPE";
3946 dump_stats_table (vat_main_t * vam)
3948 vat_json_node_t node;
3949 vat_json_node_t *msg_array;
3950 vat_json_node_t *msg;
3951 vat_json_node_t *counter_array;
3952 vat_json_node_t *counter;
3953 interface_counter_t c;
3955 ip4_fib_counter_t *c4;
3956 ip6_fib_counter_t *c6;
3959 if (!vam->json_output)
3961 clib_warning ("dump_stats_table supported only in JSON format");
3965 vat_json_init_object (&node);
3967 /* interface counters */
3968 msg_array = vat_json_object_add (&node, "interface_counters");
3969 vat_json_init_array (msg_array);
3970 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
3972 msg = vat_json_array_add (msg_array);
3973 vat_json_init_object (msg);
3974 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3975 (u8 *) counter_type_to_str (i, 0));
3976 vat_json_object_add_int (msg, "is_combined", 0);
3977 counter_array = vat_json_object_add (msg, "data");
3978 vat_json_init_array (counter_array);
3979 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
3981 packets = vam->simple_interface_counters[i][j];
3982 vat_json_array_add_uint (counter_array, packets);
3985 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
3987 msg = vat_json_array_add (msg_array);
3988 vat_json_init_object (msg);
3989 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3990 (u8 *) counter_type_to_str (i, 1));
3991 vat_json_object_add_int (msg, "is_combined", 1);
3992 counter_array = vat_json_object_add (msg, "data");
3993 vat_json_init_array (counter_array);
3994 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
3996 c = vam->combined_interface_counters[i][j];
3997 counter = vat_json_array_add (counter_array);
3998 vat_json_init_object (counter);
3999 vat_json_object_add_uint (counter, "packets", c.packets);
4000 vat_json_object_add_uint (counter, "bytes", c.bytes);
4004 /* ip4 fib counters */
4005 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
4006 vat_json_init_array (msg_array);
4007 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
4009 msg = vat_json_array_add (msg_array);
4010 vat_json_init_object (msg);
4011 vat_json_object_add_uint (msg, "vrf_id",
4012 vam->ip4_fib_counters_vrf_id_by_index[i]);
4013 counter_array = vat_json_object_add (msg, "c");
4014 vat_json_init_array (counter_array);
4015 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
4017 counter = vat_json_array_add (counter_array);
4018 vat_json_init_object (counter);
4019 c4 = &vam->ip4_fib_counters[i][j];
4020 vat_json_object_add_ip4 (counter, "address", c4->address);
4021 vat_json_object_add_uint (counter, "address_length",
4022 c4->address_length);
4023 vat_json_object_add_uint (counter, "packets", c4->packets);
4024 vat_json_object_add_uint (counter, "bytes", c4->bytes);
4028 /* ip6 fib counters */
4029 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
4030 vat_json_init_array (msg_array);
4031 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
4033 msg = vat_json_array_add (msg_array);
4034 vat_json_init_object (msg);
4035 vat_json_object_add_uint (msg, "vrf_id",
4036 vam->ip6_fib_counters_vrf_id_by_index[i]);
4037 counter_array = vat_json_object_add (msg, "c");
4038 vat_json_init_array (counter_array);
4039 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
4041 counter = vat_json_array_add (counter_array);
4042 vat_json_init_object (counter);
4043 c6 = &vam->ip6_fib_counters[i][j];
4044 vat_json_object_add_ip6 (counter, "address", c6->address);
4045 vat_json_object_add_uint (counter, "address_length",
4046 c6->address_length);
4047 vat_json_object_add_uint (counter, "packets", c6->packets);
4048 vat_json_object_add_uint (counter, "bytes", c6->bytes);
4052 vat_json_print (vam->ofp, &node);
4053 vat_json_free (&node);
4059 exec (vat_main_t * vam)
4061 api_main_t *am = &api_main;
4062 vl_api_cli_request_t *mp;
4066 unformat_input_t *i = vam->input;
4068 if (vec_len (i->buffer) == 0)
4071 if (vam->exec_mode == 0 && unformat (i, "mode"))
4076 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4083 M (CLI_REQUEST, cli_request);
4086 * Copy cmd into shared memory.
4087 * In order for the CLI command to work, it
4088 * must be a vector ending in \n, not a C-string ending
4091 pthread_mutex_lock (&am->vlib_rp->mutex);
4092 oldheap = svm_push_data_heap (am->vlib_rp);
4094 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4095 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4097 svm_pop_heap (oldheap);
4098 pthread_mutex_unlock (&am->vlib_rp->mutex);
4100 mp->cmd_in_shmem = (u64) cmd;
4102 timeout = vat_time_now (vam) + 10.0;
4104 while (vat_time_now (vam) < timeout)
4106 if (vam->result_ready == 1)
4109 if (vam->shmem_result != NULL)
4110 fformat (vam->ofp, "%s", vam->shmem_result);
4111 pthread_mutex_lock (&am->vlib_rp->mutex);
4112 oldheap = svm_push_data_heap (am->vlib_rp);
4114 free_me = (u8 *) vam->shmem_result;
4117 svm_pop_heap (oldheap);
4118 pthread_mutex_unlock (&am->vlib_rp->mutex);
4126 * Future replacement of exec() that passes CLI buffers directly in
4127 * the API messages instead of an additional shared memory area.
4130 exec_inband (vat_main_t * vam)
4132 vl_api_cli_inband_t *mp;
4134 unformat_input_t *i = vam->input;
4136 if (vec_len (i->buffer) == 0)
4139 if (vam->exec_mode == 0 && unformat (i, "mode"))
4144 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4151 * In order for the CLI command to work, it
4152 * must be a vector ending in \n, not a C-string ending
4155 u32 len = vec_len (vam->input->buffer);
4156 M2 (CLI_INBAND, cli_inband, len);
4157 clib_memcpy (mp->cmd, vam->input->buffer, len);
4158 mp->length = htonl (len);
4161 W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
4165 api_create_loopback (vat_main_t * vam)
4167 unformat_input_t *i = vam->input;
4168 vl_api_create_loopback_t *mp;
4173 memset (mac_address, 0, sizeof (mac_address));
4175 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4177 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4183 /* Construct the API message */
4184 M (CREATE_LOOPBACK, create_loopback);
4186 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4193 api_delete_loopback (vat_main_t * vam)
4195 unformat_input_t *i = vam->input;
4196 vl_api_delete_loopback_t *mp;
4198 u32 sw_if_index = ~0;
4200 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4202 if (unformat (i, "sw_if_index %d", &sw_if_index))
4208 if (sw_if_index == ~0)
4210 errmsg ("missing sw_if_index\n");
4214 /* Construct the API message */
4215 M (DELETE_LOOPBACK, delete_loopback);
4216 mp->sw_if_index = ntohl (sw_if_index);
4223 api_want_stats (vat_main_t * vam)
4225 unformat_input_t *i = vam->input;
4226 vl_api_want_stats_t *mp;
4230 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4232 if (unformat (i, "enable"))
4234 else if (unformat (i, "disable"))
4242 errmsg ("missing enable|disable\n");
4246 M (WANT_STATS, want_stats);
4247 mp->enable_disable = enable;
4254 api_want_interface_events (vat_main_t * vam)
4256 unformat_input_t *i = vam->input;
4257 vl_api_want_interface_events_t *mp;
4261 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4263 if (unformat (i, "enable"))
4265 else if (unformat (i, "disable"))
4273 errmsg ("missing enable|disable\n");
4277 M (WANT_INTERFACE_EVENTS, want_interface_events);
4278 mp->enable_disable = enable;
4280 vam->interface_event_display = enable;
4287 /* Note: non-static, called once to set up the initial intfc table */
4289 api_sw_interface_dump (vat_main_t * vam)
4291 vl_api_sw_interface_dump_t *mp;
4294 name_sort_t *nses = 0, *ns;
4295 sw_interface_subif_t *sub = NULL;
4297 /* Toss the old name table */
4299 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4301 vec_add2 (nses, ns, 1);
4302 ns->name = (u8 *)(p->key);
4303 ns->value = (u32) p->value[0];
4307 hash_free (vam->sw_if_index_by_interface_name);
4309 vec_foreach (ns, nses) vec_free (ns->name);
4313 vec_foreach (sub, vam->sw_if_subif_table)
4315 vec_free (sub->interface_name);
4317 vec_free (vam->sw_if_subif_table);
4319 /* recreate the interface name hash table */
4320 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
4322 /* Get list of ethernets */
4323 M (SW_INTERFACE_DUMP, sw_interface_dump);
4324 mp->name_filter_valid = 1;
4325 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4328 /* and local / loopback interfaces */
4329 M (SW_INTERFACE_DUMP, sw_interface_dump);
4330 mp->name_filter_valid = 1;
4331 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4335 /* and vxlan-gpe tunnel interfaces */
4336 M (SW_INTERFACE_DUMP, sw_interface_dump);
4337 mp->name_filter_valid = 1;
4338 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4339 sizeof (mp->name_filter) - 1);
4342 /* and vxlan tunnel interfaces */
4343 M (SW_INTERFACE_DUMP, sw_interface_dump);
4344 mp->name_filter_valid = 1;
4345 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4348 /* and host (af_packet) interfaces */
4349 M (SW_INTERFACE_DUMP, sw_interface_dump);
4350 mp->name_filter_valid = 1;
4351 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4354 /* and l2tpv3 tunnel interfaces */
4355 M (SW_INTERFACE_DUMP, sw_interface_dump);
4356 mp->name_filter_valid = 1;
4357 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4358 sizeof (mp->name_filter) - 1);
4361 /* and GRE tunnel interfaces */
4362 M (SW_INTERFACE_DUMP, sw_interface_dump);
4363 mp->name_filter_valid = 1;
4364 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4367 /* and LISP-GPE interfaces */
4368 M (SW_INTERFACE_DUMP, sw_interface_dump);
4369 mp->name_filter_valid = 1;
4370 strncpy ((char *) mp->name_filter, "lisp_gpe",
4371 sizeof (mp->name_filter) - 1);
4374 /* and IPSEC tunnel interfaces */
4375 M (SW_INTERFACE_DUMP, sw_interface_dump);
4376 mp->name_filter_valid = 1;
4377 strncpy ((char *) mp->name_filter, "ipsec", sizeof (mp->name_filter) - 1);
4380 /* Use a control ping for synchronization */
4382 vl_api_control_ping_t *mp;
4383 M (CONTROL_PING, control_ping);
4390 api_sw_interface_set_flags (vat_main_t * vam)
4392 unformat_input_t *i = vam->input;
4393 vl_api_sw_interface_set_flags_t *mp;
4396 u8 sw_if_index_set = 0;
4397 u8 admin_up = 0, link_up = 0;
4399 /* Parse args required to build the message */
4400 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4402 if (unformat (i, "admin-up"))
4404 else if (unformat (i, "admin-down"))
4406 else if (unformat (i, "link-up"))
4408 else if (unformat (i, "link-down"))
4410 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4411 sw_if_index_set = 1;
4412 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4413 sw_if_index_set = 1;
4418 if (sw_if_index_set == 0)
4420 errmsg ("missing interface name or sw_if_index\n");
4424 /* Construct the API message */
4425 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4426 mp->sw_if_index = ntohl (sw_if_index);
4427 mp->admin_up_down = admin_up;
4428 mp->link_up_down = link_up;
4433 /* Wait for a reply, return the good/bad news... */
4438 api_sw_interface_clear_stats (vat_main_t * vam)
4440 unformat_input_t *i = vam->input;
4441 vl_api_sw_interface_clear_stats_t *mp;
4444 u8 sw_if_index_set = 0;
4446 /* Parse args required to build the message */
4447 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4449 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4450 sw_if_index_set = 1;
4451 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4452 sw_if_index_set = 1;
4457 /* Construct the API message */
4458 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
4460 if (sw_if_index_set == 1)
4461 mp->sw_if_index = ntohl (sw_if_index);
4463 mp->sw_if_index = ~0;
4468 /* Wait for a reply, return the good/bad news... */
4473 api_sw_interface_add_del_address (vat_main_t * vam)
4475 unformat_input_t *i = vam->input;
4476 vl_api_sw_interface_add_del_address_t *mp;
4479 u8 sw_if_index_set = 0;
4480 u8 is_add = 1, del_all = 0;
4481 u32 address_length = 0;
4482 u8 v4_address_set = 0;
4483 u8 v6_address_set = 0;
4484 ip4_address_t v4address;
4485 ip6_address_t v6address;
4487 /* Parse args required to build the message */
4488 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4490 if (unformat (i, "del-all"))
4492 else if (unformat (i, "del"))
4494 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4495 sw_if_index_set = 1;
4496 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4497 sw_if_index_set = 1;
4498 else if (unformat (i, "%U/%d",
4499 unformat_ip4_address, &v4address, &address_length))
4501 else if (unformat (i, "%U/%d",
4502 unformat_ip6_address, &v6address, &address_length))
4508 if (sw_if_index_set == 0)
4510 errmsg ("missing interface name or sw_if_index\n");
4513 if (v4_address_set && v6_address_set)
4515 errmsg ("both v4 and v6 addresses set\n");
4518 if (!v4_address_set && !v6_address_set && !del_all)
4520 errmsg ("no addresses set\n");
4524 /* Construct the API message */
4525 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4527 mp->sw_if_index = ntohl (sw_if_index);
4528 mp->is_add = is_add;
4529 mp->del_all = del_all;
4533 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4537 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4539 mp->address_length = address_length;
4544 /* Wait for a reply, return good/bad news */
4549 api_sw_interface_set_table (vat_main_t * vam)
4551 unformat_input_t *i = vam->input;
4552 vl_api_sw_interface_set_table_t *mp;
4554 u32 sw_if_index, vrf_id = 0;
4555 u8 sw_if_index_set = 0;
4558 /* Parse args required to build the message */
4559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4561 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4562 sw_if_index_set = 1;
4563 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4564 sw_if_index_set = 1;
4565 else if (unformat (i, "vrf %d", &vrf_id))
4567 else if (unformat (i, "ipv6"))
4573 if (sw_if_index_set == 0)
4575 errmsg ("missing interface name or sw_if_index\n");
4579 /* Construct the API message */
4580 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4582 mp->sw_if_index = ntohl (sw_if_index);
4583 mp->is_ipv6 = is_ipv6;
4584 mp->vrf_id = ntohl (vrf_id);
4589 /* Wait for a reply... */
4594 api_sw_interface_set_vpath (vat_main_t * vam)
4596 unformat_input_t *i = vam->input;
4597 vl_api_sw_interface_set_vpath_t *mp;
4599 u32 sw_if_index = 0;
4600 u8 sw_if_index_set = 0;
4603 /* Parse args required to build the message */
4604 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4606 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4607 sw_if_index_set = 1;
4608 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4609 sw_if_index_set = 1;
4610 else if (unformat (i, "enable"))
4612 else if (unformat (i, "disable"))
4618 if (sw_if_index_set == 0)
4620 errmsg ("missing interface name or sw_if_index\n");
4624 /* Construct the API message */
4625 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
4627 mp->sw_if_index = ntohl (sw_if_index);
4628 mp->enable = is_enable;
4633 /* Wait for a reply... */
4638 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
4640 unformat_input_t *i = vam->input;
4641 vl_api_sw_interface_set_l2_xconnect_t *mp;
4644 u8 rx_sw_if_index_set = 0;
4646 u8 tx_sw_if_index_set = 0;
4649 /* Parse args required to build the message */
4650 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4652 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
4653 rx_sw_if_index_set = 1;
4654 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4655 tx_sw_if_index_set = 1;
4656 else if (unformat (i, "rx"))
4658 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4660 if (unformat (i, "%U", unformat_sw_if_index, vam,
4662 rx_sw_if_index_set = 1;
4667 else if (unformat (i, "tx"))
4669 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4671 if (unformat (i, "%U", unformat_sw_if_index, vam,
4673 tx_sw_if_index_set = 1;
4678 else if (unformat (i, "enable"))
4680 else if (unformat (i, "disable"))
4686 if (rx_sw_if_index_set == 0)
4688 errmsg ("missing rx interface name or rx_sw_if_index\n");
4692 if (enable && (tx_sw_if_index_set == 0))
4694 errmsg ("missing tx interface name or tx_sw_if_index\n");
4698 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
4700 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4701 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
4702 mp->enable = enable;
4711 api_sw_interface_set_l2_bridge (vat_main_t * vam)
4713 unformat_input_t *i = vam->input;
4714 vl_api_sw_interface_set_l2_bridge_t *mp;
4717 u8 rx_sw_if_index_set = 0;
4724 /* Parse args required to build the message */
4725 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4727 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
4728 rx_sw_if_index_set = 1;
4729 else if (unformat (i, "bd_id %d", &bd_id))
4731 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
4732 rx_sw_if_index_set = 1;
4733 else if (unformat (i, "shg %d", &shg))
4735 else if (unformat (i, "bvi"))
4737 else if (unformat (i, "enable"))
4739 else if (unformat (i, "disable"))
4745 if (rx_sw_if_index_set == 0)
4747 errmsg ("missing rx interface name or sw_if_index\n");
4751 if (enable && (bd_id_set == 0))
4753 errmsg ("missing bridge domain\n");
4757 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
4759 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4760 mp->bd_id = ntohl (bd_id);
4763 mp->enable = enable;
4772 api_bridge_domain_dump (vat_main_t * vam)
4774 unformat_input_t *i = vam->input;
4775 vl_api_bridge_domain_dump_t *mp;
4779 /* Parse args required to build the message */
4780 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4782 if (unformat (i, "bd_id %d", &bd_id))
4788 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
4789 mp->bd_id = ntohl (bd_id);
4792 /* Use a control ping for synchronization */
4794 vl_api_control_ping_t *mp;
4795 M (CONTROL_PING, control_ping);
4805 api_bridge_domain_add_del (vat_main_t * vam)
4807 unformat_input_t *i = vam->input;
4808 vl_api_bridge_domain_add_del_t *mp;
4812 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
4814 /* Parse args required to build the message */
4815 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4817 if (unformat (i, "bd_id %d", &bd_id))
4819 else if (unformat (i, "flood %d", &flood))
4821 else if (unformat (i, "uu-flood %d", &uu_flood))
4823 else if (unformat (i, "forward %d", &forward))
4825 else if (unformat (i, "learn %d", &learn))
4827 else if (unformat (i, "arp-term %d", &arp_term))
4829 else if (unformat (i, "del"))
4832 flood = uu_flood = forward = learn = 0;
4840 errmsg ("missing bridge domain\n");
4844 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
4846 mp->bd_id = ntohl (bd_id);
4848 mp->uu_flood = uu_flood;
4849 mp->forward = forward;
4851 mp->arp_term = arp_term;
4852 mp->is_add = is_add;
4861 api_l2fib_add_del (vat_main_t * vam)
4863 unformat_input_t *i = vam->input;
4864 vl_api_l2fib_add_del_t *mp;
4871 u8 sw_if_index_set = 0;
4880 /* Parse args required to build the message */
4881 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4883 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
4885 else if (unformat (i, "bd_id %d", &bd_id))
4887 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4888 sw_if_index_set = 1;
4889 else if (unformat (i, "sw_if"))
4891 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4893 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4894 sw_if_index_set = 1;
4899 else if (unformat (i, "static"))
4901 else if (unformat (i, "filter"))
4906 else if (unformat (i, "bvi"))
4911 else if (unformat (i, "del"))
4913 else if (unformat (i, "count %d", &count))
4921 errmsg ("missing mac address\n");
4927 errmsg ("missing bridge domain\n");
4931 if (is_add && (sw_if_index_set == 0))
4933 errmsg ("missing interface name or sw_if_index\n");
4939 /* Turn on async mode */
4940 vam->async_mode = 1;
4941 vam->async_errors = 0;
4942 before = vat_time_now (vam);
4945 for (j = 0; j < count; j++)
4947 M (L2FIB_ADD_DEL, l2fib_add_del);
4950 mp->bd_id = ntohl (bd_id);
4951 mp->is_add = is_add;
4955 mp->sw_if_index = ntohl (sw_if_index);
4956 mp->static_mac = static_mac;
4957 mp->filter_mac = filter_mac;
4958 mp->bvi_mac = bvi_mac;
4960 increment_mac_address (&mac);
4967 vl_api_control_ping_t *mp;
4970 /* Shut off async mode */
4971 vam->async_mode = 0;
4973 M (CONTROL_PING, control_ping);
4976 timeout = vat_time_now (vam) + 1.0;
4977 while (vat_time_now (vam) < timeout)
4978 if (vam->result_ready == 1)
4983 if (vam->retval == -99)
4984 errmsg ("timeout\n");
4986 if (vam->async_errors > 0)
4988 errmsg ("%d asynchronous errors\n", vam->async_errors);
4991 vam->async_errors = 0;
4992 after = vat_time_now (vam);
4994 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4995 count, after - before, count / (after - before));
4999 /* Wait for a reply... */
5002 /* Return the good/bad news */
5003 return (vam->retval);
5007 api_l2_flags (vat_main_t * vam)
5009 unformat_input_t *i = vam->input;
5010 vl_api_l2_flags_t *mp;
5013 u32 feature_bitmap = 0;
5014 u8 sw_if_index_set = 0;
5016 /* Parse args required to build the message */
5017 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5019 if (unformat (i, "sw_if_index %d", &sw_if_index))
5020 sw_if_index_set = 1;
5021 else if (unformat (i, "sw_if"))
5023 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5025 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5026 sw_if_index_set = 1;
5031 else if (unformat (i, "learn"))
5032 feature_bitmap |= L2INPUT_FEAT_LEARN;
5033 else if (unformat (i, "forward"))
5034 feature_bitmap |= L2INPUT_FEAT_FWD;
5035 else if (unformat (i, "flood"))
5036 feature_bitmap |= L2INPUT_FEAT_FLOOD;
5037 else if (unformat (i, "uu-flood"))
5038 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
5043 if (sw_if_index_set == 0)
5045 errmsg ("missing interface name or sw_if_index\n");
5049 M (L2_FLAGS, l2_flags);
5051 mp->sw_if_index = ntohl (sw_if_index);
5052 mp->feature_bitmap = ntohl (feature_bitmap);
5061 api_bridge_flags (vat_main_t * vam)
5063 unformat_input_t *i = vam->input;
5064 vl_api_bridge_flags_t *mp;
5071 /* Parse args required to build the message */
5072 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5074 if (unformat (i, "bd_id %d", &bd_id))
5076 else if (unformat (i, "learn"))
5078 else if (unformat (i, "forward"))
5080 else if (unformat (i, "flood"))
5082 else if (unformat (i, "uu-flood"))
5083 flags |= L2_UU_FLOOD;
5084 else if (unformat (i, "arp-term"))
5085 flags |= L2_ARP_TERM;
5086 else if (unformat (i, "off"))
5088 else if (unformat (i, "disable"))
5096 errmsg ("missing bridge domain\n");
5100 M (BRIDGE_FLAGS, bridge_flags);
5102 mp->bd_id = ntohl (bd_id);
5103 mp->feature_bitmap = ntohl (flags);
5104 mp->is_set = is_set;
5113 api_bd_ip_mac_add_del (vat_main_t * vam)
5115 unformat_input_t *i = vam->input;
5116 vl_api_bd_ip_mac_add_del_t *mp;
5124 ip4_address_t v4addr;
5125 ip6_address_t v6addr;
5129 /* Parse args required to build the message */
5130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5132 if (unformat (i, "bd_id %d", &bd_id))
5136 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5140 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5145 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5149 else if (unformat (i, "del"))
5157 errmsg ("missing bridge domain\n");
5160 else if (ip_set == 0)
5162 errmsg ("missing IP address\n");
5165 else if (mac_set == 0)
5167 errmsg ("missing MAC address\n");
5171 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
5173 mp->bd_id = ntohl (bd_id);
5174 mp->is_ipv6 = is_ipv6;
5175 mp->is_add = is_add;
5177 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5179 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5180 clib_memcpy (mp->mac_address, macaddr, 6);
5188 api_tap_connect (vat_main_t * vam)
5190 unformat_input_t *i = vam->input;
5191 vl_api_tap_connect_t *mp;
5198 memset (mac_address, 0, sizeof (mac_address));
5200 /* Parse args required to build the message */
5201 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5203 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5207 else if (unformat (i, "random-mac"))
5209 else if (unformat (i, "tapname %s", &tap_name))
5217 errmsg ("missing tap name\n");
5220 if (vec_len (tap_name) > 63)
5222 errmsg ("tap name too long\n");
5224 vec_add1 (tap_name, 0);
5226 /* Construct the API message */
5227 M (TAP_CONNECT, tap_connect);
5229 mp->use_random_mac = random_mac;
5230 clib_memcpy (mp->mac_address, mac_address, 6);
5231 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5232 vec_free (tap_name);
5237 /* Wait for a reply... */
5242 api_tap_modify (vat_main_t * vam)
5244 unformat_input_t *i = vam->input;
5245 vl_api_tap_modify_t *mp;
5251 u32 sw_if_index = ~0;
5252 u8 sw_if_index_set = 0;
5254 memset (mac_address, 0, sizeof (mac_address));
5256 /* Parse args required to build the message */
5257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5259 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5260 sw_if_index_set = 1;
5261 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5262 sw_if_index_set = 1;
5263 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5267 else if (unformat (i, "random-mac"))
5269 else if (unformat (i, "tapname %s", &tap_name))
5275 if (sw_if_index_set == 0)
5277 errmsg ("missing vpp interface name");
5282 errmsg ("missing tap name\n");
5285 if (vec_len (tap_name) > 63)
5287 errmsg ("tap name too long\n");
5289 vec_add1 (tap_name, 0);
5291 /* Construct the API message */
5292 M (TAP_MODIFY, tap_modify);
5294 mp->use_random_mac = random_mac;
5295 mp->sw_if_index = ntohl (sw_if_index);
5296 clib_memcpy (mp->mac_address, mac_address, 6);
5297 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5298 vec_free (tap_name);
5303 /* Wait for a reply... */
5308 api_tap_delete (vat_main_t * vam)
5310 unformat_input_t *i = vam->input;
5311 vl_api_tap_delete_t *mp;
5313 u32 sw_if_index = ~0;
5314 u8 sw_if_index_set = 0;
5316 /* Parse args required to build the message */
5317 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5319 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5320 sw_if_index_set = 1;
5321 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5322 sw_if_index_set = 1;
5327 if (sw_if_index_set == 0)
5329 errmsg ("missing vpp interface name");
5333 /* Construct the API message */
5334 M (TAP_DELETE, tap_delete);
5336 mp->sw_if_index = ntohl (sw_if_index);
5341 /* Wait for a reply... */
5346 api_ip_add_del_route (vat_main_t * vam)
5348 unformat_input_t *i = vam->input;
5349 vl_api_ip_add_del_route_t *mp;
5351 u32 sw_if_index = ~0, vrf_id = 0;
5352 u8 sw_if_index_set = 0;
5354 u8 is_local = 0, is_drop = 0;
5355 u8 create_vrf_if_needed = 0;
5357 u8 next_hop_weight = 1;
5359 u8 is_multipath = 0;
5361 u8 address_length_set = 0;
5362 u32 lookup_in_vrf = 0;
5363 u32 resolve_attempts = 0;
5364 u32 dst_address_length = 0;
5365 u8 next_hop_set = 0;
5366 ip4_address_t v4_dst_address, v4_next_hop_address;
5367 ip6_address_t v6_dst_address, v6_next_hop_address;
5371 u32 random_add_del = 0;
5372 u32 *random_vector = 0;
5374 u32 random_seed = 0xdeaddabe;
5375 u32 classify_table_index = ~0;
5378 /* Parse args required to build the message */
5379 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5381 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5382 sw_if_index_set = 1;
5383 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5384 sw_if_index_set = 1;
5385 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5390 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5395 else if (unformat (i, "/%d", &dst_address_length))
5397 address_length_set = 1;
5400 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5401 &v4_next_hop_address))
5405 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5406 &v6_next_hop_address))
5410 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5412 else if (unformat (i, "weight %d", &next_hop_weight))
5414 else if (unformat (i, "drop"))
5418 else if (unformat (i, "local"))
5422 else if (unformat (i, "classify %d", &classify_table_index))
5426 else if (unformat (i, "del"))
5428 else if (unformat (i, "add"))
5430 else if (unformat (i, "not-last"))
5432 else if (unformat (i, "multipath"))
5434 else if (unformat (i, "vrf %d", &vrf_id))
5436 else if (unformat (i, "create-vrf"))
5437 create_vrf_if_needed = 1;
5438 else if (unformat (i, "count %d", &count))
5440 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
5442 else if (unformat (i, "random"))
5444 else if (unformat (i, "seed %d", &random_seed))
5448 clib_warning ("parse error '%U'", format_unformat_error, i);
5453 if (resolve_attempts > 0 && sw_if_index_set == 0)
5455 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5459 if (!next_hop_set && !is_drop && !is_local && !is_classify)
5461 errmsg ("next hop / local / drop / classify not set\n");
5465 if (address_set == 0)
5467 errmsg ("missing addresses\n");
5471 if (address_length_set == 0)
5473 errmsg ("missing address length\n");
5477 /* Generate a pile of unique, random routes */
5480 u32 this_random_address;
5481 random_hash = hash_create (count, sizeof (uword));
5483 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5484 for (j = 0; j <= count; j++)
5488 this_random_address = random_u32 (&random_seed);
5489 this_random_address =
5490 clib_host_to_net_u32 (this_random_address);
5492 while (hash_get (random_hash, this_random_address));
5493 vec_add1 (random_vector, this_random_address);
5494 hash_set (random_hash, this_random_address, 1);
5496 hash_free (random_hash);
5497 v4_dst_address.as_u32 = random_vector[0];
5502 /* Turn on async mode */
5503 vam->async_mode = 1;
5504 vam->async_errors = 0;
5505 before = vat_time_now (vam);
5508 for (j = 0; j < count; j++)
5510 /* Construct the API message */
5511 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
5513 mp->next_hop_sw_if_index = ntohl (sw_if_index);
5514 mp->vrf_id = ntohl (vrf_id);
5515 if (resolve_attempts > 0)
5517 mp->resolve_attempts = ntohl (resolve_attempts);
5518 mp->resolve_if_needed = 1;
5520 mp->create_vrf_if_needed = create_vrf_if_needed;
5522 mp->is_add = is_add;
5523 mp->is_drop = is_drop;
5524 mp->is_ipv6 = is_ipv6;
5525 mp->is_local = is_local;
5526 mp->is_classify = is_classify;
5527 mp->is_multipath = is_multipath;
5528 mp->not_last = not_last;
5529 mp->next_hop_weight = next_hop_weight;
5530 mp->dst_address_length = dst_address_length;
5531 mp->lookup_in_vrf = ntohl (lookup_in_vrf);
5532 mp->classify_table_index = ntohl (classify_table_index);
5536 clib_memcpy (mp->dst_address, &v6_dst_address,
5537 sizeof (v6_dst_address));
5539 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5540 sizeof (v6_next_hop_address));
5541 increment_v6_address (&v6_dst_address);
5545 clib_memcpy (mp->dst_address, &v4_dst_address,
5546 sizeof (v4_dst_address));
5548 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5549 sizeof (v4_next_hop_address));
5551 v4_dst_address.as_u32 = random_vector[j + 1];
5553 increment_v4_address (&v4_dst_address);
5559 /* When testing multiple add/del ops, use a control-ping to sync */
5562 vl_api_control_ping_t *mp;
5565 /* Shut off async mode */
5566 vam->async_mode = 0;
5568 M (CONTROL_PING, control_ping);
5571 timeout = vat_time_now (vam) + 1.0;
5572 while (vat_time_now (vam) < timeout)
5573 if (vam->result_ready == 1)
5578 if (vam->retval == -99)
5579 errmsg ("timeout\n");
5581 if (vam->async_errors > 0)
5583 errmsg ("%d asynchronous errors\n", vam->async_errors);
5586 vam->async_errors = 0;
5587 after = vat_time_now (vam);
5589 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5590 count, after - before, count / (after - before));
5594 /* Wait for a reply... */
5598 /* Return the good/bad news */
5599 return (vam->retval);
5603 api_proxy_arp_add_del (vat_main_t * vam)
5605 unformat_input_t *i = vam->input;
5606 vl_api_proxy_arp_add_del_t *mp;
5610 ip4_address_t lo, hi;
5613 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5615 if (unformat (i, "vrf %d", &vrf_id))
5617 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
5618 unformat_ip4_address, &hi))
5620 else if (unformat (i, "del"))
5624 clib_warning ("parse error '%U'", format_unformat_error, i);
5631 errmsg ("address range not set\n");
5635 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
5637 mp->vrf_id = ntohl (vrf_id);
5638 mp->is_add = is_add;
5639 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
5640 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
5649 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
5651 unformat_input_t *i = vam->input;
5652 vl_api_proxy_arp_intfc_enable_disable_t *mp;
5656 u8 sw_if_index_set = 0;
5658 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5660 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5661 sw_if_index_set = 1;
5662 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5663 sw_if_index_set = 1;
5664 else if (unformat (i, "enable"))
5666 else if (unformat (i, "disable"))
5670 clib_warning ("parse error '%U'", format_unformat_error, i);
5675 if (sw_if_index_set == 0)
5677 errmsg ("missing interface name or sw_if_index\n");
5681 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
5683 mp->sw_if_index = ntohl (sw_if_index);
5684 mp->enable_disable = enable;
5693 api_mpls_add_del_decap (vat_main_t * vam)
5695 unformat_input_t *i = vam->input;
5696 vl_api_mpls_add_del_decap_t *mp;
5705 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5707 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
5709 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
5711 else if (unformat (i, "label %d", &label))
5713 else if (unformat (i, "next-index %d", &next_index))
5715 else if (unformat (i, "del"))
5717 else if (unformat (i, "s-bit-clear"))
5721 clib_warning ("parse error '%U'", format_unformat_error, i);
5726 M (MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
5728 mp->rx_vrf_id = ntohl (rx_vrf_id);
5729 mp->tx_vrf_id = ntohl (tx_vrf_id);
5730 mp->label = ntohl (label);
5731 mp->next_index = ntohl (next_index);
5733 mp->is_add = is_add;
5742 api_mpls_add_del_encap (vat_main_t * vam)
5744 unformat_input_t *i = vam->input;
5745 vl_api_mpls_add_del_encap_t *mp;
5750 ip4_address_t dst_address;
5753 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5755 if (unformat (i, "vrf %d", &vrf_id))
5757 else if (unformat (i, "label %d", &label))
5758 vec_add1 (labels, ntohl (label));
5759 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5761 else if (unformat (i, "del"))
5765 clib_warning ("parse error '%U'", format_unformat_error, i);
5770 if (vec_len (labels) == 0)
5772 errmsg ("missing encap label stack\n");
5776 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
5777 sizeof (u32) * vec_len (labels));
5779 mp->vrf_id = ntohl (vrf_id);
5780 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5781 mp->is_add = is_add;
5782 mp->nlabels = vec_len (labels);
5783 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
5794 api_mpls_gre_add_del_tunnel (vat_main_t * vam)
5796 unformat_input_t *i = vam->input;
5797 vl_api_mpls_gre_add_del_tunnel_t *mp;
5799 u32 inner_vrf_id = 0;
5800 u32 outer_vrf_id = 0;
5801 ip4_address_t src_address;
5802 ip4_address_t dst_address;
5803 ip4_address_t intfc_address;
5805 u8 intfc_address_length = 0;
5809 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5811 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5813 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5815 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
5817 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5819 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5820 &intfc_address, &tmp))
5821 intfc_address_length = tmp;
5822 else if (unformat (i, "l2-only"))
5824 else if (unformat (i, "del"))
5828 clib_warning ("parse error '%U'", format_unformat_error, i);
5833 M (MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
5835 mp->inner_vrf_id = ntohl (inner_vrf_id);
5836 mp->outer_vrf_id = ntohl (outer_vrf_id);
5837 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
5838 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5839 clib_memcpy (mp->intfc_address, &intfc_address, sizeof (intfc_address));
5840 mp->intfc_address_length = intfc_address_length;
5841 mp->l2_only = l2_only;
5842 mp->is_add = is_add;
5851 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
5853 unformat_input_t *i = vam->input;
5854 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
5856 u32 inner_vrf_id = 0;
5857 ip4_address_t intfc_address;
5858 u8 dst_mac_address[6];
5861 u8 intfc_address_length = 0;
5865 int tx_sw_if_index_set = 0;
5867 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5869 if (unformat (i, "vrf %d", &inner_vrf_id))
5871 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5872 &intfc_address, &tmp))
5873 intfc_address_length = tmp;
5874 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
5875 tx_sw_if_index_set = 1;
5876 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5877 tx_sw_if_index_set = 1;
5878 else if (unformat (i, "dst %U", unformat_ethernet_address,
5881 else if (unformat (i, "l2-only"))
5883 else if (unformat (i, "del"))
5887 clib_warning ("parse error '%U'", format_unformat_error, i);
5894 errmsg ("dst (mac address) not set\n");
5897 if (!tx_sw_if_index_set)
5899 errmsg ("tx-intfc not set\n");
5903 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
5905 mp->vrf_id = ntohl (inner_vrf_id);
5906 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
5907 mp->adj_address_length = intfc_address_length;
5908 clib_memcpy (mp->dst_mac_address, dst_mac_address,
5909 sizeof (dst_mac_address));
5910 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5911 mp->l2_only = l2_only;
5912 mp->is_add = is_add;
5921 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
5923 unformat_input_t *i = vam->input;
5924 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
5926 u32 inner_vrf_id = 0;
5927 u32 outer_vrf_id = 0;
5928 ip4_address_t adj_address;
5929 int adj_address_set = 0;
5930 ip4_address_t next_hop_address;
5931 int next_hop_address_set = 0;
5933 u8 adj_address_length = 0;
5936 u32 resolve_attempts = 5;
5937 u8 resolve_if_needed = 1;
5939 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5941 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5943 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5945 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5946 &adj_address, &tmp))
5948 adj_address_length = tmp;
5949 adj_address_set = 1;
5951 else if (unformat (i, "next-hop %U", unformat_ip4_address,
5953 next_hop_address_set = 1;
5954 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5956 else if (unformat (i, "resolve-if-needed %d", &tmp))
5957 resolve_if_needed = tmp;
5958 else if (unformat (i, "l2-only"))
5960 else if (unformat (i, "del"))
5964 clib_warning ("parse error '%U'", format_unformat_error, i);
5969 if (!adj_address_set)
5971 errmsg ("adjacency address/mask not set\n");
5974 if (!next_hop_address_set)
5976 errmsg ("ip4 next hop address (in outer fib) not set\n");
5980 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
5982 mp->inner_vrf_id = ntohl (inner_vrf_id);
5983 mp->outer_vrf_id = ntohl (outer_vrf_id);
5984 mp->resolve_attempts = ntohl (resolve_attempts);
5985 mp->resolve_if_needed = resolve_if_needed;
5986 mp->is_add = is_add;
5987 mp->l2_only = l2_only;
5988 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
5989 mp->adj_address_length = adj_address_length;
5990 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
5991 sizeof (next_hop_address));
6000 api_sw_interface_set_unnumbered (vat_main_t * vam)
6002 unformat_input_t *i = vam->input;
6003 vl_api_sw_interface_set_unnumbered_t *mp;
6006 u32 unnum_sw_index = ~0;
6008 u8 sw_if_index_set = 0;
6010 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6012 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6013 sw_if_index_set = 1;
6014 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6015 sw_if_index_set = 1;
6016 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
6018 else if (unformat (i, "del"))
6022 clib_warning ("parse error '%U'", format_unformat_error, i);
6027 if (sw_if_index_set == 0)
6029 errmsg ("missing interface name or sw_if_index\n");
6033 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
6035 mp->sw_if_index = ntohl (sw_if_index);
6036 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6037 mp->is_add = is_add;
6046 api_ip_neighbor_add_del (vat_main_t * vam)
6048 unformat_input_t *i = vam->input;
6049 vl_api_ip_neighbor_add_del_t *mp;
6052 u8 sw_if_index_set = 0;
6058 u8 v4_address_set = 0;
6059 u8 v6_address_set = 0;
6060 ip4_address_t v4address;
6061 ip6_address_t v6address;
6063 memset (mac_address, 0, sizeof (mac_address));
6065 /* Parse args required to build the message */
6066 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6068 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6072 else if (unformat (i, "del"))
6074 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6075 sw_if_index_set = 1;
6076 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6077 sw_if_index_set = 1;
6078 else if (unformat (i, "is_static"))
6080 else if (unformat (i, "vrf %d", &vrf_id))
6082 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6084 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6088 clib_warning ("parse error '%U'", format_unformat_error, i);
6093 if (sw_if_index_set == 0)
6095 errmsg ("missing interface name or sw_if_index\n");
6098 if (v4_address_set && v6_address_set)
6100 errmsg ("both v4 and v6 addresses set\n");
6103 if (!v4_address_set && !v6_address_set)
6105 errmsg ("no address set\n");
6109 /* Construct the API message */
6110 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6112 mp->sw_if_index = ntohl (sw_if_index);
6113 mp->is_add = is_add;
6114 mp->vrf_id = ntohl (vrf_id);
6115 mp->is_static = is_static;
6117 clib_memcpy (mp->mac_address, mac_address, 6);
6121 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6125 /* mp->is_ipv6 = 0; via memset in M macro above */
6126 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6132 /* Wait for a reply, return good/bad news */
6140 api_reset_vrf (vat_main_t * vam)
6142 unformat_input_t *i = vam->input;
6143 vl_api_reset_vrf_t *mp;
6149 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6151 if (unformat (i, "vrf %d", &vrf_id))
6153 else if (unformat (i, "ipv6"))
6157 clib_warning ("parse error '%U'", format_unformat_error, i);
6162 if (vrf_id_set == 0)
6164 errmsg ("missing vrf id\n");
6168 M (RESET_VRF, reset_vrf);
6170 mp->vrf_id = ntohl (vrf_id);
6171 mp->is_ipv6 = is_ipv6;
6180 api_create_vlan_subif (vat_main_t * vam)
6182 unformat_input_t *i = vam->input;
6183 vl_api_create_vlan_subif_t *mp;
6186 u8 sw_if_index_set = 0;
6190 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6192 if (unformat (i, "sw_if_index %d", &sw_if_index))
6193 sw_if_index_set = 1;
6194 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6195 sw_if_index_set = 1;
6196 else if (unformat (i, "vlan %d", &vlan_id))
6200 clib_warning ("parse error '%U'", format_unformat_error, i);
6205 if (sw_if_index_set == 0)
6207 errmsg ("missing interface name or sw_if_index\n");
6211 if (vlan_id_set == 0)
6213 errmsg ("missing vlan_id\n");
6216 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6218 mp->sw_if_index = ntohl (sw_if_index);
6219 mp->vlan_id = ntohl (vlan_id);
6227 #define foreach_create_subif_bit \
6234 _(outer_vlan_id_any) \
6235 _(inner_vlan_id_any)
6238 api_create_subif (vat_main_t * vam)
6240 unformat_input_t *i = vam->input;
6241 vl_api_create_subif_t *mp;
6244 u8 sw_if_index_set = 0;
6251 u32 exact_match = 0;
6252 u32 default_sub = 0;
6253 u32 outer_vlan_id_any = 0;
6254 u32 inner_vlan_id_any = 0;
6256 u16 outer_vlan_id = 0;
6257 u16 inner_vlan_id = 0;
6259 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6261 if (unformat (i, "sw_if_index %d", &sw_if_index))
6262 sw_if_index_set = 1;
6263 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6264 sw_if_index_set = 1;
6265 else if (unformat (i, "sub_id %d", &sub_id))
6267 else if (unformat (i, "outer_vlan_id %d", &tmp))
6268 outer_vlan_id = tmp;
6269 else if (unformat (i, "inner_vlan_id %d", &tmp))
6270 inner_vlan_id = tmp;
6272 #define _(a) else if (unformat (i, #a)) a = 1 ;
6273 foreach_create_subif_bit
6277 clib_warning ("parse error '%U'", format_unformat_error, i);
6282 if (sw_if_index_set == 0)
6284 errmsg ("missing interface name or sw_if_index\n");
6288 if (sub_id_set == 0)
6290 errmsg ("missing sub_id\n");
6293 M (CREATE_SUBIF, create_subif);
6295 mp->sw_if_index = ntohl (sw_if_index);
6296 mp->sub_id = ntohl (sub_id);
6298 #define _(a) mp->a = a;
6299 foreach_create_subif_bit;
6302 mp->outer_vlan_id = ntohs (outer_vlan_id);
6303 mp->inner_vlan_id = ntohs (inner_vlan_id);
6312 api_oam_add_del (vat_main_t * vam)
6314 unformat_input_t *i = vam->input;
6315 vl_api_oam_add_del_t *mp;
6319 ip4_address_t src, dst;
6323 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6325 if (unformat (i, "vrf %d", &vrf_id))
6327 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6329 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6331 else if (unformat (i, "del"))
6335 clib_warning ("parse error '%U'", format_unformat_error, i);
6342 errmsg ("missing src addr\n");
6348 errmsg ("missing dst addr\n");
6352 M (OAM_ADD_DEL, oam_add_del);
6354 mp->vrf_id = ntohl (vrf_id);
6355 mp->is_add = is_add;
6356 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6357 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6366 api_reset_fib (vat_main_t * vam)
6368 unformat_input_t *i = vam->input;
6369 vl_api_reset_fib_t *mp;
6375 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6377 if (unformat (i, "vrf %d", &vrf_id))
6379 else if (unformat (i, "ipv6"))
6383 clib_warning ("parse error '%U'", format_unformat_error, i);
6388 if (vrf_id_set == 0)
6390 errmsg ("missing vrf id\n");
6394 M (RESET_FIB, reset_fib);
6396 mp->vrf_id = ntohl (vrf_id);
6397 mp->is_ipv6 = is_ipv6;
6406 api_dhcp_proxy_config (vat_main_t * vam)
6408 unformat_input_t *i = vam->input;
6409 vl_api_dhcp_proxy_config_t *mp;
6414 u8 v4_address_set = 0;
6415 u8 v6_address_set = 0;
6416 ip4_address_t v4address;
6417 ip6_address_t v6address;
6418 u8 v4_src_address_set = 0;
6419 u8 v6_src_address_set = 0;
6420 ip4_address_t v4srcaddress;
6421 ip6_address_t v6srcaddress;
6423 /* Parse args required to build the message */
6424 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6426 if (unformat (i, "del"))
6428 else if (unformat (i, "vrf %d", &vrf_id))
6430 else if (unformat (i, "insert-cid %d", &insert_cid))
6432 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6434 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6436 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6437 v4_src_address_set = 1;
6438 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6439 v6_src_address_set = 1;
6444 if (v4_address_set && v6_address_set)
6446 errmsg ("both v4 and v6 server addresses set\n");
6449 if (!v4_address_set && !v6_address_set)
6451 errmsg ("no server addresses set\n");
6455 if (v4_src_address_set && v6_src_address_set)
6457 errmsg ("both v4 and v6 src addresses set\n");
6460 if (!v4_src_address_set && !v6_src_address_set)
6462 errmsg ("no src addresses set\n");
6466 if (!(v4_src_address_set && v4_address_set) &&
6467 !(v6_src_address_set && v6_address_set))
6469 errmsg ("no matching server and src addresses set\n");
6473 /* Construct the API message */
6474 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
6476 mp->insert_circuit_id = insert_cid;
6477 mp->is_add = is_add;
6478 mp->vrf_id = ntohl (vrf_id);
6482 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6483 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6487 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6488 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6494 /* Wait for a reply, return good/bad news */
6501 api_dhcp_proxy_config_2 (vat_main_t * vam)
6503 unformat_input_t *i = vam->input;
6504 vl_api_dhcp_proxy_config_2_t *mp;
6507 u32 server_vrf_id = 0;
6510 u8 v4_address_set = 0;
6511 u8 v6_address_set = 0;
6512 ip4_address_t v4address;
6513 ip6_address_t v6address;
6514 u8 v4_src_address_set = 0;
6515 u8 v6_src_address_set = 0;
6516 ip4_address_t v4srcaddress;
6517 ip6_address_t v6srcaddress;
6519 /* Parse args required to build the message */
6520 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6522 if (unformat (i, "del"))
6524 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
6526 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
6528 else if (unformat (i, "insert-cid %d", &insert_cid))
6530 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6532 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6534 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6535 v4_src_address_set = 1;
6536 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6537 v6_src_address_set = 1;
6542 if (v4_address_set && v6_address_set)
6544 errmsg ("both v4 and v6 server addresses set\n");
6547 if (!v4_address_set && !v6_address_set)
6549 errmsg ("no server addresses set\n");
6553 if (v4_src_address_set && v6_src_address_set)
6555 errmsg ("both v4 and v6 src addresses set\n");
6558 if (!v4_src_address_set && !v6_src_address_set)
6560 errmsg ("no src addresses set\n");
6564 if (!(v4_src_address_set && v4_address_set) &&
6565 !(v6_src_address_set && v6_address_set))
6567 errmsg ("no matching server and src addresses set\n");
6571 /* Construct the API message */
6572 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
6574 mp->insert_circuit_id = insert_cid;
6575 mp->is_add = is_add;
6576 mp->rx_vrf_id = ntohl (rx_vrf_id);
6577 mp->server_vrf_id = ntohl (server_vrf_id);
6581 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6582 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6586 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6587 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6593 /* Wait for a reply, return good/bad news */
6600 api_dhcp_proxy_set_vss (vat_main_t * vam)
6602 unformat_input_t *i = vam->input;
6603 vl_api_dhcp_proxy_set_vss_t *mp;
6614 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6616 if (unformat (i, "tbl_id %d", &tbl_id))
6618 if (unformat (i, "fib_id %d", &fib_id))
6620 if (unformat (i, "oui %d", &oui))
6622 else if (unformat (i, "ipv6"))
6624 else if (unformat (i, "del"))
6628 clib_warning ("parse error '%U'", format_unformat_error, i);
6633 if (tbl_id_set == 0)
6635 errmsg ("missing tbl id\n");
6639 if (fib_id_set == 0)
6641 errmsg ("missing fib id\n");
6646 errmsg ("missing oui\n");
6650 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
6651 mp->tbl_id = ntohl (tbl_id);
6652 mp->fib_id = ntohl (fib_id);
6653 mp->oui = ntohl (oui);
6654 mp->is_ipv6 = is_ipv6;
6655 mp->is_add = is_add;
6664 api_dhcp_client_config (vat_main_t * vam)
6666 unformat_input_t *i = vam->input;
6667 vl_api_dhcp_client_config_t *mp;
6670 u8 sw_if_index_set = 0;
6673 u8 disable_event = 0;
6675 /* Parse args required to build the message */
6676 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6678 if (unformat (i, "del"))
6680 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6681 sw_if_index_set = 1;
6682 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6683 sw_if_index_set = 1;
6684 else if (unformat (i, "hostname %s", &hostname))
6686 else if (unformat (i, "disable_event"))
6692 if (sw_if_index_set == 0)
6694 errmsg ("missing interface name or sw_if_index\n");
6698 if (vec_len (hostname) > 63)
6700 errmsg ("hostname too long\n");
6702 vec_add1 (hostname, 0);
6704 /* Construct the API message */
6705 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
6707 mp->sw_if_index = ntohl (sw_if_index);
6708 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
6709 vec_free (hostname);
6710 mp->is_add = is_add;
6711 mp->want_dhcp_event = disable_event ? 0 : 1;
6712 mp->pid = getpid ();
6717 /* Wait for a reply, return good/bad news */
6724 api_set_ip_flow_hash (vat_main_t * vam)
6726 unformat_input_t *i = vam->input;
6727 vl_api_set_ip_flow_hash_t *mp;
6739 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6741 if (unformat (i, "vrf %d", &vrf_id))
6743 else if (unformat (i, "ipv6"))
6745 else if (unformat (i, "src"))
6747 else if (unformat (i, "dst"))
6749 else if (unformat (i, "sport"))
6751 else if (unformat (i, "dport"))
6753 else if (unformat (i, "proto"))
6755 else if (unformat (i, "reverse"))
6760 clib_warning ("parse error '%U'", format_unformat_error, i);
6765 if (vrf_id_set == 0)
6767 errmsg ("missing vrf id\n");
6771 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
6777 mp->reverse = reverse;
6778 mp->vrf_id = ntohl (vrf_id);
6779 mp->is_ipv6 = is_ipv6;
6788 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
6790 unformat_input_t *i = vam->input;
6791 vl_api_sw_interface_ip6_enable_disable_t *mp;
6794 u8 sw_if_index_set = 0;
6797 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6799 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6800 sw_if_index_set = 1;
6801 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6802 sw_if_index_set = 1;
6803 else if (unformat (i, "enable"))
6805 else if (unformat (i, "disable"))
6809 clib_warning ("parse error '%U'", format_unformat_error, i);
6814 if (sw_if_index_set == 0)
6816 errmsg ("missing interface name or sw_if_index\n");
6820 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
6822 mp->sw_if_index = ntohl (sw_if_index);
6823 mp->enable = enable;
6832 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
6834 unformat_input_t *i = vam->input;
6835 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
6838 u8 sw_if_index_set = 0;
6839 u32 address_length = 0;
6840 u8 v6_address_set = 0;
6841 ip6_address_t v6address;
6843 /* Parse args required to build the message */
6844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6846 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6847 sw_if_index_set = 1;
6848 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6849 sw_if_index_set = 1;
6850 else if (unformat (i, "%U/%d",
6851 unformat_ip6_address, &v6address, &address_length))
6857 if (sw_if_index_set == 0)
6859 errmsg ("missing interface name or sw_if_index\n");
6862 if (!v6_address_set)
6864 errmsg ("no address set\n");
6868 /* Construct the API message */
6869 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
6870 sw_interface_ip6_set_link_local_address);
6872 mp->sw_if_index = ntohl (sw_if_index);
6873 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6874 mp->address_length = address_length;
6879 /* Wait for a reply, return good/bad news */
6888 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
6890 unformat_input_t *i = vam->input;
6891 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
6894 u8 sw_if_index_set = 0;
6895 u32 address_length = 0;
6896 u8 v6_address_set = 0;
6897 ip6_address_t v6address;
6899 u8 no_advertise = 0;
6901 u8 no_autoconfig = 0;
6904 u32 val_lifetime = 0;
6905 u32 pref_lifetime = 0;
6907 /* Parse args required to build the message */
6908 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6910 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6911 sw_if_index_set = 1;
6912 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6913 sw_if_index_set = 1;
6914 else if (unformat (i, "%U/%d",
6915 unformat_ip6_address, &v6address, &address_length))
6917 else if (unformat (i, "val_life %d", &val_lifetime))
6919 else if (unformat (i, "pref_life %d", &pref_lifetime))
6921 else if (unformat (i, "def"))
6923 else if (unformat (i, "noadv"))
6925 else if (unformat (i, "offl"))
6927 else if (unformat (i, "noauto"))
6929 else if (unformat (i, "nolink"))
6931 else if (unformat (i, "isno"))
6935 clib_warning ("parse error '%U'", format_unformat_error, i);
6940 if (sw_if_index_set == 0)
6942 errmsg ("missing interface name or sw_if_index\n");
6945 if (!v6_address_set)
6947 errmsg ("no address set\n");
6951 /* Construct the API message */
6952 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
6954 mp->sw_if_index = ntohl (sw_if_index);
6955 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6956 mp->address_length = address_length;
6957 mp->use_default = use_default;
6958 mp->no_advertise = no_advertise;
6959 mp->off_link = off_link;
6960 mp->no_autoconfig = no_autoconfig;
6961 mp->no_onlink = no_onlink;
6963 mp->val_lifetime = ntohl (val_lifetime);
6964 mp->pref_lifetime = ntohl (pref_lifetime);
6969 /* Wait for a reply, return good/bad news */
6977 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
6979 unformat_input_t *i = vam->input;
6980 vl_api_sw_interface_ip6nd_ra_config_t *mp;
6983 u8 sw_if_index_set = 0;
6988 u8 send_unicast = 0;
6991 u8 default_router = 0;
6992 u32 max_interval = 0;
6993 u32 min_interval = 0;
6995 u32 initial_count = 0;
6996 u32 initial_interval = 0;
6999 /* Parse args required to build the message */
7000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7002 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7003 sw_if_index_set = 1;
7004 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7005 sw_if_index_set = 1;
7006 else if (unformat (i, "maxint %d", &max_interval))
7008 else if (unformat (i, "minint %d", &min_interval))
7010 else if (unformat (i, "life %d", &lifetime))
7012 else if (unformat (i, "count %d", &initial_count))
7014 else if (unformat (i, "interval %d", &initial_interval))
7016 else if (unformat (i, "suppress") || unformat (i, "surpress"))
7018 else if (unformat (i, "managed"))
7020 else if (unformat (i, "other"))
7022 else if (unformat (i, "ll"))
7024 else if (unformat (i, "send"))
7026 else if (unformat (i, "cease"))
7028 else if (unformat (i, "isno"))
7030 else if (unformat (i, "def"))
7034 clib_warning ("parse error '%U'", format_unformat_error, i);
7039 if (sw_if_index_set == 0)
7041 errmsg ("missing interface name or sw_if_index\n");
7045 /* Construct the API message */
7046 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
7048 mp->sw_if_index = ntohl (sw_if_index);
7049 mp->max_interval = ntohl (max_interval);
7050 mp->min_interval = ntohl (min_interval);
7051 mp->lifetime = ntohl (lifetime);
7052 mp->initial_count = ntohl (initial_count);
7053 mp->initial_interval = ntohl (initial_interval);
7054 mp->suppress = suppress;
7055 mp->managed = managed;
7057 mp->ll_option = ll_option;
7058 mp->send_unicast = send_unicast;
7061 mp->default_router = default_router;
7066 /* Wait for a reply, return good/bad news */
7074 api_set_arp_neighbor_limit (vat_main_t * vam)
7076 unformat_input_t *i = vam->input;
7077 vl_api_set_arp_neighbor_limit_t *mp;
7083 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7085 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7087 else if (unformat (i, "ipv6"))
7091 clib_warning ("parse error '%U'", format_unformat_error, i);
7098 errmsg ("missing limit value\n");
7102 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
7104 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7105 mp->is_ipv6 = is_ipv6;
7114 api_l2_patch_add_del (vat_main_t * vam)
7116 unformat_input_t *i = vam->input;
7117 vl_api_l2_patch_add_del_t *mp;
7120 u8 rx_sw_if_index_set = 0;
7122 u8 tx_sw_if_index_set = 0;
7125 /* Parse args required to build the message */
7126 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7128 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7129 rx_sw_if_index_set = 1;
7130 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7131 tx_sw_if_index_set = 1;
7132 else if (unformat (i, "rx"))
7134 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7136 if (unformat (i, "%U", unformat_sw_if_index, vam,
7138 rx_sw_if_index_set = 1;
7143 else if (unformat (i, "tx"))
7145 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7147 if (unformat (i, "%U", unformat_sw_if_index, vam,
7149 tx_sw_if_index_set = 1;
7154 else if (unformat (i, "del"))
7160 if (rx_sw_if_index_set == 0)
7162 errmsg ("missing rx interface name or rx_sw_if_index\n");
7166 if (tx_sw_if_index_set == 0)
7168 errmsg ("missing tx interface name or tx_sw_if_index\n");
7172 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7174 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7175 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7176 mp->is_add = is_add;
7185 api_ioam_enable (vat_main_t * vam)
7187 unformat_input_t *input = vam->input;
7188 vl_api_ioam_enable_t *mp;
7191 int has_trace_option = 0;
7192 int has_pow_option = 0;
7193 int has_ppc_option = 0;
7195 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7197 if (unformat (input, "trace"))
7198 has_trace_option = 1;
7199 else if (unformat (input, "pow"))
7201 else if (unformat (input, "ppc encap"))
7202 has_ppc_option = PPC_ENCAP;
7203 else if (unformat (input, "ppc decap"))
7204 has_ppc_option = PPC_DECAP;
7205 else if (unformat (input, "ppc none"))
7206 has_ppc_option = PPC_NONE;
7210 M (IOAM_ENABLE, ioam_enable);
7211 mp->id = htons (id);
7212 mp->trace_ppc = has_ppc_option;
7213 mp->pow_enable = has_pow_option;
7214 mp->trace_enable = has_trace_option;
7225 api_ioam_disable (vat_main_t * vam)
7227 vl_api_ioam_disable_t *mp;
7230 M (IOAM_DISABLE, ioam_disable);
7237 api_sr_tunnel_add_del (vat_main_t * vam)
7239 unformat_input_t *i = vam->input;
7240 vl_api_sr_tunnel_add_del_t *mp;
7244 ip6_address_t src_address;
7245 int src_address_set = 0;
7246 ip6_address_t dst_address;
7248 int dst_address_set = 0;
7250 u32 rx_table_id = 0;
7251 u32 tx_table_id = 0;
7252 ip6_address_t *segments = 0;
7253 ip6_address_t *this_seg;
7254 ip6_address_t *tags = 0;
7255 ip6_address_t *this_tag;
7256 ip6_address_t next_address, tag;
7258 u8 *policy_name = 0;
7260 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7262 if (unformat (i, "del"))
7264 else if (unformat (i, "name %s", &name))
7266 else if (unformat (i, "policy %s", &policy_name))
7268 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7270 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7272 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7273 src_address_set = 1;
7274 else if (unformat (i, "dst %U/%d",
7275 unformat_ip6_address, &dst_address, &dst_mask_width))
7276 dst_address_set = 1;
7277 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7279 vec_add2 (segments, this_seg, 1);
7280 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7281 sizeof (*this_seg));
7283 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7285 vec_add2 (tags, this_tag, 1);
7286 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7288 else if (unformat (i, "clean"))
7289 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7290 else if (unformat (i, "protected"))
7291 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7292 else if (unformat (i, "InPE %d", &pl_index))
7294 if (pl_index <= 0 || pl_index > 4)
7296 pl_index_range_error:
7297 errmsg ("pl index %d out of range\n", pl_index);
7301 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7303 else if (unformat (i, "EgPE %d", &pl_index))
7305 if (pl_index <= 0 || pl_index > 4)
7306 goto pl_index_range_error;
7308 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7310 else if (unformat (i, "OrgSrc %d", &pl_index))
7312 if (pl_index <= 0 || pl_index > 4)
7313 goto pl_index_range_error;
7315 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7321 if (!src_address_set)
7323 errmsg ("src address required\n");
7327 if (!dst_address_set)
7329 errmsg ("dst address required\n");
7335 errmsg ("at least one sr segment required\n");
7339 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7340 vec_len (segments) * sizeof (ip6_address_t)
7341 + vec_len (tags) * sizeof (ip6_address_t));
7343 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7344 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7345 mp->dst_mask_width = dst_mask_width;
7346 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7347 mp->n_segments = vec_len (segments);
7348 mp->n_tags = vec_len (tags);
7349 mp->is_add = is_del == 0;
7350 clib_memcpy (mp->segs_and_tags, segments,
7351 vec_len (segments) * sizeof (ip6_address_t));
7352 clib_memcpy (mp->segs_and_tags +
7353 vec_len (segments) * sizeof (ip6_address_t), tags,
7354 vec_len (tags) * sizeof (ip6_address_t));
7356 mp->outer_vrf_id = ntohl (rx_table_id);
7357 mp->inner_vrf_id = ntohl (tx_table_id);
7358 memcpy (mp->name, name, vec_len (name));
7359 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7361 vec_free (segments);
7370 api_sr_policy_add_del (vat_main_t * vam)
7372 unformat_input_t *input = vam->input;
7373 vl_api_sr_policy_add_del_t *mp;
7377 u8 *tunnel_name = 0;
7378 u8 **tunnel_names = 0;
7383 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
7384 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
7386 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7388 if (unformat (input, "del"))
7390 else if (unformat (input, "name %s", &name))
7392 else if (unformat (input, "tunnel %s", &tunnel_name))
7396 vec_add1 (tunnel_names, tunnel_name);
7398 - length = #bytes to store in serial vector
7399 - +1 = byte to store that length
7401 tunnel_names_length += (vec_len (tunnel_name) + 1);
7412 errmsg ("policy name required\n");
7416 if ((!tunnel_set) && (!is_del))
7418 errmsg ("tunnel name required\n");
7422 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
7426 mp->is_add = !is_del;
7428 memcpy (mp->name, name, vec_len (name));
7429 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
7430 u8 *serial_orig = 0;
7431 vec_validate (serial_orig, tunnel_names_length);
7432 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
7433 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
7435 for (j = 0; j < vec_len (tunnel_names); j++)
7437 tun_name_len = vec_len (tunnel_names[j]);
7438 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
7439 serial_orig += 1; // Move along one byte to store the actual tunnel name
7440 memcpy (serial_orig, tunnel_names[j], tun_name_len);
7441 serial_orig += tun_name_len; // Advance past the copy
7443 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
7445 vec_free (tunnel_names);
7446 vec_free (tunnel_name);
7454 api_sr_multicast_map_add_del (vat_main_t * vam)
7456 unformat_input_t *input = vam->input;
7457 vl_api_sr_multicast_map_add_del_t *mp;
7460 ip6_address_t multicast_address;
7461 u8 *policy_name = 0;
7462 int multicast_address_set = 0;
7464 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7466 if (unformat (input, "del"))
7470 (input, "address %U", unformat_ip6_address, &multicast_address))
7471 multicast_address_set = 1;
7472 else if (unformat (input, "sr-policy %s", &policy_name))
7478 if (!is_del && !policy_name)
7480 errmsg ("sr-policy name required\n");
7485 if (!multicast_address_set)
7487 errmsg ("address required\n");
7491 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
7493 mp->is_add = !is_del;
7494 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7495 clib_memcpy (mp->multicast_address, &multicast_address,
7496 sizeof (mp->multicast_address));
7499 vec_free (policy_name);
7507 #define foreach_ip4_proto_field \
7518 unformat_ip4_mask (unformat_input_t * input, va_list * args)
7520 u8 **maskp = va_arg (*args, u8 **);
7522 u8 found_something = 0;
7525 #define _(a) u8 a=0;
7526 foreach_ip4_proto_field;
7532 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7534 if (unformat (input, "version"))
7536 else if (unformat (input, "hdr_length"))
7538 else if (unformat (input, "src"))
7540 else if (unformat (input, "dst"))
7542 else if (unformat (input, "proto"))
7545 #define _(a) else if (unformat (input, #a)) a=1;
7546 foreach_ip4_proto_field
7552 #define _(a) found_something += a;
7553 foreach_ip4_proto_field;
7556 if (found_something == 0)
7559 vec_validate (mask, sizeof (*ip) - 1);
7561 ip = (ip4_header_t *) mask;
7563 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7564 foreach_ip4_proto_field;
7567 ip->ip_version_and_header_length = 0;
7570 ip->ip_version_and_header_length |= 0xF0;
7573 ip->ip_version_and_header_length |= 0x0F;
7579 #define foreach_ip6_proto_field \
7587 unformat_ip6_mask (unformat_input_t * input, va_list * args)
7589 u8 **maskp = va_arg (*args, u8 **);
7591 u8 found_something = 0;
7593 u32 ip_version_traffic_class_and_flow_label;
7595 #define _(a) u8 a=0;
7596 foreach_ip6_proto_field;
7599 u8 traffic_class = 0;
7602 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7604 if (unformat (input, "version"))
7606 else if (unformat (input, "traffic-class"))
7608 else if (unformat (input, "flow-label"))
7610 else if (unformat (input, "src"))
7612 else if (unformat (input, "dst"))
7614 else if (unformat (input, "proto"))
7617 #define _(a) else if (unformat (input, #a)) a=1;
7618 foreach_ip6_proto_field
7624 #define _(a) found_something += a;
7625 foreach_ip6_proto_field;
7628 if (found_something == 0)
7631 vec_validate (mask, sizeof (*ip) - 1);
7633 ip = (ip6_header_t *) mask;
7635 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7636 foreach_ip6_proto_field;
7639 ip_version_traffic_class_and_flow_label = 0;
7642 ip_version_traffic_class_and_flow_label |= 0xF0000000;
7645 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
7648 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
7650 ip->ip_version_traffic_class_and_flow_label =
7651 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
7658 unformat_l3_mask (unformat_input_t * input, va_list * args)
7660 u8 **maskp = va_arg (*args, u8 **);
7662 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7664 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
7666 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
7675 unformat_l2_mask (unformat_input_t * input, va_list * args)
7677 u8 **maskp = va_arg (*args, u8 **);
7692 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7694 if (unformat (input, "src"))
7696 else if (unformat (input, "dst"))
7698 else if (unformat (input, "proto"))
7700 else if (unformat (input, "tag1"))
7702 else if (unformat (input, "tag2"))
7704 else if (unformat (input, "ignore-tag1"))
7706 else if (unformat (input, "ignore-tag2"))
7708 else if (unformat (input, "cos1"))
7710 else if (unformat (input, "cos2"))
7712 else if (unformat (input, "dot1q"))
7714 else if (unformat (input, "dot1ad"))
7719 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
7720 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
7723 if (tag1 || ignore_tag1 || cos1 || dot1q)
7725 if (tag2 || ignore_tag2 || cos2 || dot1ad)
7728 vec_validate (mask, len - 1);
7731 memset (mask, 0xff, 6);
7734 memset (mask + 6, 0xff, 6);
7738 /* inner vlan tag */
7747 mask[21] = mask[20] = 0xff;
7768 mask[16] = mask[17] = 0xff;
7778 mask[12] = mask[13] = 0xff;
7785 unformat_classify_mask (unformat_input_t * input, va_list * args)
7787 u8 **maskp = va_arg (*args, u8 **);
7788 u32 *skipp = va_arg (*args, u32 *);
7789 u32 *matchp = va_arg (*args, u32 *);
7796 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7798 if (unformat (input, "hex %U", unformat_hex_string, &mask))
7800 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
7802 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
7808 if (mask || l2 || l3)
7812 /* "With a free Ethernet header in every package" */
7814 vec_validate (l2, 13);
7818 vec_append (mask, l3);
7823 /* Scan forward looking for the first significant mask octet */
7824 for (i = 0; i < vec_len (mask); i++)
7828 /* compute (skip, match) params */
7829 *skipp = i / sizeof (u32x4);
7830 vec_delete (mask, *skipp * sizeof (u32x4), 0);
7832 /* Pad mask to an even multiple of the vector size */
7833 while (vec_len (mask) % sizeof (u32x4))
7836 match = vec_len (mask) / sizeof (u32x4);
7838 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
7840 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
7841 if (*tmp || *(tmp + 1))
7846 clib_warning ("BUG: match 0");
7848 _vec_len (mask) = match * sizeof (u32x4);
7859 #define foreach_l2_next \
7861 _(ethernet, ETHERNET_INPUT) \
7866 unformat_l2_next_index (unformat_input_t * input, va_list * args)
7868 u32 *miss_next_indexp = va_arg (*args, u32 *);
7873 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
7877 if (unformat (input, "%d", &tmp))
7886 *miss_next_indexp = next_index;
7890 #define foreach_ip_next \
7897 unformat_ip_next_index (unformat_input_t * input, va_list * args)
7899 u32 *miss_next_indexp = va_arg (*args, u32 *);
7904 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
7908 if (unformat (input, "%d", &tmp))
7917 *miss_next_indexp = next_index;
7921 #define foreach_acl_next \
7925 unformat_acl_next_index (unformat_input_t * input, va_list * args)
7927 u32 *miss_next_indexp = va_arg (*args, u32 *);
7932 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
7936 if (unformat (input, "permit"))
7941 else if (unformat (input, "%d", &tmp))
7950 *miss_next_indexp = next_index;
7955 unformat_policer_precolor (unformat_input_t * input, va_list * args)
7957 u32 *r = va_arg (*args, u32 *);
7959 if (unformat (input, "conform-color"))
7960 *r = POLICE_CONFORM;
7961 else if (unformat (input, "exceed-color"))
7970 api_classify_add_del_table (vat_main_t * vam)
7972 unformat_input_t *i = vam->input;
7973 vl_api_classify_add_del_table_t *mp;
7979 u32 table_index = ~0;
7980 u32 next_table_index = ~0;
7981 u32 miss_next_index = ~0;
7982 u32 memory_size = 32 << 20;
7986 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7988 if (unformat (i, "del"))
7990 else if (unformat (i, "buckets %d", &nbuckets))
7992 else if (unformat (i, "memory_size %d", &memory_size))
7994 else if (unformat (i, "skip %d", &skip))
7996 else if (unformat (i, "match %d", &match))
7998 else if (unformat (i, "table %d", &table_index))
8000 else if (unformat (i, "mask %U", unformat_classify_mask,
8001 &mask, &skip, &match))
8003 else if (unformat (i, "next-table %d", &next_table_index))
8005 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8008 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8011 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8018 if (is_add && mask == 0)
8020 errmsg ("Mask required\n");
8024 if (is_add && skip == ~0)
8026 errmsg ("skip count required\n");
8030 if (is_add && match == ~0)
8032 errmsg ("match count required\n");
8036 if (!is_add && table_index == ~0)
8038 errmsg ("table index required for delete\n");
8042 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8044 mp->is_add = is_add;
8045 mp->table_index = ntohl (table_index);
8046 mp->nbuckets = ntohl (nbuckets);
8047 mp->memory_size = ntohl (memory_size);
8048 mp->skip_n_vectors = ntohl (skip);
8049 mp->match_n_vectors = ntohl (match);
8050 mp->next_table_index = ntohl (next_table_index);
8051 mp->miss_next_index = ntohl (miss_next_index);
8052 clib_memcpy (mp->mask, mask, vec_len (mask));
8062 unformat_ip4_match (unformat_input_t * input, va_list * args)
8064 u8 **matchp = va_arg (*args, u8 **);
8071 int src = 0, dst = 0;
8072 ip4_address_t src_val, dst_val;
8079 int fragment_id = 0;
8080 u32 fragment_id_val;
8086 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8088 if (unformat (input, "version %d", &version_val))
8090 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8092 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8094 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8096 else if (unformat (input, "proto %d", &proto_val))
8098 else if (unformat (input, "tos %d", &tos_val))
8100 else if (unformat (input, "length %d", &length_val))
8102 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8104 else if (unformat (input, "ttl %d", &ttl_val))
8106 else if (unformat (input, "checksum %d", &checksum_val))
8112 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8113 + ttl + checksum == 0)
8117 * Aligned because we use the real comparison functions
8119 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8121 ip = (ip4_header_t *) match;
8123 /* These are realistically matched in practice */
8125 ip->src_address.as_u32 = src_val.as_u32;
8128 ip->dst_address.as_u32 = dst_val.as_u32;
8131 ip->protocol = proto_val;
8134 /* These are not, but they're included for completeness */
8136 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8139 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8145 ip->length = length_val;
8151 ip->checksum = checksum_val;
8158 unformat_ip6_match (unformat_input_t * input, va_list * args)
8160 u8 **matchp = va_arg (*args, u8 **);
8165 u8 traffic_class = 0;
8166 u32 traffic_class_val = 0;
8169 int src = 0, dst = 0;
8170 ip6_address_t src_val, dst_val;
8173 int payload_length = 0;
8174 u32 payload_length_val;
8177 u32 ip_version_traffic_class_and_flow_label;
8179 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8181 if (unformat (input, "version %d", &version_val))
8183 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8185 else if (unformat (input, "flow_label %d", &flow_label_val))
8187 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8189 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8191 else if (unformat (input, "proto %d", &proto_val))
8193 else if (unformat (input, "payload_length %d", &payload_length_val))
8195 else if (unformat (input, "hop_limit %d", &hop_limit_val))
8201 if (version + traffic_class + flow_label + src + dst + proto +
8202 payload_length + hop_limit == 0)
8206 * Aligned because we use the real comparison functions
8208 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8210 ip = (ip6_header_t *) match;
8213 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
8216 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
8219 ip->protocol = proto_val;
8221 ip_version_traffic_class_and_flow_label = 0;
8224 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
8227 ip_version_traffic_class_and_flow_label |=
8228 (traffic_class_val & 0xFF) << 20;
8231 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
8233 ip->ip_version_traffic_class_and_flow_label =
8234 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8237 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
8240 ip->hop_limit = hop_limit_val;
8247 unformat_l3_match (unformat_input_t * input, va_list * args)
8249 u8 **matchp = va_arg (*args, u8 **);
8251 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8253 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
8255 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
8264 unformat_vlan_tag (unformat_input_t * input, va_list * args)
8266 u8 *tagp = va_arg (*args, u8 *);
8269 if (unformat (input, "%d", &tag))
8271 tagp[0] = (tag >> 8) & 0x0F;
8272 tagp[1] = tag & 0xFF;
8280 unformat_l2_match (unformat_input_t * input, va_list * args)
8282 u8 **matchp = va_arg (*args, u8 **);
8302 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8304 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
8307 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
8309 else if (unformat (input, "proto %U",
8310 unformat_ethernet_type_host_byte_order, &proto_val))
8312 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
8314 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
8316 else if (unformat (input, "ignore-tag1"))
8318 else if (unformat (input, "ignore-tag2"))
8320 else if (unformat (input, "cos1 %d", &cos1_val))
8322 else if (unformat (input, "cos2 %d", &cos2_val))
8327 if ((src + dst + proto + tag1 + tag2 +
8328 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8331 if (tag1 || ignore_tag1 || cos1)
8333 if (tag2 || ignore_tag2 || cos2)
8336 vec_validate_aligned (match, len - 1, sizeof (u32x4));
8339 clib_memcpy (match, dst_val, 6);
8342 clib_memcpy (match + 6, src_val, 6);
8346 /* inner vlan tag */
8347 match[19] = tag2_val[1];
8348 match[18] = tag2_val[0];
8350 match[18] |= (cos2_val & 0x7) << 5;
8353 match[21] = proto_val & 0xff;
8354 match[20] = proto_val >> 8;
8358 match[15] = tag1_val[1];
8359 match[14] = tag1_val[0];
8362 match[14] |= (cos1_val & 0x7) << 5;
8368 match[15] = tag1_val[1];
8369 match[14] = tag1_val[0];
8372 match[17] = proto_val & 0xff;
8373 match[16] = proto_val >> 8;
8376 match[14] |= (cos1_val & 0x7) << 5;
8382 match[18] |= (cos2_val & 0x7) << 5;
8384 match[14] |= (cos1_val & 0x7) << 5;
8387 match[13] = proto_val & 0xff;
8388 match[12] = proto_val >> 8;
8397 unformat_classify_match (unformat_input_t * input, va_list * args)
8399 u8 **matchp = va_arg (*args, u8 **);
8400 u32 skip_n_vectors = va_arg (*args, u32);
8401 u32 match_n_vectors = va_arg (*args, u32);
8407 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8409 if (unformat (input, "hex %U", unformat_hex_string, &match))
8411 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
8413 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
8419 if (match || l2 || l3)
8423 /* "Win a free Ethernet header in every packet" */
8425 vec_validate_aligned (l2, 13, sizeof (u32x4));
8429 vec_append_aligned (match, l3, sizeof (u32x4));
8434 /* Make sure the vector is big enough even if key is all 0's */
8435 vec_validate_aligned
8436 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
8439 /* Set size, include skipped vectors */
8440 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
8451 api_classify_add_del_session (vat_main_t * vam)
8453 unformat_input_t *i = vam->input;
8454 vl_api_classify_add_del_session_t *mp;
8456 u32 table_index = ~0;
8457 u32 hit_next_index = ~0;
8458 u32 opaque_index = ~0;
8462 u32 skip_n_vectors = 0;
8463 u32 match_n_vectors = 0;
8466 * Warning: you have to supply skip_n and match_n
8467 * because the API client cant simply look at the classify
8471 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8473 if (unformat (i, "del"))
8475 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
8478 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
8481 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
8484 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
8486 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
8488 else if (unformat (i, "opaque-index %d", &opaque_index))
8490 else if (unformat (i, "skip_n %d", &skip_n_vectors))
8492 else if (unformat (i, "match_n %d", &match_n_vectors))
8494 else if (unformat (i, "match %U", unformat_classify_match,
8495 &match, skip_n_vectors, match_n_vectors))
8497 else if (unformat (i, "advance %d", &advance))
8499 else if (unformat (i, "table-index %d", &table_index))
8505 if (table_index == ~0)
8507 errmsg ("Table index required\n");
8511 if (is_add && match == 0)
8513 errmsg ("Match value required\n");
8517 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
8519 mp->is_add = is_add;
8520 mp->table_index = ntohl (table_index);
8521 mp->hit_next_index = ntohl (hit_next_index);
8522 mp->opaque_index = ntohl (opaque_index);
8523 mp->advance = ntohl (advance);
8524 clib_memcpy (mp->match, match, vec_len (match));
8533 api_classify_set_interface_ip_table (vat_main_t * vam)
8535 unformat_input_t *i = vam->input;
8536 vl_api_classify_set_interface_ip_table_t *mp;
8539 int sw_if_index_set;
8540 u32 table_index = ~0;
8543 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8545 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8546 sw_if_index_set = 1;
8547 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8548 sw_if_index_set = 1;
8549 else if (unformat (i, "table %d", &table_index))
8553 clib_warning ("parse error '%U'", format_unformat_error, i);
8558 if (sw_if_index_set == 0)
8560 errmsg ("missing interface name or sw_if_index\n");
8565 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
8567 mp->sw_if_index = ntohl (sw_if_index);
8568 mp->table_index = ntohl (table_index);
8569 mp->is_ipv6 = is_ipv6;
8578 api_classify_set_interface_l2_tables (vat_main_t * vam)
8580 unformat_input_t *i = vam->input;
8581 vl_api_classify_set_interface_l2_tables_t *mp;
8584 int sw_if_index_set;
8585 u32 ip4_table_index = ~0;
8586 u32 ip6_table_index = ~0;
8587 u32 other_table_index = ~0;
8590 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8592 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8593 sw_if_index_set = 1;
8594 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8595 sw_if_index_set = 1;
8596 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8598 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8600 else if (unformat (i, "other-table %d", &other_table_index))
8602 else if (unformat (i, "is-input %d", &is_input))
8606 clib_warning ("parse error '%U'", format_unformat_error, i);
8611 if (sw_if_index_set == 0)
8613 errmsg ("missing interface name or sw_if_index\n");
8618 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
8620 mp->sw_if_index = ntohl (sw_if_index);
8621 mp->ip4_table_index = ntohl (ip4_table_index);
8622 mp->ip6_table_index = ntohl (ip6_table_index);
8623 mp->other_table_index = ntohl (other_table_index);
8624 mp->is_input = (u8) is_input;
8633 api_set_ipfix_exporter (vat_main_t * vam)
8635 unformat_input_t *i = vam->input;
8636 vl_api_set_ipfix_exporter_t *mp;
8637 ip4_address_t collector_address;
8638 u8 collector_address_set = 0;
8639 u32 collector_port = ~0;
8640 ip4_address_t src_address;
8641 u8 src_address_set = 0;
8644 u32 template_interval = ~0;
8645 u8 udp_checksum = 0;
8648 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8650 if (unformat (i, "collector_address %U", unformat_ip4_address,
8651 &collector_address))
8652 collector_address_set = 1;
8653 else if (unformat (i, "collector_port %d", &collector_port))
8655 else if (unformat (i, "src_address %U", unformat_ip4_address,
8657 src_address_set = 1;
8658 else if (unformat (i, "vrf_id %d", &vrf_id))
8660 else if (unformat (i, "path_mtu %d", &path_mtu))
8662 else if (unformat (i, "template_interval %d", &template_interval))
8664 else if (unformat (i, "udp_checksum"))
8670 if (collector_address_set == 0)
8672 errmsg ("collector_address required\n");
8676 if (src_address_set == 0)
8678 errmsg ("src_address required\n");
8682 M (SET_IPFIX_EXPORTER, set_ipfix_exporter);
8684 memcpy (mp->collector_address, collector_address.data,
8685 sizeof (collector_address.data));
8686 mp->collector_port = htons ((u16) collector_port);
8687 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
8688 mp->vrf_id = htonl (vrf_id);
8689 mp->path_mtu = htonl (path_mtu);
8690 mp->template_interval = htonl (template_interval);
8691 mp->udp_checksum = udp_checksum;
8699 api_set_ipfix_classify_stream (vat_main_t * vam)
8701 unformat_input_t *i = vam->input;
8702 vl_api_set_ipfix_classify_stream_t *mp;
8704 u32 src_port = UDP_DST_PORT_ipfix;
8707 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8709 if (unformat (i, "domain %d", &domain_id))
8711 else if (unformat (i, "src_port %d", &src_port))
8715 errmsg ("unknown input `%U'", format_unformat_error, i);
8720 M (SET_IPFIX_CLASSIFY_STREAM, set_ipfix_classify_stream);
8722 mp->domain_id = htonl (domain_id);
8723 mp->src_port = htons ((u16) src_port);
8731 api_ipfix_classify_table_add_del (vat_main_t * vam)
8733 unformat_input_t *i = vam->input;
8734 vl_api_ipfix_classify_table_add_del_t *mp;
8736 u32 classify_table_index = ~0;
8738 u8 transport_protocol = 255;
8741 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8743 if (unformat (i, "add"))
8745 else if (unformat (i, "del"))
8747 else if (unformat (i, "table %d", &classify_table_index))
8749 else if (unformat (i, "ip4"))
8751 else if (unformat (i, "ip6"))
8753 else if (unformat (i, "tcp"))
8754 transport_protocol = 6;
8755 else if (unformat (i, "udp"))
8756 transport_protocol = 17;
8759 errmsg ("unknown input `%U'", format_unformat_error, i);
8766 errmsg ("expecting: add|del");
8769 if (classify_table_index == ~0)
8771 errmsg ("classifier table not specified");
8774 if (ip_version == 0)
8776 errmsg ("IP version not specified");
8780 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, ipfix_classify_table_add_del);
8782 mp->is_add = is_add;
8783 mp->table_id = htonl (classify_table_index);
8784 mp->ip_version = ip_version;
8785 mp->transport_protocol = transport_protocol;
8793 api_get_node_index (vat_main_t * vam)
8795 unformat_input_t *i = vam->input;
8796 vl_api_get_node_index_t *mp;
8800 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8802 if (unformat (i, "node %s", &name))
8809 errmsg ("node name required\n");
8812 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8814 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8818 M (GET_NODE_INDEX, get_node_index);
8819 clib_memcpy (mp->node_name, name, vec_len (name));
8829 api_get_next_index (vat_main_t * vam)
8831 unformat_input_t *i = vam->input;
8832 vl_api_get_next_index_t *mp;
8834 u8 *node_name = 0, *next_node_name = 0;
8836 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8838 if (unformat (i, "node-name %s", &node_name))
8840 else if (unformat (i, "next-node-name %s", &next_node_name))
8846 errmsg ("node name required\n");
8849 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
8851 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8855 if (next_node_name == 0)
8857 errmsg ("next node name required\n");
8860 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
8862 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
8866 M (GET_NEXT_INDEX, get_next_index);
8867 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
8868 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
8869 vec_free (node_name);
8870 vec_free (next_node_name);
8879 api_add_node_next (vat_main_t * vam)
8881 unformat_input_t *i = vam->input;
8882 vl_api_add_node_next_t *mp;
8887 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8889 if (unformat (i, "node %s", &name))
8891 else if (unformat (i, "next %s", &next))
8898 errmsg ("node name required\n");
8901 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8903 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8908 errmsg ("next node required\n");
8911 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
8913 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
8917 M (ADD_NODE_NEXT, add_node_next);
8918 clib_memcpy (mp->node_name, name, vec_len (name));
8919 clib_memcpy (mp->next_name, next, vec_len (next));
8930 api_l2tpv3_create_tunnel (vat_main_t * vam)
8932 unformat_input_t *i = vam->input;
8933 ip6_address_t client_address, our_address;
8934 int client_address_set = 0;
8935 int our_address_set = 0;
8936 u32 local_session_id = 0;
8937 u32 remote_session_id = 0;
8938 u64 local_cookie = 0;
8939 u64 remote_cookie = 0;
8940 u8 l2_sublayer_present = 0;
8941 vl_api_l2tpv3_create_tunnel_t *mp;
8944 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8946 if (unformat (i, "client_address %U", unformat_ip6_address,
8948 client_address_set = 1;
8949 else if (unformat (i, "our_address %U", unformat_ip6_address,
8951 our_address_set = 1;
8952 else if (unformat (i, "local_session_id %d", &local_session_id))
8954 else if (unformat (i, "remote_session_id %d", &remote_session_id))
8956 else if (unformat (i, "local_cookie %lld", &local_cookie))
8958 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
8960 else if (unformat (i, "l2-sublayer-present"))
8961 l2_sublayer_present = 1;
8966 if (client_address_set == 0)
8968 errmsg ("client_address required\n");
8972 if (our_address_set == 0)
8974 errmsg ("our_address required\n");
8978 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
8980 clib_memcpy (mp->client_address, client_address.as_u8,
8981 sizeof (mp->client_address));
8983 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
8985 mp->local_session_id = ntohl (local_session_id);
8986 mp->remote_session_id = ntohl (remote_session_id);
8987 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
8988 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
8989 mp->l2_sublayer_present = l2_sublayer_present;
8999 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
9001 unformat_input_t *i = vam->input;
9003 u8 sw_if_index_set = 0;
9004 u64 new_local_cookie = 0;
9005 u64 new_remote_cookie = 0;
9006 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
9009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9011 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9012 sw_if_index_set = 1;
9013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9014 sw_if_index_set = 1;
9015 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
9017 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
9023 if (sw_if_index_set == 0)
9025 errmsg ("missing interface name or sw_if_index\n");
9029 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
9031 mp->sw_if_index = ntohl (sw_if_index);
9032 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
9033 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
9042 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
9044 unformat_input_t *i = vam->input;
9045 vl_api_l2tpv3_interface_enable_disable_t *mp;
9048 u8 sw_if_index_set = 0;
9049 u8 enable_disable = 1;
9051 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9053 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9054 sw_if_index_set = 1;
9055 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9056 sw_if_index_set = 1;
9057 else if (unformat (i, "enable"))
9059 else if (unformat (i, "disable"))
9065 if (sw_if_index_set == 0)
9067 errmsg ("missing interface name or sw_if_index\n");
9071 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
9073 mp->sw_if_index = ntohl (sw_if_index);
9074 mp->enable_disable = enable_disable;
9083 api_l2tpv3_set_lookup_key (vat_main_t * vam)
9085 unformat_input_t *i = vam->input;
9086 vl_api_l2tpv3_set_lookup_key_t *mp;
9090 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9092 if (unformat (i, "lookup_v6_src"))
9093 key = L2T_LOOKUP_SRC_ADDRESS;
9094 else if (unformat (i, "lookup_v6_dst"))
9095 key = L2T_LOOKUP_DST_ADDRESS;
9096 else if (unformat (i, "lookup_session_id"))
9097 key = L2T_LOOKUP_SESSION_ID;
9102 if (key == (u8) ~ 0)
9104 errmsg ("l2tp session lookup key unset\n");
9108 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
9118 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
9119 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9121 vat_main_t *vam = &vat_main;
9123 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9124 format_ip6_address, mp->our_address,
9125 format_ip6_address, mp->client_address,
9126 clib_net_to_host_u32 (mp->sw_if_index));
9129 " local cookies %016llx %016llx remote cookie %016llx\n",
9130 clib_net_to_host_u64 (mp->local_cookie[0]),
9131 clib_net_to_host_u64 (mp->local_cookie[1]),
9132 clib_net_to_host_u64 (mp->remote_cookie));
9134 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9135 clib_net_to_host_u32 (mp->local_session_id),
9136 clib_net_to_host_u32 (mp->remote_session_id));
9138 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9139 mp->l2_sublayer_present ? "preset" : "absent");
9143 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9144 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9146 vat_main_t *vam = &vat_main;
9147 vat_json_node_t *node = NULL;
9148 struct in6_addr addr;
9150 if (VAT_JSON_ARRAY != vam->json_tree.type)
9152 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9153 vat_json_init_array (&vam->json_tree);
9155 node = vat_json_array_add (&vam->json_tree);
9157 vat_json_init_object (node);
9159 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9160 vat_json_object_add_ip6 (node, "our_address", addr);
9161 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9162 vat_json_object_add_ip6 (node, "client_address", addr);
9164 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9165 vat_json_init_array (lc);
9166 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9167 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9168 vat_json_object_add_uint (node, "remote_cookie",
9169 clib_net_to_host_u64 (mp->remote_cookie));
9171 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9172 vat_json_object_add_uint (node, "local_session_id",
9173 clib_net_to_host_u32 (mp->local_session_id));
9174 vat_json_object_add_uint (node, "remote_session_id",
9175 clib_net_to_host_u32 (mp->remote_session_id));
9176 vat_json_object_add_string_copy (node, "l2_sublayer",
9177 mp->l2_sublayer_present ? (u8 *) "present"
9182 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
9184 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
9187 /* Get list of l2tpv3-tunnel interfaces */
9188 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
9191 /* Use a control ping for synchronization */
9193 vl_api_control_ping_t *mp;
9194 M (CONTROL_PING, control_ping);
9201 static void vl_api_sw_interface_tap_details_t_handler
9202 (vl_api_sw_interface_tap_details_t * mp)
9204 vat_main_t *vam = &vat_main;
9206 fformat (vam->ofp, "%-16s %d\n",
9207 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
9210 static void vl_api_sw_interface_tap_details_t_handler_json
9211 (vl_api_sw_interface_tap_details_t * mp)
9213 vat_main_t *vam = &vat_main;
9214 vat_json_node_t *node = NULL;
9216 if (VAT_JSON_ARRAY != vam->json_tree.type)
9218 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9219 vat_json_init_array (&vam->json_tree);
9221 node = vat_json_array_add (&vam->json_tree);
9223 vat_json_init_object (node);
9224 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9225 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
9229 api_sw_interface_tap_dump (vat_main_t * vam)
9231 vl_api_sw_interface_tap_dump_t *mp;
9234 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
9235 /* Get list of tap interfaces */
9236 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
9239 /* Use a control ping for synchronization */
9241 vl_api_control_ping_t *mp;
9242 M (CONTROL_PING, control_ping);
9248 static uword unformat_vxlan_decap_next
9249 (unformat_input_t * input, va_list * args)
9251 u32 *result = va_arg (*args, u32 *);
9254 if (unformat (input, "drop"))
9255 *result = VXLAN_INPUT_NEXT_DROP;
9256 else if (unformat (input, "ip4"))
9257 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
9258 else if (unformat (input, "ip6"))
9259 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
9260 else if (unformat (input, "l2"))
9261 *result = VXLAN_INPUT_NEXT_L2_INPUT;
9262 else if (unformat (input, "%d", &tmp))
9270 api_vxlan_add_del_tunnel (vat_main_t * vam)
9272 unformat_input_t *line_input = vam->input;
9273 vl_api_vxlan_add_del_tunnel_t *mp;
9275 ip4_address_t src4, dst4;
9276 ip6_address_t src6, dst6;
9278 u8 ipv4_set = 0, ipv6_set = 0;
9281 u32 encap_vrf_id = 0;
9282 u32 decap_next_index = ~0;
9285 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9287 if (unformat (line_input, "del"))
9289 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9294 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9299 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
9304 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
9309 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9311 else if (unformat (line_input, "decap-next %U",
9312 unformat_vxlan_decap_next, &decap_next_index))
9314 else if (unformat (line_input, "vni %d", &vni))
9318 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9325 errmsg ("tunnel src address not specified\n");
9330 errmsg ("tunnel dst address not specified\n");
9334 if (ipv4_set && ipv6_set)
9336 errmsg ("both IPv4 and IPv6 addresses specified");
9340 if ((vni == 0) || (vni >> 24))
9342 errmsg ("vni not specified or out of range\n");
9346 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
9350 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
9351 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
9355 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9356 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9358 mp->encap_vrf_id = ntohl (encap_vrf_id);
9359 mp->decap_next_index = ntohl (decap_next_index);
9360 mp->vni = ntohl (vni);
9361 mp->is_add = is_add;
9362 mp->is_ipv6 = ipv6_set;
9370 static void vl_api_vxlan_tunnel_details_t_handler
9371 (vl_api_vxlan_tunnel_details_t * mp)
9373 vat_main_t *vam = &vat_main;
9375 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
9376 ntohl (mp->sw_if_index),
9377 format_ip46_address, &(mp->src_address[0]),
9379 format_ip46_address, &(mp->dst_address[0]),
9381 ntohl (mp->encap_vrf_id),
9382 ntohl (mp->decap_next_index), ntohl (mp->vni));
9385 static void vl_api_vxlan_tunnel_details_t_handler_json
9386 (vl_api_vxlan_tunnel_details_t * mp)
9388 vat_main_t *vam = &vat_main;
9389 vat_json_node_t *node = NULL;
9391 struct in6_addr ip6;
9393 if (VAT_JSON_ARRAY != vam->json_tree.type)
9395 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9396 vat_json_init_array (&vam->json_tree);
9398 node = vat_json_array_add (&vam->json_tree);
9400 vat_json_init_object (node);
9401 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9404 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
9405 vat_json_object_add_ip6 (node, "src_address", ip6);
9406 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
9407 vat_json_object_add_ip6 (node, "dst_address", ip6);
9411 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
9412 vat_json_object_add_ip4 (node, "src_address", ip4);
9413 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
9414 vat_json_object_add_ip4 (node, "dst_address", ip4);
9416 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
9417 vat_json_object_add_uint (node, "decap_next_index",
9418 ntohl (mp->decap_next_index));
9419 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
9420 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
9424 api_vxlan_tunnel_dump (vat_main_t * vam)
9426 unformat_input_t *i = vam->input;
9427 vl_api_vxlan_tunnel_dump_t *mp;
9430 u8 sw_if_index_set = 0;
9432 /* Parse args required to build the message */
9433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9435 if (unformat (i, "sw_if_index %d", &sw_if_index))
9436 sw_if_index_set = 1;
9441 if (sw_if_index_set == 0)
9446 if (!vam->json_output)
9448 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
9449 "sw_if_index", "src_address", "dst_address",
9450 "encap_vrf_id", "decap_next_index", "vni");
9453 /* Get list of vxlan-tunnel interfaces */
9454 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
9456 mp->sw_if_index = htonl (sw_if_index);
9460 /* Use a control ping for synchronization */
9462 vl_api_control_ping_t *mp;
9463 M (CONTROL_PING, control_ping);
9470 api_gre_add_del_tunnel (vat_main_t * vam)
9472 unformat_input_t *line_input = vam->input;
9473 vl_api_gre_add_del_tunnel_t *mp;
9475 ip4_address_t src4, dst4;
9479 u32 outer_fib_id = 0;
9481 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9483 if (unformat (line_input, "del"))
9485 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9487 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9489 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
9493 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9500 errmsg ("tunnel src address not specified\n");
9505 errmsg ("tunnel dst address not specified\n");
9510 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
9512 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9513 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9514 mp->outer_fib_id = ntohl (outer_fib_id);
9515 mp->is_add = is_add;
9523 static void vl_api_gre_tunnel_details_t_handler
9524 (vl_api_gre_tunnel_details_t * mp)
9526 vat_main_t *vam = &vat_main;
9528 fformat (vam->ofp, "%11d%15U%15U%14d\n",
9529 ntohl (mp->sw_if_index),
9530 format_ip4_address, &mp->src_address,
9531 format_ip4_address, &mp->dst_address, ntohl (mp->outer_fib_id));
9534 static void vl_api_gre_tunnel_details_t_handler_json
9535 (vl_api_gre_tunnel_details_t * mp)
9537 vat_main_t *vam = &vat_main;
9538 vat_json_node_t *node = NULL;
9541 if (VAT_JSON_ARRAY != vam->json_tree.type)
9543 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9544 vat_json_init_array (&vam->json_tree);
9546 node = vat_json_array_add (&vam->json_tree);
9548 vat_json_init_object (node);
9549 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9550 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
9551 vat_json_object_add_ip4 (node, "src_address", ip4);
9552 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
9553 vat_json_object_add_ip4 (node, "dst_address", ip4);
9554 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
9558 api_gre_tunnel_dump (vat_main_t * vam)
9560 unformat_input_t *i = vam->input;
9561 vl_api_gre_tunnel_dump_t *mp;
9564 u8 sw_if_index_set = 0;
9566 /* Parse args required to build the message */
9567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9569 if (unformat (i, "sw_if_index %d", &sw_if_index))
9570 sw_if_index_set = 1;
9575 if (sw_if_index_set == 0)
9580 if (!vam->json_output)
9582 fformat (vam->ofp, "%11s%15s%15s%14s\n",
9583 "sw_if_index", "src_address", "dst_address", "outer_fib_id");
9586 /* Get list of gre-tunnel interfaces */
9587 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
9589 mp->sw_if_index = htonl (sw_if_index);
9593 /* Use a control ping for synchronization */
9595 vl_api_control_ping_t *mp;
9596 M (CONTROL_PING, control_ping);
9603 api_l2_fib_clear_table (vat_main_t * vam)
9605 // unformat_input_t * i = vam->input;
9606 vl_api_l2_fib_clear_table_t *mp;
9609 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
9618 api_l2_interface_efp_filter (vat_main_t * vam)
9620 unformat_input_t *i = vam->input;
9621 vl_api_l2_interface_efp_filter_t *mp;
9625 u8 sw_if_index_set = 0;
9627 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9629 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9630 sw_if_index_set = 1;
9631 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9632 sw_if_index_set = 1;
9633 else if (unformat (i, "enable"))
9635 else if (unformat (i, "disable"))
9639 clib_warning ("parse error '%U'", format_unformat_error, i);
9644 if (sw_if_index_set == 0)
9646 errmsg ("missing sw_if_index\n");
9650 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
9652 mp->sw_if_index = ntohl (sw_if_index);
9653 mp->enable_disable = enable;
9661 #define foreach_vtr_op \
9662 _("disable", L2_VTR_DISABLED) \
9663 _("push-1", L2_VTR_PUSH_1) \
9664 _("push-2", L2_VTR_PUSH_2) \
9665 _("pop-1", L2_VTR_POP_1) \
9666 _("pop-2", L2_VTR_POP_2) \
9667 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
9668 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
9669 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
9670 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
9673 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
9675 unformat_input_t *i = vam->input;
9676 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
9679 u8 sw_if_index_set = 0;
9686 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9688 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9689 sw_if_index_set = 1;
9690 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9691 sw_if_index_set = 1;
9692 else if (unformat (i, "vtr_op %d", &vtr_op))
9694 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
9697 else if (unformat (i, "push_dot1q %d", &push_dot1q))
9699 else if (unformat (i, "tag1 %d", &tag1))
9701 else if (unformat (i, "tag2 %d", &tag2))
9705 clib_warning ("parse error '%U'", format_unformat_error, i);
9710 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
9712 errmsg ("missing vtr operation or sw_if_index\n");
9716 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
9717 mp->sw_if_index = ntohl (sw_if_index);
9718 mp->vtr_op = ntohl (vtr_op);
9719 mp->push_dot1q = ntohl (push_dot1q);
9720 mp->tag1 = ntohl (tag1);
9721 mp->tag2 = ntohl (tag2);
9730 api_create_vhost_user_if (vat_main_t * vam)
9732 unformat_input_t *i = vam->input;
9733 vl_api_create_vhost_user_if_t *mp;
9737 u8 file_name_set = 0;
9738 u32 custom_dev_instance = ~0;
9740 u8 use_custom_mac = 0;
9742 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9744 if (unformat (i, "socket %s", &file_name))
9748 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9750 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
9752 else if (unformat (i, "server"))
9758 if (file_name_set == 0)
9760 errmsg ("missing socket file name\n");
9764 if (vec_len (file_name) > 255)
9766 errmsg ("socket file name too long\n");
9769 vec_add1 (file_name, 0);
9771 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
9773 mp->is_server = is_server;
9774 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9775 vec_free (file_name);
9776 if (custom_dev_instance != ~0)
9779 mp->custom_dev_instance = ntohl (custom_dev_instance);
9781 mp->use_custom_mac = use_custom_mac;
9782 clib_memcpy (mp->mac_address, hwaddr, 6);
9791 api_modify_vhost_user_if (vat_main_t * vam)
9793 unformat_input_t *i = vam->input;
9794 vl_api_modify_vhost_user_if_t *mp;
9798 u8 file_name_set = 0;
9799 u32 custom_dev_instance = ~0;
9800 u8 sw_if_index_set = 0;
9801 u32 sw_if_index = (u32) ~ 0;
9803 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9805 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9806 sw_if_index_set = 1;
9807 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9808 sw_if_index_set = 1;
9809 else if (unformat (i, "socket %s", &file_name))
9813 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9815 else if (unformat (i, "server"))
9821 if (sw_if_index_set == 0)
9823 errmsg ("missing sw_if_index or interface name\n");
9827 if (file_name_set == 0)
9829 errmsg ("missing socket file name\n");
9833 if (vec_len (file_name) > 255)
9835 errmsg ("socket file name too long\n");
9838 vec_add1 (file_name, 0);
9840 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
9842 mp->sw_if_index = ntohl (sw_if_index);
9843 mp->is_server = is_server;
9844 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9845 vec_free (file_name);
9846 if (custom_dev_instance != ~0)
9849 mp->custom_dev_instance = ntohl (custom_dev_instance);
9859 api_delete_vhost_user_if (vat_main_t * vam)
9861 unformat_input_t *i = vam->input;
9862 vl_api_delete_vhost_user_if_t *mp;
9864 u32 sw_if_index = ~0;
9865 u8 sw_if_index_set = 0;
9867 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9869 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9870 sw_if_index_set = 1;
9871 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9872 sw_if_index_set = 1;
9877 if (sw_if_index_set == 0)
9879 errmsg ("missing sw_if_index or interface name\n");
9884 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
9886 mp->sw_if_index = ntohl (sw_if_index);
9894 static void vl_api_sw_interface_vhost_user_details_t_handler
9895 (vl_api_sw_interface_vhost_user_details_t * mp)
9897 vat_main_t *vam = &vat_main;
9899 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
9900 (char *) mp->interface_name,
9901 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
9902 clib_net_to_host_u64 (mp->features), mp->is_server,
9903 ntohl (mp->num_regions), (char *) mp->sock_filename);
9904 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
9907 static void vl_api_sw_interface_vhost_user_details_t_handler_json
9908 (vl_api_sw_interface_vhost_user_details_t * mp)
9910 vat_main_t *vam = &vat_main;
9911 vat_json_node_t *node = NULL;
9913 if (VAT_JSON_ARRAY != vam->json_tree.type)
9915 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9916 vat_json_init_array (&vam->json_tree);
9918 node = vat_json_array_add (&vam->json_tree);
9920 vat_json_init_object (node);
9921 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9922 vat_json_object_add_string_copy (node, "interface_name",
9923 mp->interface_name);
9924 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
9925 ntohl (mp->virtio_net_hdr_sz));
9926 vat_json_object_add_uint (node, "features",
9927 clib_net_to_host_u64 (mp->features));
9928 vat_json_object_add_uint (node, "is_server", mp->is_server);
9929 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
9930 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
9931 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
9935 api_sw_interface_vhost_user_dump (vat_main_t * vam)
9937 vl_api_sw_interface_vhost_user_dump_t *mp;
9940 "Interface name idx hdr_sz features server regions filename\n");
9942 /* Get list of vhost-user interfaces */
9943 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
9946 /* Use a control ping for synchronization */
9948 vl_api_control_ping_t *mp;
9949 M (CONTROL_PING, control_ping);
9956 api_show_version (vat_main_t * vam)
9958 vl_api_show_version_t *mp;
9961 M (SHOW_VERSION, show_version);
9971 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
9973 unformat_input_t *line_input = vam->input;
9974 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
9976 ip4_address_t local4, remote4;
9977 ip6_address_t local6, remote6;
9979 u8 ipv4_set = 0, ipv6_set = 0;
9982 u32 encap_vrf_id = 0;
9983 u32 decap_vrf_id = 0;
9988 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9990 if (unformat (line_input, "del"))
9992 else if (unformat (line_input, "local %U",
9993 unformat_ip4_address, &local4))
9998 else if (unformat (line_input, "remote %U",
9999 unformat_ip4_address, &remote4))
10004 else if (unformat (line_input, "local %U",
10005 unformat_ip6_address, &local6))
10010 else if (unformat (line_input, "remote %U",
10011 unformat_ip6_address, &remote6))
10016 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10018 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
10020 else if (unformat (line_input, "vni %d", &vni))
10022 else if (unformat (line_input, "next-ip4"))
10024 else if (unformat (line_input, "next-ip6"))
10026 else if (unformat (line_input, "next-ethernet"))
10028 else if (unformat (line_input, "next-nsh"))
10032 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10037 if (local_set == 0)
10039 errmsg ("tunnel local address not specified\n");
10042 if (remote_set == 0)
10044 errmsg ("tunnel remote address not specified\n");
10047 if (ipv4_set && ipv6_set)
10049 errmsg ("both IPv4 and IPv6 addresses specified");
10055 errmsg ("vni not specified\n");
10059 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
10064 clib_memcpy (&mp->local, &local6, sizeof (local6));
10065 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10069 clib_memcpy (&mp->local, &local4, sizeof (local4));
10070 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
10073 mp->encap_vrf_id = ntohl (encap_vrf_id);
10074 mp->decap_vrf_id = ntohl (decap_vrf_id);
10075 mp->protocol = ntohl (protocol);
10076 mp->vni = ntohl (vni);
10077 mp->is_add = is_add;
10078 mp->is_ipv6 = ipv6_set;
10086 static void vl_api_vxlan_gpe_tunnel_details_t_handler
10087 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10089 vat_main_t *vam = &vat_main;
10091 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10092 ntohl (mp->sw_if_index),
10093 format_ip46_address, &(mp->local[0]),
10094 format_ip46_address, &(mp->remote[0]),
10096 ntohl (mp->protocol),
10097 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
10100 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
10101 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10103 vat_main_t *vam = &vat_main;
10104 vat_json_node_t *node = NULL;
10105 struct in_addr ip4;
10106 struct in6_addr ip6;
10108 if (VAT_JSON_ARRAY != vam->json_tree.type)
10110 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10111 vat_json_init_array (&vam->json_tree);
10113 node = vat_json_array_add (&vam->json_tree);
10115 vat_json_init_object (node);
10116 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10119 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10120 vat_json_object_add_ip6 (node, "local", ip6);
10121 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10122 vat_json_object_add_ip6 (node, "remote", ip6);
10126 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10127 vat_json_object_add_ip4 (node, "local", ip4);
10128 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10129 vat_json_object_add_ip4 (node, "remote", ip4);
10131 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10132 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10133 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10134 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10135 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10139 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10141 unformat_input_t *i = vam->input;
10142 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10145 u8 sw_if_index_set = 0;
10147 /* Parse args required to build the message */
10148 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10150 if (unformat (i, "sw_if_index %d", &sw_if_index))
10151 sw_if_index_set = 1;
10156 if (sw_if_index_set == 0)
10161 if (!vam->json_output)
10163 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10164 "sw_if_index", "local", "remote", "vni",
10165 "protocol", "encap_vrf_id", "decap_vrf_id");
10168 /* Get list of vxlan-tunnel interfaces */
10169 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10171 mp->sw_if_index = htonl (sw_if_index);
10175 /* Use a control ping for synchronization */
10177 vl_api_control_ping_t *mp;
10178 M (CONTROL_PING, control_ping);
10185 format_l2_fib_mac_address (u8 * s, va_list * args)
10187 u8 *a = va_arg (*args, u8 *);
10189 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
10190 a[2], a[3], a[4], a[5], a[6], a[7]);
10193 static void vl_api_l2_fib_table_entry_t_handler
10194 (vl_api_l2_fib_table_entry_t * mp)
10196 vat_main_t *vam = &vat_main;
10198 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
10200 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
10201 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
10205 static void vl_api_l2_fib_table_entry_t_handler_json
10206 (vl_api_l2_fib_table_entry_t * mp)
10208 vat_main_t *vam = &vat_main;
10209 vat_json_node_t *node = NULL;
10211 if (VAT_JSON_ARRAY != vam->json_tree.type)
10213 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10214 vat_json_init_array (&vam->json_tree);
10216 node = vat_json_array_add (&vam->json_tree);
10218 vat_json_init_object (node);
10219 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
10220 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
10221 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10222 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
10223 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
10224 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
10228 api_l2_fib_table_dump (vat_main_t * vam)
10230 unformat_input_t *i = vam->input;
10231 vl_api_l2_fib_table_dump_t *mp;
10236 /* Parse args required to build the message */
10237 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10239 if (unformat (i, "bd_id %d", &bd_id))
10245 if (bd_id_set == 0)
10247 errmsg ("missing bridge domain\n");
10252 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
10254 /* Get list of l2 fib entries */
10255 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
10257 mp->bd_id = ntohl (bd_id);
10260 /* Use a control ping for synchronization */
10262 vl_api_control_ping_t *mp;
10263 M (CONTROL_PING, control_ping);
10271 api_interface_name_renumber (vat_main_t * vam)
10273 unformat_input_t *line_input = vam->input;
10274 vl_api_interface_name_renumber_t *mp;
10275 u32 sw_if_index = ~0;
10277 u32 new_show_dev_instance = ~0;
10279 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10281 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
10284 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
10286 else if (unformat (line_input, "new_show_dev_instance %d",
10287 &new_show_dev_instance))
10293 if (sw_if_index == ~0)
10295 errmsg ("missing interface name or sw_if_index\n");
10299 if (new_show_dev_instance == ~0)
10301 errmsg ("missing new_show_dev_instance\n");
10305 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
10307 mp->sw_if_index = ntohl (sw_if_index);
10308 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
10315 api_want_ip4_arp_events (vat_main_t * vam)
10317 unformat_input_t *line_input = vam->input;
10318 vl_api_want_ip4_arp_events_t *mp;
10320 ip4_address_t address;
10321 int address_set = 0;
10322 u32 enable_disable = 1;
10324 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10326 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
10328 else if (unformat (line_input, "del"))
10329 enable_disable = 0;
10334 if (address_set == 0)
10336 errmsg ("missing addresses\n");
10340 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
10341 mp->enable_disable = enable_disable;
10342 mp->pid = getpid ();
10343 mp->address = address.as_u32;
10350 api_want_ip6_nd_events (vat_main_t * vam)
10352 unformat_input_t *line_input = vam->input;
10353 vl_api_want_ip6_nd_events_t *mp;
10355 ip6_address_t address;
10356 int address_set = 0;
10357 u32 enable_disable = 1;
10359 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10361 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
10363 else if (unformat (line_input, "del"))
10364 enable_disable = 0;
10369 if (address_set == 0)
10371 errmsg ("missing addresses\n");
10375 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
10376 mp->enable_disable = enable_disable;
10377 mp->pid = getpid ();
10378 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
10385 api_input_acl_set_interface (vat_main_t * vam)
10387 unformat_input_t *i = vam->input;
10388 vl_api_input_acl_set_interface_t *mp;
10391 int sw_if_index_set;
10392 u32 ip4_table_index = ~0;
10393 u32 ip6_table_index = ~0;
10394 u32 l2_table_index = ~0;
10397 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10399 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10400 sw_if_index_set = 1;
10401 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10402 sw_if_index_set = 1;
10403 else if (unformat (i, "del"))
10405 else if (unformat (i, "ip4-table %d", &ip4_table_index))
10407 else if (unformat (i, "ip6-table %d", &ip6_table_index))
10409 else if (unformat (i, "l2-table %d", &l2_table_index))
10413 clib_warning ("parse error '%U'", format_unformat_error, i);
10418 if (sw_if_index_set == 0)
10420 errmsg ("missing interface name or sw_if_index\n");
10424 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
10426 mp->sw_if_index = ntohl (sw_if_index);
10427 mp->ip4_table_index = ntohl (ip4_table_index);
10428 mp->ip6_table_index = ntohl (ip6_table_index);
10429 mp->l2_table_index = ntohl (l2_table_index);
10430 mp->is_add = is_add;
10439 api_ip_address_dump (vat_main_t * vam)
10441 unformat_input_t *i = vam->input;
10442 vl_api_ip_address_dump_t *mp;
10443 u32 sw_if_index = ~0;
10444 u8 sw_if_index_set = 0;
10449 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10451 if (unformat (i, "sw_if_index %d", &sw_if_index))
10452 sw_if_index_set = 1;
10453 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10454 sw_if_index_set = 1;
10455 else if (unformat (i, "ipv4"))
10457 else if (unformat (i, "ipv6"))
10463 if (ipv4_set && ipv6_set)
10465 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10469 if ((!ipv4_set) && (!ipv6_set))
10471 errmsg ("no ipv4 nor ipv6 flag set\n");
10475 if (sw_if_index_set == 0)
10477 errmsg ("missing interface name or sw_if_index\n");
10481 vam->current_sw_if_index = sw_if_index;
10482 vam->is_ipv6 = ipv6_set;
10484 M (IP_ADDRESS_DUMP, ip_address_dump);
10485 mp->sw_if_index = ntohl (sw_if_index);
10486 mp->is_ipv6 = ipv6_set;
10489 /* Use a control ping for synchronization */
10491 vl_api_control_ping_t *mp;
10492 M (CONTROL_PING, control_ping);
10499 api_ip_dump (vat_main_t * vam)
10501 vl_api_ip_dump_t *mp;
10502 unformat_input_t *in = vam->input;
10509 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
10511 if (unformat (in, "ipv4"))
10513 else if (unformat (in, "ipv6"))
10519 if (ipv4_set && ipv6_set)
10521 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10525 if ((!ipv4_set) && (!ipv6_set))
10527 errmsg ("no ipv4 nor ipv6 flag set\n");
10531 is_ipv6 = ipv6_set;
10532 vam->is_ipv6 = is_ipv6;
10534 /* free old data */
10535 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
10537 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
10539 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
10541 M (IP_DUMP, ip_dump);
10542 mp->is_ipv6 = ipv6_set;
10545 /* Use a control ping for synchronization */
10547 vl_api_control_ping_t *mp;
10548 M (CONTROL_PING, control_ping);
10555 api_ipsec_spd_add_del (vat_main_t * vam)
10558 unformat_input_t *i = vam->input;
10559 vl_api_ipsec_spd_add_del_t *mp;
10564 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10566 if (unformat (i, "spd_id %d", &spd_id))
10568 else if (unformat (i, "del"))
10572 clib_warning ("parse error '%U'", format_unformat_error, i);
10578 errmsg ("spd_id must be set\n");
10582 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
10584 mp->spd_id = ntohl (spd_id);
10585 mp->is_add = is_add;
10592 clib_warning ("unsupported (no dpdk)");
10598 api_ipsec_interface_add_del_spd (vat_main_t * vam)
10601 unformat_input_t *i = vam->input;
10602 vl_api_ipsec_interface_add_del_spd_t *mp;
10605 u8 sw_if_index_set = 0;
10606 u32 spd_id = (u32) ~ 0;
10609 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10611 if (unformat (i, "del"))
10613 else if (unformat (i, "spd_id %d", &spd_id))
10615 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10616 sw_if_index_set = 1;
10617 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10618 sw_if_index_set = 1;
10621 clib_warning ("parse error '%U'", format_unformat_error, i);
10627 if (spd_id == (u32) ~ 0)
10629 errmsg ("spd_id must be set\n");
10633 if (sw_if_index_set == 0)
10635 errmsg ("missing interface name or sw_if_index\n");
10639 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
10641 mp->spd_id = ntohl (spd_id);
10642 mp->sw_if_index = ntohl (sw_if_index);
10643 mp->is_add = is_add;
10650 clib_warning ("unsupported (no dpdk)");
10656 api_ipsec_spd_add_del_entry (vat_main_t * vam)
10659 unformat_input_t *i = vam->input;
10660 vl_api_ipsec_spd_add_del_entry_t *mp;
10662 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
10663 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
10665 u32 rport_start = 0, rport_stop = (u32) ~ 0;
10666 u32 lport_start = 0, lport_stop = (u32) ~ 0;
10667 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
10668 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
10670 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
10671 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
10672 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
10673 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
10674 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
10675 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
10677 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10679 if (unformat (i, "del"))
10681 if (unformat (i, "outbound"))
10683 if (unformat (i, "inbound"))
10685 else if (unformat (i, "spd_id %d", &spd_id))
10687 else if (unformat (i, "sa_id %d", &sa_id))
10689 else if (unformat (i, "priority %d", &priority))
10691 else if (unformat (i, "protocol %d", &protocol))
10693 else if (unformat (i, "lport_start %d", &lport_start))
10695 else if (unformat (i, "lport_stop %d", &lport_stop))
10697 else if (unformat (i, "rport_start %d", &rport_start))
10699 else if (unformat (i, "rport_stop %d", &rport_stop))
10703 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
10709 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
10716 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
10722 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
10729 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
10735 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
10742 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
10748 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
10754 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
10756 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
10758 clib_warning ("unsupported action: 'resolve'");
10764 clib_warning ("parse error '%U'", format_unformat_error, i);
10770 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
10772 mp->spd_id = ntohl (spd_id);
10773 mp->priority = ntohl (priority);
10774 mp->is_outbound = is_outbound;
10776 mp->is_ipv6 = is_ipv6;
10777 if (is_ipv6 || is_ip_any)
10779 clib_memcpy (mp->remote_address_start, &raddr6_start,
10780 sizeof (ip6_address_t));
10781 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
10782 sizeof (ip6_address_t));
10783 clib_memcpy (mp->local_address_start, &laddr6_start,
10784 sizeof (ip6_address_t));
10785 clib_memcpy (mp->local_address_stop, &laddr6_stop,
10786 sizeof (ip6_address_t));
10790 clib_memcpy (mp->remote_address_start, &raddr4_start,
10791 sizeof (ip4_address_t));
10792 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
10793 sizeof (ip4_address_t));
10794 clib_memcpy (mp->local_address_start, &laddr4_start,
10795 sizeof (ip4_address_t));
10796 clib_memcpy (mp->local_address_stop, &laddr4_stop,
10797 sizeof (ip4_address_t));
10799 mp->protocol = (u8) protocol;
10800 mp->local_port_start = ntohs ((u16) lport_start);
10801 mp->local_port_stop = ntohs ((u16) lport_stop);
10802 mp->remote_port_start = ntohs ((u16) rport_start);
10803 mp->remote_port_stop = ntohs ((u16) rport_stop);
10804 mp->policy = (u8) policy;
10805 mp->sa_id = ntohl (sa_id);
10806 mp->is_add = is_add;
10807 mp->is_ip_any = is_ip_any;
10813 clib_warning ("unsupported (no dpdk)");
10819 api_ipsec_sad_add_del_entry (vat_main_t * vam)
10822 unformat_input_t *i = vam->input;
10823 vl_api_ipsec_sad_add_del_entry_t *mp;
10825 u32 sad_id = 0, spi = 0;
10826 u8 *ck = 0, *ik = 0;
10829 u8 protocol = IPSEC_PROTOCOL_AH;
10830 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
10831 u32 crypto_alg = 0, integ_alg = 0;
10832 ip4_address_t tun_src4;
10833 ip4_address_t tun_dst4;
10834 ip6_address_t tun_src6;
10835 ip6_address_t tun_dst6;
10837 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10839 if (unformat (i, "del"))
10841 else if (unformat (i, "sad_id %d", &sad_id))
10843 else if (unformat (i, "spi %d", &spi))
10845 else if (unformat (i, "esp"))
10846 protocol = IPSEC_PROTOCOL_ESP;
10847 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
10850 is_tunnel_ipv6 = 0;
10852 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
10855 is_tunnel_ipv6 = 0;
10857 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
10860 is_tunnel_ipv6 = 1;
10862 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
10865 is_tunnel_ipv6 = 1;
10869 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
10871 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
10872 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
10874 clib_warning ("unsupported crypto-alg: '%U'",
10875 format_ipsec_crypto_alg, crypto_alg);
10879 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10883 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
10885 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
10886 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
10888 clib_warning ("unsupported integ-alg: '%U'",
10889 format_ipsec_integ_alg, integ_alg);
10893 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10897 clib_warning ("parse error '%U'", format_unformat_error, i);
10903 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
10905 mp->sad_id = ntohl (sad_id);
10906 mp->is_add = is_add;
10907 mp->protocol = protocol;
10908 mp->spi = ntohl (spi);
10909 mp->is_tunnel = is_tunnel;
10910 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
10911 mp->crypto_algorithm = crypto_alg;
10912 mp->integrity_algorithm = integ_alg;
10913 mp->crypto_key_length = vec_len (ck);
10914 mp->integrity_key_length = vec_len (ik);
10916 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10917 mp->crypto_key_length = sizeof (mp->crypto_key);
10919 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10920 mp->integrity_key_length = sizeof (mp->integrity_key);
10923 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10925 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10929 if (is_tunnel_ipv6)
10931 clib_memcpy (mp->tunnel_src_address, &tun_src6,
10932 sizeof (ip6_address_t));
10933 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
10934 sizeof (ip6_address_t));
10938 clib_memcpy (mp->tunnel_src_address, &tun_src4,
10939 sizeof (ip4_address_t));
10940 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
10941 sizeof (ip4_address_t));
10950 clib_warning ("unsupported (no dpdk)");
10956 api_ipsec_sa_set_key (vat_main_t * vam)
10959 unformat_input_t *i = vam->input;
10960 vl_api_ipsec_sa_set_key_t *mp;
10963 u8 *ck = 0, *ik = 0;
10965 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10967 if (unformat (i, "sa_id %d", &sa_id))
10969 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10971 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10975 clib_warning ("parse error '%U'", format_unformat_error, i);
10980 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
10982 mp->sa_id = ntohl (sa_id);
10983 mp->crypto_key_length = vec_len (ck);
10984 mp->integrity_key_length = vec_len (ik);
10986 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10987 mp->crypto_key_length = sizeof (mp->crypto_key);
10989 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10990 mp->integrity_key_length = sizeof (mp->integrity_key);
10993 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10995 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
11002 clib_warning ("unsupported (no dpdk)");
11008 api_ikev2_profile_add_del (vat_main_t * vam)
11011 unformat_input_t *i = vam->input;
11012 vl_api_ikev2_profile_add_del_t *mp;
11017 const char *valid_chars = "a-zA-Z0-9_";
11019 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11021 if (unformat (i, "del"))
11023 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11024 vec_add1 (name, 0);
11027 errmsg ("parse error '%U'", format_unformat_error, i);
11032 if (!vec_len (name))
11034 errmsg ("profile name must be specified");
11038 if (vec_len (name) > 64)
11040 errmsg ("profile name too long");
11044 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
11046 clib_memcpy (mp->name, name, vec_len (name));
11047 mp->is_add = is_add;
11055 clib_warning ("unsupported (no dpdk)");
11061 api_ikev2_profile_set_auth (vat_main_t * vam)
11064 unformat_input_t *i = vam->input;
11065 vl_api_ikev2_profile_set_auth_t *mp;
11069 u32 auth_method = 0;
11072 const char *valid_chars = "a-zA-Z0-9_";
11074 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11076 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11077 vec_add1 (name, 0);
11078 else if (unformat (i, "auth_method %U",
11079 unformat_ikev2_auth_method, &auth_method))
11081 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11083 else if (unformat (i, "auth_data %v", &data))
11087 errmsg ("parse error '%U'", format_unformat_error, i);
11092 if (!vec_len (name))
11094 errmsg ("profile name must be specified");
11098 if (vec_len (name) > 64)
11100 errmsg ("profile name too long");
11104 if (!vec_len (data))
11106 errmsg ("auth_data must be specified");
11112 errmsg ("auth_method must be specified");
11116 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
11118 mp->is_hex = is_hex;
11119 mp->auth_method = (u8) auth_method;
11120 mp->data_len = vec_len (data);
11121 clib_memcpy (mp->name, name, vec_len (name));
11122 clib_memcpy (mp->data, data, vec_len (data));
11131 clib_warning ("unsupported (no dpdk)");
11137 api_ikev2_profile_set_id (vat_main_t * vam)
11140 unformat_input_t *i = vam->input;
11141 vl_api_ikev2_profile_set_id_t *mp;
11149 const char *valid_chars = "a-zA-Z0-9_";
11151 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11153 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11154 vec_add1 (name, 0);
11155 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11157 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11159 data = vec_new (u8, 4);
11160 clib_memcpy (data, ip4.as_u8, 4);
11162 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11164 else if (unformat (i, "id_data %v", &data))
11166 else if (unformat (i, "local"))
11168 else if (unformat (i, "remote"))
11172 errmsg ("parse error '%U'", format_unformat_error, i);
11177 if (!vec_len (name))
11179 errmsg ("profile name must be specified");
11183 if (vec_len (name) > 64)
11185 errmsg ("profile name too long");
11189 if (!vec_len (data))
11191 errmsg ("id_data must be specified");
11197 errmsg ("id_type must be specified");
11201 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
11203 mp->is_local = is_local;
11204 mp->id_type = (u8) id_type;
11205 mp->data_len = vec_len (data);
11206 clib_memcpy (mp->name, name, vec_len (name));
11207 clib_memcpy (mp->data, data, vec_len (data));
11216 clib_warning ("unsupported (no dpdk)");
11222 api_ikev2_profile_set_ts (vat_main_t * vam)
11225 unformat_input_t *i = vam->input;
11226 vl_api_ikev2_profile_set_ts_t *mp;
11230 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
11231 ip4_address_t start_addr, end_addr;
11233 const char *valid_chars = "a-zA-Z0-9_";
11235 start_addr.as_u32 = 0;
11236 end_addr.as_u32 = (u32) ~ 0;
11238 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11240 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11241 vec_add1 (name, 0);
11242 else if (unformat (i, "protocol %d", &proto))
11244 else if (unformat (i, "start_port %d", &start_port))
11246 else if (unformat (i, "end_port %d", &end_port))
11249 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
11251 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
11253 else if (unformat (i, "local"))
11255 else if (unformat (i, "remote"))
11259 errmsg ("parse error '%U'", format_unformat_error, i);
11264 if (!vec_len (name))
11266 errmsg ("profile name must be specified");
11270 if (vec_len (name) > 64)
11272 errmsg ("profile name too long");
11276 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
11278 mp->is_local = is_local;
11279 mp->proto = (u8) proto;
11280 mp->start_port = (u16) start_port;
11281 mp->end_port = (u16) end_port;
11282 mp->start_addr = start_addr.as_u32;
11283 mp->end_addr = end_addr.as_u32;
11284 clib_memcpy (mp->name, name, vec_len (name));
11292 clib_warning ("unsupported (no dpdk)");
11298 api_ikev2_set_local_key (vat_main_t * vam)
11301 unformat_input_t *i = vam->input;
11302 vl_api_ikev2_set_local_key_t *mp;
11306 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11308 if (unformat (i, "file %v", &file))
11309 vec_add1 (file, 0);
11312 errmsg ("parse error '%U'", format_unformat_error, i);
11317 if (!vec_len (file))
11319 errmsg ("RSA key file must be specified");
11323 if (vec_len (file) > 256)
11325 errmsg ("file name too long");
11329 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
11331 clib_memcpy (mp->key_file, file, vec_len (file));
11339 clib_warning ("unsupported (no dpdk)");
11348 api_map_add_domain (vat_main_t * vam)
11350 unformat_input_t *i = vam->input;
11351 vl_api_map_add_domain_t *mp;
11354 ip4_address_t ip4_prefix;
11355 ip6_address_t ip6_prefix;
11356 ip6_address_t ip6_src;
11357 u32 num_m_args = 0;
11358 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
11359 0, psid_length = 0;
11360 u8 is_translation = 0;
11362 u32 ip6_src_len = 128;
11364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11366 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
11367 &ip4_prefix, &ip4_prefix_len))
11369 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
11370 &ip6_prefix, &ip6_prefix_len))
11374 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
11377 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
11379 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
11381 else if (unformat (i, "psid-offset %d", &psid_offset))
11383 else if (unformat (i, "psid-len %d", &psid_length))
11385 else if (unformat (i, "mtu %d", &mtu))
11387 else if (unformat (i, "map-t"))
11388 is_translation = 1;
11391 clib_warning ("parse error '%U'", format_unformat_error, i);
11396 if (num_m_args < 3)
11398 errmsg ("mandatory argument(s) missing\n");
11402 /* Construct the API message */
11403 M (MAP_ADD_DOMAIN, map_add_domain);
11405 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
11406 mp->ip4_prefix_len = ip4_prefix_len;
11408 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
11409 mp->ip6_prefix_len = ip6_prefix_len;
11411 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
11412 mp->ip6_src_prefix_len = ip6_src_len;
11414 mp->ea_bits_len = ea_bits_len;
11415 mp->psid_offset = psid_offset;
11416 mp->psid_length = psid_length;
11417 mp->is_translation = is_translation;
11418 mp->mtu = htons (mtu);
11423 /* Wait for a reply, return good/bad news */
11428 api_map_del_domain (vat_main_t * vam)
11430 unformat_input_t *i = vam->input;
11431 vl_api_map_del_domain_t *mp;
11434 u32 num_m_args = 0;
11437 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11439 if (unformat (i, "index %d", &index))
11443 clib_warning ("parse error '%U'", format_unformat_error, i);
11448 if (num_m_args != 1)
11450 errmsg ("mandatory argument(s) missing\n");
11454 /* Construct the API message */
11455 M (MAP_DEL_DOMAIN, map_del_domain);
11457 mp->index = ntohl (index);
11462 /* Wait for a reply, return good/bad news */
11467 api_map_add_del_rule (vat_main_t * vam)
11469 unformat_input_t *i = vam->input;
11470 vl_api_map_add_del_rule_t *mp;
11473 ip6_address_t ip6_dst;
11474 u32 num_m_args = 0, index, psid = 0;
11476 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11478 if (unformat (i, "index %d", &index))
11480 else if (unformat (i, "psid %d", &psid))
11482 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
11484 else if (unformat (i, "del"))
11490 clib_warning ("parse error '%U'", format_unformat_error, i);
11495 /* Construct the API message */
11496 M (MAP_ADD_DEL_RULE, map_add_del_rule);
11498 mp->index = ntohl (index);
11499 mp->is_add = is_add;
11500 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
11501 mp->psid = ntohs (psid);
11506 /* Wait for a reply, return good/bad news */
11511 api_map_domain_dump (vat_main_t * vam)
11513 vl_api_map_domain_dump_t *mp;
11516 /* Construct the API message */
11517 M (MAP_DOMAIN_DUMP, map_domain_dump);
11522 /* Use a control ping for synchronization */
11524 vl_api_control_ping_t *mp;
11525 M (CONTROL_PING, control_ping);
11532 api_map_rule_dump (vat_main_t * vam)
11534 unformat_input_t *i = vam->input;
11535 vl_api_map_rule_dump_t *mp;
11537 u32 domain_index = ~0;
11539 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11541 if (unformat (i, "index %u", &domain_index))
11547 if (domain_index == ~0)
11549 clib_warning ("parse error: domain index expected");
11553 /* Construct the API message */
11554 M (MAP_RULE_DUMP, map_rule_dump);
11556 mp->domain_index = htonl (domain_index);
11561 /* Use a control ping for synchronization */
11563 vl_api_control_ping_t *mp;
11564 M (CONTROL_PING, control_ping);
11570 static void vl_api_map_add_domain_reply_t_handler
11571 (vl_api_map_add_domain_reply_t * mp)
11573 vat_main_t *vam = &vat_main;
11574 i32 retval = ntohl (mp->retval);
11576 if (vam->async_mode)
11578 vam->async_errors += (retval < 0);
11582 vam->retval = retval;
11583 vam->result_ready = 1;
11587 static void vl_api_map_add_domain_reply_t_handler_json
11588 (vl_api_map_add_domain_reply_t * mp)
11590 vat_main_t *vam = &vat_main;
11591 vat_json_node_t node;
11593 vat_json_init_object (&node);
11594 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
11595 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
11597 vat_json_print (vam->ofp, &node);
11598 vat_json_free (&node);
11600 vam->retval = ntohl (mp->retval);
11601 vam->result_ready = 1;
11605 api_get_first_msg_id (vat_main_t * vam)
11607 vl_api_get_first_msg_id_t *mp;
11609 unformat_input_t *i = vam->input;
11613 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11615 if (unformat (i, "client %s", &name))
11623 errmsg ("missing client name\n");
11626 vec_add1 (name, 0);
11628 if (vec_len (name) > 63)
11630 errmsg ("client name too long\n");
11634 M (GET_FIRST_MSG_ID, get_first_msg_id);
11635 clib_memcpy (mp->name, name, vec_len (name));
11643 api_cop_interface_enable_disable (vat_main_t * vam)
11645 unformat_input_t *line_input = vam->input;
11646 vl_api_cop_interface_enable_disable_t *mp;
11648 u32 sw_if_index = ~0;
11649 u8 enable_disable = 1;
11651 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11653 if (unformat (line_input, "disable"))
11654 enable_disable = 0;
11655 if (unformat (line_input, "enable"))
11656 enable_disable = 1;
11657 else if (unformat (line_input, "%U", unformat_sw_if_index,
11658 vam, &sw_if_index))
11660 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11666 if (sw_if_index == ~0)
11668 errmsg ("missing interface name or sw_if_index\n");
11672 /* Construct the API message */
11673 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
11674 mp->sw_if_index = ntohl (sw_if_index);
11675 mp->enable_disable = enable_disable;
11679 /* Wait for the reply */
11684 api_cop_whitelist_enable_disable (vat_main_t * vam)
11686 unformat_input_t *line_input = vam->input;
11687 vl_api_cop_whitelist_enable_disable_t *mp;
11689 u32 sw_if_index = ~0;
11690 u8 ip4 = 0, ip6 = 0, default_cop = 0;
11693 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11695 if (unformat (line_input, "ip4"))
11697 else if (unformat (line_input, "ip6"))
11699 else if (unformat (line_input, "default"))
11701 else if (unformat (line_input, "%U", unformat_sw_if_index,
11702 vam, &sw_if_index))
11704 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11706 else if (unformat (line_input, "fib-id %d", &fib_id))
11712 if (sw_if_index == ~0)
11714 errmsg ("missing interface name or sw_if_index\n");
11718 /* Construct the API message */
11719 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
11720 mp->sw_if_index = ntohl (sw_if_index);
11721 mp->fib_id = ntohl (fib_id);
11724 mp->default_cop = default_cop;
11728 /* Wait for the reply */
11733 api_get_node_graph (vat_main_t * vam)
11735 vl_api_get_node_graph_t *mp;
11738 M (GET_NODE_GRAPH, get_node_graph);
11742 /* Wait for the reply */
11747 /** Used for parsing LISP eids */
11748 typedef CLIB_PACKED(struct{
11749 u8 addr[16]; /**< eid address */
11750 u32 len; /**< prefix length if IP */
11751 u8 type; /**< type of eid */
11756 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
11758 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
11760 memset (a, 0, sizeof (a[0]));
11762 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
11764 a->type = 0; /* ipv4 type */
11766 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
11768 a->type = 1; /* ipv6 type */
11770 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
11772 a->type = 2; /* mac type */
11779 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
11788 lisp_eid_size_vat (u8 type)
11803 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
11805 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
11809 /** Used for transferring locators via VPP API */
11810 typedef CLIB_PACKED(struct
11812 u32 sw_if_index; /**< locator sw_if_index */
11813 u8 priority; /**< locator priority */
11814 u8 weight; /**< locator weight */
11819 api_lisp_add_del_locator_set (vat_main_t * vam)
11821 unformat_input_t *input = vam->input;
11822 vl_api_lisp_add_del_locator_set_t *mp;
11825 u8 *locator_set_name = NULL;
11826 u8 locator_set_name_set = 0;
11827 ls_locator_t locator, *locators = 0;
11828 u32 sw_if_index, priority, weight;
11830 /* Parse args required to build the message */
11831 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11833 if (unformat (input, "del"))
11837 else if (unformat (input, "locator-set %s", &locator_set_name))
11839 locator_set_name_set = 1;
11841 else if (unformat (input, "sw_if_index %u p %u w %u",
11842 &sw_if_index, &priority, &weight))
11844 locator.sw_if_index = htonl (sw_if_index);
11845 locator.priority = priority;
11846 locator.weight = weight;
11847 vec_add1 (locators, locator);
11849 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
11850 vam, &sw_if_index, &priority, &weight))
11852 locator.sw_if_index = htonl (sw_if_index);
11853 locator.priority = priority;
11854 locator.weight = weight;
11855 vec_add1 (locators, locator);
11861 if (locator_set_name_set == 0)
11863 errmsg ("missing locator-set name");
11864 vec_free (locators);
11868 if (vec_len (locator_set_name) > 64)
11870 errmsg ("locator-set name too long\n");
11871 vec_free (locator_set_name);
11872 vec_free (locators);
11875 vec_add1 (locator_set_name, 0);
11877 /* Construct the API message */
11878 M (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
11880 mp->is_add = is_add;
11881 clib_memcpy (mp->locator_set_name, locator_set_name,
11882 vec_len (locator_set_name));
11883 vec_free (locator_set_name);
11885 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
11887 clib_memcpy (mp->locators, locators,
11888 (sizeof (ls_locator_t) * vec_len (locators)));
11889 vec_free (locators);
11894 /* Wait for a reply... */
11902 api_lisp_add_del_locator (vat_main_t * vam)
11904 unformat_input_t *input = vam->input;
11905 vl_api_lisp_add_del_locator_t *mp;
11907 u32 tmp_if_index = ~0;
11908 u32 sw_if_index = ~0;
11909 u8 sw_if_index_set = 0;
11910 u8 sw_if_index_if_name_set = 0;
11912 u8 priority_set = 0;
11916 u8 *locator_set_name = NULL;
11917 u8 locator_set_name_set = 0;
11919 /* Parse args required to build the message */
11920 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11922 if (unformat (input, "del"))
11926 else if (unformat (input, "locator-set %s", &locator_set_name))
11928 locator_set_name_set = 1;
11930 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
11933 sw_if_index_if_name_set = 1;
11934 sw_if_index = tmp_if_index;
11936 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
11938 sw_if_index_set = 1;
11939 sw_if_index = tmp_if_index;
11941 else if (unformat (input, "p %d", &priority))
11945 else if (unformat (input, "w %d", &weight))
11953 if (locator_set_name_set == 0)
11955 errmsg ("missing locator-set name");
11959 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
11961 errmsg ("missing sw_if_index");
11962 vec_free (locator_set_name);
11966 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
11968 errmsg ("cannot use both params interface name and sw_if_index");
11969 vec_free (locator_set_name);
11973 if (priority_set == 0)
11975 errmsg ("missing locator-set priority\n");
11976 vec_free (locator_set_name);
11980 if (weight_set == 0)
11982 errmsg ("missing locator-set weight\n");
11983 vec_free (locator_set_name);
11987 if (vec_len (locator_set_name) > 64)
11989 errmsg ("locator-set name too long\n");
11990 vec_free (locator_set_name);
11993 vec_add1 (locator_set_name, 0);
11995 /* Construct the API message */
11996 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
11998 mp->is_add = is_add;
11999 mp->sw_if_index = ntohl (sw_if_index);
12000 mp->priority = priority;
12001 mp->weight = weight;
12002 clib_memcpy (mp->locator_set_name, locator_set_name,
12003 vec_len (locator_set_name));
12004 vec_free (locator_set_name);
12009 /* Wait for a reply... */
12017 api_lisp_add_del_local_eid (vat_main_t * vam)
12019 unformat_input_t *input = vam->input;
12020 vl_api_lisp_add_del_local_eid_t *mp;
12024 lisp_eid_vat_t _eid, *eid = &_eid;
12025 u8 *locator_set_name = 0;
12026 u8 locator_set_name_set = 0;
12029 /* Parse args required to build the message */
12030 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12032 if (unformat (input, "del"))
12036 else if (unformat (input, "vni %d", &vni))
12040 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
12044 else if (unformat (input, "locator-set %s", &locator_set_name))
12046 locator_set_name_set = 1;
12052 if (locator_set_name_set == 0)
12054 errmsg ("missing locator-set name\n");
12060 errmsg ("EID address not set!");
12061 vec_free (locator_set_name);
12065 if (vec_len (locator_set_name) > 64)
12067 errmsg ("locator-set name too long\n");
12068 vec_free (locator_set_name);
12071 vec_add1 (locator_set_name, 0);
12073 /* Construct the API message */
12074 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
12076 mp->is_add = is_add;
12077 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12078 mp->eid_type = eid->type;
12079 mp->prefix_len = eid->len;
12080 mp->vni = clib_host_to_net_u32 (vni);
12081 clib_memcpy (mp->locator_set_name, locator_set_name,
12082 vec_len (locator_set_name));
12084 vec_free (locator_set_name);
12089 /* Wait for a reply... */
12097 /** Used for transferring locators via VPP API */
12098 typedef CLIB_PACKED(struct
12100 u8 is_ip4; /**< is locator an IPv4 address? */
12101 u8 priority; /**< locator priority */
12102 u8 weight; /**< locator weight */
12103 u8 addr[16]; /**< IPv4/IPv6 address */
12108 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
12110 unformat_input_t *input = vam->input;
12111 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12114 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12115 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12116 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12117 u32 action = ~0, p, w;
12118 ip4_address_t rmt_rloc4, lcl_rloc4;
12119 ip6_address_t rmt_rloc6, lcl_rloc6;
12120 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
12122 memset (&rloc, 0, sizeof (rloc));
12124 /* Parse args required to build the message */
12125 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12127 if (unformat (input, "del"))
12131 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12135 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12139 else if (unformat (input, "p %d w %d", &p, &w))
12143 errmsg ("No RLOC configured for setting priority/weight!");
12146 curr_rloc->priority = p;
12147 curr_rloc->weight = w;
12149 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12150 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12154 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
12155 rloc.priority = rloc.weight = 0;
12156 vec_add1 (lcl_locs, rloc);
12158 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12159 vec_add1 (rmt_locs, rloc);
12160 /* priority and weight saved in rmt loc */
12161 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12163 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
12164 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12167 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
12168 rloc.priority = rloc.weight = 0;
12169 vec_add1 (lcl_locs, rloc);
12171 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12172 vec_add1 (rmt_locs, rloc);
12173 /* priority and weight saved in rmt loc */
12174 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12176 else if (unformat (input, "action %d", &action))
12182 clib_warning ("parse error '%U'", format_unformat_error, input);
12189 errmsg ("remote eid addresses not set\n");
12193 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
12195 errmsg ("eid types don't match\n");
12199 if (0 == rmt_locs && (u32) ~ 0 == action)
12201 errmsg ("action not set for negative mapping\n");
12205 /* Construct the API message */
12206 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
12208 mp->is_add = is_add;
12209 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
12210 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
12211 mp->eid_type = rmt_eid->type;
12212 mp->rmt_len = rmt_eid->len;
12213 mp->lcl_len = lcl_eid->len;
12214 mp->action = action;
12216 if (0 != rmt_locs && 0 != lcl_locs)
12218 mp->loc_num = vec_len (rmt_locs);
12219 clib_memcpy (mp->lcl_locs, lcl_locs,
12220 (sizeof (rloc_t) * vec_len (lcl_locs)));
12221 clib_memcpy (mp->rmt_locs, rmt_locs,
12222 (sizeof (rloc_t) * vec_len (rmt_locs)));
12224 vec_free (lcl_locs);
12225 vec_free (rmt_locs);
12230 /* Wait for a reply... */
12238 api_lisp_add_del_map_resolver (vat_main_t * vam)
12240 unformat_input_t *input = vam->input;
12241 vl_api_lisp_add_del_map_resolver_t *mp;
12246 ip4_address_t ipv4;
12247 ip6_address_t ipv6;
12249 /* Parse args required to build the message */
12250 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12252 if (unformat (input, "del"))
12256 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
12260 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
12268 if (ipv4_set && ipv6_set)
12270 errmsg ("both eid v4 and v6 addresses set\n");
12274 if (!ipv4_set && !ipv6_set)
12276 errmsg ("eid addresses not set\n");
12280 /* Construct the API message */
12281 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
12283 mp->is_add = is_add;
12287 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
12292 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
12298 /* Wait for a reply... */
12306 api_lisp_gpe_enable_disable (vat_main_t * vam)
12308 unformat_input_t *input = vam->input;
12309 vl_api_lisp_gpe_enable_disable_t *mp;
12314 /* Parse args required to build the message */
12315 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12317 if (unformat (input, "enable"))
12322 else if (unformat (input, "disable"))
12333 errmsg ("Value not set\n");
12337 /* Construct the API message */
12338 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
12345 /* Wait for a reply... */
12353 api_lisp_enable_disable (vat_main_t * vam)
12355 unformat_input_t *input = vam->input;
12356 vl_api_lisp_enable_disable_t *mp;
12361 /* Parse args required to build the message */
12362 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12364 if (unformat (input, "enable"))
12369 else if (unformat (input, "disable"))
12379 errmsg ("Value not set\n");
12383 /* Construct the API message */
12384 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
12391 /* Wait for a reply... */
12399 * Enable/disable LISP proxy ITR.
12401 * @param vam vpp API test context
12402 * @return return code
12405 api_lisp_pitr_set_locator_set (vat_main_t * vam)
12408 u8 ls_name_set = 0;
12409 unformat_input_t *input = vam->input;
12410 vl_api_lisp_pitr_set_locator_set_t *mp;
12414 /* Parse args required to build the message */
12415 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12417 if (unformat (input, "del"))
12419 else if (unformat (input, "locator-set %s", &ls_name))
12423 errmsg ("parse error '%U'", format_unformat_error, input);
12430 errmsg ("locator-set name not set!");
12434 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
12436 mp->is_add = is_add;
12437 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
12438 vec_free (ls_name);
12443 /* wait for reply */
12451 api_show_lisp_pitr (vat_main_t * vam)
12453 vl_api_show_lisp_pitr_t *mp;
12456 if (!vam->json_output)
12458 fformat (vam->ofp, "%=20s\n", "lisp status:");
12461 M (SHOW_LISP_PITR, show_lisp_pitr);
12465 /* Wait for a reply... */
12473 * Add/delete mapping between vni and vrf
12476 api_lisp_eid_table_add_del_map (vat_main_t * vam)
12479 unformat_input_t *input = vam->input;
12480 vl_api_lisp_eid_table_add_del_map_t *mp;
12481 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
12482 u32 vni, vrf, bd_index;
12484 /* Parse args required to build the message */
12485 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12487 if (unformat (input, "del"))
12489 else if (unformat (input, "vrf %d", &vrf))
12491 else if (unformat (input, "bd_index %d", &bd_index))
12493 else if (unformat (input, "vni %d", &vni))
12499 if (!vni_set || (!vrf_set && !bd_index_set))
12501 errmsg ("missing arguments!");
12505 if (vrf_set && bd_index_set)
12507 errmsg ("error: both vrf and bd entered!");
12511 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
12513 mp->is_add = is_add;
12514 mp->vni = htonl (vni);
12515 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
12516 mp->is_l2 = bd_index_set;
12521 /* wait for reply */
12529 * Add/del remote mapping to/from LISP control plane
12531 * @param vam vpp API test context
12532 * @return return code
12535 api_lisp_add_del_remote_mapping (vat_main_t * vam)
12537 unformat_input_t *input = vam->input;
12538 vl_api_lisp_add_del_remote_mapping_t *mp;
12541 //TODO: seid need remove
12542 lisp_eid_vat_t _eid, *eid = &_eid;
12543 lisp_eid_vat_t _seid, *seid = &_seid;
12544 u8 is_add = 1, del_all = 0, eid_set = 0;
12545 u32 action = ~0, p, w;
12546 ip4_address_t rloc4;
12547 ip6_address_t rloc6;
12548 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
12550 memset (&rloc, 0, sizeof (rloc));
12552 /* Parse args required to build the message */
12553 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12555 if (unformat (input, "del-all"))
12559 else if (unformat (input, "del"))
12563 else if (unformat (input, "add"))
12567 else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid))
12571 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, &seid))
12573 //TODO: Need remove, but first must be remove from CSIT test
12575 else if (unformat (input, "vni %d", &vni))
12579 else if (unformat (input, "p %d w %d", &p, &w))
12583 errmsg ("No RLOC configured for setting priority/weight!");
12586 curr_rloc->priority = p;
12587 curr_rloc->weight = w;
12589 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
12592 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
12593 vec_add1 (rlocs, rloc);
12594 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12596 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
12599 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
12600 vec_add1 (rlocs, rloc);
12601 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12603 else if (unformat (input, "action %d", &action))
12609 clib_warning ("parse error '%U'", format_unformat_error, input);
12616 errmsg ("missing params!");
12620 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
12622 errmsg ("no action set for negative map-reply!");
12626 M (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
12627 mp->is_add = is_add;
12628 mp->vni = htonl (vni);
12629 mp->action = (u8) action;
12630 mp->eid_len = eid->len;
12631 mp->del_all = del_all;
12632 mp->eid_type = eid->type;
12633 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12635 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
12636 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
12642 /* Wait for a reply... */
12650 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
12651 * forwarding entries in data-plane accordingly.
12653 * @param vam vpp API test context
12654 * @return return code
12657 api_lisp_add_del_adjacency (vat_main_t * vam)
12659 unformat_input_t *input = vam->input;
12660 vl_api_lisp_add_del_adjacency_t *mp;
12663 ip4_address_t seid4, deid4;
12664 ip6_address_t seid6, deid6;
12665 u8 deid_mac[6] = { 0 };
12666 u8 seid_mac[6] = { 0 };
12667 u8 deid_type, seid_type;
12668 u32 seid_len = 0, deid_len = 0, len;
12671 seid_type = deid_type = (u8) ~ 0;
12673 /* Parse args required to build the message */
12674 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12676 if (unformat (input, "del"))
12680 else if (unformat (input, "add"))
12684 else if (unformat (input, "deid %U/%d", unformat_ip4_address,
12687 deid_type = 0; /* ipv4 */
12690 else if (unformat (input, "deid %U/%d", unformat_ip6_address,
12693 deid_type = 1; /* ipv6 */
12696 else if (unformat (input, "deid %U", unformat_ethernet_address,
12699 deid_type = 2; /* mac */
12701 else if (unformat (input, "seid %U/%d", unformat_ip4_address,
12704 seid_type = 0; /* ipv4 */
12707 else if (unformat (input, "seid %U/%d", unformat_ip6_address,
12710 seid_type = 1; /* ipv6 */
12713 else if (unformat (input, "seid %U", unformat_ethernet_address,
12716 seid_type = 2; /* mac */
12718 else if (unformat (input, "vni %d", &vni))
12724 errmsg ("parse error '%U'", format_unformat_error, input);
12729 if ((u8) ~ 0 == deid_type)
12731 errmsg ("missing params!");
12735 if (seid_type != deid_type)
12737 errmsg ("source and destination EIDs are of different types!");
12741 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
12742 mp->is_add = is_add;
12743 mp->vni = htonl (vni);
12744 mp->seid_len = seid_len;
12745 mp->deid_len = deid_len;
12746 mp->eid_type = deid_type;
12748 switch (mp->eid_type)
12751 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
12752 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
12755 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
12756 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
12759 clib_memcpy (mp->seid, seid_mac, 6);
12760 clib_memcpy (mp->deid, deid_mac, 6);
12763 errmsg ("unknown EID type %d!", mp->eid_type);
12770 /* Wait for a reply... */
12778 api_lisp_gpe_add_del_iface (vat_main_t * vam)
12780 unformat_input_t *input = vam->input;
12781 vl_api_lisp_gpe_add_del_iface_t *mp;
12783 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
12784 u32 dp_table = 0, vni = 0;
12786 /* Parse args required to build the message */
12787 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12789 if (unformat (input, "up"))
12794 else if (unformat (input, "down"))
12799 else if (unformat (input, "table_id %d", &dp_table))
12803 else if (unformat (input, "bd_id %d", &dp_table))
12808 else if (unformat (input, "vni %d", &vni))
12816 if (action_set == 0)
12818 errmsg ("Action not set\n");
12821 if (dp_table_set == 0 || vni_set == 0)
12823 errmsg ("vni and dp_table must be set\n");
12827 /* Construct the API message */
12828 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
12830 mp->is_add = is_add;
12831 mp->dp_table = dp_table;
12838 /* Wait for a reply... */
12846 * Add/del map request itr rlocs from LISP control plane and updates
12848 * @param vam vpp API test context
12849 * @return return code
12852 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
12854 unformat_input_t *input = vam->input;
12855 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
12857 u8 *locator_set_name = 0;
12858 u8 locator_set_name_set = 0;
12861 /* Parse args required to build the message */
12862 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12864 if (unformat (input, "del"))
12868 else if (unformat (input, "%_%v%_", &locator_set_name))
12870 locator_set_name_set = 1;
12874 clib_warning ("parse error '%U'", format_unformat_error, input);
12879 if (is_add && !locator_set_name_set)
12881 errmsg ("itr-rloc is not set!");
12885 if (is_add && vec_len (locator_set_name) > 64)
12887 errmsg ("itr-rloc locator-set name too long\n");
12888 vec_free (locator_set_name);
12892 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
12893 mp->is_add = is_add;
12896 clib_memcpy (mp->locator_set_name, locator_set_name,
12897 vec_len (locator_set_name));
12901 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
12903 vec_free (locator_set_name);
12908 /* Wait for a reply... */
12916 lisp_locator_dump_send_msg (vat_main_t * vam, u32 locator_set_index,
12919 vl_api_lisp_locator_dump_t *mp;
12922 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
12924 mp->locator_set_index = htonl (locator_set_index);
12925 mp->filter = filter;
12930 /* Use a control ping for synchronization */
12932 vl_api_noprint_control_ping_t *mp;
12933 M (NOPRINT_CONTROL_PING, noprint_control_ping);
12936 /* Wait for a reply... */
12941 clean_locator_set_message (vat_main_t * vam)
12943 locator_set_msg_t *ls = 0;
12945 vec_foreach (ls, vam->locator_set_msg)
12947 vec_free (ls->locator_set_name);
12950 vec_free (vam->locator_set_msg);
12954 print_locator_in_locator_set (vat_main_t * vam, u8 filter)
12956 locator_set_msg_t *ls;
12957 locator_msg_t *loc;
12959 int i = 0, ret = 0;
12961 vec_foreach (ls, vam->locator_set_msg)
12963 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12966 vec_free (vam->locator_msg);
12967 clean_locator_set_message (vam);
12971 tmp_str = format (0, "%=20s%=16d%s", ls->locator_set_name,
12972 ls->locator_set_index,
12973 vec_len (vam->locator_msg) ? "" : "\n");
12975 vec_foreach (loc, vam->locator_msg)
12979 tmp_str = format (tmp_str, "%=37s", " ");
12983 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
12984 loc->sw_if_index, loc->priority, loc->weight);
12988 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
12989 loc->is_ipv6 ? format_ip6_address :
12990 format_ip4_address,
12991 loc->ip_address, loc->priority, loc->weight);
12996 fformat (vam->ofp, "%s", tmp_str);
12997 vec_free (tmp_str);
12998 vec_free (vam->locator_msg);
13001 clean_locator_set_message (vam);
13007 json_locator_in_locator_set (vat_main_t * vam, u8 filter)
13009 locator_set_msg_t *ls;
13010 locator_msg_t *loc;
13011 vat_json_node_t *node = NULL;
13012 vat_json_node_t *locator_array;
13013 vat_json_node_t *locator;
13014 struct in6_addr ip6;
13015 struct in_addr ip4;
13018 if (!vec_len (vam->locator_set_msg))
13020 /* just print [] */
13021 vat_json_init_array (&vam->json_tree);
13022 vat_json_print (vam->ofp, &vam->json_tree);
13023 vam->json_tree.type = VAT_JSON_NONE;
13027 if (VAT_JSON_ARRAY != vam->json_tree.type)
13029 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13030 vat_json_init_array (&vam->json_tree);
13033 vec_foreach (ls, vam->locator_set_msg)
13035 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
13038 vec_free (ls->locator_set_name);
13039 vec_free (vam->locator_msg);
13040 vec_free (vam->locator_set_msg);
13041 vat_json_free (&vam->json_tree);
13042 vam->json_tree.type = VAT_JSON_NONE;
13046 node = vat_json_array_add (&vam->json_tree);
13047 vat_json_init_object (node);
13049 vat_json_object_add_uint (node, "locator-set-index",
13050 ls->locator_set_index);
13051 vat_json_object_add_string_copy (node, "locator-set",
13052 ls->locator_set_name);
13053 locator_array = vat_json_object_add_list (node, "locator");
13054 vec_foreach (loc, vam->locator_msg)
13056 locator = vat_json_array_add (locator_array);
13057 vat_json_init_object (locator);
13060 vat_json_object_add_uint (locator, "locator-index",
13067 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13068 vat_json_object_add_ip6 (locator, "locator", ip6);
13072 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13073 vat_json_object_add_ip4 (locator, "locator", ip4);
13076 vat_json_object_add_uint (locator, "priority", loc->priority);
13077 vat_json_object_add_uint (locator, "weight", loc->weight);
13080 vec_free (ls->locator_set_name);
13081 vec_free (vam->locator_msg);
13084 vat_json_print (vam->ofp, &vam->json_tree);
13085 vat_json_free (&vam->json_tree);
13086 vam->json_tree.type = VAT_JSON_NONE;
13088 vec_free (vam->locator_set_msg);
13094 get_locator_set_index_from_msg (vat_main_t * vam, u8 * locator_set,
13095 u32 * locator_set_index)
13097 locator_set_msg_t *ls;
13100 *locator_set_index = ~0;
13102 if (!vec_len (vam->locator_set_msg))
13107 vec_foreach (ls, vam->locator_set_msg)
13109 if (!strcmp ((char *) locator_set, (char *) ls->locator_set_name))
13111 *locator_set_index = ls->locator_set_index;
13112 vec_free (vam->locator_set_msg);
13117 vec_free (vam->locator_set_msg);
13123 get_locator_set_index (vat_main_t * vam, u8 * locator_set,
13124 u32 * locator_set_index)
13126 vl_api_lisp_locator_set_dump_t *mp;
13129 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13133 /* Use a control ping for synchronization */
13135 vl_api_noprint_control_ping_t *mp;
13136 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13140 vam->noprint_msg = 1;
13141 /* Wait for a reply... */
13145 get_locator_set_index_from_msg (vam, locator_set, locator_set_index);
13146 vam->noprint_msg = 0;
13155 lisp_locator_dump (vat_main_t * vam, u32 locator_set_index, u8 * locator_set,
13162 if (!vam->json_output)
13164 fformat (vam->ofp, "%=20s%=16s%=16s\n",
13165 "locator", "priority", "weight");
13170 ret = get_locator_set_index (vam, locator_set, &locator_set_index);
13173 if (!ret && ~0 == locator_set_index)
13178 ret = lisp_locator_dump_send_msg (vam, locator_set_index, filter);
13184 lisp_locator_set_dump (vat_main_t * vam, u8 filter)
13186 vl_api_lisp_locator_set_dump_t *mp;
13189 if (!vam->json_output)
13191 fformat (vam->ofp, "%=20s%=16s%=16s%=16s%=16s\n",
13192 "locator-set", "locator-set-index", "locator", "priority",
13196 vam->noprint_msg = 1;
13198 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13200 mp->filter = filter;
13205 /* Use a control ping for synchronization */
13207 vl_api_noprint_control_ping_t *mp;
13208 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13212 /* Wait for a reply... */
13216 if (vam->noprint_msg)
13218 if (!vam->json_output)
13220 print_locator_in_locator_set(vam, filter);
13224 json_locator_in_locator_set(vam, filter);
13227 vam->noprint_msg = 0;
13236 api_lisp_locator_set_dump (vat_main_t * vam)
13238 unformat_input_t *input = vam->input;
13239 vam->noprint_msg = 0;
13240 u32 locator_set_index = ~0;
13241 u8 locator_set_index_set = 0;
13242 u8 *locator_set = 0;
13243 u8 locator_set_set = 0;
13247 /* Parse args required to build the message */
13248 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13250 if (unformat (input, "locator-set-index %u", &locator_set_index))
13252 locator_set_index_set = 1;
13254 else if (unformat (input, "locator-set %s", &locator_set))
13256 locator_set_set = 1;
13258 else if (unformat (input, "local"))
13262 else if (unformat (input, "remote"))
13272 if (locator_set_index_set && locator_set_set)
13274 errmsg ("use only input parameter!\n");
13278 if (locator_set_index_set || locator_set_set)
13280 ret = lisp_locator_dump (vam, locator_set_index, locator_set, filter);
13284 ret = lisp_locator_set_dump (vam, filter);
13287 vec_free (locator_set);
13293 api_lisp_eid_table_map_dump (vat_main_t * vam)
13297 unformat_input_t *input = vam->input;
13298 vl_api_lisp_eid_table_map_dump_t *mp;
13301 /* Parse args required to build the message */
13302 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13304 if (unformat (input, "l2"))
13309 else if (unformat (input, "l3"))
13316 errmsg ("parse error '%U'", format_unformat_error, input);
13323 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13327 if (!vam->json_output)
13329 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
13332 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
13338 /* Use a control ping for synchronization */
13340 vl_api_control_ping_t *mp;
13341 M (CONTROL_PING, control_ping);
13344 /* Wait for a reply... */
13352 api_lisp_eid_table_vni_dump (vat_main_t * vam)
13354 vl_api_lisp_eid_table_vni_dump_t *mp;
13357 if (!vam->json_output)
13359 fformat (vam->ofp, "VNI\n");
13362 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
13367 /* Use a control ping for synchronization */
13369 vl_api_control_ping_t *mp;
13370 M (CONTROL_PING, control_ping);
13373 /* Wait for a reply... */
13381 get_locator_set (vat_main_t * vam)
13383 vl_api_lisp_locator_set_dump_t *mp;
13386 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13390 /* Use a control ping for synchronization */
13392 vl_api_noprint_control_ping_t *mp;
13393 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13397 /* Wait for a reply... */
13405 format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table,
13408 u8 *(*format_eid) (u8 *, va_list *) = 0;
13410 ASSERT (vam != NULL);
13411 ASSERT (eid_table != NULL);
13418 switch (eid_table->eid_type)
13422 format_eid = (eid_table->eid_type ? format_ip6_address :
13423 format_ip4_address);
13424 str = format (0, "[%d] %U/%d", eid_table->vni,
13425 format_eid, eid_table->eid, eid_table->eid_prefix_len);
13428 str = format (0, "[%d] %U", eid_table->vni,
13429 format_ethernet_address, eid_table->eid);
13432 errmsg ("unknown EID type %d!", eid_table->eid_type);
13444 format_locator_set_for_eid_table (vat_main_t * vam, u8 * str,
13445 eid_table_t * eid_table)
13447 locator_set_msg_t *ls = 0;
13449 ASSERT (vam != NULL);
13450 ASSERT (eid_table != NULL);
13452 if (eid_table->is_local)
13454 vec_foreach (ls, vam->locator_set_msg)
13456 if (ls->locator_set_index == eid_table->locator_set_index)
13458 str = format (0, "local(%s)", ls->locator_set_name);
13463 str = format (0, "local(N/A)");
13467 str = format (0, "remote");
13474 format_locator_for_eid_table (vat_main_t * vam, u8 * str,
13475 eid_table_t * eid_table)
13477 locator_msg_t *loc = 0;
13478 int first_line = 1;
13480 ASSERT (vam != NULL);
13481 ASSERT (eid_table != NULL);
13483 if (~0 == eid_table->locator_set_index)
13485 return format (0, "action: %d\n", eid_table->action);
13488 vec_foreach (loc, vam->locator_msg)
13494 str = format (str, "%-55s%-d\n", " ", loc->sw_if_index);
13498 str = format (str, "%=55s%-U\n", " ",
13499 loc->is_ipv6 ? format_ip6_address :
13500 format_ip4_address, loc->ip_address);
13508 str = format (str, "%-30d%-20u%-u\n", loc->sw_if_index,
13509 eid_table->ttl, eid_table->authoritative);
13513 str = format (str, "%-30U%-20u%-u\n",
13514 loc->is_ipv6 ? format_ip6_address :
13515 format_ip4_address,
13516 loc->ip_address, eid_table->ttl,
13517 eid_table->authoritative);
13526 print_lisp_eid_table_dump (vat_main_t * vam)
13528 eid_table_t *eid_table = 0;
13529 u8 *tmp_str = 0, *tmp_str2 = 0;
13532 ASSERT (vam != NULL);
13534 ret = get_locator_set (vam);
13537 vec_free (vam->eid_tables);
13541 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", "locators",
13542 "ttl", "authoritative");
13544 vec_foreach (eid_table, vam->eid_tables)
13546 if (~0 != eid_table->locator_set_index)
13548 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index,
13552 vec_free (vam->locator_msg);
13553 clean_locator_set_message (vam);
13554 vec_free (vam->eid_tables);
13559 tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret);
13562 vec_free (vam->locator_msg);
13563 clean_locator_set_message (vam);
13564 vec_free (vam->eid_tables);
13568 tmp_str = format (0, "%-35s", tmp_str2);
13569 vec_free (tmp_str2);
13571 tmp_str2 = format_locator_set_for_eid_table (vam, tmp_str2, eid_table);
13572 tmp_str = format (tmp_str, "%-20s", tmp_str2);
13573 vec_free (tmp_str2);
13575 tmp_str2 = format_locator_for_eid_table (vam, tmp_str2, eid_table);
13576 tmp_str = format (tmp_str, "%-s", tmp_str2);
13577 vec_free (tmp_str2);
13579 fformat (vam->ofp, "%s", tmp_str);
13580 vec_free (tmp_str);
13581 vec_free (vam->locator_msg);
13584 clean_locator_set_message (vam);
13585 vec_free (vam->eid_tables);
13591 json_locator_set_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13592 eid_table_t * eid_table)
13594 locator_set_msg_t *ls = 0;
13597 ASSERT (vam != NULL);
13598 ASSERT (node != NULL);
13599 ASSERT (eid_table != NULL);
13601 if (eid_table->is_local)
13603 vec_foreach (ls, vam->locator_set_msg)
13605 if (ls->locator_set_index == eid_table->locator_set_index)
13607 vat_json_object_add_string_copy (node, "locator-set",
13608 ls->locator_set_name);
13613 s = format (0, "N/A");
13615 vat_json_object_add_string_copy (node, "locator-set", s);
13620 s = format (0, "remote");
13622 vat_json_object_add_string_copy (node, "locator-set", s);
13628 json_eid_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13629 eid_table_t * eid_table)
13632 struct in6_addr ip6;
13633 struct in_addr ip4;
13635 ASSERT (vam != NULL);
13636 ASSERT (node != NULL);
13637 ASSERT (eid_table != NULL);
13639 switch (eid_table->eid_type)
13642 clib_memcpy (&ip4, eid_table->eid, sizeof (ip4));
13643 vat_json_object_add_ip4 (node, "eid", ip4);
13644 vat_json_object_add_uint (node, "eid-prefix-len",
13645 eid_table->eid_prefix_len);
13648 clib_memcpy (&ip6, eid_table->eid, sizeof (ip6));
13649 vat_json_object_add_ip6 (node, "eid", ip6);
13650 vat_json_object_add_uint (node, "eid-prefix-len",
13651 eid_table->eid_prefix_len);
13654 s = format (0, "%U", format_ethernet_address, eid_table->eid);
13656 vat_json_object_add_string_copy (node, "eid", s);
13660 errmsg ("unknown EID type %d!", eid_table->eid_type);
13668 json_locator_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13669 eid_table_t * eid_table)
13671 locator_msg_t *loc = 0;
13672 vat_json_node_t *locator_array = 0;
13673 vat_json_node_t *locator = 0;
13674 struct in6_addr ip6;
13675 struct in_addr ip4;
13677 ASSERT (vam != NULL);
13678 ASSERT (node != NULL);
13679 ASSERT (eid_table != NULL);
13681 locator_array = vat_json_object_add_list (node, "locator");
13682 vec_foreach (loc, vam->locator_msg)
13684 locator = vat_json_array_add (locator_array);
13685 vat_json_init_object (locator);
13688 vat_json_object_add_uint (locator, "locator-index", loc->sw_if_index);
13694 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13695 vat_json_object_add_ip6 (locator, "locator", ip6);
13699 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13700 vat_json_object_add_ip4 (locator, "locator", ip4);
13707 json_lisp_eid_table_dump (vat_main_t * vam)
13709 eid_table_t *eid_table;
13710 vat_json_node_t *node = 0;
13713 ASSERT (vam != NULL);
13715 ret = get_locator_set (vam);
13718 vec_free (vam->eid_tables);
13722 if (!vec_len (vam->eid_tables))
13724 /* just print [] */
13725 vat_json_init_array (&vam->json_tree);
13726 vat_json_print (vam->ofp, &vam->json_tree);
13727 vam->json_tree.type = VAT_JSON_NONE;
13731 if (VAT_JSON_ARRAY != vam->json_tree.type)
13733 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13734 vat_json_init_array (&vam->json_tree);
13737 vec_foreach (eid_table, vam->eid_tables)
13739 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0);
13742 vec_free (vam->locator_msg);
13743 vec_free (vam->eid_tables);
13744 clean_locator_set_message (vam);
13745 vat_json_free (&vam->json_tree);
13746 vam->json_tree.type = VAT_JSON_NONE;
13750 node = vat_json_array_add (&vam->json_tree);
13751 vat_json_init_object (node);
13753 vat_json_object_add_uint (node, "vni", eid_table->vni);
13755 json_locator_set_for_eid_table (vam, node, eid_table);
13756 ret = json_eid_for_eid_table (vam, node, eid_table);
13759 vec_free (vam->locator_msg);
13760 vec_free (vam->eid_tables);
13761 clean_locator_set_message (vam);
13762 vat_json_free (&vam->json_tree);
13763 vam->json_tree.type = VAT_JSON_NONE;
13767 json_locator_for_eid_table (vam, node, eid_table);
13769 vat_json_object_add_uint (node, "ttl", eid_table->ttl);
13770 vat_json_object_add_uint (node, "authoritative",
13771 eid_table->authoritative);
13773 vec_free (vam->locator_msg);
13776 vat_json_print (vam->ofp, &vam->json_tree);
13777 vat_json_free (&vam->json_tree);
13778 vam->json_tree.type = VAT_JSON_NONE;
13780 clean_locator_set_message (vam);
13781 vec_free (vam->eid_tables);
13787 api_lisp_eid_table_dump (vat_main_t * vam)
13789 unformat_input_t *i = vam->input;
13790 vl_api_lisp_eid_table_dump_t *mp;
13792 struct in_addr ip4;
13793 struct in6_addr ip6;
13795 u8 eid_type = ~0, eid_set = 0;
13796 u32 prefix_length = ~0, t, vni = 0;
13799 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13801 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
13807 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
13813 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
13818 else if (unformat (i, "vni %d", &t))
13822 else if (unformat (i, "local"))
13826 else if (unformat (i, "remote"))
13832 errmsg ("parse error '%U'", format_unformat_error, i);
13837 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
13839 mp->filter = filter;
13843 mp->vni = htonl (vni);
13844 mp->eid_type = eid_type;
13848 mp->prefix_length = prefix_length;
13849 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
13852 mp->prefix_length = prefix_length;
13853 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
13856 clib_memcpy (mp->eid, mac, sizeof (mac));
13859 errmsg ("unknown EID type %d!", eid_type);
13864 vam->noprint_msg = 1;
13869 /* Use a control ping for synchronization */
13871 vl_api_noprint_control_ping_t *mp;
13872 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13876 /* Wait for a reply... */
13880 if (vam->noprint_msg)
13882 if (!vam->json_output)
13884 vam->retval = print_lisp_eid_table_dump(vam);
13888 vam->retval = json_lisp_eid_table_dump(vam);
13891 vam->noprint_msg = 0;
13900 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
13902 vl_api_lisp_gpe_tunnel_dump_t *mp;
13905 if (!vam->json_output)
13907 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
13908 "%=16s%=16s%=16s%=16s%=16s\n",
13909 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
13910 "Decap next", "Lisp version", "Flags", "Next protocol",
13911 "ver_res", "res", "iid");
13914 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
13918 /* Use a control ping for synchronization */
13920 vl_api_control_ping_t *mp;
13921 M (CONTROL_PING, control_ping);
13924 /* Wait for a reply... */
13932 api_lisp_map_resolver_dump (vat_main_t * vam)
13934 vl_api_lisp_map_resolver_dump_t *mp;
13937 if (!vam->json_output)
13939 fformat (vam->ofp, "%=20s\n", "Map resolver");
13942 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
13946 /* Use a control ping for synchronization */
13948 vl_api_control_ping_t *mp;
13949 M (CONTROL_PING, control_ping);
13952 /* Wait for a reply... */
13960 api_show_lisp_status (vat_main_t * vam)
13962 vl_api_show_lisp_status_t *mp;
13965 if (!vam->json_output)
13967 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
13970 M (SHOW_LISP_STATUS, show_lisp_status);
13973 /* Wait for a reply... */
13981 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
13983 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
13986 if (!vam->json_output)
13988 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
13991 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
13994 /* Wait for a reply... */
14002 api_af_packet_create (vat_main_t * vam)
14004 unformat_input_t *i = vam->input;
14005 vl_api_af_packet_create_t *mp;
14007 u8 *host_if_name = 0;
14009 u8 random_hw_addr = 1;
14011 memset (hw_addr, 0, sizeof (hw_addr));
14013 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14015 if (unformat (i, "name %s", &host_if_name))
14016 vec_add1 (host_if_name, 0);
14017 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14018 random_hw_addr = 0;
14023 if (!vec_len (host_if_name))
14025 errmsg ("host-interface name must be specified");
14029 if (vec_len (host_if_name) > 64)
14031 errmsg ("host-interface name too long");
14035 M (AF_PACKET_CREATE, af_packet_create);
14037 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14038 clib_memcpy (mp->hw_addr, hw_addr, 6);
14039 mp->use_random_hw_addr = random_hw_addr;
14040 vec_free (host_if_name);
14043 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14049 api_af_packet_delete (vat_main_t * vam)
14051 unformat_input_t *i = vam->input;
14052 vl_api_af_packet_delete_t *mp;
14054 u8 *host_if_name = 0;
14056 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14058 if (unformat (i, "name %s", &host_if_name))
14059 vec_add1 (host_if_name, 0);
14064 if (!vec_len (host_if_name))
14066 errmsg ("host-interface name must be specified");
14070 if (vec_len (host_if_name) > 64)
14072 errmsg ("host-interface name too long");
14076 M (AF_PACKET_DELETE, af_packet_delete);
14078 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14079 vec_free (host_if_name);
14088 api_policer_add_del (vat_main_t * vam)
14090 unformat_input_t *i = vam->input;
14091 vl_api_policer_add_del_t *mp;
14102 u8 color_aware = 0;
14103 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
14105 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14106 conform_action.dscp = 0;
14107 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14108 exceed_action.dscp = 0;
14109 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14110 violate_action.dscp = 0;
14112 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14114 if (unformat (i, "del"))
14116 else if (unformat (i, "name %s", &name))
14117 vec_add1 (name, 0);
14118 else if (unformat (i, "cir %u", &cir))
14120 else if (unformat (i, "eir %u", &eir))
14122 else if (unformat (i, "cb %u", &cb))
14124 else if (unformat (i, "eb %u", &eb))
14126 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14129 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14132 else if (unformat (i, "type %U", unformat_policer_type, &type))
14134 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14137 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14140 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14143 else if (unformat (i, "color-aware"))
14149 if (!vec_len (name))
14151 errmsg ("policer name must be specified");
14155 if (vec_len (name) > 64)
14157 errmsg ("policer name too long");
14161 M (POLICER_ADD_DEL, policer_add_del);
14163 clib_memcpy (mp->name, name, vec_len (name));
14165 mp->is_add = is_add;
14170 mp->rate_type = rate_type;
14171 mp->round_type = round_type;
14173 mp->conform_action_type = conform_action.action_type;
14174 mp->conform_dscp = conform_action.dscp;
14175 mp->exceed_action_type = exceed_action.action_type;
14176 mp->exceed_dscp = exceed_action.dscp;
14177 mp->violate_action_type = violate_action.action_type;
14178 mp->violate_dscp = violate_action.dscp;
14179 mp->color_aware = color_aware;
14188 api_policer_dump (vat_main_t * vam)
14190 unformat_input_t *i = vam->input;
14191 vl_api_policer_dump_t *mp;
14193 u8 *match_name = 0;
14194 u8 match_name_valid = 0;
14196 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14198 if (unformat (i, "name %s", &match_name))
14200 vec_add1 (match_name, 0);
14201 match_name_valid = 1;
14207 M (POLICER_DUMP, policer_dump);
14208 mp->match_name_valid = match_name_valid;
14209 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14210 vec_free (match_name);
14214 /* Use a control ping for synchronization */
14216 vl_api_control_ping_t *mp;
14217 M (CONTROL_PING, control_ping);
14220 /* Wait for a reply... */
14228 api_policer_classify_set_interface (vat_main_t * vam)
14230 unformat_input_t *i = vam->input;
14231 vl_api_policer_classify_set_interface_t *mp;
14234 int sw_if_index_set;
14235 u32 ip4_table_index = ~0;
14236 u32 ip6_table_index = ~0;
14237 u32 l2_table_index = ~0;
14240 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14242 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14243 sw_if_index_set = 1;
14244 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14245 sw_if_index_set = 1;
14246 else if (unformat (i, "del"))
14248 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14250 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14252 else if (unformat (i, "l2-table %d", &l2_table_index))
14256 clib_warning ("parse error '%U'", format_unformat_error, i);
14261 if (sw_if_index_set == 0)
14263 errmsg ("missing interface name or sw_if_index\n");
14267 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14269 mp->sw_if_index = ntohl (sw_if_index);
14270 mp->ip4_table_index = ntohl (ip4_table_index);
14271 mp->ip6_table_index = ntohl (ip6_table_index);
14272 mp->l2_table_index = ntohl (l2_table_index);
14273 mp->is_add = is_add;
14282 api_policer_classify_dump (vat_main_t * vam)
14284 unformat_input_t *i = vam->input;
14285 vl_api_policer_classify_dump_t *mp;
14287 u8 type = POLICER_CLASSIFY_N_TABLES;
14289 if (unformat (i, "type %U", unformat_classify_table_type, &type))
14293 errmsg ("classify table type must be specified\n");
14297 if (!vam->json_output)
14299 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14302 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14307 /* Use a control ping for synchronization */
14309 vl_api_control_ping_t *mp;
14310 M (CONTROL_PING, control_ping);
14313 /* Wait for a reply... */
14321 api_netmap_create (vat_main_t * vam)
14323 unformat_input_t *i = vam->input;
14324 vl_api_netmap_create_t *mp;
14328 u8 random_hw_addr = 1;
14332 memset (hw_addr, 0, sizeof (hw_addr));
14334 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14336 if (unformat (i, "name %s", &if_name))
14337 vec_add1 (if_name, 0);
14338 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14339 random_hw_addr = 0;
14340 else if (unformat (i, "pipe"))
14342 else if (unformat (i, "master"))
14344 else if (unformat (i, "slave"))
14350 if (!vec_len (if_name))
14352 errmsg ("interface name must be specified");
14356 if (vec_len (if_name) > 64)
14358 errmsg ("interface name too long");
14362 M (NETMAP_CREATE, netmap_create);
14364 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14365 clib_memcpy (mp->hw_addr, hw_addr, 6);
14366 mp->use_random_hw_addr = random_hw_addr;
14367 mp->is_pipe = is_pipe;
14368 mp->is_master = is_master;
14369 vec_free (if_name);
14378 api_netmap_delete (vat_main_t * vam)
14380 unformat_input_t *i = vam->input;
14381 vl_api_netmap_delete_t *mp;
14385 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14387 if (unformat (i, "name %s", &if_name))
14388 vec_add1 (if_name, 0);
14393 if (!vec_len (if_name))
14395 errmsg ("interface name must be specified");
14399 if (vec_len (if_name) > 64)
14401 errmsg ("interface name too long");
14405 M (NETMAP_DELETE, netmap_delete);
14407 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14408 vec_free (if_name);
14416 static void vl_api_mpls_gre_tunnel_details_t_handler
14417 (vl_api_mpls_gre_tunnel_details_t * mp)
14419 vat_main_t *vam = &vat_main;
14421 i32 len = ntohl (mp->nlabels);
14423 if (mp->l2_only == 0)
14425 fformat (vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
14426 ntohl (mp->tunnel_index),
14427 format_ip4_address, &mp->tunnel_src,
14428 format_ip4_address, &mp->tunnel_dst,
14429 format_ip4_address, &mp->intfc_address,
14430 ntohl (mp->mask_width));
14431 for (i = 0; i < len; i++)
14433 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14435 fformat (vam->ofp, "\n");
14436 fformat (vam->ofp, " inner fib index %d, outer fib index %d\n",
14437 ntohl (mp->inner_fib_index), ntohl (mp->outer_fib_index));
14441 fformat (vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
14442 ntohl (mp->tunnel_index),
14443 format_ip4_address, &mp->tunnel_src,
14444 format_ip4_address, &mp->tunnel_dst,
14445 format_ip4_address, &mp->intfc_address);
14446 for (i = 0; i < len; i++)
14448 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14450 fformat (vam->ofp, "\n");
14451 fformat (vam->ofp, " l2 interface %d, outer fib index %d\n",
14452 ntohl (mp->hw_if_index), ntohl (mp->outer_fib_index));
14456 static void vl_api_mpls_gre_tunnel_details_t_handler_json
14457 (vl_api_mpls_gre_tunnel_details_t * mp)
14459 vat_main_t *vam = &vat_main;
14460 vat_json_node_t *node = NULL;
14461 struct in_addr ip4;
14463 i32 len = ntohl (mp->nlabels);
14465 if (VAT_JSON_ARRAY != vam->json_tree.type)
14467 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14468 vat_json_init_array (&vam->json_tree);
14470 node = vat_json_array_add (&vam->json_tree);
14472 vat_json_init_object (node);
14473 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14474 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14475 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14476 vat_json_object_add_uint (node, "inner_fib_index",
14477 ntohl (mp->inner_fib_index));
14478 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14479 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14480 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14481 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14482 clib_memcpy (&ip4, &(mp->tunnel_src), sizeof (ip4));
14483 vat_json_object_add_ip4 (node, "tunnel_src", ip4);
14484 clib_memcpy (&ip4, &(mp->tunnel_dst), sizeof (ip4));
14485 vat_json_object_add_ip4 (node, "tunnel_dst", ip4);
14486 vat_json_object_add_uint (node, "outer_fib_index",
14487 ntohl (mp->outer_fib_index));
14488 vat_json_object_add_uint (node, "label_count", len);
14489 for (i = 0; i < len; i++)
14491 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14496 api_mpls_gre_tunnel_dump (vat_main_t * vam)
14498 vl_api_mpls_gre_tunnel_dump_t *mp;
14502 /* Parse args required to build the message */
14503 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14505 if (!unformat (vam->input, "tunnel_index %d", &index))
14512 fformat (vam->ofp, " tunnel_index %d\n", index);
14514 M (MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
14515 mp->tunnel_index = htonl (index);
14518 /* Use a control ping for synchronization */
14520 vl_api_control_ping_t *mp;
14521 M (CONTROL_PING, control_ping);
14527 static void vl_api_mpls_eth_tunnel_details_t_handler
14528 (vl_api_mpls_eth_tunnel_details_t * mp)
14530 vat_main_t *vam = &vat_main;
14532 i32 len = ntohl (mp->nlabels);
14534 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14535 ntohl (mp->tunnel_index),
14536 format_ethernet_address, &mp->tunnel_dst_mac,
14537 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14538 for (i = 0; i < len; i++)
14540 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14542 fformat (vam->ofp, "\n");
14543 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14544 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14547 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14548 (vl_api_mpls_eth_tunnel_details_t * mp)
14550 vat_main_t *vam = &vat_main;
14551 vat_json_node_t *node = NULL;
14552 struct in_addr ip4;
14554 i32 len = ntohl (mp->nlabels);
14556 if (VAT_JSON_ARRAY != vam->json_tree.type)
14558 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14559 vat_json_init_array (&vam->json_tree);
14561 node = vat_json_array_add (&vam->json_tree);
14563 vat_json_init_object (node);
14564 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14565 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14566 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14567 vat_json_object_add_uint (node, "inner_fib_index",
14568 ntohl (mp->inner_fib_index));
14569 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14570 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14571 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14572 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14573 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14574 format (0, "%U", format_ethernet_address,
14575 &mp->tunnel_dst_mac));
14576 vat_json_object_add_uint (node, "tx_sw_if_index",
14577 ntohl (mp->tx_sw_if_index));
14578 vat_json_object_add_uint (node, "label_count", len);
14579 for (i = 0; i < len; i++)
14581 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14586 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14588 vl_api_mpls_eth_tunnel_dump_t *mp;
14592 /* Parse args required to build the message */
14593 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14595 if (!unformat (vam->input, "tunnel_index %d", &index))
14602 fformat (vam->ofp, " tunnel_index %d\n", index);
14604 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14605 mp->tunnel_index = htonl (index);
14608 /* Use a control ping for synchronization */
14610 vl_api_control_ping_t *mp;
14611 M (CONTROL_PING, control_ping);
14617 static void vl_api_mpls_fib_encap_details_t_handler
14618 (vl_api_mpls_fib_encap_details_t * mp)
14620 vat_main_t *vam = &vat_main;
14622 i32 len = ntohl (mp->nlabels);
14624 fformat (vam->ofp, "table %d, dest %U, label ",
14625 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14626 for (i = 0; i < len; i++)
14628 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14630 fformat (vam->ofp, "\n");
14633 static void vl_api_mpls_fib_encap_details_t_handler_json
14634 (vl_api_mpls_fib_encap_details_t * mp)
14636 vat_main_t *vam = &vat_main;
14637 vat_json_node_t *node = NULL;
14639 i32 len = ntohl (mp->nlabels);
14640 struct in_addr ip4;
14642 if (VAT_JSON_ARRAY != vam->json_tree.type)
14644 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14645 vat_json_init_array (&vam->json_tree);
14647 node = vat_json_array_add (&vam->json_tree);
14649 vat_json_init_object (node);
14650 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14651 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14652 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14653 vat_json_object_add_ip4 (node, "dest", ip4);
14654 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14655 vat_json_object_add_uint (node, "label_count", len);
14656 for (i = 0; i < len; i++)
14658 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14663 api_mpls_fib_encap_dump (vat_main_t * vam)
14665 vl_api_mpls_fib_encap_dump_t *mp;
14668 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14671 /* Use a control ping for synchronization */
14673 vl_api_control_ping_t *mp;
14674 M (CONTROL_PING, control_ping);
14680 static void vl_api_mpls_fib_decap_details_t_handler
14681 (vl_api_mpls_fib_decap_details_t * mp)
14683 vat_main_t *vam = &vat_main;
14686 "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
14687 ntohl (mp->rx_table_id), ntohl (mp->tx_table_id), mp->swif_tag,
14688 ntohl (mp->label), ntohl (mp->s_bit));
14691 static void vl_api_mpls_fib_decap_details_t_handler_json
14692 (vl_api_mpls_fib_decap_details_t * mp)
14694 vat_main_t *vam = &vat_main;
14695 vat_json_node_t *node = NULL;
14696 struct in_addr ip4;
14698 if (VAT_JSON_ARRAY != vam->json_tree.type)
14700 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14701 vat_json_init_array (&vam->json_tree);
14703 node = vat_json_array_add (&vam->json_tree);
14705 vat_json_init_object (node);
14706 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14707 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14708 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14709 vat_json_object_add_ip4 (node, "dest", ip4);
14710 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14711 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14712 vat_json_object_add_uint (node, "rx_table_id", ntohl (mp->rx_table_id));
14713 vat_json_object_add_uint (node, "tx_table_id", ntohl (mp->tx_table_id));
14714 vat_json_object_add_string_copy (node, "swif_tag", mp->swif_tag);
14718 api_mpls_fib_decap_dump (vat_main_t * vam)
14720 vl_api_mpls_fib_decap_dump_t *mp;
14723 M (MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
14726 /* Use a control ping for synchronization */
14728 vl_api_control_ping_t *mp;
14729 M (CONTROL_PING, control_ping);
14736 api_classify_table_ids (vat_main_t * vam)
14738 vl_api_classify_table_ids_t *mp;
14741 /* Construct the API message */
14742 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14752 api_classify_table_by_interface (vat_main_t * vam)
14754 unformat_input_t *input = vam->input;
14755 vl_api_classify_table_by_interface_t *mp;
14758 u32 sw_if_index = ~0;
14759 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14761 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14763 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14768 if (sw_if_index == ~0)
14770 errmsg ("missing interface name or sw_if_index\n");
14774 /* Construct the API message */
14775 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14777 mp->sw_if_index = ntohl (sw_if_index);
14786 api_classify_table_info (vat_main_t * vam)
14788 unformat_input_t *input = vam->input;
14789 vl_api_classify_table_info_t *mp;
14793 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14795 if (unformat (input, "table_id %d", &table_id))
14800 if (table_id == ~0)
14802 errmsg ("missing table id\n");
14806 /* Construct the API message */
14807 M (CLASSIFY_TABLE_INFO, classify_table_info);
14809 mp->table_id = ntohl (table_id);
14818 api_classify_session_dump (vat_main_t * vam)
14820 unformat_input_t *input = vam->input;
14821 vl_api_classify_session_dump_t *mp;
14825 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14827 if (unformat (input, "table_id %d", &table_id))
14832 if (table_id == ~0)
14834 errmsg ("missing table id\n");
14838 /* Construct the API message */
14839 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
14841 mp->table_id = ntohl (table_id);
14844 /* Use a control ping for synchronization */
14846 vl_api_control_ping_t *mp;
14847 M (CONTROL_PING, control_ping);
14856 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
14858 vat_main_t *vam = &vat_main;
14860 fformat (vam->ofp, "collector_address %U, collector_port %d, "
14861 "src_address %U, vrf_id %d, path_mtu %u, "
14862 "template_interval %u, udp_checksum %d\n",
14863 format_ip4_address, mp->collector_address,
14864 ntohs (mp->collector_port),
14865 format_ip4_address, mp->src_address,
14866 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
14867 ntohl (mp->template_interval), mp->udp_checksum);
14870 vam->result_ready = 1;
14874 vl_api_ipfix_exporter_details_t_handler_json
14875 (vl_api_ipfix_exporter_details_t * mp)
14877 vat_main_t *vam = &vat_main;
14878 vat_json_node_t node;
14879 struct in_addr collector_address;
14880 struct in_addr src_address;
14882 vat_json_init_object (&node);
14883 clib_memcpy (&collector_address, &mp->collector_address,
14884 sizeof (collector_address));
14885 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
14886 vat_json_object_add_uint (&node, "collector_port",
14887 ntohs (mp->collector_port));
14888 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
14889 vat_json_object_add_ip4 (&node, "src_address", src_address);
14890 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
14891 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
14892 vat_json_object_add_uint (&node, "template_interval",
14893 ntohl (mp->template_interval));
14894 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
14896 vat_json_print (vam->ofp, &node);
14897 vat_json_free (&node);
14899 vam->result_ready = 1;
14903 api_ipfix_exporter_dump (vat_main_t * vam)
14905 vl_api_ipfix_exporter_dump_t *mp;
14908 /* Construct the API message */
14909 M (IPFIX_EXPORTER_DUMP, ipfix_exporter_dump);
14919 api_ipfix_classify_stream_dump (vat_main_t * vam)
14921 vl_api_ipfix_classify_stream_dump_t *mp;
14924 /* Construct the API message */
14925 M (IPFIX_CLASSIFY_STREAM_DUMP, ipfix_classify_stream_dump);
14935 vl_api_ipfix_classify_stream_details_t_handler
14936 (vl_api_ipfix_classify_stream_details_t * mp)
14938 vat_main_t *vam = &vat_main;
14939 fformat (vam->ofp, "domain_id %d, src_port %d\n",
14940 ntohl (mp->domain_id), ntohs (mp->src_port));
14942 vam->result_ready = 1;
14946 vl_api_ipfix_classify_stream_details_t_handler_json
14947 (vl_api_ipfix_classify_stream_details_t * mp)
14949 vat_main_t *vam = &vat_main;
14950 vat_json_node_t node;
14952 vat_json_init_object (&node);
14953 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
14954 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
14956 vat_json_print (vam->ofp, &node);
14957 vat_json_free (&node);
14959 vam->result_ready = 1;
14963 api_ipfix_classify_table_dump (vat_main_t * vam)
14965 vl_api_ipfix_classify_table_dump_t *mp;
14968 if (!vam->json_output)
14970 fformat (vam->ofp, "%15s%15s%20s\n", "table_id", "ip_version",
14971 "transport_protocol");
14974 /* Construct the API message */
14975 M (IPFIX_CLASSIFY_TABLE_DUMP, ipfix_classify_table_dump);
14980 /* Use a control ping for synchronization */
14982 vl_api_control_ping_t *mp;
14983 M (CONTROL_PING, control_ping);
14990 vl_api_ipfix_classify_table_details_t_handler
14991 (vl_api_ipfix_classify_table_details_t * mp)
14993 vat_main_t *vam = &vat_main;
14994 fformat (vam->ofp, "%15d%15d%20d\n", ntohl (mp->table_id), mp->ip_version,
14995 mp->transport_protocol);
14999 vl_api_ipfix_classify_table_details_t_handler_json
15000 (vl_api_ipfix_classify_table_details_t * mp)
15002 vat_json_node_t *node = NULL;
15003 vat_main_t *vam = &vat_main;
15005 if (VAT_JSON_ARRAY != vam->json_tree.type)
15007 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15008 vat_json_init_array (&vam->json_tree);
15011 node = vat_json_array_add (&vam->json_tree);
15012 vat_json_init_object (node);
15014 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
15015 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
15016 vat_json_object_add_uint (node, "transport_protocol",
15017 mp->transport_protocol);
15021 api_pg_create_interface (vat_main_t * vam)
15023 unformat_input_t *input = vam->input;
15024 vl_api_pg_create_interface_t *mp;
15028 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15030 if (unformat (input, "if_id %d", &if_id))
15037 errmsg ("missing pg interface index\n");
15041 /* Construct the API message */
15042 M (PG_CREATE_INTERFACE, pg_create_interface);
15044 mp->interface_id = ntohl (if_id);
15053 api_pg_capture (vat_main_t * vam)
15055 unformat_input_t *input = vam->input;
15056 vl_api_pg_capture_t *mp;
15062 u8 pcap_file_set = 0;
15064 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15066 if (unformat (input, "if_id %d", &if_id))
15068 else if (unformat (input, "pcap %s", &pcap_file))
15070 else if (unformat (input, "count %d", &count))
15072 else if (unformat (input, "disable"))
15079 errmsg ("missing pg interface index\n");
15082 if (pcap_file_set > 0)
15084 if (vec_len (pcap_file) > 255)
15086 errmsg ("pcap file name is too long\n");
15091 u32 name_len = vec_len (pcap_file);
15092 /* Construct the API message */
15093 M (PG_CAPTURE, pg_capture);
15095 mp->interface_id = ntohl (if_id);
15096 mp->is_enabled = enable;
15097 mp->count = ntohl (count);
15098 mp->pcap_name_length = ntohl (name_len);
15099 if (pcap_file_set != 0)
15101 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
15103 vec_free (pcap_file);
15112 api_pg_enable_disable (vat_main_t * vam)
15114 unformat_input_t *input = vam->input;
15115 vl_api_pg_enable_disable_t *mp;
15119 u8 stream_name_set = 0;
15120 u8 *stream_name = 0;
15121 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15123 if (unformat (input, "stream %s", &stream_name))
15124 stream_name_set = 1;
15125 else if (unformat (input, "disable"))
15131 if (stream_name_set > 0)
15133 if (vec_len (stream_name) > 255)
15135 errmsg ("stream name too long\n");
15140 u32 name_len = vec_len (stream_name);
15141 /* Construct the API message */
15142 M (PG_ENABLE_DISABLE, pg_enable_disable);
15144 mp->is_enabled = enable;
15145 if (stream_name_set != 0)
15147 mp->stream_name_length = ntohl (name_len);
15148 clib_memcpy (mp->stream_name, stream_name, name_len);
15150 vec_free (stream_name);
15159 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15161 unformat_input_t *input = vam->input;
15162 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15165 u16 *low_ports = 0;
15166 u16 *high_ports = 0;
15169 ip4_address_t ip4_addr;
15170 ip6_address_t ip6_addr;
15178 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15180 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15186 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15191 else if (unformat (input, "vrf %d", &vrf_id))
15193 else if (unformat (input, "del"))
15195 else if (unformat (input, "port %d", &tmp))
15197 if (tmp == 0 || tmp > 65535)
15199 errmsg ("port %d out of range", tmp);
15203 this_hi = this_low + 1;
15204 vec_add1 (low_ports, this_low);
15205 vec_add1 (high_ports, this_hi);
15207 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15209 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15211 errmsg ("incorrect range parameters\n");
15215 /* Note: in debug CLI +1 is added to high before
15216 passing to real fn that does "the work"
15217 (ip_source_and_port_range_check_add_del).
15218 This fn is a wrapper around the binary API fn a
15219 control plane will call, which expects this increment
15220 to have occurred. Hence letting the binary API control
15221 plane fn do the increment for consistency between VAT
15222 and other control planes.
15225 vec_add1 (low_ports, this_low);
15226 vec_add1 (high_ports, this_hi);
15232 if (prefix_set == 0)
15234 errmsg ("<address>/<mask> not specified\n");
15240 errmsg ("VRF ID required, not specified\n");
15247 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15251 if (vec_len (low_ports) == 0)
15253 errmsg ("At least one port or port range required\n");
15257 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15258 ip_source_and_port_range_check_add_del);
15260 mp->is_add = is_add;
15265 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15270 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15273 mp->mask_length = length;
15274 mp->number_of_ranges = vec_len (low_ports);
15276 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15277 vec_free (low_ports);
15279 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15280 vec_free (high_ports);
15282 mp->vrf_id = ntohl (vrf_id);
15291 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15293 unformat_input_t *input = vam->input;
15294 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15296 u32 sw_if_index = ~0;
15298 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15299 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15302 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15304 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15306 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15308 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15310 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15312 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15314 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15316 else if (unformat (input, "del"))
15322 if (sw_if_index == ~0)
15324 errmsg ("Interface required but not specified\n");
15330 errmsg ("VRF ID required but not specified\n");
15334 if (tcp_out_vrf_id == 0
15335 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15338 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15342 /* Construct the API message */
15343 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15344 ip_source_and_port_range_check_interface_add_del);
15346 mp->sw_if_index = ntohl (sw_if_index);
15347 mp->is_add = is_add;
15348 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15349 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15350 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15351 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15356 /* Wait for a reply... */
15361 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15363 unformat_input_t *i = vam->input;
15364 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15366 u32 local_sa_id = 0;
15367 u32 remote_sa_id = 0;
15368 ip4_address_t src_address;
15369 ip4_address_t dst_address;
15372 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15374 if (unformat (i, "local_sa %d", &local_sa_id))
15376 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15378 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15380 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15382 else if (unformat (i, "del"))
15386 clib_warning ("parse error '%U'", format_unformat_error, i);
15391 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15393 mp->local_sa_id = ntohl (local_sa_id);
15394 mp->remote_sa_id = ntohl (remote_sa_id);
15395 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15396 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15397 mp->is_add = is_add;
15405 static void vl_api_ipsec_gre_tunnel_details_t_handler
15406 (vl_api_ipsec_gre_tunnel_details_t * mp)
15408 vat_main_t *vam = &vat_main;
15410 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15411 ntohl (mp->sw_if_index),
15412 format_ip4_address, &mp->src_address,
15413 format_ip4_address, &mp->dst_address,
15414 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15417 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15418 (vl_api_ipsec_gre_tunnel_details_t * mp)
15420 vat_main_t *vam = &vat_main;
15421 vat_json_node_t *node = NULL;
15422 struct in_addr ip4;
15424 if (VAT_JSON_ARRAY != vam->json_tree.type)
15426 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15427 vat_json_init_array (&vam->json_tree);
15429 node = vat_json_array_add (&vam->json_tree);
15431 vat_json_init_object (node);
15432 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15433 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15434 vat_json_object_add_ip4 (node, "src_address", ip4);
15435 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15436 vat_json_object_add_ip4 (node, "dst_address", ip4);
15437 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15438 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15442 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15444 unformat_input_t *i = vam->input;
15445 vl_api_ipsec_gre_tunnel_dump_t *mp;
15448 u8 sw_if_index_set = 0;
15450 /* Parse args required to build the message */
15451 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15453 if (unformat (i, "sw_if_index %d", &sw_if_index))
15454 sw_if_index_set = 1;
15459 if (sw_if_index_set == 0)
15464 if (!vam->json_output)
15466 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15467 "sw_if_index", "src_address", "dst_address",
15468 "local_sa_id", "remote_sa_id");
15471 /* Get list of gre-tunnel interfaces */
15472 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15474 mp->sw_if_index = htonl (sw_if_index);
15478 /* Use a control ping for synchronization */
15480 vl_api_control_ping_t *mp;
15481 M (CONTROL_PING, control_ping);
15488 api_delete_subif (vat_main_t * vam)
15490 unformat_input_t *i = vam->input;
15491 vl_api_delete_subif_t *mp;
15493 u32 sw_if_index = ~0;
15495 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15497 if (unformat (i, "sw_if_index %d", &sw_if_index))
15503 if (sw_if_index == ~0)
15505 errmsg ("missing sw_if_index\n");
15509 /* Construct the API message */
15510 M (DELETE_SUBIF, delete_subif);
15511 mp->sw_if_index = ntohl (sw_if_index);
15518 q_or_quit (vat_main_t * vam)
15520 longjmp (vam->jump_buf, 1);
15521 return 0; /* not so much */
15525 q (vat_main_t * vam)
15527 return q_or_quit (vam);
15531 quit (vat_main_t * vam)
15533 return q_or_quit (vam);
15537 comment (vat_main_t * vam)
15543 cmd_cmp (void *a1, void *a2)
15548 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15552 help (vat_main_t * vam)
15557 unformat_input_t *i = vam->input;
15560 if (unformat (i, "%s", &name))
15564 vec_add1 (name, 0);
15566 hs = hash_get_mem (vam->help_by_name, name);
15568 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15570 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15575 fformat (vam->ofp, "Help is available for the following:\n");
15578 hash_foreach_pair (p, vam->function_by_name,
15580 vec_add1 (cmds, (u8 *)(p->key));
15584 vec_sort_with_function (cmds, cmd_cmp);
15586 for (j = 0; j < vec_len (cmds); j++)
15587 fformat (vam->ofp, "%s\n", cmds[j]);
15594 set (vat_main_t * vam)
15596 u8 *name = 0, *value = 0;
15597 unformat_input_t *i = vam->input;
15599 if (unformat (i, "%s", &name))
15601 /* The input buffer is a vector, not a string. */
15602 value = vec_dup (i->buffer);
15603 vec_delete (value, i->index, 0);
15604 /* Almost certainly has a trailing newline */
15605 if (value[vec_len (value) - 1] == '\n')
15606 value[vec_len (value) - 1] = 0;
15607 /* Make sure it's a proper string, one way or the other */
15608 vec_add1 (value, 0);
15609 (void) clib_macro_set_value (&vam->macro_main,
15610 (char *) name, (char *) value);
15613 errmsg ("usage: set <name> <value>\n");
15621 unset (vat_main_t * vam)
15625 if (unformat (vam->input, "%s", &name))
15626 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
15627 errmsg ("unset: %s wasn't set\n", name);
15640 macro_sort_cmp (void *a1, void *a2)
15642 macro_sort_t *s1 = a1;
15643 macro_sort_t *s2 = a2;
15645 return strcmp ((char *) (s1->name), (char *) (s2->name));
15649 dump_macro_table (vat_main_t * vam)
15651 macro_sort_t *sort_me = 0, *sm;
15656 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
15658 vec_add2 (sort_me, sm, 1);
15659 sm->name = (u8 *)(p->key);
15660 sm->value = (u8 *) (p->value[0]);
15664 vec_sort_with_function (sort_me, macro_sort_cmp);
15666 if (vec_len (sort_me))
15667 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
15669 fformat (vam->ofp, "The macro table is empty...\n");
15671 for (i = 0; i < vec_len (sort_me); i++)
15672 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
15677 dump_node_table (vat_main_t * vam)
15680 vlib_node_t *node, *next_node;
15682 if (vec_len (vam->graph_nodes) == 0)
15684 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15688 for (i = 0; i < vec_len (vam->graph_nodes); i++)
15690 node = vam->graph_nodes[i];
15691 fformat (vam->ofp, "[%d] %s\n", i, node->name);
15692 for (j = 0; j < vec_len (node->next_nodes); j++)
15694 if (node->next_nodes[j] != ~0)
15696 next_node = vam->graph_nodes[node->next_nodes[j]];
15697 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15705 search_node_table (vat_main_t * vam)
15707 unformat_input_t *line_input = vam->input;
15710 vlib_node_t *node, *next_node;
15713 if (vam->graph_node_index_by_name == 0)
15715 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15719 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15721 if (unformat (line_input, "%s", &node_to_find))
15723 vec_add1 (node_to_find, 0);
15724 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
15727 fformat (vam->ofp, "%s not found...\n", node_to_find);
15730 node = vam->graph_nodes[p[0]];
15731 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
15732 for (j = 0; j < vec_len (node->next_nodes); j++)
15734 if (node->next_nodes[j] != ~0)
15736 next_node = vam->graph_nodes[node->next_nodes[j]];
15737 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15744 clib_warning ("parse error '%U'", format_unformat_error,
15750 vec_free (node_to_find);
15759 script (vat_main_t * vam)
15762 char *save_current_file;
15763 unformat_input_t save_input;
15764 jmp_buf save_jump_buf;
15765 u32 save_line_number;
15767 FILE *new_fp, *save_ifp;
15769 if (unformat (vam->input, "%s", &s))
15771 new_fp = fopen ((char *) s, "r");
15774 errmsg ("Couldn't open script file %s\n", s);
15781 errmsg ("Missing script name\n");
15785 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
15786 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
15787 save_ifp = vam->ifp;
15788 save_line_number = vam->input_line_number;
15789 save_current_file = (char *) vam->current_file;
15791 vam->input_line_number = 0;
15793 vam->current_file = s;
15796 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
15797 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
15798 vam->ifp = save_ifp;
15799 vam->input_line_number = save_line_number;
15800 vam->current_file = (u8 *) save_current_file;
15807 echo (vat_main_t * vam)
15809 fformat (vam->ofp, "%v", vam->input->buffer);
15813 /* List of API message constructors, CLI names map to api_xxx */
15814 #define foreach_vpe_api_msg \
15815 _(create_loopback,"[mac <mac-addr>]") \
15816 _(sw_interface_dump,"") \
15817 _(sw_interface_set_flags, \
15818 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
15819 _(sw_interface_add_del_address, \
15820 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
15821 _(sw_interface_set_table, \
15822 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
15823 _(sw_interface_set_vpath, \
15824 "<intfc> | sw_if_index <id> enable | disable") \
15825 _(sw_interface_set_l2_xconnect, \
15826 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15827 "enable | disable") \
15828 _(sw_interface_set_l2_bridge, \
15829 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
15830 "[shg <split-horizon-group>] [bvi]\n" \
15831 "enable | disable") \
15832 _(bridge_domain_add_del, \
15833 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
15834 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
15836 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
15838 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
15840 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
15842 "tapname <name> mac <mac-addr> | random-mac") \
15844 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
15846 "<vpp-if-name> | sw_if_index <id>") \
15847 _(sw_interface_tap_dump, "") \
15848 _(ip_add_del_route, \
15849 "<addr>/<mask> via <addr> [vrf <n>]\n" \
15850 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
15851 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
15852 "[multipath] [count <n>]") \
15853 _(proxy_arp_add_del, \
15854 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
15855 _(proxy_arp_intfc_enable_disable, \
15856 "<intfc> | sw_if_index <id> enable | disable") \
15857 _(mpls_add_del_encap, \
15858 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
15859 _(mpls_add_del_decap, \
15860 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
15861 _(mpls_gre_add_del_tunnel, \
15862 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
15863 "adj <ip4-address>/<mask-width> [del]") \
15864 _(sw_interface_set_unnumbered, \
15865 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
15866 _(ip_neighbor_add_del, \
15867 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
15868 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
15869 _(reset_vrf, "vrf <id> [ipv6]") \
15870 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
15871 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
15872 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
15873 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
15874 "[outer_vlan_id_any][inner_vlan_id_any]") \
15875 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
15876 _(reset_fib, "vrf <n> [ipv6]") \
15877 _(dhcp_proxy_config, \
15878 "svr <v46-address> src <v46-address>\n" \
15879 "insert-cid <n> [del]") \
15880 _(dhcp_proxy_config_2, \
15881 "svr <v46-address> src <v46-address>\n" \
15882 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
15883 _(dhcp_proxy_set_vss, \
15884 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
15885 _(dhcp_client_config, \
15886 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
15887 _(set_ip_flow_hash, \
15888 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
15889 _(sw_interface_ip6_enable_disable, \
15890 "<intfc> | sw_if_index <id> enable | disable") \
15891 _(sw_interface_ip6_set_link_local_address, \
15892 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
15893 _(sw_interface_ip6nd_ra_prefix, \
15894 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
15895 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
15896 "[nolink] [isno]") \
15897 _(sw_interface_ip6nd_ra_config, \
15898 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
15899 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
15900 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
15901 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
15902 _(l2_patch_add_del, \
15903 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15904 "enable | disable") \
15905 _(mpls_ethernet_add_del_tunnel, \
15906 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
15907 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
15908 _(mpls_ethernet_add_del_tunnel_2, \
15909 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
15910 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
15911 _(sr_tunnel_add_del, \
15912 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
15913 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
15914 "[policy <policy_name>]") \
15915 _(sr_policy_add_del, \
15916 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
15917 _(sr_multicast_map_add_del, \
15918 "address [ip6 multicast address] sr-policy [policy name] [del]") \
15919 _(classify_add_del_table, \
15920 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
15921 "[del] mask <mask-value>\n" \
15922 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
15923 _(classify_add_del_session, \
15924 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
15925 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
15926 " [l3 [ip4|ip6]]") \
15927 _(classify_set_interface_ip_table, \
15928 "<intfc> | sw_if_index <nn> table <nn>") \
15929 _(classify_set_interface_l2_tables, \
15930 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15931 " [other-table <nn>]") \
15932 _(get_node_index, "node <node-name") \
15933 _(add_node_next, "node <node-name> next <next-node-name>") \
15934 _(l2tpv3_create_tunnel, \
15935 "client_address <ip6-addr> our_address <ip6-addr>\n" \
15936 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
15937 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
15938 _(l2tpv3_set_tunnel_cookies, \
15939 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
15940 "[new_remote_cookie <nn>]\n") \
15941 _(l2tpv3_interface_enable_disable, \
15942 "<intfc> | sw_if_index <nn> enable | disable") \
15943 _(l2tpv3_set_lookup_key, \
15944 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
15945 _(sw_if_l2tpv3_tunnel_dump, "") \
15946 _(vxlan_add_del_tunnel, \
15947 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
15948 " [decap-next l2|ip4|ip6] [del]") \
15949 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15950 _(gre_add_del_tunnel, \
15951 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
15952 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15953 _(l2_fib_clear_table, "") \
15954 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
15955 _(l2_interface_vlan_tag_rewrite, \
15956 "<intfc> | sw_if_index <nn> \n" \
15957 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
15958 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
15959 _(create_vhost_user_if, \
15960 "socket <filename> [server] [renumber <dev_instance>] " \
15961 "[mac <mac_address>]") \
15962 _(modify_vhost_user_if, \
15963 "<intfc> | sw_if_index <nn> socket <filename>\n" \
15964 "[server] [renumber <dev_instance>]") \
15965 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
15966 _(sw_interface_vhost_user_dump, "") \
15967 _(show_version, "") \
15968 _(vxlan_gpe_add_del_tunnel, \
15969 "local <addr> remote <addr> vni <nn>\n" \
15970 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
15971 "[next-ethernet] [next-nsh]\n") \
15972 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15973 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
15974 _(interface_name_renumber, \
15975 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
15976 _(input_acl_set_interface, \
15977 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15978 " [l2-table <nn>] [del]") \
15979 _(want_ip4_arp_events, "address <ip4-address> [del]") \
15980 _(want_ip6_nd_events, "address <ip6-address> [del]") \
15981 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
15982 _(ip_dump, "ipv4 | ipv6") \
15983 _(ipsec_spd_add_del, "spd_id <n> [del]") \
15984 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
15986 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
15987 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
15988 " integ_alg <alg> integ_key <hex>") \
15989 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
15990 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
15991 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
15992 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
15993 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
15994 _(ikev2_profile_add_del, "name <profile_name> [del]") \
15995 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
15996 "(auth_data 0x<data> | auth_data <data>)") \
15997 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
15998 "(id_data 0x<data> | id_data <data>) (local|remote)") \
15999 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
16000 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
16001 "(local|remote)") \
16002 _(ikev2_set_local_key, "file <absolute_file_path>") \
16003 _(delete_loopback,"sw_if_index <nn>") \
16004 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
16005 _(map_add_domain, \
16006 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
16007 "ip6-src <ip6addr> " \
16008 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
16009 _(map_del_domain, "index <n>") \
16010 _(map_add_del_rule, \
16011 "index <n> psid <n> dst <ip6addr> [del]") \
16012 _(map_domain_dump, "") \
16013 _(map_rule_dump, "index <map-domain>") \
16014 _(want_interface_events, "enable|disable") \
16015 _(want_stats,"enable|disable") \
16016 _(get_first_msg_id, "client <name>") \
16017 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
16018 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
16019 "fib-id <nn> [ip4][ip6][default]") \
16020 _(get_node_graph, " ") \
16021 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
16022 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
16023 _(ioam_disable, "") \
16024 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
16025 " sw_if_index <sw_if_index> p <priority> " \
16026 "w <weight>] [del]") \
16027 _(lisp_add_del_locator, "locator-set <locator_name> " \
16028 "iface <intf> | sw_if_index <sw_if_index> " \
16029 "p <priority> w <weight> [del]") \
16030 _(lisp_add_del_local_eid,"vni <vni> eid " \
16031 "<ipv4|ipv6>/<prefix> | <L2 address> " \
16032 "locator-set <locator_name> [del]") \
16033 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
16034 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
16035 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
16036 _(lisp_gpe_enable_disable, "enable|disable") \
16037 _(lisp_enable_disable, "enable|disable") \
16038 _(lisp_gpe_add_del_iface, "up|down") \
16039 _(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> " \
16040 "rloc <locator> p <prio> " \
16041 "w <weight> [rloc <loc> ... ] " \
16042 "action <action> [del-all]") \
16043 _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
16044 "<src-eid> rloc <locator> p <prio> w <weight>"\
16045 "[rloc <loc> ... ] action <action>") \
16046 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
16047 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
16048 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
16049 _(lisp_locator_set_dump, "[locator-set-index <ls-index> | " \
16050 "locator-set <loc-set-name>] [local | remote]")\
16051 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
16052 "[local] | [remote]") \
16053 _(lisp_eid_table_vni_dump, "") \
16054 _(lisp_eid_table_map_dump, "l2|l3") \
16055 _(lisp_gpe_tunnel_dump, "") \
16056 _(lisp_map_resolver_dump, "") \
16057 _(show_lisp_status, "") \
16058 _(lisp_get_map_request_itr_rlocs, "") \
16059 _(show_lisp_pitr, "") \
16060 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
16061 _(af_packet_delete, "name <host interface name>") \
16062 _(policer_add_del, "name <policer name> <params> [del]") \
16063 _(policer_dump, "[name <policer name>]") \
16064 _(policer_classify_set_interface, \
16065 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16066 " [l2-table <nn>] [del]") \
16067 _(policer_classify_dump, "type [ip4|ip6|l2]") \
16068 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
16069 "[master|slave]") \
16070 _(netmap_delete, "name <interface name>") \
16071 _(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
16072 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
16073 _(mpls_fib_encap_dump, "") \
16074 _(mpls_fib_decap_dump, "") \
16075 _(classify_table_ids, "") \
16076 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
16077 _(classify_table_info, "table_id <nn>") \
16078 _(classify_session_dump, "table_id <nn>") \
16079 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
16080 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
16081 "[template_interval <nn>] [udp_checksum]") \
16082 _(ipfix_exporter_dump, "") \
16083 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
16084 _(ipfix_classify_stream_dump, "") \
16085 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]")\
16086 _(ipfix_classify_table_dump, "") \
16087 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
16088 _(pg_create_interface, "if_id <nn>") \
16089 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
16090 _(pg_enable_disable, "[stream <id>] disable") \
16091 _(ip_source_and_port_range_check_add_del, \
16092 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
16093 _(ip_source_and_port_range_check_interface_add_del, \
16094 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
16095 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
16096 _(ipsec_gre_add_del_tunnel, \
16097 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
16098 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
16099 _(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>")
16101 /* List of command functions, CLI names map directly to functions */
16102 #define foreach_cli_function \
16103 _(comment, "usage: comment <ignore-rest-of-line>") \
16104 _(dump_interface_table, "usage: dump_interface_table") \
16105 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
16106 _(dump_ipv4_table, "usage: dump_ipv4_table") \
16107 _(dump_ipv6_table, "usage: dump_ipv6_table") \
16108 _(dump_stats_table, "usage: dump_stats_table") \
16109 _(dump_macro_table, "usage: dump_macro_table ") \
16110 _(dump_node_table, "usage: dump_node_table") \
16111 _(echo, "usage: echo <message>") \
16112 _(exec, "usage: exec <vpe-debug-CLI-command>") \
16113 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
16114 _(help, "usage: help") \
16115 _(q, "usage: quit") \
16116 _(quit, "usage: quit") \
16117 _(search_node_table, "usage: search_node_table <name>...") \
16118 _(set, "usage: set <variable-name> <value>") \
16119 _(script, "usage: script <file-name>") \
16120 _(unset, "usage: unset <variable-name>")
16123 static void vl_api_##n##_t_handler_uni \
16124 (vl_api_##n##_t * mp) \
16126 vat_main_t * vam = &vat_main; \
16127 if (vam->json_output) { \
16128 vl_api_##n##_t_handler_json(mp); \
16130 vl_api_##n##_t_handler(mp); \
16133 foreach_vpe_api_reply_msg;
16137 vat_api_hookup (vat_main_t * vam)
16140 vl_msg_api_set_handlers(VL_API_##N, #n, \
16141 vl_api_##n##_t_handler_uni, \
16143 vl_api_##n##_t_endian, \
16144 vl_api_##n##_t_print, \
16145 sizeof(vl_api_##n##_t), 1);
16146 foreach_vpe_api_reply_msg;
16149 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
16151 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
16153 vam->function_by_name = hash_create_string (0, sizeof (uword));
16155 vam->help_by_name = hash_create_string (0, sizeof (uword));
16157 /* API messages we can send */
16158 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
16159 foreach_vpe_api_msg;
16163 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16164 foreach_vpe_api_msg;
16167 /* CLI functions */
16168 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
16169 foreach_cli_function;
16173 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16174 foreach_cli_function;
16178 #undef vl_api_version
16179 #define vl_api_version(n,v) static u32 vpe_api_version = v;
16180 #include <vpp-api/vpe.api.h>
16181 #undef vl_api_version
16184 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
16187 * Send the main API signature in slot 0. This bit of code must
16188 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16190 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
16194 * fd.io coding-style-patch-verification: ON
16197 * eval: (c-set-style "gnu")