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 event: address %U new mac %U sw_if_index %d\n",
1155 format_ip4_address, &mp->address,
1156 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1160 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1162 /* JSON output not supported */
1166 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1168 vat_main_t *vam = &vat_main;
1169 errmsg ("ip6 nd event: address %U new mac %U sw_if_index %d\n",
1170 format_ip6_address, mp->address,
1171 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1175 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1177 /* JSON output not supported */
1181 * Special-case: build the bridge domain table, maintain
1182 * the next bd id vbl.
1184 static void vl_api_bridge_domain_details_t_handler
1185 (vl_api_bridge_domain_details_t * mp)
1187 vat_main_t *vam = &vat_main;
1188 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1190 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1191 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1193 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1194 ntohl (mp->bd_id), mp->learn, mp->forward,
1195 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1198 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1202 static void vl_api_bridge_domain_details_t_handler_json
1203 (vl_api_bridge_domain_details_t * mp)
1205 vat_main_t *vam = &vat_main;
1206 vat_json_node_t *node, *array = NULL;
1208 if (VAT_JSON_ARRAY != vam->json_tree.type)
1210 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1211 vat_json_init_array (&vam->json_tree);
1213 node = vat_json_array_add (&vam->json_tree);
1215 vat_json_init_object (node);
1216 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1217 vat_json_object_add_uint (node, "flood", mp->flood);
1218 vat_json_object_add_uint (node, "forward", mp->forward);
1219 vat_json_object_add_uint (node, "learn", mp->learn);
1220 vat_json_object_add_uint (node, "bvi_sw_if_index",
1221 ntohl (mp->bvi_sw_if_index));
1222 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1223 array = vat_json_object_add (node, "sw_if");
1224 vat_json_init_array (array);
1228 * Special-case: build the bridge domain sw if table.
1230 static void vl_api_bridge_domain_sw_if_details_t_handler
1231 (vl_api_bridge_domain_sw_if_details_t * mp)
1233 vat_main_t *vam = &vat_main;
1238 sw_if_index = ntohl (mp->sw_if_index);
1240 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1242 if ((u32) p->value[0] == sw_if_index)
1244 sw_if_name = (u8 *)(p->key);
1250 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1251 mp->shg, sw_if_name ? (char *) sw_if_name :
1252 "sw_if_index not found!");
1255 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1256 (vl_api_bridge_domain_sw_if_details_t * mp)
1258 vat_main_t *vam = &vat_main;
1259 vat_json_node_t *node = NULL;
1260 uword last_index = 0;
1262 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1263 ASSERT (vec_len (vam->json_tree.array) >= 1);
1264 last_index = vec_len (vam->json_tree.array) - 1;
1265 node = &vam->json_tree.array[last_index];
1266 node = vat_json_object_get_element (node, "sw_if");
1267 ASSERT (NULL != node);
1268 node = vat_json_array_add (node);
1270 vat_json_init_object (node);
1271 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1272 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1273 vat_json_object_add_uint (node, "shg", mp->shg);
1276 static void vl_api_control_ping_reply_t_handler
1277 (vl_api_control_ping_reply_t * mp)
1279 vat_main_t *vam = &vat_main;
1280 i32 retval = ntohl (mp->retval);
1281 if (vam->async_mode)
1283 vam->async_errors += (retval < 0);
1287 vam->retval = retval;
1288 vam->result_ready = 1;
1292 static void vl_api_control_ping_reply_t_handler_json
1293 (vl_api_control_ping_reply_t * mp)
1295 vat_main_t *vam = &vat_main;
1296 i32 retval = ntohl (mp->retval);
1298 if (VAT_JSON_NONE != vam->json_tree.type)
1300 vat_json_print (vam->ofp, &vam->json_tree);
1301 vat_json_free (&vam->json_tree);
1302 vam->json_tree.type = VAT_JSON_NONE;
1307 vat_json_init_array (&vam->json_tree);
1308 vat_json_print (vam->ofp, &vam->json_tree);
1309 vam->json_tree.type = VAT_JSON_NONE;
1312 vam->retval = retval;
1313 vam->result_ready = 1;
1316 static void vl_api_noprint_control_ping_reply_t_handler
1317 (vl_api_noprint_control_ping_reply_t * mp)
1319 vat_main_t *vam = &vat_main;
1320 i32 retval = ntohl (mp->retval);
1321 if (vam->async_mode)
1323 vam->async_errors += (retval < 0);
1327 vam->retval = retval;
1328 vam->result_ready = 1;
1332 static void vl_api_noprint_control_ping_reply_t_handler_json
1333 (vl_api_noprint_control_ping_reply_t * mp)
1335 vat_main_t *vam = &vat_main;
1336 i32 retval = ntohl (mp->retval);
1338 if (vam->noprint_msg)
1340 vam->retval = retval;
1341 vam->result_ready = 1;
1345 if (VAT_JSON_NONE != vam->json_tree.type)
1347 vat_json_print (vam->ofp, &vam->json_tree);
1348 vat_json_free (&vam->json_tree);
1349 vam->json_tree.type = VAT_JSON_NONE;
1354 vat_json_init_array (&vam->json_tree);
1355 vat_json_print (vam->ofp, &vam->json_tree);
1356 vam->json_tree.type = VAT_JSON_NONE;
1359 vam->retval = retval;
1360 vam->result_ready = 1;
1364 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1366 vat_main_t *vam = &vat_main;
1367 i32 retval = ntohl (mp->retval);
1368 if (vam->async_mode)
1370 vam->async_errors += (retval < 0);
1374 vam->retval = retval;
1375 vam->result_ready = 1;
1379 static void vl_api_l2_flags_reply_t_handler_json
1380 (vl_api_l2_flags_reply_t * mp)
1382 vat_main_t *vam = &vat_main;
1383 vat_json_node_t node;
1385 vat_json_init_object (&node);
1386 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1387 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1388 ntohl (mp->resulting_feature_bitmap));
1390 vat_json_print (vam->ofp, &node);
1391 vat_json_free (&node);
1393 vam->retval = ntohl (mp->retval);
1394 vam->result_ready = 1;
1397 static void vl_api_bridge_flags_reply_t_handler
1398 (vl_api_bridge_flags_reply_t * mp)
1400 vat_main_t *vam = &vat_main;
1401 i32 retval = ntohl (mp->retval);
1402 if (vam->async_mode)
1404 vam->async_errors += (retval < 0);
1408 vam->retval = retval;
1409 vam->result_ready = 1;
1413 static void vl_api_bridge_flags_reply_t_handler_json
1414 (vl_api_bridge_flags_reply_t * mp)
1416 vat_main_t *vam = &vat_main;
1417 vat_json_node_t node;
1419 vat_json_init_object (&node);
1420 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1421 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1422 ntohl (mp->resulting_feature_bitmap));
1424 vat_json_print (vam->ofp, &node);
1425 vat_json_free (&node);
1427 vam->retval = ntohl (mp->retval);
1428 vam->result_ready = 1;
1431 static void vl_api_tap_connect_reply_t_handler
1432 (vl_api_tap_connect_reply_t * mp)
1434 vat_main_t *vam = &vat_main;
1435 i32 retval = ntohl (mp->retval);
1436 if (vam->async_mode)
1438 vam->async_errors += (retval < 0);
1442 vam->retval = retval;
1443 vam->sw_if_index = ntohl (mp->sw_if_index);
1444 vam->result_ready = 1;
1449 static void vl_api_tap_connect_reply_t_handler_json
1450 (vl_api_tap_connect_reply_t * mp)
1452 vat_main_t *vam = &vat_main;
1453 vat_json_node_t node;
1455 vat_json_init_object (&node);
1456 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1457 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1459 vat_json_print (vam->ofp, &node);
1460 vat_json_free (&node);
1462 vam->retval = ntohl (mp->retval);
1463 vam->result_ready = 1;
1468 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1470 vat_main_t *vam = &vat_main;
1471 i32 retval = ntohl (mp->retval);
1472 if (vam->async_mode)
1474 vam->async_errors += (retval < 0);
1478 vam->retval = retval;
1479 vam->sw_if_index = ntohl (mp->sw_if_index);
1480 vam->result_ready = 1;
1484 static void vl_api_tap_modify_reply_t_handler_json
1485 (vl_api_tap_modify_reply_t * mp)
1487 vat_main_t *vam = &vat_main;
1488 vat_json_node_t node;
1490 vat_json_init_object (&node);
1491 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1492 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1494 vat_json_print (vam->ofp, &node);
1495 vat_json_free (&node);
1497 vam->retval = ntohl (mp->retval);
1498 vam->result_ready = 1;
1502 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1504 vat_main_t *vam = &vat_main;
1505 i32 retval = ntohl (mp->retval);
1506 if (vam->async_mode)
1508 vam->async_errors += (retval < 0);
1512 vam->retval = retval;
1513 vam->result_ready = 1;
1517 static void vl_api_tap_delete_reply_t_handler_json
1518 (vl_api_tap_delete_reply_t * mp)
1520 vat_main_t *vam = &vat_main;
1521 vat_json_node_t node;
1523 vat_json_init_object (&node);
1524 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1526 vat_json_print (vam->ofp, &node);
1527 vat_json_free (&node);
1529 vam->retval = ntohl (mp->retval);
1530 vam->result_ready = 1;
1533 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1534 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1536 vat_main_t *vam = &vat_main;
1537 i32 retval = ntohl (mp->retval);
1538 if (vam->async_mode)
1540 vam->async_errors += (retval < 0);
1544 vam->retval = retval;
1545 vam->result_ready = 1;
1549 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1550 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1552 vat_main_t *vam = &vat_main;
1553 vat_json_node_t node;
1555 vat_json_init_object (&node);
1556 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1557 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1558 ntohl (mp->tunnel_sw_if_index));
1560 vat_json_print (vam->ofp, &node);
1561 vat_json_free (&node);
1563 vam->retval = ntohl (mp->retval);
1564 vam->result_ready = 1;
1567 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1568 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1570 vat_main_t *vam = &vat_main;
1571 i32 retval = ntohl (mp->retval);
1572 if (vam->async_mode)
1574 vam->async_errors += (retval < 0);
1578 vam->retval = retval;
1579 vam->sw_if_index = ntohl (mp->sw_if_index);
1580 vam->result_ready = 1;
1584 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1585 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1587 vat_main_t *vam = &vat_main;
1588 vat_json_node_t node;
1590 vat_json_init_object (&node);
1591 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1592 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1594 vat_json_print (vam->ofp, &node);
1595 vat_json_free (&node);
1597 vam->retval = ntohl (mp->retval);
1598 vam->result_ready = 1;
1602 static void vl_api_lisp_add_del_locator_set_reply_t_handler
1603 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1605 vat_main_t *vam = &vat_main;
1606 i32 retval = ntohl (mp->retval);
1607 if (vam->async_mode)
1609 vam->async_errors += (retval < 0);
1613 vam->retval = retval;
1614 vam->result_ready = 1;
1618 static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1619 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1621 vat_main_t *vam = &vat_main;
1622 vat_json_node_t node;
1624 vat_json_init_object (&node);
1625 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1626 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1628 vat_json_print (vam->ofp, &node);
1629 vat_json_free (&node);
1631 vam->retval = ntohl (mp->retval);
1632 vam->result_ready = 1;
1635 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1636 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1638 vat_main_t *vam = &vat_main;
1639 i32 retval = ntohl (mp->retval);
1640 if (vam->async_mode)
1642 vam->async_errors += (retval < 0);
1646 vam->retval = retval;
1647 vam->sw_if_index = ntohl (mp->sw_if_index);
1648 vam->result_ready = 1;
1652 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1653 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1655 vat_main_t *vam = &vat_main;
1656 vat_json_node_t node;
1658 vat_json_init_object (&node);
1659 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1660 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1662 vat_json_print (vam->ofp, &node);
1663 vat_json_free (&node);
1665 vam->retval = ntohl (mp->retval);
1666 vam->result_ready = 1;
1669 static void vl_api_gre_add_del_tunnel_reply_t_handler
1670 (vl_api_gre_add_del_tunnel_reply_t * mp)
1672 vat_main_t *vam = &vat_main;
1673 i32 retval = ntohl (mp->retval);
1674 if (vam->async_mode)
1676 vam->async_errors += (retval < 0);
1680 vam->retval = retval;
1681 vam->sw_if_index = ntohl (mp->sw_if_index);
1682 vam->result_ready = 1;
1686 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1687 (vl_api_gre_add_del_tunnel_reply_t * mp)
1689 vat_main_t *vam = &vat_main;
1690 vat_json_node_t node;
1692 vat_json_init_object (&node);
1693 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1694 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1696 vat_json_print (vam->ofp, &node);
1697 vat_json_free (&node);
1699 vam->retval = ntohl (mp->retval);
1700 vam->result_ready = 1;
1703 static void vl_api_create_vhost_user_if_reply_t_handler
1704 (vl_api_create_vhost_user_if_reply_t * mp)
1706 vat_main_t *vam = &vat_main;
1707 i32 retval = ntohl (mp->retval);
1708 if (vam->async_mode)
1710 vam->async_errors += (retval < 0);
1714 vam->retval = retval;
1715 vam->sw_if_index = ntohl (mp->sw_if_index);
1716 vam->result_ready = 1;
1720 static void vl_api_create_vhost_user_if_reply_t_handler_json
1721 (vl_api_create_vhost_user_if_reply_t * mp)
1723 vat_main_t *vam = &vat_main;
1724 vat_json_node_t node;
1726 vat_json_init_object (&node);
1727 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1728 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1730 vat_json_print (vam->ofp, &node);
1731 vat_json_free (&node);
1733 vam->retval = ntohl (mp->retval);
1734 vam->result_ready = 1;
1737 static void vl_api_ip_address_details_t_handler
1738 (vl_api_ip_address_details_t * mp)
1740 vat_main_t *vam = &vat_main;
1741 static ip_address_details_t empty_ip_address_details = { {0} };
1742 ip_address_details_t *address = NULL;
1743 ip_details_t *current_ip_details = NULL;
1744 ip_details_t *details = NULL;
1746 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1748 if (!details || vam->current_sw_if_index >= vec_len (details)
1749 || !details[vam->current_sw_if_index].present)
1751 errmsg ("ip address details arrived but not stored\n");
1752 errmsg ("ip_dump should be called first\n");
1756 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1758 #define addresses (current_ip_details->addr)
1760 vec_validate_init_empty (addresses, vec_len (addresses),
1761 empty_ip_address_details);
1763 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1765 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1766 address->prefix_length = mp->prefix_length;
1770 static void vl_api_ip_address_details_t_handler_json
1771 (vl_api_ip_address_details_t * mp)
1773 vat_main_t *vam = &vat_main;
1774 vat_json_node_t *node = NULL;
1775 struct in6_addr ip6;
1778 if (VAT_JSON_ARRAY != vam->json_tree.type)
1780 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1781 vat_json_init_array (&vam->json_tree);
1783 node = vat_json_array_add (&vam->json_tree);
1785 vat_json_init_object (node);
1788 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1789 vat_json_object_add_ip6 (node, "ip", ip6);
1793 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1794 vat_json_object_add_ip4 (node, "ip", ip4);
1796 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1800 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1802 vat_main_t *vam = &vat_main;
1803 static ip_details_t empty_ip_details = { 0 };
1804 ip_details_t *ip = NULL;
1805 u32 sw_if_index = ~0;
1807 sw_if_index = ntohl (mp->sw_if_index);
1809 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1810 sw_if_index, empty_ip_details);
1812 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1819 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1821 vat_main_t *vam = &vat_main;
1823 if (VAT_JSON_ARRAY != vam->json_tree.type)
1825 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1826 vat_json_init_array (&vam->json_tree);
1828 vat_json_array_add_uint (&vam->json_tree,
1829 clib_net_to_host_u32 (mp->sw_if_index));
1832 static void vl_api_map_domain_details_t_handler_json
1833 (vl_api_map_domain_details_t * mp)
1835 vat_json_node_t *node = NULL;
1836 vat_main_t *vam = &vat_main;
1837 struct in6_addr ip6;
1840 if (VAT_JSON_ARRAY != vam->json_tree.type)
1842 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1843 vat_json_init_array (&vam->json_tree);
1846 node = vat_json_array_add (&vam->json_tree);
1847 vat_json_init_object (node);
1849 vat_json_object_add_uint (node, "domain_index",
1850 clib_net_to_host_u32 (mp->domain_index));
1851 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1852 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1853 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1854 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1855 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1856 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1857 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1858 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1859 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1860 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1861 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1862 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1863 vat_json_object_add_uint (node, "flags", mp->flags);
1864 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1865 vat_json_object_add_int (node, "is_translation", mp->is_translation);
1868 static void vl_api_map_domain_details_t_handler
1869 (vl_api_map_domain_details_t * mp)
1871 vat_main_t *vam = &vat_main;
1873 if (mp->is_translation)
1876 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1877 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1878 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1879 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1880 clib_net_to_host_u32 (mp->domain_index));
1885 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1886 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1887 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1888 format_ip6_address, mp->ip6_src,
1889 clib_net_to_host_u32 (mp->domain_index));
1891 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1892 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1893 mp->is_translation ? "map-t" : "");
1896 static void vl_api_map_rule_details_t_handler_json
1897 (vl_api_map_rule_details_t * mp)
1899 struct in6_addr ip6;
1900 vat_json_node_t *node = NULL;
1901 vat_main_t *vam = &vat_main;
1903 if (VAT_JSON_ARRAY != vam->json_tree.type)
1905 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1906 vat_json_init_array (&vam->json_tree);
1909 node = vat_json_array_add (&vam->json_tree);
1910 vat_json_init_object (node);
1912 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
1913 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1914 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
1918 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
1920 vat_main_t *vam = &vat_main;
1921 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1922 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
1926 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
1928 vat_main_t *vam = &vat_main;
1929 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1930 "router_addr %U host_mac %U\n",
1931 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1932 format_ip4_address, &mp->host_address,
1933 format_ip4_address, &mp->router_address,
1934 format_ethernet_address, mp->host_mac);
1937 static void vl_api_dhcp_compl_event_t_handler_json
1938 (vl_api_dhcp_compl_event_t * mp)
1940 /* JSON output not supported */
1944 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1947 vat_main_t *vam = &vat_main;
1948 static u64 default_counter = 0;
1950 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1952 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1953 sw_if_index, default_counter);
1954 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1958 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1959 interface_counter_t counter)
1961 vat_main_t *vam = &vat_main;
1962 static interface_counter_t default_counter = { 0, };
1964 vec_validate_init_empty (vam->combined_interface_counters,
1965 vnet_counter_type, NULL);
1966 vec_validate_init_empty (vam->combined_interface_counters
1967 [vnet_counter_type], sw_if_index, default_counter);
1968 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1971 static void vl_api_vnet_interface_counters_t_handler
1972 (vl_api_vnet_interface_counters_t * mp)
1977 static void vl_api_vnet_interface_counters_t_handler_json
1978 (vl_api_vnet_interface_counters_t * mp)
1980 interface_counter_t counter;
1985 u32 first_sw_if_index;
1988 count = ntohl (mp->count);
1989 first_sw_if_index = ntohl (mp->first_sw_if_index);
1991 if (!mp->is_combined)
1993 v_packets = (u64 *) & mp->data;
1994 for (i = 0; i < count; i++)
1997 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
1998 set_simple_interface_counter (mp->vnet_counter_type,
1999 first_sw_if_index + i, packets);
2005 v = (vlib_counter_t *) & mp->data;
2006 for (i = 0; i < count; i++)
2009 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
2011 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
2012 set_combined_interface_counter (mp->vnet_counter_type,
2013 first_sw_if_index + i, counter);
2020 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2022 vat_main_t *vam = &vat_main;
2025 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
2027 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
2036 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2038 vat_main_t *vam = &vat_main;
2041 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2043 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2051 static void vl_api_vnet_ip4_fib_counters_t_handler
2052 (vl_api_vnet_ip4_fib_counters_t * mp)
2057 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2058 (vl_api_vnet_ip4_fib_counters_t * mp)
2060 vat_main_t *vam = &vat_main;
2061 vl_api_ip4_fib_counter_t *v;
2062 ip4_fib_counter_t *counter;
2069 vrf_id = ntohl (mp->vrf_id);
2070 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2071 if (~0 == vrf_index)
2073 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2074 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2075 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2076 vec_validate (vam->ip4_fib_counters, vrf_index);
2077 vam->ip4_fib_counters[vrf_index] = NULL;
2080 vec_free (vam->ip4_fib_counters[vrf_index]);
2081 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2082 count = ntohl (mp->count);
2083 for (i = 0; i < count; i++)
2085 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2086 counter = &vam->ip4_fib_counters[vrf_index][i];
2087 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2088 counter->address = ip4;
2089 counter->address_length = v->address_length;
2090 counter->packets = clib_net_to_host_u64 (v->packets);
2091 counter->bytes = clib_net_to_host_u64 (v->bytes);
2096 static void vl_api_vnet_ip6_fib_counters_t_handler
2097 (vl_api_vnet_ip6_fib_counters_t * mp)
2102 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2103 (vl_api_vnet_ip6_fib_counters_t * mp)
2105 vat_main_t *vam = &vat_main;
2106 vl_api_ip6_fib_counter_t *v;
2107 ip6_fib_counter_t *counter;
2108 struct in6_addr ip6;
2114 vrf_id = ntohl (mp->vrf_id);
2115 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2116 if (~0 == vrf_index)
2118 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2119 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2120 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2121 vec_validate (vam->ip6_fib_counters, vrf_index);
2122 vam->ip6_fib_counters[vrf_index] = NULL;
2125 vec_free (vam->ip6_fib_counters[vrf_index]);
2126 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2127 count = ntohl (mp->count);
2128 for (i = 0; i < count; i++)
2130 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2131 counter = &vam->ip6_fib_counters[vrf_index][i];
2132 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2133 counter->address = ip6;
2134 counter->address_length = v->address_length;
2135 counter->packets = clib_net_to_host_u64 (v->packets);
2136 counter->bytes = clib_net_to_host_u64 (v->bytes);
2141 static void vl_api_get_first_msg_id_reply_t_handler
2142 (vl_api_get_first_msg_id_reply_t * mp)
2144 vat_main_t *vam = &vat_main;
2145 i32 retval = ntohl (mp->retval);
2147 if (vam->async_mode)
2149 vam->async_errors += (retval < 0);
2153 vam->retval = retval;
2154 vam->result_ready = 1;
2158 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
2162 static void vl_api_get_first_msg_id_reply_t_handler_json
2163 (vl_api_get_first_msg_id_reply_t * mp)
2165 vat_main_t *vam = &vat_main;
2166 vat_json_node_t node;
2168 vat_json_init_object (&node);
2169 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2170 vat_json_object_add_uint (&node, "first_msg_id",
2171 (uint) ntohs (mp->first_msg_id));
2173 vat_json_print (vam->ofp, &node);
2174 vat_json_free (&node);
2176 vam->retval = ntohl (mp->retval);
2177 vam->result_ready = 1;
2180 static void vl_api_get_node_graph_reply_t_handler
2181 (vl_api_get_node_graph_reply_t * mp)
2183 vat_main_t *vam = &vat_main;
2184 api_main_t *am = &api_main;
2185 i32 retval = ntohl (mp->retval);
2186 u8 *pvt_copy, *reply;
2191 if (vam->async_mode)
2193 vam->async_errors += (retval < 0);
2197 vam->retval = retval;
2198 vam->result_ready = 1;
2201 /* "Should never happen..." */
2205 reply = (u8 *) (mp->reply_in_shmem);
2206 pvt_copy = vec_dup (reply);
2208 /* Toss the shared-memory original... */
2209 pthread_mutex_lock (&am->vlib_rp->mutex);
2210 oldheap = svm_push_data_heap (am->vlib_rp);
2214 svm_pop_heap (oldheap);
2215 pthread_mutex_unlock (&am->vlib_rp->mutex);
2217 if (vam->graph_nodes)
2219 hash_free (vam->graph_node_index_by_name);
2221 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2223 node = vam->graph_nodes[i];
2224 vec_free (node->name);
2225 vec_free (node->next_nodes);
2228 vec_free (vam->graph_nodes);
2231 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2232 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2233 vec_free (pvt_copy);
2235 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2237 node = vam->graph_nodes[i];
2238 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2242 static void vl_api_get_node_graph_reply_t_handler_json
2243 (vl_api_get_node_graph_reply_t * mp)
2245 vat_main_t *vam = &vat_main;
2246 api_main_t *am = &api_main;
2248 vat_json_node_t node;
2251 /* $$$$ make this real? */
2252 vat_json_init_object (&node);
2253 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2254 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2256 reply = (u8 *) (mp->reply_in_shmem);
2258 /* Toss the shared-memory original... */
2259 pthread_mutex_lock (&am->vlib_rp->mutex);
2260 oldheap = svm_push_data_heap (am->vlib_rp);
2264 svm_pop_heap (oldheap);
2265 pthread_mutex_unlock (&am->vlib_rp->mutex);
2267 vat_json_print (vam->ofp, &node);
2268 vat_json_free (&node);
2270 vam->retval = ntohl (mp->retval);
2271 vam->result_ready = 1;
2275 vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
2277 vat_main_t *vam = &vat_main;
2281 memset (&loc, 0, sizeof (loc));
2282 if (vam->noprint_msg)
2284 loc.local = mp->local;
2285 loc.priority = mp->priority;
2286 loc.weight = mp->weight;
2289 loc.sw_if_index = ntohl (mp->sw_if_index);
2293 loc.is_ipv6 = mp->is_ipv6;
2294 clib_memcpy (loc.ip_address, mp->ip_address,
2295 sizeof (loc.ip_address));
2297 vec_add1 (vam->locator_msg, loc);
2303 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
2304 ntohl (mp->sw_if_index),
2305 mp->priority, mp->weight);
2309 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
2310 mp->is_ipv6 ? format_ip6_address :
2312 mp->ip_address, mp->priority, mp->weight);
2315 fformat (vam->ofp, "%s", tmp_str);
2322 vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2325 vat_main_t *vam = &vat_main;
2326 vat_json_node_t *node = NULL;
2328 struct in6_addr ip6;
2331 memset (&loc, 0, sizeof (loc));
2332 if (vam->noprint_msg)
2334 loc.local = mp->local;
2335 loc.priority = mp->priority;
2336 loc.weight = mp->weight;
2339 loc.sw_if_index = ntohl (mp->sw_if_index);
2343 loc.is_ipv6 = mp->is_ipv6;
2344 clib_memcpy (loc.ip_address, mp->ip_address,
2345 sizeof (loc.ip_address));
2347 vec_add1 (vam->locator_msg, loc);
2351 if (VAT_JSON_ARRAY != vam->json_tree.type)
2353 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2354 vat_json_init_array (&vam->json_tree);
2356 node = vat_json_array_add (&vam->json_tree);
2358 vat_json_init_object (node);
2362 vat_json_object_add_uint (node, "locator_index",
2363 ntohl (mp->sw_if_index));
2369 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2370 vat_json_object_add_ip6 (node, "locator", ip6);
2374 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2375 vat_json_object_add_ip4 (node, "locator", ip4);
2378 vat_json_object_add_uint (node, "priority", mp->priority);
2379 vat_json_object_add_uint (node, "weight", mp->weight);
2383 vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2386 vat_main_t *vam = &vat_main;
2387 locator_set_msg_t ls;
2389 ls.locator_set_index = ntohl (mp->locator_set_index);
2390 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2391 vec_add1 (vam->locator_set_msg, ls);
2395 vl_api_lisp_locator_set_details_t_handler_json
2396 (vl_api_lisp_locator_set_details_t * mp)
2398 vat_main_t *vam = &vat_main;
2399 locator_set_msg_t ls;
2401 ls.locator_set_index = ntohl (mp->locator_set_index);
2402 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2403 vec_add1 (vam->locator_set_msg, ls);
2407 add_lisp_eid_table_entry (vat_main_t * vam,
2408 vl_api_lisp_eid_table_details_t * mp)
2410 eid_table_t eid_table;
2412 memset (&eid_table, 0, sizeof (eid_table));
2413 eid_table.is_local = mp->is_local;
2414 eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index);
2415 eid_table.eid_type = mp->eid_type;
2416 eid_table.vni = clib_net_to_host_u32 (mp->vni);
2417 eid_table.eid_prefix_len = mp->eid_prefix_len;
2418 eid_table.ttl = clib_net_to_host_u32 (mp->ttl);
2419 eid_table.action = mp->action;
2420 eid_table.authoritative = mp->authoritative;
2421 clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
2422 vec_add1 (vam->eid_tables, eid_table);
2426 vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2428 vat_main_t *vam = &vat_main;
2429 add_lisp_eid_table_entry (vam, mp);
2433 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2436 vat_main_t *vam = &vat_main;
2437 add_lisp_eid_table_entry (vam, mp);
2441 vl_api_lisp_eid_table_map_details_t_handler
2442 (vl_api_lisp_eid_table_map_details_t * mp)
2444 vat_main_t *vam = &vat_main;
2446 u8 *line = format (0, "%=10d%=10d",
2447 clib_net_to_host_u32 (mp->vni),
2448 clib_net_to_host_u32 (mp->dp_table));
2449 fformat (vam->ofp, "%v\n", line);
2454 vl_api_lisp_eid_table_map_details_t_handler_json
2455 (vl_api_lisp_eid_table_map_details_t * mp)
2457 vat_main_t *vam = &vat_main;
2458 vat_json_node_t *node = NULL;
2460 if (VAT_JSON_ARRAY != vam->json_tree.type)
2462 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2463 vat_json_init_array (&vam->json_tree);
2465 node = vat_json_array_add (&vam->json_tree);
2466 vat_json_init_object (node);
2467 vat_json_object_add_uint (node, "dp_table",
2468 clib_net_to_host_u32 (mp->dp_table));
2469 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2473 vl_api_lisp_eid_table_vni_details_t_handler
2474 (vl_api_lisp_eid_table_vni_details_t * mp)
2476 vat_main_t *vam = &vat_main;
2478 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2479 fformat (vam->ofp, "%v\n", line);
2484 vl_api_lisp_eid_table_vni_details_t_handler_json
2485 (vl_api_lisp_eid_table_vni_details_t * mp)
2487 vat_main_t *vam = &vat_main;
2488 vat_json_node_t *node = NULL;
2490 if (VAT_JSON_ARRAY != vam->json_tree.type)
2492 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2493 vat_json_init_array (&vam->json_tree);
2495 node = vat_json_array_add (&vam->json_tree);
2496 vat_json_init_object (node);
2497 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2501 format_decap_next (u8 * s, va_list * args)
2503 u32 next_index = va_arg (*args, u32);
2507 case LISP_GPE_INPUT_NEXT_DROP:
2508 return format (s, "drop");
2509 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2510 return format (s, "ip4");
2511 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2512 return format (s, "ip6");
2514 return format (s, "unknown %d", next_index);
2520 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2523 vat_main_t *vam = &vat_main;
2525 u8 *flag_str = NULL;
2527 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
2529 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2530 foreach_lisp_gpe_flag_bit;
2533 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2534 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2536 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2538 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2540 ntohl (mp->encap_fib_id),
2541 ntohl (mp->decap_fib_id),
2542 format_decap_next, ntohl (mp->dcap_next),
2544 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
2550 vl_api_lisp_gpe_tunnel_details_t_handler_json
2551 (vl_api_lisp_gpe_tunnel_details_t * mp)
2553 vat_main_t *vam = &vat_main;
2554 vat_json_node_t *node = NULL;
2555 struct in6_addr ip6;
2559 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
2561 if (VAT_JSON_ARRAY != vam->json_tree.type)
2563 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2564 vat_json_init_array (&vam->json_tree);
2566 node = vat_json_array_add (&vam->json_tree);
2568 vat_json_init_object (node);
2569 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2572 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2573 vat_json_object_add_ip6 (node, "source address", ip6);
2574 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2575 vat_json_object_add_ip6 (node, "destination address", ip6);
2579 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2580 vat_json_object_add_ip4 (node, "source address", ip4);
2581 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2582 vat_json_object_add_ip4 (node, "destination address", ip4);
2584 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2585 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2586 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2587 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2588 vat_json_object_add_uint (node, "flags", mp->flags);
2589 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2590 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2591 vat_json_object_add_uint (node, "res", mp->res);
2592 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
2594 vec_free (next_decap_str);
2598 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2601 vat_main_t *vam = &vat_main;
2603 fformat (vam->ofp, "%=20U\n",
2604 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2609 vl_api_lisp_map_resolver_details_t_handler_json
2610 (vl_api_lisp_map_resolver_details_t * mp)
2612 vat_main_t *vam = &vat_main;
2613 vat_json_node_t *node = NULL;
2614 struct in6_addr ip6;
2617 if (VAT_JSON_ARRAY != vam->json_tree.type)
2619 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2620 vat_json_init_array (&vam->json_tree);
2622 node = vat_json_array_add (&vam->json_tree);
2624 vat_json_init_object (node);
2627 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2628 vat_json_object_add_ip6 (node, "map resolver", ip6);
2632 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2633 vat_json_object_add_ip4 (node, "map resolver", ip4);
2638 vl_api_show_lisp_status_reply_t_handler
2639 (vl_api_show_lisp_status_reply_t * mp)
2641 vat_main_t *vam = &vat_main;
2642 i32 retval = ntohl (mp->retval);
2646 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2647 mp->feature_status ? "enabled" : "disabled",
2648 mp->gpe_status ? "enabled" : "disabled");
2651 vam->retval = retval;
2652 vam->result_ready = 1;
2656 vl_api_show_lisp_status_reply_t_handler_json
2657 (vl_api_show_lisp_status_reply_t * mp)
2659 vat_main_t *vam = &vat_main;
2660 vat_json_node_t node;
2661 u8 *gpe_status = NULL;
2662 u8 *feature_status = NULL;
2664 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2665 feature_status = format (0, "%s",
2666 mp->feature_status ? "enabled" : "disabled");
2667 vec_add1 (gpe_status, 0);
2668 vec_add1 (feature_status, 0);
2670 vat_json_init_object (&node);
2671 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2672 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
2674 vec_free (gpe_status);
2675 vec_free (feature_status);
2677 vat_json_print (vam->ofp, &node);
2678 vat_json_free (&node);
2680 vam->retval = ntohl (mp->retval);
2681 vam->result_ready = 1;
2685 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2686 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2688 vat_main_t *vam = &vat_main;
2689 i32 retval = ntohl (mp->retval);
2693 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
2696 vam->retval = retval;
2697 vam->result_ready = 1;
2701 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2702 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2704 vat_main_t *vam = &vat_main;
2705 vat_json_node_t *node = NULL;
2707 if (VAT_JSON_ARRAY != vam->json_tree.type)
2709 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2710 vat_json_init_array (&vam->json_tree);
2712 node = vat_json_array_add (&vam->json_tree);
2714 vat_json_init_object (node);
2715 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
2717 vat_json_print (vam->ofp, node);
2718 vat_json_free (node);
2720 vam->retval = ntohl (mp->retval);
2721 vam->result_ready = 1;
2725 vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2727 vat_main_t *vam = &vat_main;
2728 i32 retval = ntohl (mp->retval);
2732 fformat (vam->ofp, "%-20s%-16s\n",
2733 mp->status ? "enabled" : "disabled",
2734 mp->status ? (char *) mp->locator_set_name : "");
2737 vam->retval = retval;
2738 vam->result_ready = 1;
2742 vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2745 vat_main_t *vam = &vat_main;
2746 vat_json_node_t node;
2749 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2750 vec_add1 (status, 0);
2752 vat_json_init_object (&node);
2753 vat_json_object_add_string_copy (&node, "status", status);
2756 vat_json_object_add_string_copy (&node, "locator_set",
2757 mp->locator_set_name);
2762 vat_json_print (vam->ofp, &node);
2763 vat_json_free (&node);
2765 vam->retval = ntohl (mp->retval);
2766 vam->result_ready = 1;
2770 format_policer_type (u8 * s, va_list * va)
2772 u32 i = va_arg (*va, u32);
2774 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2775 s = format (s, "1r2c");
2776 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2777 s = format (s, "1r3c");
2778 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2779 s = format (s, "2r3c-2698");
2780 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2781 s = format (s, "2r3c-4115");
2782 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2783 s = format (s, "2r3c-mef5cf1");
2785 s = format (s, "ILLEGAL");
2790 format_policer_rate_type (u8 * s, va_list * va)
2792 u32 i = va_arg (*va, u32);
2794 if (i == SSE2_QOS_RATE_KBPS)
2795 s = format (s, "kbps");
2796 else if (i == SSE2_QOS_RATE_PPS)
2797 s = format (s, "pps");
2799 s = format (s, "ILLEGAL");
2804 format_policer_round_type (u8 * s, va_list * va)
2806 u32 i = va_arg (*va, u32);
2808 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2809 s = format (s, "closest");
2810 else if (i == SSE2_QOS_ROUND_TO_UP)
2811 s = format (s, "up");
2812 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2813 s = format (s, "down");
2815 s = format (s, "ILLEGAL");
2820 format_policer_action_type (u8 * s, va_list * va)
2822 u32 i = va_arg (*va, u32);
2824 if (i == SSE2_QOS_ACTION_DROP)
2825 s = format (s, "drop");
2826 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2827 s = format (s, "transmit");
2828 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2829 s = format (s, "mark-and-transmit");
2831 s = format (s, "ILLEGAL");
2836 format_dscp (u8 * s, va_list * va)
2838 u32 i = va_arg (*va, u32);
2843 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2847 return format (s, "ILLEGAL");
2849 s = format (s, "%s", t);
2854 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
2856 vat_main_t *vam = &vat_main;
2857 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
2859 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2860 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2862 conform_dscp_str = format (0, "");
2864 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2865 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2867 exceed_dscp_str = format (0, "");
2869 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2870 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2872 violate_dscp_str = format (0, "");
2874 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2875 "rate type %U, round type %U, %s rate, %s color-aware, "
2876 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2877 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2878 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2880 format_policer_type, mp->type,
2883 clib_net_to_host_u64 (mp->cb),
2884 clib_net_to_host_u64 (mp->eb),
2885 format_policer_rate_type, mp->rate_type,
2886 format_policer_round_type, mp->round_type,
2887 mp->single_rate ? "single" : "dual",
2888 mp->color_aware ? "is" : "not",
2889 ntohl (mp->cir_tokens_per_period),
2890 ntohl (mp->pir_tokens_per_period),
2892 ntohl (mp->current_limit),
2893 ntohl (mp->current_bucket),
2894 ntohl (mp->extended_limit),
2895 ntohl (mp->extended_bucket),
2896 clib_net_to_host_u64 (mp->last_update_time),
2897 format_policer_action_type, mp->conform_action_type,
2899 format_policer_action_type, mp->exceed_action_type,
2901 format_policer_action_type, mp->violate_action_type,
2904 vec_free (conform_dscp_str);
2905 vec_free (exceed_dscp_str);
2906 vec_free (violate_dscp_str);
2909 static void vl_api_policer_details_t_handler_json
2910 (vl_api_policer_details_t * mp)
2912 vat_main_t *vam = &vat_main;
2913 vat_json_node_t *node;
2914 u8 *rate_type_str, *round_type_str, *type_str;
2915 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
2917 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
2919 format (0, "%U", format_policer_round_type, mp->round_type);
2920 type_str = format (0, "%U", format_policer_type, mp->type);
2921 conform_action_str = format (0, "%U", format_policer_action_type,
2922 mp->conform_action_type);
2923 exceed_action_str = format (0, "%U", format_policer_action_type,
2924 mp->exceed_action_type);
2925 violate_action_str = format (0, "%U", format_policer_action_type,
2926 mp->violate_action_type);
2928 if (VAT_JSON_ARRAY != vam->json_tree.type)
2930 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2931 vat_json_init_array (&vam->json_tree);
2933 node = vat_json_array_add (&vam->json_tree);
2935 vat_json_init_object (node);
2936 vat_json_object_add_string_copy (node, "name", mp->name);
2937 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
2938 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
2939 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
2940 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
2941 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
2942 vat_json_object_add_string_copy (node, "round_type", round_type_str);
2943 vat_json_object_add_string_copy (node, "type", type_str);
2944 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
2945 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
2946 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
2947 vat_json_object_add_uint (node, "cir_tokens_per_period",
2948 ntohl (mp->cir_tokens_per_period));
2949 vat_json_object_add_uint (node, "eir_tokens_per_period",
2950 ntohl (mp->pir_tokens_per_period));
2951 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
2952 vat_json_object_add_uint (node, "current_bucket",
2953 ntohl (mp->current_bucket));
2954 vat_json_object_add_uint (node, "extended_limit",
2955 ntohl (mp->extended_limit));
2956 vat_json_object_add_uint (node, "extended_bucket",
2957 ntohl (mp->extended_bucket));
2958 vat_json_object_add_uint (node, "last_update_time",
2959 ntohl (mp->last_update_time));
2960 vat_json_object_add_string_copy (node, "conform_action",
2961 conform_action_str);
2962 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2964 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2965 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
2966 vec_free (dscp_str);
2968 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
2969 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2971 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2972 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
2973 vec_free (dscp_str);
2975 vat_json_object_add_string_copy (node, "violate_action",
2976 violate_action_str);
2977 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2979 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2980 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
2981 vec_free (dscp_str);
2984 vec_free (rate_type_str);
2985 vec_free (round_type_str);
2986 vec_free (type_str);
2987 vec_free (conform_action_str);
2988 vec_free (exceed_action_str);
2989 vec_free (violate_action_str);
2993 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
2996 vat_main_t *vam = &vat_main;
2997 int i, count = ntohl (mp->count);
3000 fformat (vam->ofp, "classify table ids (%d) : ", count);
3001 for (i = 0; i < count; i++)
3003 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
3004 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
3006 vam->retval = ntohl (mp->retval);
3007 vam->result_ready = 1;
3011 vl_api_classify_table_ids_reply_t_handler_json
3012 (vl_api_classify_table_ids_reply_t * mp)
3014 vat_main_t *vam = &vat_main;
3015 int i, count = ntohl (mp->count);
3019 vat_json_node_t node;
3021 vat_json_init_object (&node);
3022 for (i = 0; i < count; i++)
3024 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
3026 vat_json_print (vam->ofp, &node);
3027 vat_json_free (&node);
3029 vam->retval = ntohl (mp->retval);
3030 vam->result_ready = 1;
3034 vl_api_classify_table_by_interface_reply_t_handler
3035 (vl_api_classify_table_by_interface_reply_t * mp)
3037 vat_main_t *vam = &vat_main;
3040 table_id = ntohl (mp->l2_table_id);
3042 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3044 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3045 table_id = ntohl (mp->ip4_table_id);
3047 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3049 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3050 table_id = ntohl (mp->ip6_table_id);
3052 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3054 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3055 vam->retval = ntohl (mp->retval);
3056 vam->result_ready = 1;
3060 vl_api_classify_table_by_interface_reply_t_handler_json
3061 (vl_api_classify_table_by_interface_reply_t * mp)
3063 vat_main_t *vam = &vat_main;
3064 vat_json_node_t node;
3066 vat_json_init_object (&node);
3068 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3069 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3070 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3072 vat_json_print (vam->ofp, &node);
3073 vat_json_free (&node);
3075 vam->retval = ntohl (mp->retval);
3076 vam->result_ready = 1;
3079 static void vl_api_policer_add_del_reply_t_handler
3080 (vl_api_policer_add_del_reply_t * mp)
3082 vat_main_t *vam = &vat_main;
3083 i32 retval = ntohl (mp->retval);
3084 if (vam->async_mode)
3086 vam->async_errors += (retval < 0);
3090 vam->retval = retval;
3091 vam->result_ready = 1;
3092 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3094 * Note: this is just barely thread-safe, depends on
3095 * the main thread spinning waiting for an answer...
3097 errmsg ("policer index %d\n", ntohl (mp->policer_index));
3101 static void vl_api_policer_add_del_reply_t_handler_json
3102 (vl_api_policer_add_del_reply_t * mp)
3104 vat_main_t *vam = &vat_main;
3105 vat_json_node_t node;
3107 vat_json_init_object (&node);
3108 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3109 vat_json_object_add_uint (&node, "policer_index",
3110 ntohl (mp->policer_index));
3112 vat_json_print (vam->ofp, &node);
3113 vat_json_free (&node);
3115 vam->retval = ntohl (mp->retval);
3116 vam->result_ready = 1;
3119 /* Format hex dump. */
3121 format_hex_bytes (u8 * s, va_list * va)
3123 u8 *bytes = va_arg (*va, u8 *);
3124 int n_bytes = va_arg (*va, int);
3127 /* Print short or long form depending on byte count. */
3128 uword short_form = n_bytes <= 32;
3129 uword indent = format_get_indent (s);
3134 for (i = 0; i < n_bytes; i++)
3136 if (!short_form && (i % 32) == 0)
3137 s = format (s, "%08x: ", i);
3138 s = format (s, "%02x", bytes[i]);
3139 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3140 s = format (s, "\n%U", format_white_space, indent);
3147 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3150 vat_main_t *vam = &vat_main;
3151 i32 retval = ntohl (mp->retval);
3154 fformat (vam->ofp, "classify table info :\n");
3155 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3156 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3157 ntohl (mp->miss_next_index));
3158 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3159 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3160 ntohl (mp->match_n_vectors));
3161 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3162 ntohl (mp->mask_length));
3164 vam->retval = retval;
3165 vam->result_ready = 1;
3169 vl_api_classify_table_info_reply_t_handler_json
3170 (vl_api_classify_table_info_reply_t * mp)
3172 vat_main_t *vam = &vat_main;
3173 vat_json_node_t node;
3175 i32 retval = ntohl (mp->retval);
3178 vat_json_init_object (&node);
3180 vat_json_object_add_int (&node, "sessions",
3181 ntohl (mp->active_sessions));
3182 vat_json_object_add_int (&node, "nexttbl",
3183 ntohl (mp->next_table_index));
3184 vat_json_object_add_int (&node, "nextnode",
3185 ntohl (mp->miss_next_index));
3186 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3187 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3188 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3189 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3190 ntohl (mp->mask_length), 0);
3191 vat_json_object_add_string_copy (&node, "mask", s);
3193 vat_json_print (vam->ofp, &node);
3194 vat_json_free (&node);
3196 vam->retval = ntohl (mp->retval);
3197 vam->result_ready = 1;
3201 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3204 vat_main_t *vam = &vat_main;
3206 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3207 ntohl (mp->hit_next_index), ntohl (mp->advance),
3208 ntohl (mp->opaque_index));
3209 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3210 ntohl (mp->match_length));
3214 vl_api_classify_session_details_t_handler_json
3215 (vl_api_classify_session_details_t * mp)
3217 vat_main_t *vam = &vat_main;
3218 vat_json_node_t *node = NULL;
3220 if (VAT_JSON_ARRAY != vam->json_tree.type)
3222 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3223 vat_json_init_array (&vam->json_tree);
3225 node = vat_json_array_add (&vam->json_tree);
3227 vat_json_init_object (node);
3228 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3229 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3230 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3232 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3234 vat_json_object_add_string_copy (node, "match", s);
3237 static void vl_api_pg_create_interface_reply_t_handler
3238 (vl_api_pg_create_interface_reply_t * mp)
3240 vat_main_t *vam = &vat_main;
3242 vam->retval = ntohl (mp->retval);
3243 vam->result_ready = 1;
3246 static void vl_api_pg_create_interface_reply_t_handler_json
3247 (vl_api_pg_create_interface_reply_t * mp)
3249 vat_main_t *vam = &vat_main;
3250 vat_json_node_t node;
3252 i32 retval = ntohl (mp->retval);
3255 vat_json_init_object (&node);
3257 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
3259 vat_json_print (vam->ofp, &node);
3260 vat_json_free (&node);
3262 vam->retval = ntohl (mp->retval);
3263 vam->result_ready = 1;
3266 static void vl_api_policer_classify_details_t_handler
3267 (vl_api_policer_classify_details_t * mp)
3269 vat_main_t *vam = &vat_main;
3271 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3272 ntohl (mp->table_index));
3275 static void vl_api_policer_classify_details_t_handler_json
3276 (vl_api_policer_classify_details_t * mp)
3278 vat_main_t *vam = &vat_main;
3279 vat_json_node_t *node;
3281 if (VAT_JSON_ARRAY != vam->json_tree.type)
3283 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3284 vat_json_init_array (&vam->json_tree);
3286 node = vat_json_array_add (&vam->json_tree);
3288 vat_json_init_object (node);
3289 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3290 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3293 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3294 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3296 vat_main_t *vam = &vat_main;
3297 i32 retval = ntohl (mp->retval);
3298 if (vam->async_mode)
3300 vam->async_errors += (retval < 0);
3304 vam->retval = retval;
3305 vam->sw_if_index = ntohl (mp->sw_if_index);
3306 vam->result_ready = 1;
3310 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3311 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3313 vat_main_t *vam = &vat_main;
3314 vat_json_node_t node;
3316 vat_json_init_object (&node);
3317 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3318 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3320 vat_json_print (vam->ofp, &node);
3321 vat_json_free (&node);
3323 vam->retval = ntohl (mp->retval);
3324 vam->result_ready = 1;
3327 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3328 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3329 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3330 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
3333 * Generate boilerplate reply handlers, which
3334 * dig the return value out of the xxx_reply_t API message,
3335 * stick it into vam->retval, and set vam->result_ready
3337 * Could also do this by pointing N message decode slots at
3338 * a single function, but that could break in subtle ways.
3341 #define foreach_standard_reply_retval_handler \
3342 _(sw_interface_set_flags_reply) \
3343 _(sw_interface_add_del_address_reply) \
3344 _(sw_interface_set_table_reply) \
3345 _(sw_interface_set_vpath_reply) \
3346 _(sw_interface_set_l2_bridge_reply) \
3347 _(bridge_domain_add_del_reply) \
3348 _(sw_interface_set_l2_xconnect_reply) \
3349 _(l2fib_add_del_reply) \
3350 _(ip_add_del_route_reply) \
3351 _(proxy_arp_add_del_reply) \
3352 _(proxy_arp_intfc_enable_disable_reply) \
3353 _(mpls_add_del_encap_reply) \
3354 _(mpls_add_del_decap_reply) \
3355 _(mpls_ethernet_add_del_tunnel_2_reply) \
3356 _(sw_interface_set_unnumbered_reply) \
3357 _(ip_neighbor_add_del_reply) \
3358 _(reset_vrf_reply) \
3359 _(oam_add_del_reply) \
3360 _(reset_fib_reply) \
3361 _(dhcp_proxy_config_reply) \
3362 _(dhcp_proxy_config_2_reply) \
3363 _(dhcp_proxy_set_vss_reply) \
3364 _(dhcp_client_config_reply) \
3365 _(set_ip_flow_hash_reply) \
3366 _(sw_interface_ip6_enable_disable_reply) \
3367 _(sw_interface_ip6_set_link_local_address_reply) \
3368 _(sw_interface_ip6nd_ra_prefix_reply) \
3369 _(sw_interface_ip6nd_ra_config_reply) \
3370 _(set_arp_neighbor_limit_reply) \
3371 _(l2_patch_add_del_reply) \
3372 _(sr_tunnel_add_del_reply) \
3373 _(sr_policy_add_del_reply) \
3374 _(sr_multicast_map_add_del_reply) \
3375 _(classify_add_del_session_reply) \
3376 _(classify_set_interface_ip_table_reply) \
3377 _(classify_set_interface_l2_tables_reply) \
3378 _(l2tpv3_set_tunnel_cookies_reply) \
3379 _(l2tpv3_interface_enable_disable_reply) \
3380 _(l2tpv3_set_lookup_key_reply) \
3381 _(l2_fib_clear_table_reply) \
3382 _(l2_interface_efp_filter_reply) \
3383 _(l2_interface_vlan_tag_rewrite_reply) \
3384 _(modify_vhost_user_if_reply) \
3385 _(delete_vhost_user_if_reply) \
3386 _(want_ip4_arp_events_reply) \
3387 _(want_ip6_nd_events_reply) \
3388 _(input_acl_set_interface_reply) \
3389 _(ipsec_spd_add_del_reply) \
3390 _(ipsec_interface_add_del_spd_reply) \
3391 _(ipsec_spd_add_del_entry_reply) \
3392 _(ipsec_sad_add_del_entry_reply) \
3393 _(ipsec_sa_set_key_reply) \
3394 _(ikev2_profile_add_del_reply) \
3395 _(ikev2_profile_set_auth_reply) \
3396 _(ikev2_profile_set_id_reply) \
3397 _(ikev2_profile_set_ts_reply) \
3398 _(ikev2_set_local_key_reply) \
3399 _(delete_loopback_reply) \
3400 _(bd_ip_mac_add_del_reply) \
3401 _(map_del_domain_reply) \
3402 _(map_add_del_rule_reply) \
3403 _(want_interface_events_reply) \
3404 _(want_stats_reply) \
3405 _(cop_interface_enable_disable_reply) \
3406 _(cop_whitelist_enable_disable_reply) \
3407 _(sw_interface_clear_stats_reply) \
3408 _(trace_profile_add_reply) \
3409 _(trace_profile_apply_reply) \
3410 _(trace_profile_del_reply) \
3411 _(lisp_add_del_locator_reply) \
3412 _(lisp_add_del_local_eid_reply) \
3413 _(lisp_add_del_remote_mapping_reply) \
3414 _(lisp_add_del_adjacency_reply) \
3415 _(lisp_gpe_add_del_fwd_entry_reply) \
3416 _(lisp_add_del_map_resolver_reply) \
3417 _(lisp_gpe_enable_disable_reply) \
3418 _(lisp_gpe_add_del_iface_reply) \
3419 _(lisp_enable_disable_reply) \
3420 _(lisp_pitr_set_locator_set_reply) \
3421 _(lisp_add_del_map_request_itr_rlocs_reply) \
3422 _(lisp_eid_table_add_del_map_reply) \
3423 _(vxlan_gpe_add_del_tunnel_reply) \
3424 _(af_packet_delete_reply) \
3425 _(policer_classify_set_interface_reply) \
3426 _(netmap_create_reply) \
3427 _(netmap_delete_reply) \
3428 _(ipfix_enable_reply) \
3429 _(pg_capture_reply) \
3430 _(pg_enable_disable_reply) \
3431 _(ip_source_and_port_range_check_add_del_reply) \
3432 _(ip_source_and_port_range_check_interface_add_del_reply)\
3433 _(delete_subif_reply)
3436 static void vl_api_##n##_t_handler \
3437 (vl_api_##n##_t * mp) \
3439 vat_main_t * vam = &vat_main; \
3440 i32 retval = ntohl(mp->retval); \
3441 if (vam->async_mode) { \
3442 vam->async_errors += (retval < 0); \
3444 vam->retval = retval; \
3445 vam->result_ready = 1; \
3448 foreach_standard_reply_retval_handler;
3452 static void vl_api_##n##_t_handler_json \
3453 (vl_api_##n##_t * mp) \
3455 vat_main_t * vam = &vat_main; \
3456 vat_json_node_t node; \
3457 vat_json_init_object(&node); \
3458 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3459 vat_json_print(vam->ofp, &node); \
3460 vam->retval = ntohl(mp->retval); \
3461 vam->result_ready = 1; \
3463 foreach_standard_reply_retval_handler;
3467 * Table of message reply handlers, must include boilerplate handlers
3471 #define foreach_vpe_api_reply_msg \
3472 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3473 _(SW_INTERFACE_DETAILS, sw_interface_details) \
3474 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3475 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3476 _(CONTROL_PING_REPLY, control_ping_reply) \
3477 _(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply) \
3478 _(CLI_REPLY, cli_reply) \
3479 _(CLI_INBAND_REPLY, cli_inband_reply) \
3480 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3481 sw_interface_add_del_address_reply) \
3482 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
3483 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3484 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3485 sw_interface_set_l2_xconnect_reply) \
3486 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3487 sw_interface_set_l2_bridge_reply) \
3488 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3489 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3490 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3491 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3492 _(L2_FLAGS_REPLY, l2_flags_reply) \
3493 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3494 _(TAP_CONNECT_REPLY, tap_connect_reply) \
3495 _(TAP_MODIFY_REPLY, tap_modify_reply) \
3496 _(TAP_DELETE_REPLY, tap_delete_reply) \
3497 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3498 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
3499 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3500 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3501 proxy_arp_intfc_enable_disable_reply) \
3502 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
3503 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
3504 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
3505 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3506 mpls_ethernet_add_del_tunnel_reply) \
3507 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3508 mpls_ethernet_add_del_tunnel_2_reply) \
3509 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3510 sw_interface_set_unnumbered_reply) \
3511 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3512 _(RESET_VRF_REPLY, reset_vrf_reply) \
3513 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3514 _(CREATE_SUBIF_REPLY, create_subif_reply) \
3515 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3516 _(RESET_FIB_REPLY, reset_fib_reply) \
3517 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3518 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3519 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3520 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3521 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3522 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3523 sw_interface_ip6_enable_disable_reply) \
3524 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3525 sw_interface_ip6_set_link_local_address_reply) \
3526 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3527 sw_interface_ip6nd_ra_prefix_reply) \
3528 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3529 sw_interface_ip6nd_ra_config_reply) \
3530 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3531 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3532 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
3533 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3534 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
3535 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3536 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3537 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3538 classify_set_interface_ip_table_reply) \
3539 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3540 classify_set_interface_l2_tables_reply) \
3541 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3542 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3543 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3544 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3545 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3546 l2tpv3_interface_enable_disable_reply) \
3547 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3548 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3549 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
3550 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
3551 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3552 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
3553 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3554 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3555 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3556 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3557 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3558 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3559 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3560 _(SHOW_VERSION_REPLY, show_version_reply) \
3561 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
3562 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3563 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
3564 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3565 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3566 _(IP4_ARP_EVENT, ip4_arp_event) \
3567 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
3568 _(IP6_ND_EVENT, ip6_nd_event) \
3569 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3570 _(IP_ADDRESS_DETAILS, ip_address_details) \
3571 _(IP_DETAILS, ip_details) \
3572 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3573 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3574 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3575 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3576 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
3577 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3578 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3579 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3580 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3581 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
3582 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3583 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3584 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
3585 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3586 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3587 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3588 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3589 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
3590 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
3591 _(MAP_DOMAIN_DETAILS, map_domain_details) \
3592 _(MAP_RULE_DETAILS, map_rule_details) \
3593 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3594 _(WANT_STATS_REPLY, want_stats_reply) \
3595 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3596 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
3597 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
3598 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
3599 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
3600 _(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
3601 _(TRACE_PROFILE_APPLY_REPLY, trace_profile_apply_reply) \
3602 _(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
3603 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3604 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3605 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
3606 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3607 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
3608 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3609 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
3610 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
3611 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
3612 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
3613 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
3614 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3615 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
3616 _(LISP_LOCATOR_DETAILS, lisp_locator_details) \
3617 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
3618 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
3619 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
3620 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
3621 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
3622 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
3623 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3624 lisp_add_del_map_request_itr_rlocs_reply) \
3625 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3626 lisp_get_map_request_itr_rlocs_reply) \
3627 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
3628 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
3629 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
3630 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
3631 _(POLICER_DETAILS, policer_details) \
3632 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3633 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
3634 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
3635 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
3636 _(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
3637 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3638 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
3639 _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
3640 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3641 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3642 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
3643 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
3644 _(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \
3645 _(IPFIX_DETAILS, ipfix_details) \
3646 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3647 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3648 _(PG_CAPTURE_REPLY, pg_capture_reply) \
3649 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3650 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3651 ip_source_and_port_range_check_add_del_reply) \
3652 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
3653 ip_source_and_port_range_check_interface_add_del_reply) \
3654 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
3655 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
3656 _(DELETE_SUBIF_REPLY, delete_subif_reply)
3658 /* M: construct, but don't yet send a message */
3662 vam->result_ready = 0; \
3663 mp = vl_msg_api_alloc(sizeof(*mp)); \
3664 memset (mp, 0, sizeof (*mp)); \
3665 mp->_vl_msg_id = ntohs (VL_API_##T); \
3666 mp->client_index = vam->my_client_index; \
3671 vam->result_ready = 0; \
3672 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3673 memset (mp, 0, sizeof (*mp)); \
3674 mp->_vl_msg_id = ntohs (VL_API_##T); \
3675 mp->client_index = vam->my_client_index; \
3679 /* S: send a message */
3680 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3682 /* W: wait for results, with timeout */
3685 timeout = vat_time_now (vam) + 1.0; \
3687 while (vat_time_now (vam) < timeout) { \
3688 if (vam->result_ready == 1) { \
3689 return (vam->retval); \
3695 /* W2: wait for results, with timeout */
3698 timeout = vat_time_now (vam) + 1.0; \
3700 while (vat_time_now (vam) < timeout) { \
3701 if (vam->result_ready == 1) { \
3703 return (vam->retval); \
3709 /* W_L: wait for results, with timeout */
3712 timeout = vat_time_now (vam) + 1.0; \
3714 while (vat_time_now (vam) < timeout) { \
3715 if (vam->result_ready == 1) { \
3717 return (vam->retval); \
3720 vam->noprint_msg = 0; \
3731 #define STR_VTR_OP_CASE(op) \
3732 case L2_VTR_ ## op: \
3736 str_vtr_op (u32 vtr_op)
3740 STR_VTR_OP_CASE (DISABLED);
3741 STR_VTR_OP_CASE (PUSH_1);
3742 STR_VTR_OP_CASE (PUSH_2);
3743 STR_VTR_OP_CASE (POP_1);
3744 STR_VTR_OP_CASE (POP_2);
3745 STR_VTR_OP_CASE (TRANSLATE_1_1);
3746 STR_VTR_OP_CASE (TRANSLATE_1_2);
3747 STR_VTR_OP_CASE (TRANSLATE_2_1);
3748 STR_VTR_OP_CASE (TRANSLATE_2_2);
3755 dump_sub_interface_table (vat_main_t * vam)
3757 const sw_interface_subif_t *sub = NULL;
3759 if (vam->json_output)
3762 ("JSON output supported only for VPE API calls and dump_stats_table");
3767 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3768 "Interface", "sw_if_index",
3769 "sub id", "dot1ad", "tags", "outer id",
3770 "inner id", "exact", "default", "outer any", "inner any");
3772 vec_foreach (sub, vam->sw_if_subif_table)
3775 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3776 sub->interface_name,
3778 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3779 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3780 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3781 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3782 if (sub->vtr_op != L2_VTR_DISABLED)
3785 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3786 "tag1: %d tag2: %d ]\n",
3787 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3788 sub->vtr_tag1, sub->vtr_tag2);
3796 name_sort_cmp (void *a1, void *a2)
3798 name_sort_t *n1 = a1;
3799 name_sort_t *n2 = a2;
3801 return strcmp ((char *) n1->name, (char *) n2->name);
3805 dump_interface_table (vat_main_t * vam)
3808 name_sort_t *nses = 0, *ns;
3810 if (vam->json_output)
3813 ("JSON output supported only for VPE API calls and dump_stats_table");
3818 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3820 vec_add2 (nses, ns, 1);
3821 ns->name = (u8 *)(p->key);
3822 ns->value = (u32) p->value[0];
3826 vec_sort_with_function (nses, name_sort_cmp);
3828 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3829 vec_foreach (ns, nses)
3831 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3838 dump_ip_table (vat_main_t * vam, int is_ipv6)
3840 const ip_details_t *det = NULL;
3841 const ip_address_details_t *address = NULL;
3844 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3846 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3853 fformat (vam->ofp, "%-12d\n", i);
3855 " %-30s%-13s\n", "Address", "Prefix length");
3860 vec_foreach (address, det->addr)
3864 is_ipv6 ? format_ip6_address : format_ip4_address,
3865 address->ip, address->prefix_length);
3873 dump_ipv4_table (vat_main_t * vam)
3875 if (vam->json_output)
3878 ("JSON output supported only for VPE API calls and dump_stats_table");
3882 return dump_ip_table (vam, 0);
3886 dump_ipv6_table (vat_main_t * vam)
3888 if (vam->json_output)
3891 ("JSON output supported only for VPE API calls and dump_stats_table");
3895 return dump_ip_table (vam, 1);
3899 counter_type_to_str (u8 counter_type, u8 is_combined)
3903 switch (counter_type)
3905 case VNET_INTERFACE_COUNTER_DROP:
3907 case VNET_INTERFACE_COUNTER_PUNT:
3909 case VNET_INTERFACE_COUNTER_IP4:
3911 case VNET_INTERFACE_COUNTER_IP6:
3913 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
3915 case VNET_INTERFACE_COUNTER_RX_MISS:
3917 case VNET_INTERFACE_COUNTER_RX_ERROR:
3919 case VNET_INTERFACE_COUNTER_TX_ERROR:
3922 return "INVALID-COUNTER-TYPE";
3927 switch (counter_type)
3929 case VNET_INTERFACE_COUNTER_RX:
3931 case VNET_INTERFACE_COUNTER_TX:
3934 return "INVALID-COUNTER-TYPE";
3940 dump_stats_table (vat_main_t * vam)
3942 vat_json_node_t node;
3943 vat_json_node_t *msg_array;
3944 vat_json_node_t *msg;
3945 vat_json_node_t *counter_array;
3946 vat_json_node_t *counter;
3947 interface_counter_t c;
3949 ip4_fib_counter_t *c4;
3950 ip6_fib_counter_t *c6;
3953 if (!vam->json_output)
3955 clib_warning ("dump_stats_table supported only in JSON format");
3959 vat_json_init_object (&node);
3961 /* interface counters */
3962 msg_array = vat_json_object_add (&node, "interface_counters");
3963 vat_json_init_array (msg_array);
3964 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
3966 msg = vat_json_array_add (msg_array);
3967 vat_json_init_object (msg);
3968 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3969 (u8 *) counter_type_to_str (i, 0));
3970 vat_json_object_add_int (msg, "is_combined", 0);
3971 counter_array = vat_json_object_add (msg, "data");
3972 vat_json_init_array (counter_array);
3973 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
3975 packets = vam->simple_interface_counters[i][j];
3976 vat_json_array_add_uint (counter_array, packets);
3979 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
3981 msg = vat_json_array_add (msg_array);
3982 vat_json_init_object (msg);
3983 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3984 (u8 *) counter_type_to_str (i, 1));
3985 vat_json_object_add_int (msg, "is_combined", 1);
3986 counter_array = vat_json_object_add (msg, "data");
3987 vat_json_init_array (counter_array);
3988 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
3990 c = vam->combined_interface_counters[i][j];
3991 counter = vat_json_array_add (counter_array);
3992 vat_json_init_object (counter);
3993 vat_json_object_add_uint (counter, "packets", c.packets);
3994 vat_json_object_add_uint (counter, "bytes", c.bytes);
3998 /* ip4 fib counters */
3999 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
4000 vat_json_init_array (msg_array);
4001 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
4003 msg = vat_json_array_add (msg_array);
4004 vat_json_init_object (msg);
4005 vat_json_object_add_uint (msg, "vrf_id",
4006 vam->ip4_fib_counters_vrf_id_by_index[i]);
4007 counter_array = vat_json_object_add (msg, "c");
4008 vat_json_init_array (counter_array);
4009 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
4011 counter = vat_json_array_add (counter_array);
4012 vat_json_init_object (counter);
4013 c4 = &vam->ip4_fib_counters[i][j];
4014 vat_json_object_add_ip4 (counter, "address", c4->address);
4015 vat_json_object_add_uint (counter, "address_length",
4016 c4->address_length);
4017 vat_json_object_add_uint (counter, "packets", c4->packets);
4018 vat_json_object_add_uint (counter, "bytes", c4->bytes);
4022 /* ip6 fib counters */
4023 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
4024 vat_json_init_array (msg_array);
4025 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
4027 msg = vat_json_array_add (msg_array);
4028 vat_json_init_object (msg);
4029 vat_json_object_add_uint (msg, "vrf_id",
4030 vam->ip6_fib_counters_vrf_id_by_index[i]);
4031 counter_array = vat_json_object_add (msg, "c");
4032 vat_json_init_array (counter_array);
4033 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
4035 counter = vat_json_array_add (counter_array);
4036 vat_json_init_object (counter);
4037 c6 = &vam->ip6_fib_counters[i][j];
4038 vat_json_object_add_ip6 (counter, "address", c6->address);
4039 vat_json_object_add_uint (counter, "address_length",
4040 c6->address_length);
4041 vat_json_object_add_uint (counter, "packets", c6->packets);
4042 vat_json_object_add_uint (counter, "bytes", c6->bytes);
4046 vat_json_print (vam->ofp, &node);
4047 vat_json_free (&node);
4053 exec (vat_main_t * vam)
4055 api_main_t *am = &api_main;
4056 vl_api_cli_request_t *mp;
4060 unformat_input_t *i = vam->input;
4062 if (vec_len (i->buffer) == 0)
4065 if (vam->exec_mode == 0 && unformat (i, "mode"))
4070 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4077 M (CLI_REQUEST, cli_request);
4080 * Copy cmd into shared memory.
4081 * In order for the CLI command to work, it
4082 * must be a vector ending in \n, not a C-string ending
4085 pthread_mutex_lock (&am->vlib_rp->mutex);
4086 oldheap = svm_push_data_heap (am->vlib_rp);
4088 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4089 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4091 svm_pop_heap (oldheap);
4092 pthread_mutex_unlock (&am->vlib_rp->mutex);
4094 mp->cmd_in_shmem = (u64) cmd;
4096 timeout = vat_time_now (vam) + 10.0;
4098 while (vat_time_now (vam) < timeout)
4100 if (vam->result_ready == 1)
4103 if (vam->shmem_result != NULL)
4104 fformat (vam->ofp, "%s", vam->shmem_result);
4105 pthread_mutex_lock (&am->vlib_rp->mutex);
4106 oldheap = svm_push_data_heap (am->vlib_rp);
4108 free_me = (u8 *) vam->shmem_result;
4111 svm_pop_heap (oldheap);
4112 pthread_mutex_unlock (&am->vlib_rp->mutex);
4120 * Future replacement of exec() that passes CLI buffers directly in
4121 * the API messages instead of an additional shared memory area.
4124 exec_inband (vat_main_t * vam)
4126 vl_api_cli_inband_t *mp;
4128 unformat_input_t *i = vam->input;
4130 if (vec_len (i->buffer) == 0)
4133 if (vam->exec_mode == 0 && unformat (i, "mode"))
4138 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4145 * In order for the CLI command to work, it
4146 * must be a vector ending in \n, not a C-string ending
4149 u32 len = vec_len (vam->input->buffer);
4150 M2 (CLI_INBAND, cli_inband, len);
4151 clib_memcpy (mp->cmd, vam->input->buffer, len);
4152 mp->length = htonl (len);
4155 W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
4159 api_create_loopback (vat_main_t * vam)
4161 unformat_input_t *i = vam->input;
4162 vl_api_create_loopback_t *mp;
4167 memset (mac_address, 0, sizeof (mac_address));
4169 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4171 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4177 /* Construct the API message */
4178 M (CREATE_LOOPBACK, create_loopback);
4180 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4187 api_delete_loopback (vat_main_t * vam)
4189 unformat_input_t *i = vam->input;
4190 vl_api_delete_loopback_t *mp;
4192 u32 sw_if_index = ~0;
4194 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4196 if (unformat (i, "sw_if_index %d", &sw_if_index))
4202 if (sw_if_index == ~0)
4204 errmsg ("missing sw_if_index\n");
4208 /* Construct the API message */
4209 M (DELETE_LOOPBACK, delete_loopback);
4210 mp->sw_if_index = ntohl (sw_if_index);
4217 api_want_stats (vat_main_t * vam)
4219 unformat_input_t *i = vam->input;
4220 vl_api_want_stats_t *mp;
4224 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4226 if (unformat (i, "enable"))
4228 else if (unformat (i, "disable"))
4236 errmsg ("missing enable|disable\n");
4240 M (WANT_STATS, want_stats);
4241 mp->enable_disable = enable;
4248 api_want_interface_events (vat_main_t * vam)
4250 unformat_input_t *i = vam->input;
4251 vl_api_want_interface_events_t *mp;
4255 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4257 if (unformat (i, "enable"))
4259 else if (unformat (i, "disable"))
4267 errmsg ("missing enable|disable\n");
4271 M (WANT_INTERFACE_EVENTS, want_interface_events);
4272 mp->enable_disable = enable;
4274 vam->interface_event_display = enable;
4281 /* Note: non-static, called once to set up the initial intfc table */
4283 api_sw_interface_dump (vat_main_t * vam)
4285 vl_api_sw_interface_dump_t *mp;
4288 name_sort_t *nses = 0, *ns;
4289 sw_interface_subif_t *sub = NULL;
4291 /* Toss the old name table */
4293 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4295 vec_add2 (nses, ns, 1);
4296 ns->name = (u8 *)(p->key);
4297 ns->value = (u32) p->value[0];
4301 hash_free (vam->sw_if_index_by_interface_name);
4303 vec_foreach (ns, nses) vec_free (ns->name);
4307 vec_foreach (sub, vam->sw_if_subif_table)
4309 vec_free (sub->interface_name);
4311 vec_free (vam->sw_if_subif_table);
4313 /* recreate the interface name hash table */
4314 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
4316 /* Get list of ethernets */
4317 M (SW_INTERFACE_DUMP, sw_interface_dump);
4318 mp->name_filter_valid = 1;
4319 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4322 /* and local / loopback interfaces */
4323 M (SW_INTERFACE_DUMP, sw_interface_dump);
4324 mp->name_filter_valid = 1;
4325 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4329 /* and vxlan-gpe tunnel interfaces */
4330 M (SW_INTERFACE_DUMP, sw_interface_dump);
4331 mp->name_filter_valid = 1;
4332 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4333 sizeof (mp->name_filter) - 1);
4336 /* and vxlan tunnel interfaces */
4337 M (SW_INTERFACE_DUMP, sw_interface_dump);
4338 mp->name_filter_valid = 1;
4339 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4342 /* and host (af_packet) interfaces */
4343 M (SW_INTERFACE_DUMP, sw_interface_dump);
4344 mp->name_filter_valid = 1;
4345 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4348 /* and l2tpv3 tunnel interfaces */
4349 M (SW_INTERFACE_DUMP, sw_interface_dump);
4350 mp->name_filter_valid = 1;
4351 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4352 sizeof (mp->name_filter) - 1);
4355 /* and GRE tunnel interfaces */
4356 M (SW_INTERFACE_DUMP, sw_interface_dump);
4357 mp->name_filter_valid = 1;
4358 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4361 /* Use a control ping for synchronization */
4363 vl_api_control_ping_t *mp;
4364 M (CONTROL_PING, control_ping);
4371 api_sw_interface_set_flags (vat_main_t * vam)
4373 unformat_input_t *i = vam->input;
4374 vl_api_sw_interface_set_flags_t *mp;
4377 u8 sw_if_index_set = 0;
4378 u8 admin_up = 0, link_up = 0;
4380 /* Parse args required to build the message */
4381 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4383 if (unformat (i, "admin-up"))
4385 else if (unformat (i, "admin-down"))
4387 else if (unformat (i, "link-up"))
4389 else if (unformat (i, "link-down"))
4391 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4392 sw_if_index_set = 1;
4393 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4394 sw_if_index_set = 1;
4399 if (sw_if_index_set == 0)
4401 errmsg ("missing interface name or sw_if_index\n");
4405 /* Construct the API message */
4406 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4407 mp->sw_if_index = ntohl (sw_if_index);
4408 mp->admin_up_down = admin_up;
4409 mp->link_up_down = link_up;
4414 /* Wait for a reply, return the good/bad news... */
4419 api_sw_interface_clear_stats (vat_main_t * vam)
4421 unformat_input_t *i = vam->input;
4422 vl_api_sw_interface_clear_stats_t *mp;
4425 u8 sw_if_index_set = 0;
4427 /* Parse args required to build the message */
4428 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4430 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4431 sw_if_index_set = 1;
4432 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4433 sw_if_index_set = 1;
4438 /* Construct the API message */
4439 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
4441 if (sw_if_index_set == 1)
4442 mp->sw_if_index = ntohl (sw_if_index);
4444 mp->sw_if_index = ~0;
4449 /* Wait for a reply, return the good/bad news... */
4454 api_sw_interface_add_del_address (vat_main_t * vam)
4456 unformat_input_t *i = vam->input;
4457 vl_api_sw_interface_add_del_address_t *mp;
4460 u8 sw_if_index_set = 0;
4461 u8 is_add = 1, del_all = 0;
4462 u32 address_length = 0;
4463 u8 v4_address_set = 0;
4464 u8 v6_address_set = 0;
4465 ip4_address_t v4address;
4466 ip6_address_t v6address;
4468 /* Parse args required to build the message */
4469 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4471 if (unformat (i, "del-all"))
4473 else if (unformat (i, "del"))
4475 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4476 sw_if_index_set = 1;
4477 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4478 sw_if_index_set = 1;
4479 else if (unformat (i, "%U/%d",
4480 unformat_ip4_address, &v4address, &address_length))
4482 else if (unformat (i, "%U/%d",
4483 unformat_ip6_address, &v6address, &address_length))
4489 if (sw_if_index_set == 0)
4491 errmsg ("missing interface name or sw_if_index\n");
4494 if (v4_address_set && v6_address_set)
4496 errmsg ("both v4 and v6 addresses set\n");
4499 if (!v4_address_set && !v6_address_set && !del_all)
4501 errmsg ("no addresses set\n");
4505 /* Construct the API message */
4506 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4508 mp->sw_if_index = ntohl (sw_if_index);
4509 mp->is_add = is_add;
4510 mp->del_all = del_all;
4514 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4518 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4520 mp->address_length = address_length;
4525 /* Wait for a reply, return good/bad news */
4530 api_sw_interface_set_table (vat_main_t * vam)
4532 unformat_input_t *i = vam->input;
4533 vl_api_sw_interface_set_table_t *mp;
4535 u32 sw_if_index, vrf_id = 0;
4536 u8 sw_if_index_set = 0;
4539 /* Parse args required to build the message */
4540 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4542 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4543 sw_if_index_set = 1;
4544 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4545 sw_if_index_set = 1;
4546 else if (unformat (i, "vrf %d", &vrf_id))
4548 else if (unformat (i, "ipv6"))
4554 if (sw_if_index_set == 0)
4556 errmsg ("missing interface name or sw_if_index\n");
4560 /* Construct the API message */
4561 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4563 mp->sw_if_index = ntohl (sw_if_index);
4564 mp->is_ipv6 = is_ipv6;
4565 mp->vrf_id = ntohl (vrf_id);
4570 /* Wait for a reply... */
4575 api_sw_interface_set_vpath (vat_main_t * vam)
4577 unformat_input_t *i = vam->input;
4578 vl_api_sw_interface_set_vpath_t *mp;
4580 u32 sw_if_index = 0;
4581 u8 sw_if_index_set = 0;
4584 /* Parse args required to build the message */
4585 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4587 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4588 sw_if_index_set = 1;
4589 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4590 sw_if_index_set = 1;
4591 else if (unformat (i, "enable"))
4593 else if (unformat (i, "disable"))
4599 if (sw_if_index_set == 0)
4601 errmsg ("missing interface name or sw_if_index\n");
4605 /* Construct the API message */
4606 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
4608 mp->sw_if_index = ntohl (sw_if_index);
4609 mp->enable = is_enable;
4614 /* Wait for a reply... */
4619 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
4621 unformat_input_t *i = vam->input;
4622 vl_api_sw_interface_set_l2_xconnect_t *mp;
4625 u8 rx_sw_if_index_set = 0;
4627 u8 tx_sw_if_index_set = 0;
4630 /* Parse args required to build the message */
4631 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4633 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
4634 rx_sw_if_index_set = 1;
4635 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4636 tx_sw_if_index_set = 1;
4637 else if (unformat (i, "rx"))
4639 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4641 if (unformat (i, "%U", unformat_sw_if_index, vam,
4643 rx_sw_if_index_set = 1;
4648 else if (unformat (i, "tx"))
4650 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4652 if (unformat (i, "%U", unformat_sw_if_index, vam,
4654 tx_sw_if_index_set = 1;
4659 else if (unformat (i, "enable"))
4661 else if (unformat (i, "disable"))
4667 if (rx_sw_if_index_set == 0)
4669 errmsg ("missing rx interface name or rx_sw_if_index\n");
4673 if (enable && (tx_sw_if_index_set == 0))
4675 errmsg ("missing tx interface name or tx_sw_if_index\n");
4679 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
4681 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4682 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
4683 mp->enable = enable;
4692 api_sw_interface_set_l2_bridge (vat_main_t * vam)
4694 unformat_input_t *i = vam->input;
4695 vl_api_sw_interface_set_l2_bridge_t *mp;
4698 u8 rx_sw_if_index_set = 0;
4705 /* Parse args required to build the message */
4706 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4708 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
4709 rx_sw_if_index_set = 1;
4710 else if (unformat (i, "bd_id %d", &bd_id))
4712 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
4713 rx_sw_if_index_set = 1;
4714 else if (unformat (i, "shg %d", &shg))
4716 else if (unformat (i, "bvi"))
4718 else if (unformat (i, "enable"))
4720 else if (unformat (i, "disable"))
4726 if (rx_sw_if_index_set == 0)
4728 errmsg ("missing rx interface name or sw_if_index\n");
4732 if (enable && (bd_id_set == 0))
4734 errmsg ("missing bridge domain\n");
4738 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
4740 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4741 mp->bd_id = ntohl (bd_id);
4744 mp->enable = enable;
4753 api_bridge_domain_dump (vat_main_t * vam)
4755 unformat_input_t *i = vam->input;
4756 vl_api_bridge_domain_dump_t *mp;
4760 /* Parse args required to build the message */
4761 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4763 if (unformat (i, "bd_id %d", &bd_id))
4769 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
4770 mp->bd_id = ntohl (bd_id);
4773 /* Use a control ping for synchronization */
4775 vl_api_control_ping_t *mp;
4776 M (CONTROL_PING, control_ping);
4786 api_bridge_domain_add_del (vat_main_t * vam)
4788 unformat_input_t *i = vam->input;
4789 vl_api_bridge_domain_add_del_t *mp;
4793 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
4795 /* Parse args required to build the message */
4796 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4798 if (unformat (i, "bd_id %d", &bd_id))
4800 else if (unformat (i, "flood %d", &flood))
4802 else if (unformat (i, "uu-flood %d", &uu_flood))
4804 else if (unformat (i, "forward %d", &forward))
4806 else if (unformat (i, "learn %d", &learn))
4808 else if (unformat (i, "arp-term %d", &arp_term))
4810 else if (unformat (i, "del"))
4813 flood = uu_flood = forward = learn = 0;
4821 errmsg ("missing bridge domain\n");
4825 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
4827 mp->bd_id = ntohl (bd_id);
4829 mp->uu_flood = uu_flood;
4830 mp->forward = forward;
4832 mp->arp_term = arp_term;
4833 mp->is_add = is_add;
4842 api_l2fib_add_del (vat_main_t * vam)
4844 unformat_input_t *i = vam->input;
4845 vl_api_l2fib_add_del_t *mp;
4852 u8 sw_if_index_set = 0;
4861 /* Parse args required to build the message */
4862 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4864 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
4866 else if (unformat (i, "bd_id %d", &bd_id))
4868 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4869 sw_if_index_set = 1;
4870 else if (unformat (i, "sw_if"))
4872 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4874 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4875 sw_if_index_set = 1;
4880 else if (unformat (i, "static"))
4882 else if (unformat (i, "filter"))
4887 else if (unformat (i, "bvi"))
4892 else if (unformat (i, "del"))
4894 else if (unformat (i, "count %d", &count))
4902 errmsg ("missing mac address\n");
4908 errmsg ("missing bridge domain\n");
4912 if (is_add && (sw_if_index_set == 0))
4914 errmsg ("missing interface name or sw_if_index\n");
4920 /* Turn on async mode */
4921 vam->async_mode = 1;
4922 vam->async_errors = 0;
4923 before = vat_time_now (vam);
4926 for (j = 0; j < count; j++)
4928 M (L2FIB_ADD_DEL, l2fib_add_del);
4931 mp->bd_id = ntohl (bd_id);
4932 mp->is_add = is_add;
4936 mp->sw_if_index = ntohl (sw_if_index);
4937 mp->static_mac = static_mac;
4938 mp->filter_mac = filter_mac;
4939 mp->bvi_mac = bvi_mac;
4941 increment_mac_address (&mac);
4948 vl_api_control_ping_t *mp;
4951 /* Shut off async mode */
4952 vam->async_mode = 0;
4954 M (CONTROL_PING, control_ping);
4957 timeout = vat_time_now (vam) + 1.0;
4958 while (vat_time_now (vam) < timeout)
4959 if (vam->result_ready == 1)
4964 if (vam->retval == -99)
4965 errmsg ("timeout\n");
4967 if (vam->async_errors > 0)
4969 errmsg ("%d asynchronous errors\n", vam->async_errors);
4972 vam->async_errors = 0;
4973 after = vat_time_now (vam);
4975 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4976 count, after - before, count / (after - before));
4980 /* Wait for a reply... */
4983 /* Return the good/bad news */
4984 return (vam->retval);
4988 api_l2_flags (vat_main_t * vam)
4990 unformat_input_t *i = vam->input;
4991 vl_api_l2_flags_t *mp;
4994 u32 feature_bitmap = 0;
4995 u8 sw_if_index_set = 0;
4997 /* Parse args required to build the message */
4998 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5000 if (unformat (i, "sw_if_index %d", &sw_if_index))
5001 sw_if_index_set = 1;
5002 else if (unformat (i, "sw_if"))
5004 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5006 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5007 sw_if_index_set = 1;
5012 else if (unformat (i, "learn"))
5013 feature_bitmap |= L2INPUT_FEAT_LEARN;
5014 else if (unformat (i, "forward"))
5015 feature_bitmap |= L2INPUT_FEAT_FWD;
5016 else if (unformat (i, "flood"))
5017 feature_bitmap |= L2INPUT_FEAT_FLOOD;
5018 else if (unformat (i, "uu-flood"))
5019 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
5024 if (sw_if_index_set == 0)
5026 errmsg ("missing interface name or sw_if_index\n");
5030 M (L2_FLAGS, l2_flags);
5032 mp->sw_if_index = ntohl (sw_if_index);
5033 mp->feature_bitmap = ntohl (feature_bitmap);
5042 api_bridge_flags (vat_main_t * vam)
5044 unformat_input_t *i = vam->input;
5045 vl_api_bridge_flags_t *mp;
5052 /* Parse args required to build the message */
5053 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5055 if (unformat (i, "bd_id %d", &bd_id))
5057 else if (unformat (i, "learn"))
5059 else if (unformat (i, "forward"))
5061 else if (unformat (i, "flood"))
5063 else if (unformat (i, "uu-flood"))
5064 flags |= L2_UU_FLOOD;
5065 else if (unformat (i, "arp-term"))
5066 flags |= L2_ARP_TERM;
5067 else if (unformat (i, "off"))
5069 else if (unformat (i, "disable"))
5077 errmsg ("missing bridge domain\n");
5081 M (BRIDGE_FLAGS, bridge_flags);
5083 mp->bd_id = ntohl (bd_id);
5084 mp->feature_bitmap = ntohl (flags);
5085 mp->is_set = is_set;
5094 api_bd_ip_mac_add_del (vat_main_t * vam)
5096 unformat_input_t *i = vam->input;
5097 vl_api_bd_ip_mac_add_del_t *mp;
5105 ip4_address_t v4addr;
5106 ip6_address_t v6addr;
5110 /* Parse args required to build the message */
5111 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5113 if (unformat (i, "bd_id %d", &bd_id))
5117 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5121 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5126 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5130 else if (unformat (i, "del"))
5138 errmsg ("missing bridge domain\n");
5141 else if (ip_set == 0)
5143 errmsg ("missing IP address\n");
5146 else if (mac_set == 0)
5148 errmsg ("missing MAC address\n");
5152 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
5154 mp->bd_id = ntohl (bd_id);
5155 mp->is_ipv6 = is_ipv6;
5156 mp->is_add = is_add;
5158 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5160 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5161 clib_memcpy (mp->mac_address, macaddr, 6);
5169 api_tap_connect (vat_main_t * vam)
5171 unformat_input_t *i = vam->input;
5172 vl_api_tap_connect_t *mp;
5179 memset (mac_address, 0, sizeof (mac_address));
5181 /* Parse args required to build the message */
5182 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5184 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5188 else if (unformat (i, "random-mac"))
5190 else if (unformat (i, "tapname %s", &tap_name))
5198 errmsg ("missing tap name\n");
5201 if (vec_len (tap_name) > 63)
5203 errmsg ("tap name too long\n");
5205 vec_add1 (tap_name, 0);
5207 /* Construct the API message */
5208 M (TAP_CONNECT, tap_connect);
5210 mp->use_random_mac = random_mac;
5211 clib_memcpy (mp->mac_address, mac_address, 6);
5212 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5213 vec_free (tap_name);
5218 /* Wait for a reply... */
5223 api_tap_modify (vat_main_t * vam)
5225 unformat_input_t *i = vam->input;
5226 vl_api_tap_modify_t *mp;
5232 u32 sw_if_index = ~0;
5233 u8 sw_if_index_set = 0;
5235 memset (mac_address, 0, sizeof (mac_address));
5237 /* Parse args required to build the message */
5238 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5240 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5241 sw_if_index_set = 1;
5242 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5243 sw_if_index_set = 1;
5244 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5248 else if (unformat (i, "random-mac"))
5250 else if (unformat (i, "tapname %s", &tap_name))
5256 if (sw_if_index_set == 0)
5258 errmsg ("missing vpp interface name");
5263 errmsg ("missing tap name\n");
5266 if (vec_len (tap_name) > 63)
5268 errmsg ("tap name too long\n");
5270 vec_add1 (tap_name, 0);
5272 /* Construct the API message */
5273 M (TAP_MODIFY, tap_modify);
5275 mp->use_random_mac = random_mac;
5276 mp->sw_if_index = ntohl (sw_if_index);
5277 clib_memcpy (mp->mac_address, mac_address, 6);
5278 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5279 vec_free (tap_name);
5284 /* Wait for a reply... */
5289 api_tap_delete (vat_main_t * vam)
5291 unformat_input_t *i = vam->input;
5292 vl_api_tap_delete_t *mp;
5294 u32 sw_if_index = ~0;
5295 u8 sw_if_index_set = 0;
5297 /* Parse args required to build the message */
5298 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5300 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5301 sw_if_index_set = 1;
5302 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5303 sw_if_index_set = 1;
5308 if (sw_if_index_set == 0)
5310 errmsg ("missing vpp interface name");
5314 /* Construct the API message */
5315 M (TAP_DELETE, tap_delete);
5317 mp->sw_if_index = ntohl (sw_if_index);
5322 /* Wait for a reply... */
5327 api_ip_add_del_route (vat_main_t * vam)
5329 unformat_input_t *i = vam->input;
5330 vl_api_ip_add_del_route_t *mp;
5332 u32 sw_if_index = ~0, vrf_id = 0;
5333 u8 sw_if_index_set = 0;
5335 u8 is_local = 0, is_drop = 0;
5336 u8 create_vrf_if_needed = 0;
5338 u8 next_hop_weight = 1;
5340 u8 is_multipath = 0;
5342 u8 address_length_set = 0;
5343 u32 lookup_in_vrf = 0;
5344 u32 resolve_attempts = 0;
5345 u32 dst_address_length = 0;
5346 u8 next_hop_set = 0;
5347 ip4_address_t v4_dst_address, v4_next_hop_address;
5348 ip6_address_t v6_dst_address, v6_next_hop_address;
5352 u32 random_add_del = 0;
5353 u32 *random_vector = 0;
5355 u32 random_seed = 0xdeaddabe;
5356 u32 classify_table_index = ~0;
5359 /* Parse args required to build the message */
5360 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5362 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5363 sw_if_index_set = 1;
5364 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5365 sw_if_index_set = 1;
5366 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5371 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5376 else if (unformat (i, "/%d", &dst_address_length))
5378 address_length_set = 1;
5381 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5382 &v4_next_hop_address))
5386 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5387 &v6_next_hop_address))
5391 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5393 else if (unformat (i, "weight %d", &next_hop_weight))
5395 else if (unformat (i, "drop"))
5399 else if (unformat (i, "local"))
5403 else if (unformat (i, "classify %d", &classify_table_index))
5407 else if (unformat (i, "del"))
5409 else if (unformat (i, "add"))
5411 else if (unformat (i, "not-last"))
5413 else if (unformat (i, "multipath"))
5415 else if (unformat (i, "vrf %d", &vrf_id))
5417 else if (unformat (i, "create-vrf"))
5418 create_vrf_if_needed = 1;
5419 else if (unformat (i, "count %d", &count))
5421 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
5423 else if (unformat (i, "random"))
5425 else if (unformat (i, "seed %d", &random_seed))
5429 clib_warning ("parse error '%U'", format_unformat_error, i);
5434 if (resolve_attempts > 0 && sw_if_index_set == 0)
5436 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5440 if (!next_hop_set && !is_drop && !is_local && !is_classify)
5442 errmsg ("next hop / local / drop / classify not set\n");
5446 if (address_set == 0)
5448 errmsg ("missing addresses\n");
5452 if (address_length_set == 0)
5454 errmsg ("missing address length\n");
5458 /* Generate a pile of unique, random routes */
5461 u32 this_random_address;
5462 random_hash = hash_create (count, sizeof (uword));
5464 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5465 for (j = 0; j <= count; j++)
5469 this_random_address = random_u32 (&random_seed);
5470 this_random_address =
5471 clib_host_to_net_u32 (this_random_address);
5473 while (hash_get (random_hash, this_random_address));
5474 vec_add1 (random_vector, this_random_address);
5475 hash_set (random_hash, this_random_address, 1);
5477 hash_free (random_hash);
5478 v4_dst_address.as_u32 = random_vector[0];
5483 /* Turn on async mode */
5484 vam->async_mode = 1;
5485 vam->async_errors = 0;
5486 before = vat_time_now (vam);
5489 for (j = 0; j < count; j++)
5491 /* Construct the API message */
5492 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
5494 mp->next_hop_sw_if_index = ntohl (sw_if_index);
5495 mp->vrf_id = ntohl (vrf_id);
5496 if (resolve_attempts > 0)
5498 mp->resolve_attempts = ntohl (resolve_attempts);
5499 mp->resolve_if_needed = 1;
5501 mp->create_vrf_if_needed = create_vrf_if_needed;
5503 mp->is_add = is_add;
5504 mp->is_drop = is_drop;
5505 mp->is_ipv6 = is_ipv6;
5506 mp->is_local = is_local;
5507 mp->is_classify = is_classify;
5508 mp->is_multipath = is_multipath;
5509 mp->not_last = not_last;
5510 mp->next_hop_weight = next_hop_weight;
5511 mp->dst_address_length = dst_address_length;
5512 mp->lookup_in_vrf = ntohl (lookup_in_vrf);
5513 mp->classify_table_index = ntohl (classify_table_index);
5517 clib_memcpy (mp->dst_address, &v6_dst_address,
5518 sizeof (v6_dst_address));
5520 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5521 sizeof (v6_next_hop_address));
5522 increment_v6_address (&v6_dst_address);
5526 clib_memcpy (mp->dst_address, &v4_dst_address,
5527 sizeof (v4_dst_address));
5529 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5530 sizeof (v4_next_hop_address));
5532 v4_dst_address.as_u32 = random_vector[j + 1];
5534 increment_v4_address (&v4_dst_address);
5540 /* When testing multiple add/del ops, use a control-ping to sync */
5543 vl_api_control_ping_t *mp;
5546 /* Shut off async mode */
5547 vam->async_mode = 0;
5549 M (CONTROL_PING, control_ping);
5552 timeout = vat_time_now (vam) + 1.0;
5553 while (vat_time_now (vam) < timeout)
5554 if (vam->result_ready == 1)
5559 if (vam->retval == -99)
5560 errmsg ("timeout\n");
5562 if (vam->async_errors > 0)
5564 errmsg ("%d asynchronous errors\n", vam->async_errors);
5567 vam->async_errors = 0;
5568 after = vat_time_now (vam);
5570 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5571 count, after - before, count / (after - before));
5575 /* Wait for a reply... */
5579 /* Return the good/bad news */
5580 return (vam->retval);
5584 api_proxy_arp_add_del (vat_main_t * vam)
5586 unformat_input_t *i = vam->input;
5587 vl_api_proxy_arp_add_del_t *mp;
5591 ip4_address_t lo, hi;
5594 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5596 if (unformat (i, "vrf %d", &vrf_id))
5598 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
5599 unformat_ip4_address, &hi))
5601 else if (unformat (i, "del"))
5605 clib_warning ("parse error '%U'", format_unformat_error, i);
5612 errmsg ("address range not set\n");
5616 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
5618 mp->vrf_id = ntohl (vrf_id);
5619 mp->is_add = is_add;
5620 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
5621 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
5630 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
5632 unformat_input_t *i = vam->input;
5633 vl_api_proxy_arp_intfc_enable_disable_t *mp;
5637 u8 sw_if_index_set = 0;
5639 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5641 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5642 sw_if_index_set = 1;
5643 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5644 sw_if_index_set = 1;
5645 else if (unformat (i, "enable"))
5647 else if (unformat (i, "disable"))
5651 clib_warning ("parse error '%U'", format_unformat_error, i);
5656 if (sw_if_index_set == 0)
5658 errmsg ("missing interface name or sw_if_index\n");
5662 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
5664 mp->sw_if_index = ntohl (sw_if_index);
5665 mp->enable_disable = enable;
5674 api_mpls_add_del_decap (vat_main_t * vam)
5676 unformat_input_t *i = vam->input;
5677 vl_api_mpls_add_del_decap_t *mp;
5686 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5688 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
5690 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
5692 else if (unformat (i, "label %d", &label))
5694 else if (unformat (i, "next-index %d", &next_index))
5696 else if (unformat (i, "del"))
5698 else if (unformat (i, "s-bit-clear"))
5702 clib_warning ("parse error '%U'", format_unformat_error, i);
5707 M (MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
5709 mp->rx_vrf_id = ntohl (rx_vrf_id);
5710 mp->tx_vrf_id = ntohl (tx_vrf_id);
5711 mp->label = ntohl (label);
5712 mp->next_index = ntohl (next_index);
5714 mp->is_add = is_add;
5723 api_mpls_add_del_encap (vat_main_t * vam)
5725 unformat_input_t *i = vam->input;
5726 vl_api_mpls_add_del_encap_t *mp;
5731 ip4_address_t dst_address;
5734 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5736 if (unformat (i, "vrf %d", &vrf_id))
5738 else if (unformat (i, "label %d", &label))
5739 vec_add1 (labels, ntohl (label));
5740 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5742 else if (unformat (i, "del"))
5746 clib_warning ("parse error '%U'", format_unformat_error, i);
5751 if (vec_len (labels) == 0)
5753 errmsg ("missing encap label stack\n");
5757 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
5758 sizeof (u32) * vec_len (labels));
5760 mp->vrf_id = ntohl (vrf_id);
5761 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5762 mp->is_add = is_add;
5763 mp->nlabels = vec_len (labels);
5764 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
5775 api_mpls_gre_add_del_tunnel (vat_main_t * vam)
5777 unformat_input_t *i = vam->input;
5778 vl_api_mpls_gre_add_del_tunnel_t *mp;
5780 u32 inner_vrf_id = 0;
5781 u32 outer_vrf_id = 0;
5782 ip4_address_t src_address;
5783 ip4_address_t dst_address;
5784 ip4_address_t intfc_address;
5786 u8 intfc_address_length = 0;
5790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5792 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5794 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5796 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
5798 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5800 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5801 &intfc_address, &tmp))
5802 intfc_address_length = tmp;
5803 else if (unformat (i, "l2-only"))
5805 else if (unformat (i, "del"))
5809 clib_warning ("parse error '%U'", format_unformat_error, i);
5814 M (MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
5816 mp->inner_vrf_id = ntohl (inner_vrf_id);
5817 mp->outer_vrf_id = ntohl (outer_vrf_id);
5818 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
5819 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5820 clib_memcpy (mp->intfc_address, &intfc_address, sizeof (intfc_address));
5821 mp->intfc_address_length = intfc_address_length;
5822 mp->l2_only = l2_only;
5823 mp->is_add = is_add;
5832 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
5834 unformat_input_t *i = vam->input;
5835 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
5837 u32 inner_vrf_id = 0;
5838 ip4_address_t intfc_address;
5839 u8 dst_mac_address[6];
5842 u8 intfc_address_length = 0;
5846 int tx_sw_if_index_set = 0;
5848 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5850 if (unformat (i, "vrf %d", &inner_vrf_id))
5852 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5853 &intfc_address, &tmp))
5854 intfc_address_length = tmp;
5855 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
5856 tx_sw_if_index_set = 1;
5857 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5858 tx_sw_if_index_set = 1;
5859 else if (unformat (i, "dst %U", unformat_ethernet_address,
5862 else if (unformat (i, "l2-only"))
5864 else if (unformat (i, "del"))
5868 clib_warning ("parse error '%U'", format_unformat_error, i);
5875 errmsg ("dst (mac address) not set\n");
5878 if (!tx_sw_if_index_set)
5880 errmsg ("tx-intfc not set\n");
5884 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
5886 mp->vrf_id = ntohl (inner_vrf_id);
5887 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
5888 mp->adj_address_length = intfc_address_length;
5889 clib_memcpy (mp->dst_mac_address, dst_mac_address,
5890 sizeof (dst_mac_address));
5891 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5892 mp->l2_only = l2_only;
5893 mp->is_add = is_add;
5902 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
5904 unformat_input_t *i = vam->input;
5905 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
5907 u32 inner_vrf_id = 0;
5908 u32 outer_vrf_id = 0;
5909 ip4_address_t adj_address;
5910 int adj_address_set = 0;
5911 ip4_address_t next_hop_address;
5912 int next_hop_address_set = 0;
5914 u8 adj_address_length = 0;
5917 u32 resolve_attempts = 5;
5918 u8 resolve_if_needed = 1;
5920 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5922 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5924 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5926 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5927 &adj_address, &tmp))
5929 adj_address_length = tmp;
5930 adj_address_set = 1;
5932 else if (unformat (i, "next-hop %U", unformat_ip4_address,
5934 next_hop_address_set = 1;
5935 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5937 else if (unformat (i, "resolve-if-needed %d", &tmp))
5938 resolve_if_needed = tmp;
5939 else if (unformat (i, "l2-only"))
5941 else if (unformat (i, "del"))
5945 clib_warning ("parse error '%U'", format_unformat_error, i);
5950 if (!adj_address_set)
5952 errmsg ("adjacency address/mask not set\n");
5955 if (!next_hop_address_set)
5957 errmsg ("ip4 next hop address (in outer fib) not set\n");
5961 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
5963 mp->inner_vrf_id = ntohl (inner_vrf_id);
5964 mp->outer_vrf_id = ntohl (outer_vrf_id);
5965 mp->resolve_attempts = ntohl (resolve_attempts);
5966 mp->resolve_if_needed = resolve_if_needed;
5967 mp->is_add = is_add;
5968 mp->l2_only = l2_only;
5969 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
5970 mp->adj_address_length = adj_address_length;
5971 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
5972 sizeof (next_hop_address));
5981 api_sw_interface_set_unnumbered (vat_main_t * vam)
5983 unformat_input_t *i = vam->input;
5984 vl_api_sw_interface_set_unnumbered_t *mp;
5987 u32 unnum_sw_index = ~0;
5989 u8 sw_if_index_set = 0;
5991 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5993 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5994 sw_if_index_set = 1;
5995 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5996 sw_if_index_set = 1;
5997 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
5999 else if (unformat (i, "del"))
6003 clib_warning ("parse error '%U'", format_unformat_error, i);
6008 if (sw_if_index_set == 0)
6010 errmsg ("missing interface name or sw_if_index\n");
6014 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
6016 mp->sw_if_index = ntohl (sw_if_index);
6017 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6018 mp->is_add = is_add;
6027 api_ip_neighbor_add_del (vat_main_t * vam)
6029 unformat_input_t *i = vam->input;
6030 vl_api_ip_neighbor_add_del_t *mp;
6033 u8 sw_if_index_set = 0;
6039 u8 v4_address_set = 0;
6040 u8 v6_address_set = 0;
6041 ip4_address_t v4address;
6042 ip6_address_t v6address;
6044 memset (mac_address, 0, sizeof (mac_address));
6046 /* Parse args required to build the message */
6047 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6049 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6053 else if (unformat (i, "del"))
6055 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6056 sw_if_index_set = 1;
6057 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6058 sw_if_index_set = 1;
6059 else if (unformat (i, "is_static"))
6061 else if (unformat (i, "vrf %d", &vrf_id))
6063 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6065 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6069 clib_warning ("parse error '%U'", format_unformat_error, i);
6074 if (sw_if_index_set == 0)
6076 errmsg ("missing interface name or sw_if_index\n");
6079 if (v4_address_set && v6_address_set)
6081 errmsg ("both v4 and v6 addresses set\n");
6084 if (!v4_address_set && !v6_address_set)
6086 errmsg ("no address set\n");
6090 /* Construct the API message */
6091 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6093 mp->sw_if_index = ntohl (sw_if_index);
6094 mp->is_add = is_add;
6095 mp->vrf_id = ntohl (vrf_id);
6096 mp->is_static = is_static;
6098 clib_memcpy (mp->mac_address, mac_address, 6);
6102 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6106 /* mp->is_ipv6 = 0; via memset in M macro above */
6107 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6113 /* Wait for a reply, return good/bad news */
6121 api_reset_vrf (vat_main_t * vam)
6123 unformat_input_t *i = vam->input;
6124 vl_api_reset_vrf_t *mp;
6130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6132 if (unformat (i, "vrf %d", &vrf_id))
6134 else if (unformat (i, "ipv6"))
6138 clib_warning ("parse error '%U'", format_unformat_error, i);
6143 if (vrf_id_set == 0)
6145 errmsg ("missing vrf id\n");
6149 M (RESET_VRF, reset_vrf);
6151 mp->vrf_id = ntohl (vrf_id);
6152 mp->is_ipv6 = is_ipv6;
6161 api_create_vlan_subif (vat_main_t * vam)
6163 unformat_input_t *i = vam->input;
6164 vl_api_create_vlan_subif_t *mp;
6167 u8 sw_if_index_set = 0;
6171 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6173 if (unformat (i, "sw_if_index %d", &sw_if_index))
6174 sw_if_index_set = 1;
6175 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6176 sw_if_index_set = 1;
6177 else if (unformat (i, "vlan %d", &vlan_id))
6181 clib_warning ("parse error '%U'", format_unformat_error, i);
6186 if (sw_if_index_set == 0)
6188 errmsg ("missing interface name or sw_if_index\n");
6192 if (vlan_id_set == 0)
6194 errmsg ("missing vlan_id\n");
6197 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6199 mp->sw_if_index = ntohl (sw_if_index);
6200 mp->vlan_id = ntohl (vlan_id);
6208 #define foreach_create_subif_bit \
6215 _(outer_vlan_id_any) \
6216 _(inner_vlan_id_any)
6219 api_create_subif (vat_main_t * vam)
6221 unformat_input_t *i = vam->input;
6222 vl_api_create_subif_t *mp;
6225 u8 sw_if_index_set = 0;
6232 u32 exact_match = 0;
6233 u32 default_sub = 0;
6234 u32 outer_vlan_id_any = 0;
6235 u32 inner_vlan_id_any = 0;
6237 u16 outer_vlan_id = 0;
6238 u16 inner_vlan_id = 0;
6240 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6242 if (unformat (i, "sw_if_index %d", &sw_if_index))
6243 sw_if_index_set = 1;
6244 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6245 sw_if_index_set = 1;
6246 else if (unformat (i, "sub_id %d", &sub_id))
6248 else if (unformat (i, "outer_vlan_id %d", &tmp))
6249 outer_vlan_id = tmp;
6250 else if (unformat (i, "inner_vlan_id %d", &tmp))
6251 inner_vlan_id = tmp;
6253 #define _(a) else if (unformat (i, #a)) a = 1 ;
6254 foreach_create_subif_bit
6258 clib_warning ("parse error '%U'", format_unformat_error, i);
6263 if (sw_if_index_set == 0)
6265 errmsg ("missing interface name or sw_if_index\n");
6269 if (sub_id_set == 0)
6271 errmsg ("missing sub_id\n");
6274 M (CREATE_SUBIF, create_subif);
6276 mp->sw_if_index = ntohl (sw_if_index);
6277 mp->sub_id = ntohl (sub_id);
6279 #define _(a) mp->a = a;
6280 foreach_create_subif_bit;
6283 mp->outer_vlan_id = ntohs (outer_vlan_id);
6284 mp->inner_vlan_id = ntohs (inner_vlan_id);
6293 api_oam_add_del (vat_main_t * vam)
6295 unformat_input_t *i = vam->input;
6296 vl_api_oam_add_del_t *mp;
6300 ip4_address_t src, dst;
6304 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6306 if (unformat (i, "vrf %d", &vrf_id))
6308 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6310 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6312 else if (unformat (i, "del"))
6316 clib_warning ("parse error '%U'", format_unformat_error, i);
6323 errmsg ("missing src addr\n");
6329 errmsg ("missing dst addr\n");
6333 M (OAM_ADD_DEL, oam_add_del);
6335 mp->vrf_id = ntohl (vrf_id);
6336 mp->is_add = is_add;
6337 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6338 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6347 api_reset_fib (vat_main_t * vam)
6349 unformat_input_t *i = vam->input;
6350 vl_api_reset_fib_t *mp;
6356 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6358 if (unformat (i, "vrf %d", &vrf_id))
6360 else if (unformat (i, "ipv6"))
6364 clib_warning ("parse error '%U'", format_unformat_error, i);
6369 if (vrf_id_set == 0)
6371 errmsg ("missing vrf id\n");
6375 M (RESET_FIB, reset_fib);
6377 mp->vrf_id = ntohl (vrf_id);
6378 mp->is_ipv6 = is_ipv6;
6387 api_dhcp_proxy_config (vat_main_t * vam)
6389 unformat_input_t *i = vam->input;
6390 vl_api_dhcp_proxy_config_t *mp;
6395 u8 v4_address_set = 0;
6396 u8 v6_address_set = 0;
6397 ip4_address_t v4address;
6398 ip6_address_t v6address;
6399 u8 v4_src_address_set = 0;
6400 u8 v6_src_address_set = 0;
6401 ip4_address_t v4srcaddress;
6402 ip6_address_t v6srcaddress;
6404 /* Parse args required to build the message */
6405 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6407 if (unformat (i, "del"))
6409 else if (unformat (i, "vrf %d", &vrf_id))
6411 else if (unformat (i, "insert-cid %d", &insert_cid))
6413 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6415 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6417 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6418 v4_src_address_set = 1;
6419 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6420 v6_src_address_set = 1;
6425 if (v4_address_set && v6_address_set)
6427 errmsg ("both v4 and v6 server addresses set\n");
6430 if (!v4_address_set && !v6_address_set)
6432 errmsg ("no server addresses set\n");
6436 if (v4_src_address_set && v6_src_address_set)
6438 errmsg ("both v4 and v6 src addresses set\n");
6441 if (!v4_src_address_set && !v6_src_address_set)
6443 errmsg ("no src addresses set\n");
6447 if (!(v4_src_address_set && v4_address_set) &&
6448 !(v6_src_address_set && v6_address_set))
6450 errmsg ("no matching server and src addresses set\n");
6454 /* Construct the API message */
6455 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
6457 mp->insert_circuit_id = insert_cid;
6458 mp->is_add = is_add;
6459 mp->vrf_id = ntohl (vrf_id);
6463 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6464 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6468 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6469 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6475 /* Wait for a reply, return good/bad news */
6482 api_dhcp_proxy_config_2 (vat_main_t * vam)
6484 unformat_input_t *i = vam->input;
6485 vl_api_dhcp_proxy_config_2_t *mp;
6488 u32 server_vrf_id = 0;
6491 u8 v4_address_set = 0;
6492 u8 v6_address_set = 0;
6493 ip4_address_t v4address;
6494 ip6_address_t v6address;
6495 u8 v4_src_address_set = 0;
6496 u8 v6_src_address_set = 0;
6497 ip4_address_t v4srcaddress;
6498 ip6_address_t v6srcaddress;
6500 /* Parse args required to build the message */
6501 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6503 if (unformat (i, "del"))
6505 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
6507 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
6509 else if (unformat (i, "insert-cid %d", &insert_cid))
6511 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6513 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6515 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6516 v4_src_address_set = 1;
6517 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6518 v6_src_address_set = 1;
6523 if (v4_address_set && v6_address_set)
6525 errmsg ("both v4 and v6 server addresses set\n");
6528 if (!v4_address_set && !v6_address_set)
6530 errmsg ("no server addresses set\n");
6534 if (v4_src_address_set && v6_src_address_set)
6536 errmsg ("both v4 and v6 src addresses set\n");
6539 if (!v4_src_address_set && !v6_src_address_set)
6541 errmsg ("no src addresses set\n");
6545 if (!(v4_src_address_set && v4_address_set) &&
6546 !(v6_src_address_set && v6_address_set))
6548 errmsg ("no matching server and src addresses set\n");
6552 /* Construct the API message */
6553 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
6555 mp->insert_circuit_id = insert_cid;
6556 mp->is_add = is_add;
6557 mp->rx_vrf_id = ntohl (rx_vrf_id);
6558 mp->server_vrf_id = ntohl (server_vrf_id);
6562 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6563 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6567 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6568 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6574 /* Wait for a reply, return good/bad news */
6581 api_dhcp_proxy_set_vss (vat_main_t * vam)
6583 unformat_input_t *i = vam->input;
6584 vl_api_dhcp_proxy_set_vss_t *mp;
6595 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6597 if (unformat (i, "tbl_id %d", &tbl_id))
6599 if (unformat (i, "fib_id %d", &fib_id))
6601 if (unformat (i, "oui %d", &oui))
6603 else if (unformat (i, "ipv6"))
6605 else if (unformat (i, "del"))
6609 clib_warning ("parse error '%U'", format_unformat_error, i);
6614 if (tbl_id_set == 0)
6616 errmsg ("missing tbl id\n");
6620 if (fib_id_set == 0)
6622 errmsg ("missing fib id\n");
6627 errmsg ("missing oui\n");
6631 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
6632 mp->tbl_id = ntohl (tbl_id);
6633 mp->fib_id = ntohl (fib_id);
6634 mp->oui = ntohl (oui);
6635 mp->is_ipv6 = is_ipv6;
6636 mp->is_add = is_add;
6645 api_dhcp_client_config (vat_main_t * vam)
6647 unformat_input_t *i = vam->input;
6648 vl_api_dhcp_client_config_t *mp;
6651 u8 sw_if_index_set = 0;
6654 u8 disable_event = 0;
6656 /* Parse args required to build the message */
6657 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6659 if (unformat (i, "del"))
6661 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6662 sw_if_index_set = 1;
6663 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6664 sw_if_index_set = 1;
6665 else if (unformat (i, "hostname %s", &hostname))
6667 else if (unformat (i, "disable_event"))
6673 if (sw_if_index_set == 0)
6675 errmsg ("missing interface name or sw_if_index\n");
6679 if (vec_len (hostname) > 63)
6681 errmsg ("hostname too long\n");
6683 vec_add1 (hostname, 0);
6685 /* Construct the API message */
6686 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
6688 mp->sw_if_index = ntohl (sw_if_index);
6689 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
6690 vec_free (hostname);
6691 mp->is_add = is_add;
6692 mp->want_dhcp_event = disable_event ? 0 : 1;
6693 mp->pid = getpid ();
6698 /* Wait for a reply, return good/bad news */
6705 api_set_ip_flow_hash (vat_main_t * vam)
6707 unformat_input_t *i = vam->input;
6708 vl_api_set_ip_flow_hash_t *mp;
6720 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6722 if (unformat (i, "vrf %d", &vrf_id))
6724 else if (unformat (i, "ipv6"))
6726 else if (unformat (i, "src"))
6728 else if (unformat (i, "dst"))
6730 else if (unformat (i, "sport"))
6732 else if (unformat (i, "dport"))
6734 else if (unformat (i, "proto"))
6736 else if (unformat (i, "reverse"))
6741 clib_warning ("parse error '%U'", format_unformat_error, i);
6746 if (vrf_id_set == 0)
6748 errmsg ("missing vrf id\n");
6752 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
6758 mp->reverse = reverse;
6759 mp->vrf_id = ntohl (vrf_id);
6760 mp->is_ipv6 = is_ipv6;
6769 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
6771 unformat_input_t *i = vam->input;
6772 vl_api_sw_interface_ip6_enable_disable_t *mp;
6775 u8 sw_if_index_set = 0;
6778 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6780 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6781 sw_if_index_set = 1;
6782 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6783 sw_if_index_set = 1;
6784 else if (unformat (i, "enable"))
6786 else if (unformat (i, "disable"))
6790 clib_warning ("parse error '%U'", format_unformat_error, i);
6795 if (sw_if_index_set == 0)
6797 errmsg ("missing interface name or sw_if_index\n");
6801 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
6803 mp->sw_if_index = ntohl (sw_if_index);
6804 mp->enable = enable;
6813 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
6815 unformat_input_t *i = vam->input;
6816 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
6819 u8 sw_if_index_set = 0;
6820 u32 address_length = 0;
6821 u8 v6_address_set = 0;
6822 ip6_address_t v6address;
6824 /* Parse args required to build the message */
6825 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6827 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6828 sw_if_index_set = 1;
6829 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6830 sw_if_index_set = 1;
6831 else if (unformat (i, "%U/%d",
6832 unformat_ip6_address, &v6address, &address_length))
6838 if (sw_if_index_set == 0)
6840 errmsg ("missing interface name or sw_if_index\n");
6843 if (!v6_address_set)
6845 errmsg ("no address set\n");
6849 /* Construct the API message */
6850 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
6851 sw_interface_ip6_set_link_local_address);
6853 mp->sw_if_index = ntohl (sw_if_index);
6854 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6855 mp->address_length = address_length;
6860 /* Wait for a reply, return good/bad news */
6869 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
6871 unformat_input_t *i = vam->input;
6872 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
6875 u8 sw_if_index_set = 0;
6876 u32 address_length = 0;
6877 u8 v6_address_set = 0;
6878 ip6_address_t v6address;
6880 u8 no_advertise = 0;
6882 u8 no_autoconfig = 0;
6885 u32 val_lifetime = 0;
6886 u32 pref_lifetime = 0;
6888 /* Parse args required to build the message */
6889 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6891 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6892 sw_if_index_set = 1;
6893 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6894 sw_if_index_set = 1;
6895 else if (unformat (i, "%U/%d",
6896 unformat_ip6_address, &v6address, &address_length))
6898 else if (unformat (i, "val_life %d", &val_lifetime))
6900 else if (unformat (i, "pref_life %d", &pref_lifetime))
6902 else if (unformat (i, "def"))
6904 else if (unformat (i, "noadv"))
6906 else if (unformat (i, "offl"))
6908 else if (unformat (i, "noauto"))
6910 else if (unformat (i, "nolink"))
6912 else if (unformat (i, "isno"))
6916 clib_warning ("parse error '%U'", format_unformat_error, i);
6921 if (sw_if_index_set == 0)
6923 errmsg ("missing interface name or sw_if_index\n");
6926 if (!v6_address_set)
6928 errmsg ("no address set\n");
6932 /* Construct the API message */
6933 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
6935 mp->sw_if_index = ntohl (sw_if_index);
6936 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6937 mp->address_length = address_length;
6938 mp->use_default = use_default;
6939 mp->no_advertise = no_advertise;
6940 mp->off_link = off_link;
6941 mp->no_autoconfig = no_autoconfig;
6942 mp->no_onlink = no_onlink;
6944 mp->val_lifetime = ntohl (val_lifetime);
6945 mp->pref_lifetime = ntohl (pref_lifetime);
6950 /* Wait for a reply, return good/bad news */
6958 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
6960 unformat_input_t *i = vam->input;
6961 vl_api_sw_interface_ip6nd_ra_config_t *mp;
6964 u8 sw_if_index_set = 0;
6969 u8 send_unicast = 0;
6972 u8 default_router = 0;
6973 u32 max_interval = 0;
6974 u32 min_interval = 0;
6976 u32 initial_count = 0;
6977 u32 initial_interval = 0;
6980 /* Parse args required to build the message */
6981 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6983 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6984 sw_if_index_set = 1;
6985 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6986 sw_if_index_set = 1;
6987 else if (unformat (i, "maxint %d", &max_interval))
6989 else if (unformat (i, "minint %d", &min_interval))
6991 else if (unformat (i, "life %d", &lifetime))
6993 else if (unformat (i, "count %d", &initial_count))
6995 else if (unformat (i, "interval %d", &initial_interval))
6997 else if (unformat (i, "suppress") || unformat (i, "surpress"))
6999 else if (unformat (i, "managed"))
7001 else if (unformat (i, "other"))
7003 else if (unformat (i, "ll"))
7005 else if (unformat (i, "send"))
7007 else if (unformat (i, "cease"))
7009 else if (unformat (i, "isno"))
7011 else if (unformat (i, "def"))
7015 clib_warning ("parse error '%U'", format_unformat_error, i);
7020 if (sw_if_index_set == 0)
7022 errmsg ("missing interface name or sw_if_index\n");
7026 /* Construct the API message */
7027 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
7029 mp->sw_if_index = ntohl (sw_if_index);
7030 mp->max_interval = ntohl (max_interval);
7031 mp->min_interval = ntohl (min_interval);
7032 mp->lifetime = ntohl (lifetime);
7033 mp->initial_count = ntohl (initial_count);
7034 mp->initial_interval = ntohl (initial_interval);
7035 mp->suppress = suppress;
7036 mp->managed = managed;
7038 mp->ll_option = ll_option;
7039 mp->send_unicast = send_unicast;
7042 mp->default_router = default_router;
7047 /* Wait for a reply, return good/bad news */
7055 api_set_arp_neighbor_limit (vat_main_t * vam)
7057 unformat_input_t *i = vam->input;
7058 vl_api_set_arp_neighbor_limit_t *mp;
7064 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7066 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7068 else if (unformat (i, "ipv6"))
7072 clib_warning ("parse error '%U'", format_unformat_error, i);
7079 errmsg ("missing limit value\n");
7083 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
7085 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7086 mp->is_ipv6 = is_ipv6;
7095 api_l2_patch_add_del (vat_main_t * vam)
7097 unformat_input_t *i = vam->input;
7098 vl_api_l2_patch_add_del_t *mp;
7101 u8 rx_sw_if_index_set = 0;
7103 u8 tx_sw_if_index_set = 0;
7106 /* Parse args required to build the message */
7107 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7109 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7110 rx_sw_if_index_set = 1;
7111 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7112 tx_sw_if_index_set = 1;
7113 else if (unformat (i, "rx"))
7115 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7117 if (unformat (i, "%U", unformat_sw_if_index, vam,
7119 rx_sw_if_index_set = 1;
7124 else if (unformat (i, "tx"))
7126 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7128 if (unformat (i, "%U", unformat_sw_if_index, vam,
7130 tx_sw_if_index_set = 1;
7135 else if (unformat (i, "del"))
7141 if (rx_sw_if_index_set == 0)
7143 errmsg ("missing rx interface name or rx_sw_if_index\n");
7147 if (tx_sw_if_index_set == 0)
7149 errmsg ("missing tx interface name or tx_sw_if_index\n");
7153 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7155 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7156 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7157 mp->is_add = is_add;
7166 api_trace_profile_add (vat_main_t * vam)
7168 unformat_input_t *input = vam->input;
7169 vl_api_trace_profile_add_t *mp;
7172 u32 trace_option_elts = 0;
7173 u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
7174 int has_pow_option = 0;
7175 int has_ppc_option = 0;
7177 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7179 if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
7180 "trace-tsp %d node-id 0x%x app-data 0x%x",
7181 &id, &trace_type, &trace_option_elts, &trace_tsp,
7182 &node_id, &app_data))
7184 else if (unformat (input, "pow"))
7186 else if (unformat (input, "ppc encap"))
7187 has_ppc_option = PPC_ENCAP;
7188 else if (unformat (input, "ppc decap"))
7189 has_ppc_option = PPC_DECAP;
7190 else if (unformat (input, "ppc none"))
7191 has_ppc_option = PPC_NONE;
7195 M (TRACE_PROFILE_ADD, trace_profile_add);
7196 mp->id = htons (id);
7197 mp->trace_type = trace_type;
7198 mp->trace_num_elt = trace_option_elts;
7199 mp->trace_ppc = has_ppc_option;
7200 mp->trace_app_data = htonl (app_data);
7201 mp->pow_enable = has_pow_option;
7202 mp->trace_tsp = trace_tsp;
7203 mp->node_id = htonl (node_id);
7213 api_trace_profile_apply (vat_main_t * vam)
7215 unformat_input_t *input = vam->input;
7216 vl_api_trace_profile_apply_t *mp;
7219 u32 mask_width = ~0;
7226 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7228 if (unformat (input, "%U/%d", unformat_ip6_address, &addr, &mask_width))
7230 else if (unformat (input, "id %d", &id))
7232 else if (unformat (input, "vrf-id %d", &vrf_id))
7234 else if (unformat (input, "add"))
7236 else if (unformat (input, "pop"))
7238 else if (unformat (input, "none"))
7244 if ((is_add + is_pop + is_none) != 1)
7246 errmsg ("One of (add, pop, none) required");
7249 if (mask_width == ~0)
7251 errmsg ("<address>/<mask-width> required");
7254 M (TRACE_PROFILE_APPLY, trace_profile_apply);
7255 clib_memcpy (mp->dest_ipv6, &addr, sizeof (mp->dest_ipv6));
7256 mp->id = htons (id);
7257 mp->prefix_length = htonl (mask_width);
7258 mp->vrf_id = htonl (vrf_id);
7260 mp->trace_op = IOAM_HBYH_ADD;
7262 mp->trace_op = IOAM_HBYH_POP;
7264 mp->trace_op = IOAM_HBYH_MOD;
7278 api_trace_profile_del (vat_main_t * vam)
7280 vl_api_trace_profile_del_t *mp;
7283 M (TRACE_PROFILE_DEL, trace_profile_del);
7290 api_sr_tunnel_add_del (vat_main_t * vam)
7292 unformat_input_t *i = vam->input;
7293 vl_api_sr_tunnel_add_del_t *mp;
7297 ip6_address_t src_address;
7298 int src_address_set = 0;
7299 ip6_address_t dst_address;
7301 int dst_address_set = 0;
7303 u32 rx_table_id = 0;
7304 u32 tx_table_id = 0;
7305 ip6_address_t *segments = 0;
7306 ip6_address_t *this_seg;
7307 ip6_address_t *tags = 0;
7308 ip6_address_t *this_tag;
7309 ip6_address_t next_address, tag;
7311 u8 *policy_name = 0;
7313 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7315 if (unformat (i, "del"))
7317 else if (unformat (i, "name %s", &name))
7319 else if (unformat (i, "policy %s", &policy_name))
7321 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7323 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7325 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7326 src_address_set = 1;
7327 else if (unformat (i, "dst %U/%d",
7328 unformat_ip6_address, &dst_address, &dst_mask_width))
7329 dst_address_set = 1;
7330 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7332 vec_add2 (segments, this_seg, 1);
7333 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7334 sizeof (*this_seg));
7336 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7338 vec_add2 (tags, this_tag, 1);
7339 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7341 else if (unformat (i, "clean"))
7342 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7343 else if (unformat (i, "protected"))
7344 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7345 else if (unformat (i, "InPE %d", &pl_index))
7347 if (pl_index <= 0 || pl_index > 4)
7349 pl_index_range_error:
7350 errmsg ("pl index %d out of range\n", pl_index);
7354 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7356 else if (unformat (i, "EgPE %d", &pl_index))
7358 if (pl_index <= 0 || pl_index > 4)
7359 goto pl_index_range_error;
7361 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7363 else if (unformat (i, "OrgSrc %d", &pl_index))
7365 if (pl_index <= 0 || pl_index > 4)
7366 goto pl_index_range_error;
7368 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7374 if (!src_address_set)
7376 errmsg ("src address required\n");
7380 if (!dst_address_set)
7382 errmsg ("dst address required\n");
7388 errmsg ("at least one sr segment required\n");
7392 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7393 vec_len (segments) * sizeof (ip6_address_t)
7394 + vec_len (tags) * sizeof (ip6_address_t));
7396 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7397 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7398 mp->dst_mask_width = dst_mask_width;
7399 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7400 mp->n_segments = vec_len (segments);
7401 mp->n_tags = vec_len (tags);
7402 mp->is_add = is_del == 0;
7403 clib_memcpy (mp->segs_and_tags, segments,
7404 vec_len (segments) * sizeof (ip6_address_t));
7405 clib_memcpy (mp->segs_and_tags +
7406 vec_len (segments) * sizeof (ip6_address_t), tags,
7407 vec_len (tags) * sizeof (ip6_address_t));
7409 mp->outer_vrf_id = ntohl (rx_table_id);
7410 mp->inner_vrf_id = ntohl (tx_table_id);
7411 memcpy (mp->name, name, vec_len (name));
7412 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7414 vec_free (segments);
7423 api_sr_policy_add_del (vat_main_t * vam)
7425 unformat_input_t *input = vam->input;
7426 vl_api_sr_policy_add_del_t *mp;
7430 u8 *tunnel_name = 0;
7431 u8 **tunnel_names = 0;
7436 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
7437 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
7439 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7441 if (unformat (input, "del"))
7443 else if (unformat (input, "name %s", &name))
7445 else if (unformat (input, "tunnel %s", &tunnel_name))
7449 vec_add1 (tunnel_names, tunnel_name);
7451 - length = #bytes to store in serial vector
7452 - +1 = byte to store that length
7454 tunnel_names_length += (vec_len (tunnel_name) + 1);
7465 errmsg ("policy name required\n");
7469 if ((!tunnel_set) && (!is_del))
7471 errmsg ("tunnel name required\n");
7475 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
7479 mp->is_add = !is_del;
7481 memcpy (mp->name, name, vec_len (name));
7482 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
7483 u8 *serial_orig = 0;
7484 vec_validate (serial_orig, tunnel_names_length);
7485 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
7486 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
7488 for (j = 0; j < vec_len (tunnel_names); j++)
7490 tun_name_len = vec_len (tunnel_names[j]);
7491 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
7492 serial_orig += 1; // Move along one byte to store the actual tunnel name
7493 memcpy (serial_orig, tunnel_names[j], tun_name_len);
7494 serial_orig += tun_name_len; // Advance past the copy
7496 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
7498 vec_free (tunnel_names);
7499 vec_free (tunnel_name);
7507 api_sr_multicast_map_add_del (vat_main_t * vam)
7509 unformat_input_t *input = vam->input;
7510 vl_api_sr_multicast_map_add_del_t *mp;
7513 ip6_address_t multicast_address;
7514 u8 *policy_name = 0;
7515 int multicast_address_set = 0;
7517 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7519 if (unformat (input, "del"))
7523 (input, "address %U", unformat_ip6_address, &multicast_address))
7524 multicast_address_set = 1;
7525 else if (unformat (input, "sr-policy %s", &policy_name))
7531 if (!is_del && !policy_name)
7533 errmsg ("sr-policy name required\n");
7538 if (!multicast_address_set)
7540 errmsg ("address required\n");
7544 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
7546 mp->is_add = !is_del;
7547 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7548 clib_memcpy (mp->multicast_address, &multicast_address,
7549 sizeof (mp->multicast_address));
7552 vec_free (policy_name);
7560 #define foreach_ip4_proto_field \
7571 unformat_ip4_mask (unformat_input_t * input, va_list * args)
7573 u8 **maskp = va_arg (*args, u8 **);
7575 u8 found_something = 0;
7578 #define _(a) u8 a=0;
7579 foreach_ip4_proto_field;
7585 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7587 if (unformat (input, "version"))
7589 else if (unformat (input, "hdr_length"))
7591 else if (unformat (input, "src"))
7593 else if (unformat (input, "dst"))
7595 else if (unformat (input, "proto"))
7598 #define _(a) else if (unformat (input, #a)) a=1;
7599 foreach_ip4_proto_field
7605 #define _(a) found_something += a;
7606 foreach_ip4_proto_field;
7609 if (found_something == 0)
7612 vec_validate (mask, sizeof (*ip) - 1);
7614 ip = (ip4_header_t *) mask;
7616 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7617 foreach_ip4_proto_field;
7620 ip->ip_version_and_header_length = 0;
7623 ip->ip_version_and_header_length |= 0xF0;
7626 ip->ip_version_and_header_length |= 0x0F;
7632 #define foreach_ip6_proto_field \
7640 unformat_ip6_mask (unformat_input_t * input, va_list * args)
7642 u8 **maskp = va_arg (*args, u8 **);
7644 u8 found_something = 0;
7646 u32 ip_version_traffic_class_and_flow_label;
7648 #define _(a) u8 a=0;
7649 foreach_ip6_proto_field;
7652 u8 traffic_class = 0;
7655 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7657 if (unformat (input, "version"))
7659 else if (unformat (input, "traffic-class"))
7661 else if (unformat (input, "flow-label"))
7663 else if (unformat (input, "src"))
7665 else if (unformat (input, "dst"))
7667 else if (unformat (input, "proto"))
7670 #define _(a) else if (unformat (input, #a)) a=1;
7671 foreach_ip6_proto_field
7677 #define _(a) found_something += a;
7678 foreach_ip6_proto_field;
7681 if (found_something == 0)
7684 vec_validate (mask, sizeof (*ip) - 1);
7686 ip = (ip6_header_t *) mask;
7688 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7689 foreach_ip6_proto_field;
7692 ip_version_traffic_class_and_flow_label = 0;
7695 ip_version_traffic_class_and_flow_label |= 0xF0000000;
7698 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
7701 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
7703 ip->ip_version_traffic_class_and_flow_label =
7704 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
7711 unformat_l3_mask (unformat_input_t * input, va_list * args)
7713 u8 **maskp = va_arg (*args, u8 **);
7715 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7717 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
7719 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
7728 unformat_l2_mask (unformat_input_t * input, va_list * args)
7730 u8 **maskp = va_arg (*args, u8 **);
7745 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7747 if (unformat (input, "src"))
7749 else if (unformat (input, "dst"))
7751 else if (unformat (input, "proto"))
7753 else if (unformat (input, "tag1"))
7755 else if (unformat (input, "tag2"))
7757 else if (unformat (input, "ignore-tag1"))
7759 else if (unformat (input, "ignore-tag2"))
7761 else if (unformat (input, "cos1"))
7763 else if (unformat (input, "cos2"))
7765 else if (unformat (input, "dot1q"))
7767 else if (unformat (input, "dot1ad"))
7772 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
7773 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
7776 if (tag1 || ignore_tag1 || cos1 || dot1q)
7778 if (tag2 || ignore_tag2 || cos2 || dot1ad)
7781 vec_validate (mask, len - 1);
7784 memset (mask, 0xff, 6);
7787 memset (mask + 6, 0xff, 6);
7791 /* inner vlan tag */
7800 mask[21] = mask[20] = 0xff;
7821 mask[16] = mask[17] = 0xff;
7831 mask[12] = mask[13] = 0xff;
7838 unformat_classify_mask (unformat_input_t * input, va_list * args)
7840 u8 **maskp = va_arg (*args, u8 **);
7841 u32 *skipp = va_arg (*args, u32 *);
7842 u32 *matchp = va_arg (*args, u32 *);
7849 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7851 if (unformat (input, "hex %U", unformat_hex_string, &mask))
7853 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
7855 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
7861 if (mask || l2 || l3)
7865 /* "With a free Ethernet header in every package" */
7867 vec_validate (l2, 13);
7871 vec_append (mask, l3);
7876 /* Scan forward looking for the first significant mask octet */
7877 for (i = 0; i < vec_len (mask); i++)
7881 /* compute (skip, match) params */
7882 *skipp = i / sizeof (u32x4);
7883 vec_delete (mask, *skipp * sizeof (u32x4), 0);
7885 /* Pad mask to an even multiple of the vector size */
7886 while (vec_len (mask) % sizeof (u32x4))
7889 match = vec_len (mask) / sizeof (u32x4);
7891 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
7893 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
7894 if (*tmp || *(tmp + 1))
7899 clib_warning ("BUG: match 0");
7901 _vec_len (mask) = match * sizeof (u32x4);
7912 #define foreach_l2_next \
7914 _(ethernet, ETHERNET_INPUT) \
7919 unformat_l2_next_index (unformat_input_t * input, va_list * args)
7921 u32 *miss_next_indexp = va_arg (*args, u32 *);
7926 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
7930 if (unformat (input, "%d", &tmp))
7939 *miss_next_indexp = next_index;
7943 #define foreach_ip_next \
7950 unformat_ip_next_index (unformat_input_t * input, va_list * args)
7952 u32 *miss_next_indexp = va_arg (*args, u32 *);
7957 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
7961 if (unformat (input, "%d", &tmp))
7970 *miss_next_indexp = next_index;
7974 #define foreach_acl_next \
7978 unformat_acl_next_index (unformat_input_t * input, va_list * args)
7980 u32 *miss_next_indexp = va_arg (*args, u32 *);
7985 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
7989 if (unformat (input, "permit"))
7994 else if (unformat (input, "%d", &tmp))
8003 *miss_next_indexp = next_index;
8008 unformat_policer_precolor (unformat_input_t * input, va_list * args)
8010 u32 *r = va_arg (*args, u32 *);
8012 if (unformat (input, "conform-color"))
8013 *r = POLICE_CONFORM;
8014 else if (unformat (input, "exceed-color"))
8023 api_classify_add_del_table (vat_main_t * vam)
8025 unformat_input_t *i = vam->input;
8026 vl_api_classify_add_del_table_t *mp;
8032 u32 table_index = ~0;
8033 u32 next_table_index = ~0;
8034 u32 miss_next_index = ~0;
8035 u32 memory_size = 32 << 20;
8039 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8041 if (unformat (i, "del"))
8043 else if (unformat (i, "buckets %d", &nbuckets))
8045 else if (unformat (i, "memory_size %d", &memory_size))
8047 else if (unformat (i, "skip %d", &skip))
8049 else if (unformat (i, "match %d", &match))
8051 else if (unformat (i, "table %d", &table_index))
8053 else if (unformat (i, "mask %U", unformat_classify_mask,
8054 &mask, &skip, &match))
8056 else if (unformat (i, "next-table %d", &next_table_index))
8058 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8061 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8064 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8071 if (is_add && mask == 0)
8073 errmsg ("Mask required\n");
8077 if (is_add && skip == ~0)
8079 errmsg ("skip count required\n");
8083 if (is_add && match == ~0)
8085 errmsg ("match count required\n");
8089 if (!is_add && table_index == ~0)
8091 errmsg ("table index required for delete\n");
8095 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8097 mp->is_add = is_add;
8098 mp->table_index = ntohl (table_index);
8099 mp->nbuckets = ntohl (nbuckets);
8100 mp->memory_size = ntohl (memory_size);
8101 mp->skip_n_vectors = ntohl (skip);
8102 mp->match_n_vectors = ntohl (match);
8103 mp->next_table_index = ntohl (next_table_index);
8104 mp->miss_next_index = ntohl (miss_next_index);
8105 clib_memcpy (mp->mask, mask, vec_len (mask));
8115 unformat_ip4_match (unformat_input_t * input, va_list * args)
8117 u8 **matchp = va_arg (*args, u8 **);
8124 int src = 0, dst = 0;
8125 ip4_address_t src_val, dst_val;
8132 int fragment_id = 0;
8133 u32 fragment_id_val;
8139 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8141 if (unformat (input, "version %d", &version_val))
8143 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8145 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8147 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8149 else if (unformat (input, "proto %d", &proto_val))
8151 else if (unformat (input, "tos %d", &tos_val))
8153 else if (unformat (input, "length %d", &length_val))
8155 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8157 else if (unformat (input, "ttl %d", &ttl_val))
8159 else if (unformat (input, "checksum %d", &checksum_val))
8165 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8166 + ttl + checksum == 0)
8170 * Aligned because we use the real comparison functions
8172 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8174 ip = (ip4_header_t *) match;
8176 /* These are realistically matched in practice */
8178 ip->src_address.as_u32 = src_val.as_u32;
8181 ip->dst_address.as_u32 = dst_val.as_u32;
8184 ip->protocol = proto_val;
8187 /* These are not, but they're included for completeness */
8189 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8192 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8198 ip->length = length_val;
8204 ip->checksum = checksum_val;
8211 unformat_ip6_match (unformat_input_t * input, va_list * args)
8213 u8 **matchp = va_arg (*args, u8 **);
8218 u8 traffic_class = 0;
8219 u32 traffic_class_val = 0;
8222 int src = 0, dst = 0;
8223 ip6_address_t src_val, dst_val;
8226 int payload_length = 0;
8227 u32 payload_length_val;
8230 u32 ip_version_traffic_class_and_flow_label;
8232 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8234 if (unformat (input, "version %d", &version_val))
8236 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8238 else if (unformat (input, "flow_label %d", &flow_label_val))
8240 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8242 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8244 else if (unformat (input, "proto %d", &proto_val))
8246 else if (unformat (input, "payload_length %d", &payload_length_val))
8248 else if (unformat (input, "hop_limit %d", &hop_limit_val))
8254 if (version + traffic_class + flow_label + src + dst + proto +
8255 payload_length + hop_limit == 0)
8259 * Aligned because we use the real comparison functions
8261 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8263 ip = (ip6_header_t *) match;
8266 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
8269 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
8272 ip->protocol = proto_val;
8274 ip_version_traffic_class_and_flow_label = 0;
8277 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
8280 ip_version_traffic_class_and_flow_label |=
8281 (traffic_class_val & 0xFF) << 20;
8284 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
8286 ip->ip_version_traffic_class_and_flow_label =
8287 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8290 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
8293 ip->hop_limit = hop_limit_val;
8300 unformat_l3_match (unformat_input_t * input, va_list * args)
8302 u8 **matchp = va_arg (*args, u8 **);
8304 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8306 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
8308 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
8317 unformat_vlan_tag (unformat_input_t * input, va_list * args)
8319 u8 *tagp = va_arg (*args, u8 *);
8322 if (unformat (input, "%d", &tag))
8324 tagp[0] = (tag >> 8) & 0x0F;
8325 tagp[1] = tag & 0xFF;
8333 unformat_l2_match (unformat_input_t * input, va_list * args)
8335 u8 **matchp = va_arg (*args, u8 **);
8355 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8357 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
8360 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
8362 else if (unformat (input, "proto %U",
8363 unformat_ethernet_type_host_byte_order, &proto_val))
8365 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
8367 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
8369 else if (unformat (input, "ignore-tag1"))
8371 else if (unformat (input, "ignore-tag2"))
8373 else if (unformat (input, "cos1 %d", &cos1_val))
8375 else if (unformat (input, "cos2 %d", &cos2_val))
8380 if ((src + dst + proto + tag1 + tag2 +
8381 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8384 if (tag1 || ignore_tag1 || cos1)
8386 if (tag2 || ignore_tag2 || cos2)
8389 vec_validate_aligned (match, len - 1, sizeof (u32x4));
8392 clib_memcpy (match, dst_val, 6);
8395 clib_memcpy (match + 6, src_val, 6);
8399 /* inner vlan tag */
8400 match[19] = tag2_val[1];
8401 match[18] = tag2_val[0];
8403 match[18] |= (cos2_val & 0x7) << 5;
8406 match[21] = proto_val & 0xff;
8407 match[20] = proto_val >> 8;
8411 match[15] = tag1_val[1];
8412 match[14] = tag1_val[0];
8415 match[14] |= (cos1_val & 0x7) << 5;
8421 match[15] = tag1_val[1];
8422 match[14] = tag1_val[0];
8425 match[17] = proto_val & 0xff;
8426 match[16] = proto_val >> 8;
8429 match[14] |= (cos1_val & 0x7) << 5;
8435 match[18] |= (cos2_val & 0x7) << 5;
8437 match[14] |= (cos1_val & 0x7) << 5;
8440 match[13] = proto_val & 0xff;
8441 match[12] = proto_val >> 8;
8450 unformat_classify_match (unformat_input_t * input, va_list * args)
8452 u8 **matchp = va_arg (*args, u8 **);
8453 u32 skip_n_vectors = va_arg (*args, u32);
8454 u32 match_n_vectors = va_arg (*args, u32);
8460 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8462 if (unformat (input, "hex %U", unformat_hex_string, &match))
8464 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
8466 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
8472 if (match || l2 || l3)
8476 /* "Win a free Ethernet header in every packet" */
8478 vec_validate_aligned (l2, 13, sizeof (u32x4));
8482 vec_append_aligned (match, l3, sizeof (u32x4));
8487 /* Make sure the vector is big enough even if key is all 0's */
8488 vec_validate_aligned
8489 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
8492 /* Set size, include skipped vectors */
8493 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
8504 api_classify_add_del_session (vat_main_t * vam)
8506 unformat_input_t *i = vam->input;
8507 vl_api_classify_add_del_session_t *mp;
8509 u32 table_index = ~0;
8510 u32 hit_next_index = ~0;
8511 u32 opaque_index = ~0;
8515 u32 skip_n_vectors = 0;
8516 u32 match_n_vectors = 0;
8519 * Warning: you have to supply skip_n and match_n
8520 * because the API client cant simply look at the classify
8524 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8526 if (unformat (i, "del"))
8528 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
8531 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
8534 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
8537 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
8539 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
8541 else if (unformat (i, "opaque-index %d", &opaque_index))
8543 else if (unformat (i, "skip_n %d", &skip_n_vectors))
8545 else if (unformat (i, "match_n %d", &match_n_vectors))
8547 else if (unformat (i, "match %U", unformat_classify_match,
8548 &match, skip_n_vectors, match_n_vectors))
8550 else if (unformat (i, "advance %d", &advance))
8552 else if (unformat (i, "table-index %d", &table_index))
8558 if (table_index == ~0)
8560 errmsg ("Table index required\n");
8564 if (is_add && match == 0)
8566 errmsg ("Match value required\n");
8570 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
8572 mp->is_add = is_add;
8573 mp->table_index = ntohl (table_index);
8574 mp->hit_next_index = ntohl (hit_next_index);
8575 mp->opaque_index = ntohl (opaque_index);
8576 mp->advance = ntohl (advance);
8577 clib_memcpy (mp->match, match, vec_len (match));
8586 api_classify_set_interface_ip_table (vat_main_t * vam)
8588 unformat_input_t *i = vam->input;
8589 vl_api_classify_set_interface_ip_table_t *mp;
8592 int sw_if_index_set;
8593 u32 table_index = ~0;
8596 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8598 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8599 sw_if_index_set = 1;
8600 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8601 sw_if_index_set = 1;
8602 else if (unformat (i, "table %d", &table_index))
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_IP_TABLE, classify_set_interface_ip_table);
8620 mp->sw_if_index = ntohl (sw_if_index);
8621 mp->table_index = ntohl (table_index);
8622 mp->is_ipv6 = is_ipv6;
8631 api_classify_set_interface_l2_tables (vat_main_t * vam)
8633 unformat_input_t *i = vam->input;
8634 vl_api_classify_set_interface_l2_tables_t *mp;
8637 int sw_if_index_set;
8638 u32 ip4_table_index = ~0;
8639 u32 ip6_table_index = ~0;
8640 u32 other_table_index = ~0;
8643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8645 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8646 sw_if_index_set = 1;
8647 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8648 sw_if_index_set = 1;
8649 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8651 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8653 else if (unformat (i, "other-table %d", &other_table_index))
8655 else if (unformat (i, "is-input %d", &is_input))
8659 clib_warning ("parse error '%U'", format_unformat_error, i);
8664 if (sw_if_index_set == 0)
8666 errmsg ("missing interface name or sw_if_index\n");
8671 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
8673 mp->sw_if_index = ntohl (sw_if_index);
8674 mp->ip4_table_index = ntohl (ip4_table_index);
8675 mp->ip6_table_index = ntohl (ip6_table_index);
8676 mp->other_table_index = ntohl (other_table_index);
8677 mp->is_input = (u8) is_input;
8686 api_ipfix_enable (vat_main_t * vam)
8688 unformat_input_t *i = vam->input;
8689 vl_api_ipfix_enable_t *mp;
8690 ip4_address_t collector_address;
8691 u8 collector_address_set = 0;
8692 u32 collector_port = ~0;
8693 ip4_address_t src_address;
8694 u8 src_address_set = 0;
8697 u32 template_interval = ~0;
8700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8702 if (unformat (i, "collector_address %U", unformat_ip4_address,
8703 &collector_address))
8704 collector_address_set = 1;
8705 else if (unformat (i, "collector_port %d", &collector_port))
8707 else if (unformat (i, "src_address %U", unformat_ip4_address,
8709 src_address_set = 1;
8710 else if (unformat (i, "vrf_id %d", &vrf_id))
8712 else if (unformat (i, "path_mtu %d", &path_mtu))
8714 else if (unformat (i, "template_interval %d", &template_interval))
8720 if (collector_address_set == 0)
8722 errmsg ("collector_address required\n");
8726 if (src_address_set == 0)
8728 errmsg ("src_address required\n");
8732 M (IPFIX_ENABLE, ipfix_enable);
8734 memcpy (mp->collector_address, collector_address.data,
8735 sizeof (collector_address.data));
8736 mp->collector_port = htons ((u16) collector_port);
8737 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
8738 mp->vrf_id = htonl (vrf_id);
8739 mp->path_mtu = htonl (path_mtu);
8740 mp->template_interval = htonl (template_interval);
8748 api_get_node_index (vat_main_t * vam)
8750 unformat_input_t *i = vam->input;
8751 vl_api_get_node_index_t *mp;
8755 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8757 if (unformat (i, "node %s", &name))
8764 errmsg ("node name required\n");
8767 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8769 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8773 M (GET_NODE_INDEX, get_node_index);
8774 clib_memcpy (mp->node_name, name, vec_len (name));
8784 api_get_next_index (vat_main_t * vam)
8786 unformat_input_t *i = vam->input;
8787 vl_api_get_next_index_t *mp;
8789 u8 *node_name = 0, *next_node_name = 0;
8791 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8793 if (unformat (i, "node-name %s", &node_name))
8795 else if (unformat (i, "next-node-name %s", &next_node_name))
8801 errmsg ("node name required\n");
8804 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
8806 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8810 if (next_node_name == 0)
8812 errmsg ("next node name required\n");
8815 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
8817 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
8821 M (GET_NEXT_INDEX, get_next_index);
8822 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
8823 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
8824 vec_free (node_name);
8825 vec_free (next_node_name);
8834 api_add_node_next (vat_main_t * vam)
8836 unformat_input_t *i = vam->input;
8837 vl_api_add_node_next_t *mp;
8842 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8844 if (unformat (i, "node %s", &name))
8846 else if (unformat (i, "next %s", &next))
8853 errmsg ("node name required\n");
8856 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8858 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8863 errmsg ("next node required\n");
8866 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
8868 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
8872 M (ADD_NODE_NEXT, add_node_next);
8873 clib_memcpy (mp->node_name, name, vec_len (name));
8874 clib_memcpy (mp->next_name, next, vec_len (next));
8885 api_l2tpv3_create_tunnel (vat_main_t * vam)
8887 unformat_input_t *i = vam->input;
8888 ip6_address_t client_address, our_address;
8889 int client_address_set = 0;
8890 int our_address_set = 0;
8891 u32 local_session_id = 0;
8892 u32 remote_session_id = 0;
8893 u64 local_cookie = 0;
8894 u64 remote_cookie = 0;
8895 u8 l2_sublayer_present = 0;
8896 vl_api_l2tpv3_create_tunnel_t *mp;
8899 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8901 if (unformat (i, "client_address %U", unformat_ip6_address,
8903 client_address_set = 1;
8904 else if (unformat (i, "our_address %U", unformat_ip6_address,
8906 our_address_set = 1;
8907 else if (unformat (i, "local_session_id %d", &local_session_id))
8909 else if (unformat (i, "remote_session_id %d", &remote_session_id))
8911 else if (unformat (i, "local_cookie %lld", &local_cookie))
8913 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
8915 else if (unformat (i, "l2-sublayer-present"))
8916 l2_sublayer_present = 1;
8921 if (client_address_set == 0)
8923 errmsg ("client_address required\n");
8927 if (our_address_set == 0)
8929 errmsg ("our_address required\n");
8933 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
8935 clib_memcpy (mp->client_address, client_address.as_u8,
8936 sizeof (mp->client_address));
8938 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
8940 mp->local_session_id = ntohl (local_session_id);
8941 mp->remote_session_id = ntohl (remote_session_id);
8942 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
8943 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
8944 mp->l2_sublayer_present = l2_sublayer_present;
8954 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
8956 unformat_input_t *i = vam->input;
8958 u8 sw_if_index_set = 0;
8959 u64 new_local_cookie = 0;
8960 u64 new_remote_cookie = 0;
8961 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
8964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8966 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8967 sw_if_index_set = 1;
8968 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8969 sw_if_index_set = 1;
8970 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
8972 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
8978 if (sw_if_index_set == 0)
8980 errmsg ("missing interface name or sw_if_index\n");
8984 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
8986 mp->sw_if_index = ntohl (sw_if_index);
8987 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
8988 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
8997 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
8999 unformat_input_t *i = vam->input;
9000 vl_api_l2tpv3_interface_enable_disable_t *mp;
9003 u8 sw_if_index_set = 0;
9004 u8 enable_disable = 1;
9006 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9008 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9009 sw_if_index_set = 1;
9010 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9011 sw_if_index_set = 1;
9012 else if (unformat (i, "enable"))
9014 else if (unformat (i, "disable"))
9020 if (sw_if_index_set == 0)
9022 errmsg ("missing interface name or sw_if_index\n");
9026 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
9028 mp->sw_if_index = ntohl (sw_if_index);
9029 mp->enable_disable = enable_disable;
9038 api_l2tpv3_set_lookup_key (vat_main_t * vam)
9040 unformat_input_t *i = vam->input;
9041 vl_api_l2tpv3_set_lookup_key_t *mp;
9045 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9047 if (unformat (i, "lookup_v6_src"))
9048 key = L2T_LOOKUP_SRC_ADDRESS;
9049 else if (unformat (i, "lookup_v6_dst"))
9050 key = L2T_LOOKUP_DST_ADDRESS;
9051 else if (unformat (i, "lookup_session_id"))
9052 key = L2T_LOOKUP_SESSION_ID;
9057 if (key == (u8) ~ 0)
9059 errmsg ("l2tp session lookup key unset\n");
9063 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
9073 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
9074 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9076 vat_main_t *vam = &vat_main;
9078 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9079 format_ip6_address, mp->our_address,
9080 format_ip6_address, mp->client_address,
9081 clib_net_to_host_u32 (mp->sw_if_index));
9084 " local cookies %016llx %016llx remote cookie %016llx\n",
9085 clib_net_to_host_u64 (mp->local_cookie[0]),
9086 clib_net_to_host_u64 (mp->local_cookie[1]),
9087 clib_net_to_host_u64 (mp->remote_cookie));
9089 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9090 clib_net_to_host_u32 (mp->local_session_id),
9091 clib_net_to_host_u32 (mp->remote_session_id));
9093 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9094 mp->l2_sublayer_present ? "preset" : "absent");
9098 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9099 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9101 vat_main_t *vam = &vat_main;
9102 vat_json_node_t *node = NULL;
9103 struct in6_addr addr;
9105 if (VAT_JSON_ARRAY != vam->json_tree.type)
9107 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9108 vat_json_init_array (&vam->json_tree);
9110 node = vat_json_array_add (&vam->json_tree);
9112 vat_json_init_object (node);
9114 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9115 vat_json_object_add_ip6 (node, "our_address", addr);
9116 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9117 vat_json_object_add_ip6 (node, "client_address", addr);
9119 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9120 vat_json_init_array (lc);
9121 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9122 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9123 vat_json_object_add_uint (node, "remote_cookie",
9124 clib_net_to_host_u64 (mp->remote_cookie));
9126 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9127 vat_json_object_add_uint (node, "local_session_id",
9128 clib_net_to_host_u32 (mp->local_session_id));
9129 vat_json_object_add_uint (node, "remote_session_id",
9130 clib_net_to_host_u32 (mp->remote_session_id));
9131 vat_json_object_add_string_copy (node, "l2_sublayer",
9132 mp->l2_sublayer_present ? (u8 *) "present"
9137 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
9139 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
9142 /* Get list of l2tpv3-tunnel interfaces */
9143 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
9146 /* Use a control ping for synchronization */
9148 vl_api_control_ping_t *mp;
9149 M (CONTROL_PING, control_ping);
9156 static void vl_api_sw_interface_tap_details_t_handler
9157 (vl_api_sw_interface_tap_details_t * mp)
9159 vat_main_t *vam = &vat_main;
9161 fformat (vam->ofp, "%-16s %d\n",
9162 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
9165 static void vl_api_sw_interface_tap_details_t_handler_json
9166 (vl_api_sw_interface_tap_details_t * mp)
9168 vat_main_t *vam = &vat_main;
9169 vat_json_node_t *node = NULL;
9171 if (VAT_JSON_ARRAY != vam->json_tree.type)
9173 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9174 vat_json_init_array (&vam->json_tree);
9176 node = vat_json_array_add (&vam->json_tree);
9178 vat_json_init_object (node);
9179 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9180 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
9184 api_sw_interface_tap_dump (vat_main_t * vam)
9186 vl_api_sw_interface_tap_dump_t *mp;
9189 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
9190 /* Get list of tap interfaces */
9191 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
9194 /* Use a control ping for synchronization */
9196 vl_api_control_ping_t *mp;
9197 M (CONTROL_PING, control_ping);
9203 static uword unformat_vxlan_decap_next
9204 (unformat_input_t * input, va_list * args)
9206 u32 *result = va_arg (*args, u32 *);
9209 if (unformat (input, "drop"))
9210 *result = VXLAN_INPUT_NEXT_DROP;
9211 else if (unformat (input, "ip4"))
9212 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
9213 else if (unformat (input, "ip6"))
9214 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
9215 else if (unformat (input, "l2"))
9216 *result = VXLAN_INPUT_NEXT_L2_INPUT;
9217 else if (unformat (input, "%d", &tmp))
9225 api_vxlan_add_del_tunnel (vat_main_t * vam)
9227 unformat_input_t *line_input = vam->input;
9228 vl_api_vxlan_add_del_tunnel_t *mp;
9230 ip4_address_t src4, dst4;
9231 ip6_address_t src6, dst6;
9233 u8 ipv4_set = 0, ipv6_set = 0;
9236 u32 encap_vrf_id = 0;
9237 u32 decap_next_index = ~0;
9240 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9242 if (unformat (line_input, "del"))
9244 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9249 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9254 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
9259 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
9264 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9266 else if (unformat (line_input, "decap-next %U",
9267 unformat_vxlan_decap_next, &decap_next_index))
9269 else if (unformat (line_input, "vni %d", &vni))
9273 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9280 errmsg ("tunnel src address not specified\n");
9285 errmsg ("tunnel dst address not specified\n");
9289 if (ipv4_set && ipv6_set)
9291 errmsg ("both IPv4 and IPv6 addresses specified");
9295 if ((vni == 0) || (vni >> 24))
9297 errmsg ("vni not specified or out of range\n");
9301 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
9305 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
9306 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
9310 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9311 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9313 mp->encap_vrf_id = ntohl (encap_vrf_id);
9314 mp->decap_next_index = ntohl (decap_next_index);
9315 mp->vni = ntohl (vni);
9316 mp->is_add = is_add;
9317 mp->is_ipv6 = ipv6_set;
9325 static void vl_api_vxlan_tunnel_details_t_handler
9326 (vl_api_vxlan_tunnel_details_t * mp)
9328 vat_main_t *vam = &vat_main;
9330 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
9331 ntohl (mp->sw_if_index),
9332 format_ip46_address, &(mp->src_address[0]),
9334 format_ip46_address, &(mp->dst_address[0]),
9336 ntohl (mp->encap_vrf_id),
9337 ntohl (mp->decap_next_index), ntohl (mp->vni));
9340 static void vl_api_vxlan_tunnel_details_t_handler_json
9341 (vl_api_vxlan_tunnel_details_t * mp)
9343 vat_main_t *vam = &vat_main;
9344 vat_json_node_t *node = NULL;
9346 struct in6_addr ip6;
9348 if (VAT_JSON_ARRAY != vam->json_tree.type)
9350 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9351 vat_json_init_array (&vam->json_tree);
9353 node = vat_json_array_add (&vam->json_tree);
9355 vat_json_init_object (node);
9356 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9359 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
9360 vat_json_object_add_ip6 (node, "src_address", ip6);
9361 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
9362 vat_json_object_add_ip6 (node, "dst_address", ip6);
9366 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
9367 vat_json_object_add_ip4 (node, "src_address", ip4);
9368 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
9369 vat_json_object_add_ip4 (node, "dst_address", ip4);
9371 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
9372 vat_json_object_add_uint (node, "decap_next_index",
9373 ntohl (mp->decap_next_index));
9374 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
9375 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
9379 api_vxlan_tunnel_dump (vat_main_t * vam)
9381 unformat_input_t *i = vam->input;
9382 vl_api_vxlan_tunnel_dump_t *mp;
9385 u8 sw_if_index_set = 0;
9387 /* Parse args required to build the message */
9388 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9390 if (unformat (i, "sw_if_index %d", &sw_if_index))
9391 sw_if_index_set = 1;
9396 if (sw_if_index_set == 0)
9401 if (!vam->json_output)
9403 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
9404 "sw_if_index", "src_address", "dst_address",
9405 "encap_vrf_id", "decap_next_index", "vni");
9408 /* Get list of vxlan-tunnel interfaces */
9409 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
9411 mp->sw_if_index = htonl (sw_if_index);
9415 /* Use a control ping for synchronization */
9417 vl_api_control_ping_t *mp;
9418 M (CONTROL_PING, control_ping);
9425 api_gre_add_del_tunnel (vat_main_t * vam)
9427 unformat_input_t *line_input = vam->input;
9428 vl_api_gre_add_del_tunnel_t *mp;
9430 ip4_address_t src4, dst4;
9434 u32 outer_fib_id = 0;
9436 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9438 if (unformat (line_input, "del"))
9440 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9442 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9444 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
9448 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9455 errmsg ("tunnel src address not specified\n");
9460 errmsg ("tunnel dst address not specified\n");
9465 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
9467 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9468 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9469 mp->outer_fib_id = ntohl (outer_fib_id);
9470 mp->is_add = is_add;
9478 static void vl_api_gre_tunnel_details_t_handler
9479 (vl_api_gre_tunnel_details_t * mp)
9481 vat_main_t *vam = &vat_main;
9483 fformat (vam->ofp, "%11d%15U%15U%14d\n",
9484 ntohl (mp->sw_if_index),
9485 format_ip4_address, &mp->src_address,
9486 format_ip4_address, &mp->dst_address, ntohl (mp->outer_fib_id));
9489 static void vl_api_gre_tunnel_details_t_handler_json
9490 (vl_api_gre_tunnel_details_t * mp)
9492 vat_main_t *vam = &vat_main;
9493 vat_json_node_t *node = NULL;
9496 if (VAT_JSON_ARRAY != vam->json_tree.type)
9498 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9499 vat_json_init_array (&vam->json_tree);
9501 node = vat_json_array_add (&vam->json_tree);
9503 vat_json_init_object (node);
9504 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9505 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
9506 vat_json_object_add_ip4 (node, "src_address", ip4);
9507 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
9508 vat_json_object_add_ip4 (node, "dst_address", ip4);
9509 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
9513 api_gre_tunnel_dump (vat_main_t * vam)
9515 unformat_input_t *i = vam->input;
9516 vl_api_gre_tunnel_dump_t *mp;
9519 u8 sw_if_index_set = 0;
9521 /* Parse args required to build the message */
9522 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9524 if (unformat (i, "sw_if_index %d", &sw_if_index))
9525 sw_if_index_set = 1;
9530 if (sw_if_index_set == 0)
9535 if (!vam->json_output)
9537 fformat (vam->ofp, "%11s%15s%15s%14s\n",
9538 "sw_if_index", "src_address", "dst_address", "outer_fib_id");
9541 /* Get list of gre-tunnel interfaces */
9542 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
9544 mp->sw_if_index = htonl (sw_if_index);
9548 /* Use a control ping for synchronization */
9550 vl_api_control_ping_t *mp;
9551 M (CONTROL_PING, control_ping);
9558 api_l2_fib_clear_table (vat_main_t * vam)
9560 // unformat_input_t * i = vam->input;
9561 vl_api_l2_fib_clear_table_t *mp;
9564 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
9573 api_l2_interface_efp_filter (vat_main_t * vam)
9575 unformat_input_t *i = vam->input;
9576 vl_api_l2_interface_efp_filter_t *mp;
9580 u8 sw_if_index_set = 0;
9582 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9584 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9585 sw_if_index_set = 1;
9586 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9587 sw_if_index_set = 1;
9588 else if (unformat (i, "enable"))
9590 else if (unformat (i, "disable"))
9594 clib_warning ("parse error '%U'", format_unformat_error, i);
9599 if (sw_if_index_set == 0)
9601 errmsg ("missing sw_if_index\n");
9605 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
9607 mp->sw_if_index = ntohl (sw_if_index);
9608 mp->enable_disable = enable;
9616 #define foreach_vtr_op \
9617 _("disable", L2_VTR_DISABLED) \
9618 _("push-1", L2_VTR_PUSH_1) \
9619 _("push-2", L2_VTR_PUSH_2) \
9620 _("pop-1", L2_VTR_POP_1) \
9621 _("pop-2", L2_VTR_POP_2) \
9622 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
9623 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
9624 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
9625 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
9628 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
9630 unformat_input_t *i = vam->input;
9631 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
9634 u8 sw_if_index_set = 0;
9641 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9643 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9644 sw_if_index_set = 1;
9645 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9646 sw_if_index_set = 1;
9647 else if (unformat (i, "vtr_op %d", &vtr_op))
9649 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
9652 else if (unformat (i, "push_dot1q %d", &push_dot1q))
9654 else if (unformat (i, "tag1 %d", &tag1))
9656 else if (unformat (i, "tag2 %d", &tag2))
9660 clib_warning ("parse error '%U'", format_unformat_error, i);
9665 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
9667 errmsg ("missing vtr operation or sw_if_index\n");
9671 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
9672 mp->sw_if_index = ntohl (sw_if_index);
9673 mp->vtr_op = ntohl (vtr_op);
9674 mp->push_dot1q = ntohl (push_dot1q);
9675 mp->tag1 = ntohl (tag1);
9676 mp->tag2 = ntohl (tag2);
9685 api_create_vhost_user_if (vat_main_t * vam)
9687 unformat_input_t *i = vam->input;
9688 vl_api_create_vhost_user_if_t *mp;
9692 u8 file_name_set = 0;
9693 u32 custom_dev_instance = ~0;
9695 u8 use_custom_mac = 0;
9697 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9699 if (unformat (i, "socket %s", &file_name))
9703 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9705 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
9707 else if (unformat (i, "server"))
9713 if (file_name_set == 0)
9715 errmsg ("missing socket file name\n");
9719 if (vec_len (file_name) > 255)
9721 errmsg ("socket file name too long\n");
9724 vec_add1 (file_name, 0);
9726 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
9728 mp->is_server = is_server;
9729 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9730 vec_free (file_name);
9731 if (custom_dev_instance != ~0)
9734 mp->custom_dev_instance = ntohl (custom_dev_instance);
9736 mp->use_custom_mac = use_custom_mac;
9737 clib_memcpy (mp->mac_address, hwaddr, 6);
9746 api_modify_vhost_user_if (vat_main_t * vam)
9748 unformat_input_t *i = vam->input;
9749 vl_api_modify_vhost_user_if_t *mp;
9753 u8 file_name_set = 0;
9754 u32 custom_dev_instance = ~0;
9755 u8 sw_if_index_set = 0;
9756 u32 sw_if_index = (u32) ~ 0;
9758 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9760 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9761 sw_if_index_set = 1;
9762 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9763 sw_if_index_set = 1;
9764 else if (unformat (i, "socket %s", &file_name))
9768 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9770 else if (unformat (i, "server"))
9776 if (sw_if_index_set == 0)
9778 errmsg ("missing sw_if_index or interface name\n");
9782 if (file_name_set == 0)
9784 errmsg ("missing socket file name\n");
9788 if (vec_len (file_name) > 255)
9790 errmsg ("socket file name too long\n");
9793 vec_add1 (file_name, 0);
9795 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
9797 mp->sw_if_index = ntohl (sw_if_index);
9798 mp->is_server = is_server;
9799 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9800 vec_free (file_name);
9801 if (custom_dev_instance != ~0)
9804 mp->custom_dev_instance = ntohl (custom_dev_instance);
9814 api_delete_vhost_user_if (vat_main_t * vam)
9816 unformat_input_t *i = vam->input;
9817 vl_api_delete_vhost_user_if_t *mp;
9819 u32 sw_if_index = ~0;
9820 u8 sw_if_index_set = 0;
9822 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9824 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9825 sw_if_index_set = 1;
9826 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9827 sw_if_index_set = 1;
9832 if (sw_if_index_set == 0)
9834 errmsg ("missing sw_if_index or interface name\n");
9839 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
9841 mp->sw_if_index = ntohl (sw_if_index);
9849 static void vl_api_sw_interface_vhost_user_details_t_handler
9850 (vl_api_sw_interface_vhost_user_details_t * mp)
9852 vat_main_t *vam = &vat_main;
9854 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
9855 (char *) mp->interface_name,
9856 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
9857 clib_net_to_host_u64 (mp->features), mp->is_server,
9858 ntohl (mp->num_regions), (char *) mp->sock_filename);
9859 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
9862 static void vl_api_sw_interface_vhost_user_details_t_handler_json
9863 (vl_api_sw_interface_vhost_user_details_t * mp)
9865 vat_main_t *vam = &vat_main;
9866 vat_json_node_t *node = NULL;
9868 if (VAT_JSON_ARRAY != vam->json_tree.type)
9870 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9871 vat_json_init_array (&vam->json_tree);
9873 node = vat_json_array_add (&vam->json_tree);
9875 vat_json_init_object (node);
9876 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9877 vat_json_object_add_string_copy (node, "interface_name",
9878 mp->interface_name);
9879 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
9880 ntohl (mp->virtio_net_hdr_sz));
9881 vat_json_object_add_uint (node, "features",
9882 clib_net_to_host_u64 (mp->features));
9883 vat_json_object_add_uint (node, "is_server", mp->is_server);
9884 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
9885 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
9886 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
9890 api_sw_interface_vhost_user_dump (vat_main_t * vam)
9892 vl_api_sw_interface_vhost_user_dump_t *mp;
9895 "Interface name idx hdr_sz features server regions filename\n");
9897 /* Get list of vhost-user interfaces */
9898 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
9901 /* Use a control ping for synchronization */
9903 vl_api_control_ping_t *mp;
9904 M (CONTROL_PING, control_ping);
9911 api_show_version (vat_main_t * vam)
9913 vl_api_show_version_t *mp;
9916 M (SHOW_VERSION, show_version);
9926 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
9928 unformat_input_t *line_input = vam->input;
9929 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
9931 ip4_address_t local4, remote4;
9932 ip6_address_t local6, remote6;
9934 u8 ipv4_set = 0, ipv6_set = 0;
9937 u32 encap_vrf_id = 0;
9938 u32 decap_vrf_id = 0;
9943 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9945 if (unformat (line_input, "del"))
9947 else if (unformat (line_input, "local %U",
9948 unformat_ip4_address, &local4))
9953 else if (unformat (line_input, "remote %U",
9954 unformat_ip4_address, &remote4))
9959 else if (unformat (line_input, "local %U",
9960 unformat_ip6_address, &local6))
9965 else if (unformat (line_input, "remote %U",
9966 unformat_ip6_address, &remote6))
9971 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9973 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
9975 else if (unformat (line_input, "vni %d", &vni))
9977 else if (unformat (line_input, "next-ip4"))
9979 else if (unformat (line_input, "next-ip6"))
9981 else if (unformat (line_input, "next-ethernet"))
9983 else if (unformat (line_input, "next-nsh"))
9987 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9994 errmsg ("tunnel local address not specified\n");
9997 if (remote_set == 0)
9999 errmsg ("tunnel remote address not specified\n");
10002 if (ipv4_set && ipv6_set)
10004 errmsg ("both IPv4 and IPv6 addresses specified");
10010 errmsg ("vni not specified\n");
10014 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
10019 clib_memcpy (&mp->local, &local6, sizeof (local6));
10020 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10024 clib_memcpy (&mp->local, &local4, sizeof (local4));
10025 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
10028 mp->encap_vrf_id = ntohl (encap_vrf_id);
10029 mp->decap_vrf_id = ntohl (decap_vrf_id);
10030 mp->protocol = ntohl (protocol);
10031 mp->vni = ntohl (vni);
10032 mp->is_add = is_add;
10033 mp->is_ipv6 = ipv6_set;
10041 static void vl_api_vxlan_gpe_tunnel_details_t_handler
10042 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10044 vat_main_t *vam = &vat_main;
10046 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10047 ntohl (mp->sw_if_index),
10048 format_ip46_address, &(mp->local[0]),
10049 format_ip46_address, &(mp->remote[0]),
10051 ntohl (mp->protocol),
10052 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
10055 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
10056 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10058 vat_main_t *vam = &vat_main;
10059 vat_json_node_t *node = NULL;
10060 struct in_addr ip4;
10061 struct in6_addr ip6;
10063 if (VAT_JSON_ARRAY != vam->json_tree.type)
10065 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10066 vat_json_init_array (&vam->json_tree);
10068 node = vat_json_array_add (&vam->json_tree);
10070 vat_json_init_object (node);
10071 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10074 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10075 vat_json_object_add_ip6 (node, "local", ip6);
10076 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10077 vat_json_object_add_ip6 (node, "remote", ip6);
10081 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10082 vat_json_object_add_ip4 (node, "local", ip4);
10083 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10084 vat_json_object_add_ip4 (node, "remote", ip4);
10086 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10087 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10088 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10089 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10090 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10094 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10096 unformat_input_t *i = vam->input;
10097 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10100 u8 sw_if_index_set = 0;
10102 /* Parse args required to build the message */
10103 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10105 if (unformat (i, "sw_if_index %d", &sw_if_index))
10106 sw_if_index_set = 1;
10111 if (sw_if_index_set == 0)
10116 if (!vam->json_output)
10118 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10119 "sw_if_index", "local", "remote", "vni",
10120 "protocol", "encap_vrf_id", "decap_vrf_id");
10123 /* Get list of vxlan-tunnel interfaces */
10124 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10126 mp->sw_if_index = htonl (sw_if_index);
10130 /* Use a control ping for synchronization */
10132 vl_api_control_ping_t *mp;
10133 M (CONTROL_PING, control_ping);
10140 format_l2_fib_mac_address (u8 * s, va_list * args)
10142 u8 *a = va_arg (*args, u8 *);
10144 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
10145 a[2], a[3], a[4], a[5], a[6], a[7]);
10148 static void vl_api_l2_fib_table_entry_t_handler
10149 (vl_api_l2_fib_table_entry_t * mp)
10151 vat_main_t *vam = &vat_main;
10153 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
10155 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
10156 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
10160 static void vl_api_l2_fib_table_entry_t_handler_json
10161 (vl_api_l2_fib_table_entry_t * mp)
10163 vat_main_t *vam = &vat_main;
10164 vat_json_node_t *node = NULL;
10166 if (VAT_JSON_ARRAY != vam->json_tree.type)
10168 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10169 vat_json_init_array (&vam->json_tree);
10171 node = vat_json_array_add (&vam->json_tree);
10173 vat_json_init_object (node);
10174 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
10175 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
10176 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10177 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
10178 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
10179 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
10183 api_l2_fib_table_dump (vat_main_t * vam)
10185 unformat_input_t *i = vam->input;
10186 vl_api_l2_fib_table_dump_t *mp;
10191 /* Parse args required to build the message */
10192 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10194 if (unformat (i, "bd_id %d", &bd_id))
10200 if (bd_id_set == 0)
10202 errmsg ("missing bridge domain\n");
10207 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
10209 /* Get list of l2 fib entries */
10210 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
10212 mp->bd_id = ntohl (bd_id);
10215 /* Use a control ping for synchronization */
10217 vl_api_control_ping_t *mp;
10218 M (CONTROL_PING, control_ping);
10226 api_interface_name_renumber (vat_main_t * vam)
10228 unformat_input_t *line_input = vam->input;
10229 vl_api_interface_name_renumber_t *mp;
10230 u32 sw_if_index = ~0;
10232 u32 new_show_dev_instance = ~0;
10234 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10236 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
10239 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
10241 else if (unformat (line_input, "new_show_dev_instance %d",
10242 &new_show_dev_instance))
10248 if (sw_if_index == ~0)
10250 errmsg ("missing interface name or sw_if_index\n");
10254 if (new_show_dev_instance == ~0)
10256 errmsg ("missing new_show_dev_instance\n");
10260 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
10262 mp->sw_if_index = ntohl (sw_if_index);
10263 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
10270 api_want_ip4_arp_events (vat_main_t * vam)
10272 unformat_input_t *line_input = vam->input;
10273 vl_api_want_ip4_arp_events_t *mp;
10275 ip4_address_t address;
10276 int address_set = 0;
10277 u32 enable_disable = 1;
10279 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10281 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
10283 else if (unformat (line_input, "del"))
10284 enable_disable = 0;
10289 if (address_set == 0)
10291 errmsg ("missing addresses\n");
10295 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
10296 mp->enable_disable = enable_disable;
10297 mp->pid = getpid ();
10298 mp->address = address.as_u32;
10305 api_want_ip6_nd_events (vat_main_t * vam)
10307 unformat_input_t *line_input = vam->input;
10308 vl_api_want_ip6_nd_events_t *mp;
10310 ip6_address_t address;
10311 int address_set = 0;
10312 u32 enable_disable = 1;
10314 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10316 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
10318 else if (unformat (line_input, "del"))
10319 enable_disable = 0;
10324 if (address_set == 0)
10326 errmsg ("missing addresses\n");
10330 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
10331 mp->enable_disable = enable_disable;
10332 mp->pid = getpid ();
10333 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
10340 api_input_acl_set_interface (vat_main_t * vam)
10342 unformat_input_t *i = vam->input;
10343 vl_api_input_acl_set_interface_t *mp;
10346 int sw_if_index_set;
10347 u32 ip4_table_index = ~0;
10348 u32 ip6_table_index = ~0;
10349 u32 l2_table_index = ~0;
10352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10354 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10355 sw_if_index_set = 1;
10356 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10357 sw_if_index_set = 1;
10358 else if (unformat (i, "del"))
10360 else if (unformat (i, "ip4-table %d", &ip4_table_index))
10362 else if (unformat (i, "ip6-table %d", &ip6_table_index))
10364 else if (unformat (i, "l2-table %d", &l2_table_index))
10368 clib_warning ("parse error '%U'", format_unformat_error, i);
10373 if (sw_if_index_set == 0)
10375 errmsg ("missing interface name or sw_if_index\n");
10379 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
10381 mp->sw_if_index = ntohl (sw_if_index);
10382 mp->ip4_table_index = ntohl (ip4_table_index);
10383 mp->ip6_table_index = ntohl (ip6_table_index);
10384 mp->l2_table_index = ntohl (l2_table_index);
10385 mp->is_add = is_add;
10394 api_ip_address_dump (vat_main_t * vam)
10396 unformat_input_t *i = vam->input;
10397 vl_api_ip_address_dump_t *mp;
10398 u32 sw_if_index = ~0;
10399 u8 sw_if_index_set = 0;
10404 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10406 if (unformat (i, "sw_if_index %d", &sw_if_index))
10407 sw_if_index_set = 1;
10408 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10409 sw_if_index_set = 1;
10410 else if (unformat (i, "ipv4"))
10412 else if (unformat (i, "ipv6"))
10418 if (ipv4_set && ipv6_set)
10420 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10424 if ((!ipv4_set) && (!ipv6_set))
10426 errmsg ("no ipv4 nor ipv6 flag set\n");
10430 if (sw_if_index_set == 0)
10432 errmsg ("missing interface name or sw_if_index\n");
10436 vam->current_sw_if_index = sw_if_index;
10437 vam->is_ipv6 = ipv6_set;
10439 M (IP_ADDRESS_DUMP, ip_address_dump);
10440 mp->sw_if_index = ntohl (sw_if_index);
10441 mp->is_ipv6 = ipv6_set;
10444 /* Use a control ping for synchronization */
10446 vl_api_control_ping_t *mp;
10447 M (CONTROL_PING, control_ping);
10454 api_ip_dump (vat_main_t * vam)
10456 vl_api_ip_dump_t *mp;
10457 unformat_input_t *in = vam->input;
10464 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
10466 if (unformat (in, "ipv4"))
10468 else if (unformat (in, "ipv6"))
10474 if (ipv4_set && ipv6_set)
10476 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10480 if ((!ipv4_set) && (!ipv6_set))
10482 errmsg ("no ipv4 nor ipv6 flag set\n");
10486 is_ipv6 = ipv6_set;
10487 vam->is_ipv6 = is_ipv6;
10489 /* free old data */
10490 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
10492 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
10494 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
10496 M (IP_DUMP, ip_dump);
10497 mp->is_ipv6 = ipv6_set;
10500 /* Use a control ping for synchronization */
10502 vl_api_control_ping_t *mp;
10503 M (CONTROL_PING, control_ping);
10510 api_ipsec_spd_add_del (vat_main_t * vam)
10513 unformat_input_t *i = vam->input;
10514 vl_api_ipsec_spd_add_del_t *mp;
10519 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10521 if (unformat (i, "spd_id %d", &spd_id))
10523 else if (unformat (i, "del"))
10527 clib_warning ("parse error '%U'", format_unformat_error, i);
10533 errmsg ("spd_id must be set\n");
10537 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
10539 mp->spd_id = ntohl (spd_id);
10540 mp->is_add = is_add;
10547 clib_warning ("unsupported (no dpdk)");
10553 api_ipsec_interface_add_del_spd (vat_main_t * vam)
10556 unformat_input_t *i = vam->input;
10557 vl_api_ipsec_interface_add_del_spd_t *mp;
10560 u8 sw_if_index_set = 0;
10561 u32 spd_id = (u32) ~ 0;
10564 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10566 if (unformat (i, "del"))
10568 else if (unformat (i, "spd_id %d", &spd_id))
10570 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10571 sw_if_index_set = 1;
10572 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10573 sw_if_index_set = 1;
10576 clib_warning ("parse error '%U'", format_unformat_error, i);
10582 if (spd_id == (u32) ~ 0)
10584 errmsg ("spd_id must be set\n");
10588 if (sw_if_index_set == 0)
10590 errmsg ("missing interface name or sw_if_index\n");
10594 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
10596 mp->spd_id = ntohl (spd_id);
10597 mp->sw_if_index = ntohl (sw_if_index);
10598 mp->is_add = is_add;
10605 clib_warning ("unsupported (no dpdk)");
10611 api_ipsec_spd_add_del_entry (vat_main_t * vam)
10614 unformat_input_t *i = vam->input;
10615 vl_api_ipsec_spd_add_del_entry_t *mp;
10617 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
10618 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
10620 u32 rport_start = 0, rport_stop = (u32) ~ 0;
10621 u32 lport_start = 0, lport_stop = (u32) ~ 0;
10622 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
10623 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
10625 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
10626 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
10627 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
10628 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
10629 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
10630 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
10632 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10634 if (unformat (i, "del"))
10636 if (unformat (i, "outbound"))
10638 if (unformat (i, "inbound"))
10640 else if (unformat (i, "spd_id %d", &spd_id))
10642 else if (unformat (i, "sa_id %d", &sa_id))
10644 else if (unformat (i, "priority %d", &priority))
10646 else if (unformat (i, "protocol %d", &protocol))
10648 else if (unformat (i, "lport_start %d", &lport_start))
10650 else if (unformat (i, "lport_stop %d", &lport_stop))
10652 else if (unformat (i, "rport_start %d", &rport_start))
10654 else if (unformat (i, "rport_stop %d", &rport_stop))
10658 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
10664 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
10671 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
10677 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
10684 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
10690 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
10697 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
10703 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
10709 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
10711 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
10713 clib_warning ("unsupported action: 'resolve'");
10719 clib_warning ("parse error '%U'", format_unformat_error, i);
10725 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
10727 mp->spd_id = ntohl (spd_id);
10728 mp->priority = ntohl (priority);
10729 mp->is_outbound = is_outbound;
10731 mp->is_ipv6 = is_ipv6;
10732 if (is_ipv6 || is_ip_any)
10734 clib_memcpy (mp->remote_address_start, &raddr6_start,
10735 sizeof (ip6_address_t));
10736 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
10737 sizeof (ip6_address_t));
10738 clib_memcpy (mp->local_address_start, &laddr6_start,
10739 sizeof (ip6_address_t));
10740 clib_memcpy (mp->local_address_stop, &laddr6_stop,
10741 sizeof (ip6_address_t));
10745 clib_memcpy (mp->remote_address_start, &raddr4_start,
10746 sizeof (ip4_address_t));
10747 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
10748 sizeof (ip4_address_t));
10749 clib_memcpy (mp->local_address_start, &laddr4_start,
10750 sizeof (ip4_address_t));
10751 clib_memcpy (mp->local_address_stop, &laddr4_stop,
10752 sizeof (ip4_address_t));
10754 mp->protocol = (u8) protocol;
10755 mp->local_port_start = ntohs ((u16) lport_start);
10756 mp->local_port_stop = ntohs ((u16) lport_stop);
10757 mp->remote_port_start = ntohs ((u16) rport_start);
10758 mp->remote_port_stop = ntohs ((u16) rport_stop);
10759 mp->policy = (u8) policy;
10760 mp->sa_id = ntohl (sa_id);
10761 mp->is_add = is_add;
10762 mp->is_ip_any = is_ip_any;
10768 clib_warning ("unsupported (no dpdk)");
10774 api_ipsec_sad_add_del_entry (vat_main_t * vam)
10777 unformat_input_t *i = vam->input;
10778 vl_api_ipsec_sad_add_del_entry_t *mp;
10780 u32 sad_id = 0, spi = 0;
10781 u8 *ck = 0, *ik = 0;
10784 u8 protocol = IPSEC_PROTOCOL_AH;
10785 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
10786 u32 crypto_alg = 0, integ_alg = 0;
10787 ip4_address_t tun_src4;
10788 ip4_address_t tun_dst4;
10789 ip6_address_t tun_src6;
10790 ip6_address_t tun_dst6;
10792 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10794 if (unformat (i, "del"))
10796 else if (unformat (i, "sad_id %d", &sad_id))
10798 else if (unformat (i, "spi %d", &spi))
10800 else if (unformat (i, "esp"))
10801 protocol = IPSEC_PROTOCOL_ESP;
10802 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
10805 is_tunnel_ipv6 = 0;
10807 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
10810 is_tunnel_ipv6 = 0;
10812 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
10815 is_tunnel_ipv6 = 1;
10817 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
10820 is_tunnel_ipv6 = 1;
10824 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
10826 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
10827 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
10829 clib_warning ("unsupported crypto-alg: '%U'",
10830 format_ipsec_crypto_alg, crypto_alg);
10834 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10838 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
10840 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
10841 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
10843 clib_warning ("unsupported integ-alg: '%U'",
10844 format_ipsec_integ_alg, integ_alg);
10848 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10852 clib_warning ("parse error '%U'", format_unformat_error, i);
10858 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
10860 mp->sad_id = ntohl (sad_id);
10861 mp->is_add = is_add;
10862 mp->protocol = protocol;
10863 mp->spi = ntohl (spi);
10864 mp->is_tunnel = is_tunnel;
10865 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
10866 mp->crypto_algorithm = crypto_alg;
10867 mp->integrity_algorithm = integ_alg;
10868 mp->crypto_key_length = vec_len (ck);
10869 mp->integrity_key_length = vec_len (ik);
10871 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10872 mp->crypto_key_length = sizeof (mp->crypto_key);
10874 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10875 mp->integrity_key_length = sizeof (mp->integrity_key);
10878 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10880 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10884 if (is_tunnel_ipv6)
10886 clib_memcpy (mp->tunnel_src_address, &tun_src6,
10887 sizeof (ip6_address_t));
10888 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
10889 sizeof (ip6_address_t));
10893 clib_memcpy (mp->tunnel_src_address, &tun_src4,
10894 sizeof (ip4_address_t));
10895 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
10896 sizeof (ip4_address_t));
10905 clib_warning ("unsupported (no dpdk)");
10911 api_ipsec_sa_set_key (vat_main_t * vam)
10914 unformat_input_t *i = vam->input;
10915 vl_api_ipsec_sa_set_key_t *mp;
10918 u8 *ck = 0, *ik = 0;
10920 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10922 if (unformat (i, "sa_id %d", &sa_id))
10924 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10926 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10930 clib_warning ("parse error '%U'", format_unformat_error, i);
10935 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
10937 mp->sa_id = ntohl (sa_id);
10938 mp->crypto_key_length = vec_len (ck);
10939 mp->integrity_key_length = vec_len (ik);
10941 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10942 mp->crypto_key_length = sizeof (mp->crypto_key);
10944 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10945 mp->integrity_key_length = sizeof (mp->integrity_key);
10948 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10950 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10957 clib_warning ("unsupported (no dpdk)");
10963 api_ikev2_profile_add_del (vat_main_t * vam)
10966 unformat_input_t *i = vam->input;
10967 vl_api_ikev2_profile_add_del_t *mp;
10972 const char *valid_chars = "a-zA-Z0-9_";
10974 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10976 if (unformat (i, "del"))
10978 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
10979 vec_add1 (name, 0);
10982 errmsg ("parse error '%U'", format_unformat_error, i);
10987 if (!vec_len (name))
10989 errmsg ("profile name must be specified");
10993 if (vec_len (name) > 64)
10995 errmsg ("profile name too long");
10999 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
11001 clib_memcpy (mp->name, name, vec_len (name));
11002 mp->is_add = is_add;
11010 clib_warning ("unsupported (no dpdk)");
11016 api_ikev2_profile_set_auth (vat_main_t * vam)
11019 unformat_input_t *i = vam->input;
11020 vl_api_ikev2_profile_set_auth_t *mp;
11024 u32 auth_method = 0;
11027 const char *valid_chars = "a-zA-Z0-9_";
11029 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11031 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11032 vec_add1 (name, 0);
11033 else if (unformat (i, "auth_method %U",
11034 unformat_ikev2_auth_method, &auth_method))
11036 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11038 else if (unformat (i, "auth_data %v", &data))
11042 errmsg ("parse error '%U'", format_unformat_error, i);
11047 if (!vec_len (name))
11049 errmsg ("profile name must be specified");
11053 if (vec_len (name) > 64)
11055 errmsg ("profile name too long");
11059 if (!vec_len (data))
11061 errmsg ("auth_data must be specified");
11067 errmsg ("auth_method must be specified");
11071 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
11073 mp->is_hex = is_hex;
11074 mp->auth_method = (u8) auth_method;
11075 mp->data_len = vec_len (data);
11076 clib_memcpy (mp->name, name, vec_len (name));
11077 clib_memcpy (mp->data, data, vec_len (data));
11086 clib_warning ("unsupported (no dpdk)");
11092 api_ikev2_profile_set_id (vat_main_t * vam)
11095 unformat_input_t *i = vam->input;
11096 vl_api_ikev2_profile_set_id_t *mp;
11104 const char *valid_chars = "a-zA-Z0-9_";
11106 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11108 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11109 vec_add1 (name, 0);
11110 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11112 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11114 data = vec_new (u8, 4);
11115 clib_memcpy (data, ip4.as_u8, 4);
11117 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11119 else if (unformat (i, "id_data %v", &data))
11121 else if (unformat (i, "local"))
11123 else if (unformat (i, "remote"))
11127 errmsg ("parse error '%U'", format_unformat_error, i);
11132 if (!vec_len (name))
11134 errmsg ("profile name must be specified");
11138 if (vec_len (name) > 64)
11140 errmsg ("profile name too long");
11144 if (!vec_len (data))
11146 errmsg ("id_data must be specified");
11152 errmsg ("id_type must be specified");
11156 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
11158 mp->is_local = is_local;
11159 mp->id_type = (u8) id_type;
11160 mp->data_len = vec_len (data);
11161 clib_memcpy (mp->name, name, vec_len (name));
11162 clib_memcpy (mp->data, data, vec_len (data));
11171 clib_warning ("unsupported (no dpdk)");
11177 api_ikev2_profile_set_ts (vat_main_t * vam)
11180 unformat_input_t *i = vam->input;
11181 vl_api_ikev2_profile_set_ts_t *mp;
11185 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
11186 ip4_address_t start_addr, end_addr;
11188 const char *valid_chars = "a-zA-Z0-9_";
11190 start_addr.as_u32 = 0;
11191 end_addr.as_u32 = (u32) ~ 0;
11193 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11195 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11196 vec_add1 (name, 0);
11197 else if (unformat (i, "protocol %d", &proto))
11199 else if (unformat (i, "start_port %d", &start_port))
11201 else if (unformat (i, "end_port %d", &end_port))
11204 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
11206 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
11208 else if (unformat (i, "local"))
11210 else if (unformat (i, "remote"))
11214 errmsg ("parse error '%U'", format_unformat_error, i);
11219 if (!vec_len (name))
11221 errmsg ("profile name must be specified");
11225 if (vec_len (name) > 64)
11227 errmsg ("profile name too long");
11231 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
11233 mp->is_local = is_local;
11234 mp->proto = (u8) proto;
11235 mp->start_port = (u16) start_port;
11236 mp->end_port = (u16) end_port;
11237 mp->start_addr = start_addr.as_u32;
11238 mp->end_addr = end_addr.as_u32;
11239 clib_memcpy (mp->name, name, vec_len (name));
11247 clib_warning ("unsupported (no dpdk)");
11253 api_ikev2_set_local_key (vat_main_t * vam)
11256 unformat_input_t *i = vam->input;
11257 vl_api_ikev2_set_local_key_t *mp;
11261 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11263 if (unformat (i, "file %v", &file))
11264 vec_add1 (file, 0);
11267 errmsg ("parse error '%U'", format_unformat_error, i);
11272 if (!vec_len (file))
11274 errmsg ("RSA key file must be specified");
11278 if (vec_len (file) > 256)
11280 errmsg ("file name too long");
11284 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
11286 clib_memcpy (mp->key_file, file, vec_len (file));
11294 clib_warning ("unsupported (no dpdk)");
11303 api_map_add_domain (vat_main_t * vam)
11305 unformat_input_t *i = vam->input;
11306 vl_api_map_add_domain_t *mp;
11309 ip4_address_t ip4_prefix;
11310 ip6_address_t ip6_prefix;
11311 ip6_address_t ip6_src;
11312 u32 num_m_args = 0;
11313 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
11314 0, psid_length = 0;
11315 u8 is_translation = 0;
11317 u32 ip6_src_len = 128;
11319 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11321 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
11322 &ip4_prefix, &ip4_prefix_len))
11324 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
11325 &ip6_prefix, &ip6_prefix_len))
11329 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
11332 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
11334 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
11336 else if (unformat (i, "psid-offset %d", &psid_offset))
11338 else if (unformat (i, "psid-len %d", &psid_length))
11340 else if (unformat (i, "mtu %d", &mtu))
11342 else if (unformat (i, "map-t"))
11343 is_translation = 1;
11346 clib_warning ("parse error '%U'", format_unformat_error, i);
11351 if (num_m_args < 3)
11353 errmsg ("mandatory argument(s) missing\n");
11357 /* Construct the API message */
11358 M (MAP_ADD_DOMAIN, map_add_domain);
11360 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
11361 mp->ip4_prefix_len = ip4_prefix_len;
11363 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
11364 mp->ip6_prefix_len = ip6_prefix_len;
11366 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
11367 mp->ip6_src_prefix_len = ip6_src_len;
11369 mp->ea_bits_len = ea_bits_len;
11370 mp->psid_offset = psid_offset;
11371 mp->psid_length = psid_length;
11372 mp->is_translation = is_translation;
11373 mp->mtu = htons (mtu);
11378 /* Wait for a reply, return good/bad news */
11383 api_map_del_domain (vat_main_t * vam)
11385 unformat_input_t *i = vam->input;
11386 vl_api_map_del_domain_t *mp;
11389 u32 num_m_args = 0;
11392 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11394 if (unformat (i, "index %d", &index))
11398 clib_warning ("parse error '%U'", format_unformat_error, i);
11403 if (num_m_args != 1)
11405 errmsg ("mandatory argument(s) missing\n");
11409 /* Construct the API message */
11410 M (MAP_DEL_DOMAIN, map_del_domain);
11412 mp->index = ntohl (index);
11417 /* Wait for a reply, return good/bad news */
11422 api_map_add_del_rule (vat_main_t * vam)
11424 unformat_input_t *i = vam->input;
11425 vl_api_map_add_del_rule_t *mp;
11428 ip6_address_t ip6_dst;
11429 u32 num_m_args = 0, index, psid = 0;
11431 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11433 if (unformat (i, "index %d", &index))
11435 else if (unformat (i, "psid %d", &psid))
11437 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
11439 else if (unformat (i, "del"))
11445 clib_warning ("parse error '%U'", format_unformat_error, i);
11450 /* Construct the API message */
11451 M (MAP_ADD_DEL_RULE, map_add_del_rule);
11453 mp->index = ntohl (index);
11454 mp->is_add = is_add;
11455 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
11456 mp->psid = ntohs (psid);
11461 /* Wait for a reply, return good/bad news */
11466 api_map_domain_dump (vat_main_t * vam)
11468 vl_api_map_domain_dump_t *mp;
11471 /* Construct the API message */
11472 M (MAP_DOMAIN_DUMP, map_domain_dump);
11477 /* Use a control ping for synchronization */
11479 vl_api_control_ping_t *mp;
11480 M (CONTROL_PING, control_ping);
11487 api_map_rule_dump (vat_main_t * vam)
11489 unformat_input_t *i = vam->input;
11490 vl_api_map_rule_dump_t *mp;
11492 u32 domain_index = ~0;
11494 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11496 if (unformat (i, "index %u", &domain_index))
11502 if (domain_index == ~0)
11504 clib_warning ("parse error: domain index expected");
11508 /* Construct the API message */
11509 M (MAP_RULE_DUMP, map_rule_dump);
11511 mp->domain_index = htonl (domain_index);
11516 /* Use a control ping for synchronization */
11518 vl_api_control_ping_t *mp;
11519 M (CONTROL_PING, control_ping);
11525 static void vl_api_map_add_domain_reply_t_handler
11526 (vl_api_map_add_domain_reply_t * mp)
11528 vat_main_t *vam = &vat_main;
11529 i32 retval = ntohl (mp->retval);
11531 if (vam->async_mode)
11533 vam->async_errors += (retval < 0);
11537 vam->retval = retval;
11538 vam->result_ready = 1;
11542 static void vl_api_map_add_domain_reply_t_handler_json
11543 (vl_api_map_add_domain_reply_t * mp)
11545 vat_main_t *vam = &vat_main;
11546 vat_json_node_t node;
11548 vat_json_init_object (&node);
11549 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
11550 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
11552 vat_json_print (vam->ofp, &node);
11553 vat_json_free (&node);
11555 vam->retval = ntohl (mp->retval);
11556 vam->result_ready = 1;
11560 api_get_first_msg_id (vat_main_t * vam)
11562 vl_api_get_first_msg_id_t *mp;
11564 unformat_input_t *i = vam->input;
11568 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11570 if (unformat (i, "client %s", &name))
11578 errmsg ("missing client name\n");
11581 vec_add1 (name, 0);
11583 if (vec_len (name) > 63)
11585 errmsg ("client name too long\n");
11589 M (GET_FIRST_MSG_ID, get_first_msg_id);
11590 clib_memcpy (mp->name, name, vec_len (name));
11598 api_cop_interface_enable_disable (vat_main_t * vam)
11600 unformat_input_t *line_input = vam->input;
11601 vl_api_cop_interface_enable_disable_t *mp;
11603 u32 sw_if_index = ~0;
11604 u8 enable_disable = 1;
11606 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11608 if (unformat (line_input, "disable"))
11609 enable_disable = 0;
11610 if (unformat (line_input, "enable"))
11611 enable_disable = 1;
11612 else if (unformat (line_input, "%U", unformat_sw_if_index,
11613 vam, &sw_if_index))
11615 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11621 if (sw_if_index == ~0)
11623 errmsg ("missing interface name or sw_if_index\n");
11627 /* Construct the API message */
11628 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
11629 mp->sw_if_index = ntohl (sw_if_index);
11630 mp->enable_disable = enable_disable;
11634 /* Wait for the reply */
11639 api_cop_whitelist_enable_disable (vat_main_t * vam)
11641 unformat_input_t *line_input = vam->input;
11642 vl_api_cop_whitelist_enable_disable_t *mp;
11644 u32 sw_if_index = ~0;
11645 u8 ip4 = 0, ip6 = 0, default_cop = 0;
11648 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11650 if (unformat (line_input, "ip4"))
11652 else if (unformat (line_input, "ip6"))
11654 else if (unformat (line_input, "default"))
11656 else if (unformat (line_input, "%U", unformat_sw_if_index,
11657 vam, &sw_if_index))
11659 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11661 else if (unformat (line_input, "fib-id %d", &fib_id))
11667 if (sw_if_index == ~0)
11669 errmsg ("missing interface name or sw_if_index\n");
11673 /* Construct the API message */
11674 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
11675 mp->sw_if_index = ntohl (sw_if_index);
11676 mp->fib_id = ntohl (fib_id);
11679 mp->default_cop = default_cop;
11683 /* Wait for the reply */
11688 api_get_node_graph (vat_main_t * vam)
11690 vl_api_get_node_graph_t *mp;
11693 M (GET_NODE_GRAPH, get_node_graph);
11697 /* Wait for the reply */
11702 /** Used for parsing LISP eids */
11703 typedef CLIB_PACKED(struct{
11704 u8 addr[16]; /**< eid address */
11705 u32 len; /**< prefix length if IP */
11706 u8 type; /**< type of eid */
11711 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
11713 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
11715 memset (a, 0, sizeof (a[0]));
11717 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
11719 a->type = 0; /* ipv4 type */
11721 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
11723 a->type = 1; /* ipv6 type */
11725 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
11727 a->type = 2; /* mac type */
11734 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
11743 lisp_eid_size_vat (u8 type)
11758 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
11760 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
11764 /** Used for transferring locators via VPP API */
11765 typedef CLIB_PACKED(struct
11767 u32 sw_if_index; /**< locator sw_if_index */
11768 u8 priority; /**< locator priority */
11769 u8 weight; /**< locator weight */
11774 api_lisp_add_del_locator_set (vat_main_t * vam)
11776 unformat_input_t *input = vam->input;
11777 vl_api_lisp_add_del_locator_set_t *mp;
11780 u8 *locator_set_name = NULL;
11781 u8 locator_set_name_set = 0;
11782 ls_locator_t locator, *locators = 0;
11783 u32 sw_if_index, priority, weight;
11785 /* Parse args required to build the message */
11786 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11788 if (unformat (input, "del"))
11792 else if (unformat (input, "locator-set %s", &locator_set_name))
11794 locator_set_name_set = 1;
11796 else if (unformat (input, "sw_if_index %u p %u w %u",
11797 &sw_if_index, &priority, &weight))
11799 locator.sw_if_index = htonl (sw_if_index);
11800 locator.priority = priority;
11801 locator.weight = weight;
11802 vec_add1 (locators, locator);
11804 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
11805 vam, &sw_if_index, &priority, &weight))
11807 locator.sw_if_index = htonl (sw_if_index);
11808 locator.priority = priority;
11809 locator.weight = weight;
11810 vec_add1 (locators, locator);
11816 if (locator_set_name_set == 0)
11818 errmsg ("missing locator-set name");
11819 vec_free (locators);
11823 if (vec_len (locator_set_name) > 64)
11825 errmsg ("locator-set name too long\n");
11826 vec_free (locator_set_name);
11827 vec_free (locators);
11830 vec_add1 (locator_set_name, 0);
11832 /* Construct the API message */
11833 M (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
11835 mp->is_add = is_add;
11836 clib_memcpy (mp->locator_set_name, locator_set_name,
11837 vec_len (locator_set_name));
11838 vec_free (locator_set_name);
11840 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
11842 clib_memcpy (mp->locators, locators,
11843 (sizeof (ls_locator_t) * vec_len (locators)));
11844 vec_free (locators);
11849 /* Wait for a reply... */
11857 api_lisp_add_del_locator (vat_main_t * vam)
11859 unformat_input_t *input = vam->input;
11860 vl_api_lisp_add_del_locator_t *mp;
11862 u32 tmp_if_index = ~0;
11863 u32 sw_if_index = ~0;
11864 u8 sw_if_index_set = 0;
11865 u8 sw_if_index_if_name_set = 0;
11867 u8 priority_set = 0;
11871 u8 *locator_set_name = NULL;
11872 u8 locator_set_name_set = 0;
11874 /* Parse args required to build the message */
11875 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11877 if (unformat (input, "del"))
11881 else if (unformat (input, "locator-set %s", &locator_set_name))
11883 locator_set_name_set = 1;
11885 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
11888 sw_if_index_if_name_set = 1;
11889 sw_if_index = tmp_if_index;
11891 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
11893 sw_if_index_set = 1;
11894 sw_if_index = tmp_if_index;
11896 else if (unformat (input, "p %d", &priority))
11900 else if (unformat (input, "w %d", &weight))
11908 if (locator_set_name_set == 0)
11910 errmsg ("missing locator-set name");
11914 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
11916 errmsg ("missing sw_if_index");
11917 vec_free (locator_set_name);
11921 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
11923 errmsg ("cannot use both params interface name and sw_if_index");
11924 vec_free (locator_set_name);
11928 if (priority_set == 0)
11930 errmsg ("missing locator-set priority\n");
11931 vec_free (locator_set_name);
11935 if (weight_set == 0)
11937 errmsg ("missing locator-set weight\n");
11938 vec_free (locator_set_name);
11942 if (vec_len (locator_set_name) > 64)
11944 errmsg ("locator-set name too long\n");
11945 vec_free (locator_set_name);
11948 vec_add1 (locator_set_name, 0);
11950 /* Construct the API message */
11951 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
11953 mp->is_add = is_add;
11954 mp->sw_if_index = ntohl (sw_if_index);
11955 mp->priority = priority;
11956 mp->weight = weight;
11957 clib_memcpy (mp->locator_set_name, locator_set_name,
11958 vec_len (locator_set_name));
11959 vec_free (locator_set_name);
11964 /* Wait for a reply... */
11972 api_lisp_add_del_local_eid (vat_main_t * vam)
11974 unformat_input_t *input = vam->input;
11975 vl_api_lisp_add_del_local_eid_t *mp;
11979 lisp_eid_vat_t _eid, *eid = &_eid;
11980 u8 *locator_set_name = 0;
11981 u8 locator_set_name_set = 0;
11984 /* Parse args required to build the message */
11985 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11987 if (unformat (input, "del"))
11991 else if (unformat (input, "vni %d", &vni))
11995 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
11999 else if (unformat (input, "locator-set %s", &locator_set_name))
12001 locator_set_name_set = 1;
12007 if (locator_set_name_set == 0)
12009 errmsg ("missing locator-set name\n");
12015 errmsg ("EID address not set!");
12016 vec_free (locator_set_name);
12020 if (vec_len (locator_set_name) > 64)
12022 errmsg ("locator-set name too long\n");
12023 vec_free (locator_set_name);
12026 vec_add1 (locator_set_name, 0);
12028 /* Construct the API message */
12029 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
12031 mp->is_add = is_add;
12032 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12033 mp->eid_type = eid->type;
12034 mp->prefix_len = eid->len;
12035 mp->vni = clib_host_to_net_u32 (vni);
12036 clib_memcpy (mp->locator_set_name, locator_set_name,
12037 vec_len (locator_set_name));
12039 vec_free (locator_set_name);
12044 /* Wait for a reply... */
12052 /** Used for transferring locators via VPP API */
12053 typedef CLIB_PACKED(struct
12055 u8 is_ip4; /**< is locator an IPv4 address? */
12056 u8 priority; /**< locator priority */
12057 u8 weight; /**< locator weight */
12058 u8 addr[16]; /**< IPv4/IPv6 address */
12063 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
12065 unformat_input_t *input = vam->input;
12066 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12069 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12070 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12071 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12072 u32 action = ~0, p, w;
12073 ip4_address_t rmt_rloc4, lcl_rloc4;
12074 ip6_address_t rmt_rloc6, lcl_rloc6;
12075 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
12077 memset (&rloc, 0, sizeof (rloc));
12079 /* Parse args required to build the message */
12080 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12082 if (unformat (input, "del"))
12086 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12090 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12094 else if (unformat (input, "p %d w %d", &p, &w))
12098 errmsg ("No RLOC configured for setting priority/weight!");
12101 curr_rloc->priority = p;
12102 curr_rloc->weight = w;
12104 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12105 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12109 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
12110 rloc.priority = rloc.weight = 0;
12111 vec_add1 (lcl_locs, rloc);
12113 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12114 vec_add1 (rmt_locs, rloc);
12115 /* priority and weight saved in rmt loc */
12116 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12118 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
12119 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12122 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
12123 rloc.priority = rloc.weight = 0;
12124 vec_add1 (lcl_locs, rloc);
12126 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12127 vec_add1 (rmt_locs, rloc);
12128 /* priority and weight saved in rmt loc */
12129 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12131 else if (unformat (input, "action %d", &action))
12137 clib_warning ("parse error '%U'", format_unformat_error, input);
12144 errmsg ("remote eid addresses not set\n");
12148 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
12150 errmsg ("eid types don't match\n");
12154 if (0 == rmt_locs && (u32) ~ 0 == action)
12156 errmsg ("action not set for negative mapping\n");
12160 /* Construct the API message */
12161 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
12163 mp->is_add = is_add;
12164 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
12165 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
12166 mp->eid_type = rmt_eid->type;
12167 mp->rmt_len = rmt_eid->len;
12168 mp->lcl_len = lcl_eid->len;
12169 mp->action = action;
12171 if (0 != rmt_locs && 0 != lcl_locs)
12173 mp->loc_num = vec_len (rmt_locs);
12174 clib_memcpy (mp->lcl_locs, lcl_locs,
12175 (sizeof (rloc_t) * vec_len (lcl_locs)));
12176 clib_memcpy (mp->rmt_locs, rmt_locs,
12177 (sizeof (rloc_t) * vec_len (rmt_locs)));
12179 vec_free (lcl_locs);
12180 vec_free (rmt_locs);
12185 /* Wait for a reply... */
12193 api_lisp_add_del_map_resolver (vat_main_t * vam)
12195 unformat_input_t *input = vam->input;
12196 vl_api_lisp_add_del_map_resolver_t *mp;
12201 ip4_address_t ipv4;
12202 ip6_address_t ipv6;
12204 /* Parse args required to build the message */
12205 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12207 if (unformat (input, "del"))
12211 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
12215 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
12223 if (ipv4_set && ipv6_set)
12225 errmsg ("both eid v4 and v6 addresses set\n");
12229 if (!ipv4_set && !ipv6_set)
12231 errmsg ("eid addresses not set\n");
12235 /* Construct the API message */
12236 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
12238 mp->is_add = is_add;
12242 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
12247 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
12253 /* Wait for a reply... */
12261 api_lisp_gpe_enable_disable (vat_main_t * vam)
12263 unformat_input_t *input = vam->input;
12264 vl_api_lisp_gpe_enable_disable_t *mp;
12269 /* Parse args required to build the message */
12270 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12272 if (unformat (input, "enable"))
12277 else if (unformat (input, "disable"))
12288 errmsg ("Value not set\n");
12292 /* Construct the API message */
12293 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
12300 /* Wait for a reply... */
12308 api_lisp_enable_disable (vat_main_t * vam)
12310 unformat_input_t *input = vam->input;
12311 vl_api_lisp_enable_disable_t *mp;
12316 /* Parse args required to build the message */
12317 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12319 if (unformat (input, "enable"))
12324 else if (unformat (input, "disable"))
12334 errmsg ("Value not set\n");
12338 /* Construct the API message */
12339 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
12346 /* Wait for a reply... */
12354 * Enable/disable LISP proxy ITR.
12356 * @param vam vpp API test context
12357 * @return return code
12360 api_lisp_pitr_set_locator_set (vat_main_t * vam)
12363 u8 ls_name_set = 0;
12364 unformat_input_t *input = vam->input;
12365 vl_api_lisp_pitr_set_locator_set_t *mp;
12369 /* Parse args required to build the message */
12370 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12372 if (unformat (input, "del"))
12374 else if (unformat (input, "locator-set %s", &ls_name))
12378 errmsg ("parse error '%U'", format_unformat_error, input);
12385 errmsg ("locator-set name not set!");
12389 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
12391 mp->is_add = is_add;
12392 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
12393 vec_free (ls_name);
12398 /* wait for reply */
12406 api_show_lisp_pitr (vat_main_t * vam)
12408 vl_api_show_lisp_pitr_t *mp;
12411 if (!vam->json_output)
12413 fformat (vam->ofp, "%=20s\n", "lisp status:");
12416 M (SHOW_LISP_PITR, show_lisp_pitr);
12420 /* Wait for a reply... */
12428 * Add/delete mapping between vni and vrf
12431 api_lisp_eid_table_add_del_map (vat_main_t * vam)
12434 unformat_input_t *input = vam->input;
12435 vl_api_lisp_eid_table_add_del_map_t *mp;
12436 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
12437 u32 vni, vrf, bd_index;
12439 /* Parse args required to build the message */
12440 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12442 if (unformat (input, "del"))
12444 else if (unformat (input, "vrf %d", &vrf))
12446 else if (unformat (input, "bd_index %d", &bd_index))
12448 else if (unformat (input, "vni %d", &vni))
12454 if (!vni_set || (!vrf_set && !bd_index_set))
12456 errmsg ("missing arguments!");
12460 if (vrf_set && bd_index_set)
12462 errmsg ("error: both vrf and bd entered!");
12466 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
12468 mp->is_add = is_add;
12469 mp->vni = htonl (vni);
12470 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
12471 mp->is_l2 = bd_index_set;
12476 /* wait for reply */
12484 * Add/del remote mapping to/from LISP control plane
12486 * @param vam vpp API test context
12487 * @return return code
12490 api_lisp_add_del_remote_mapping (vat_main_t * vam)
12492 unformat_input_t *input = vam->input;
12493 vl_api_lisp_add_del_remote_mapping_t *mp;
12496 //TODO: seid need remove
12497 lisp_eid_vat_t _eid, *eid = &_eid;
12498 lisp_eid_vat_t _seid, *seid = &_seid;
12499 u8 is_add = 1, del_all = 0, eid_set = 0;
12500 u32 action = ~0, p, w;
12501 ip4_address_t rloc4;
12502 ip6_address_t rloc6;
12503 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
12505 memset (&rloc, 0, sizeof (rloc));
12507 /* Parse args required to build the message */
12508 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12510 if (unformat (input, "del-all"))
12514 else if (unformat (input, "del"))
12518 else if (unformat (input, "add"))
12522 else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid))
12526 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, &seid))
12528 //TODO: Need remove, but first must be remove from CSIT test
12530 else if (unformat (input, "vni %d", &vni))
12534 else if (unformat (input, "p %d w %d", &p, &w))
12538 errmsg ("No RLOC configured for setting priority/weight!");
12541 curr_rloc->priority = p;
12542 curr_rloc->weight = w;
12544 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
12547 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
12548 vec_add1 (rlocs, rloc);
12549 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12551 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
12554 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
12555 vec_add1 (rlocs, rloc);
12556 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12558 else if (unformat (input, "action %d", &action))
12564 clib_warning ("parse error '%U'", format_unformat_error, input);
12571 errmsg ("missing params!");
12575 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
12577 errmsg ("no action set for negative map-reply!");
12581 M (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
12582 mp->is_add = is_add;
12583 mp->vni = htonl (vni);
12584 mp->action = (u8) action;
12585 mp->eid_len = eid->len;
12586 mp->del_all = del_all;
12587 mp->eid_type = eid->type;
12588 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12590 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
12591 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
12597 /* Wait for a reply... */
12605 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
12606 * forwarding entries in data-plane accordingly.
12608 * @param vam vpp API test context
12609 * @return return code
12612 api_lisp_add_del_adjacency (vat_main_t * vam)
12614 unformat_input_t *input = vam->input;
12615 vl_api_lisp_add_del_adjacency_t *mp;
12618 ip4_address_t seid4, deid4;
12619 ip6_address_t seid6, deid6;
12620 u8 deid_mac[6] = { 0 };
12621 u8 seid_mac[6] = { 0 };
12622 u8 deid_type, seid_type;
12623 u32 seid_len = 0, deid_len = 0, len;
12626 seid_type = deid_type = (u8) ~ 0;
12628 /* Parse args required to build the message */
12629 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12631 if (unformat (input, "del"))
12635 else if (unformat (input, "add"))
12639 else if (unformat (input, "deid %U/%d", unformat_ip4_address,
12642 deid_type = 0; /* ipv4 */
12645 else if (unformat (input, "deid %U/%d", unformat_ip6_address,
12648 deid_type = 1; /* ipv6 */
12651 else if (unformat (input, "deid %U", unformat_ethernet_address,
12654 deid_type = 2; /* mac */
12656 else if (unformat (input, "seid %U/%d", unformat_ip4_address,
12659 seid_type = 0; /* ipv4 */
12662 else if (unformat (input, "seid %U/%d", unformat_ip6_address,
12665 seid_type = 1; /* ipv6 */
12668 else if (unformat (input, "seid %U", unformat_ethernet_address,
12671 seid_type = 2; /* mac */
12673 else if (unformat (input, "vni %d", &vni))
12679 errmsg ("parse error '%U'", format_unformat_error, input);
12684 if ((u8) ~ 0 == deid_type)
12686 errmsg ("missing params!");
12690 if (seid_type != deid_type)
12692 errmsg ("source and destination EIDs are of different types!");
12696 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
12697 mp->is_add = is_add;
12698 mp->vni = htonl (vni);
12699 mp->seid_len = seid_len;
12700 mp->deid_len = deid_len;
12701 mp->eid_type = deid_type;
12703 switch (mp->eid_type)
12706 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
12707 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
12710 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
12711 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
12714 clib_memcpy (mp->seid, seid_mac, 6);
12715 clib_memcpy (mp->deid, deid_mac, 6);
12718 errmsg ("unknown EID type %d!", mp->eid_type);
12725 /* Wait for a reply... */
12733 api_lisp_gpe_add_del_iface (vat_main_t * vam)
12735 unformat_input_t *input = vam->input;
12736 vl_api_lisp_gpe_add_del_iface_t *mp;
12738 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
12739 u32 dp_table = 0, vni = 0;
12741 /* Parse args required to build the message */
12742 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12744 if (unformat (input, "up"))
12749 else if (unformat (input, "down"))
12754 else if (unformat (input, "table_id %d", &dp_table))
12758 else if (unformat (input, "bd_id %d", &dp_table))
12763 else if (unformat (input, "vni %d", &vni))
12771 if (action_set == 0)
12773 errmsg ("Action not set\n");
12776 if (dp_table_set == 0 || vni_set == 0)
12778 errmsg ("vni and dp_table must be set\n");
12782 /* Construct the API message */
12783 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
12785 mp->is_add = is_add;
12786 mp->dp_table = dp_table;
12793 /* Wait for a reply... */
12801 * Add/del map request itr rlocs from LISP control plane and updates
12803 * @param vam vpp API test context
12804 * @return return code
12807 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
12809 unformat_input_t *input = vam->input;
12810 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
12812 u8 *locator_set_name = 0;
12813 u8 locator_set_name_set = 0;
12816 /* Parse args required to build the message */
12817 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12819 if (unformat (input, "del"))
12823 else if (unformat (input, "%_%v%_", &locator_set_name))
12825 locator_set_name_set = 1;
12829 clib_warning ("parse error '%U'", format_unformat_error, input);
12834 if (is_add && !locator_set_name_set)
12836 errmsg ("itr-rloc is not set!");
12840 if (is_add && vec_len (locator_set_name) > 64)
12842 errmsg ("itr-rloc locator-set name too long\n");
12843 vec_free (locator_set_name);
12847 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
12848 mp->is_add = is_add;
12851 clib_memcpy (mp->locator_set_name, locator_set_name,
12852 vec_len (locator_set_name));
12856 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
12858 vec_free (locator_set_name);
12863 /* Wait for a reply... */
12871 lisp_locator_dump_send_msg (vat_main_t * vam, u32 locator_set_index,
12874 vl_api_lisp_locator_dump_t *mp;
12877 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
12879 mp->locator_set_index = htonl (locator_set_index);
12880 mp->filter = filter;
12885 /* Use a control ping for synchronization */
12887 vl_api_noprint_control_ping_t *mp;
12888 M (NOPRINT_CONTROL_PING, noprint_control_ping);
12891 /* Wait for a reply... */
12896 clean_locator_set_message (vat_main_t * vam)
12898 locator_set_msg_t *ls = 0;
12900 vec_foreach (ls, vam->locator_set_msg)
12902 vec_free (ls->locator_set_name);
12905 vec_free (vam->locator_set_msg);
12909 print_locator_in_locator_set (vat_main_t * vam, u8 filter)
12911 locator_set_msg_t *ls;
12912 locator_msg_t *loc;
12914 int i = 0, ret = 0;
12916 vec_foreach (ls, vam->locator_set_msg)
12918 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12921 vec_free (vam->locator_msg);
12922 clean_locator_set_message (vam);
12926 tmp_str = format (0, "%=20s%=16d%s", ls->locator_set_name,
12927 ls->locator_set_index,
12928 vec_len (vam->locator_msg) ? "" : "\n");
12930 vec_foreach (loc, vam->locator_msg)
12934 tmp_str = format (tmp_str, "%=37s", " ");
12938 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
12939 loc->sw_if_index, loc->priority, loc->weight);
12943 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
12944 loc->is_ipv6 ? format_ip6_address :
12945 format_ip4_address,
12946 loc->ip_address, loc->priority, loc->weight);
12951 fformat (vam->ofp, "%s", tmp_str);
12952 vec_free (tmp_str);
12953 vec_free (vam->locator_msg);
12956 clean_locator_set_message (vam);
12962 json_locator_in_locator_set (vat_main_t * vam, u8 filter)
12964 locator_set_msg_t *ls;
12965 locator_msg_t *loc;
12966 vat_json_node_t *node = NULL;
12967 vat_json_node_t *locator_array;
12968 vat_json_node_t *locator;
12969 struct in6_addr ip6;
12970 struct in_addr ip4;
12973 if (!vec_len (vam->locator_set_msg))
12975 /* just print [] */
12976 vat_json_init_array (&vam->json_tree);
12977 vat_json_print (vam->ofp, &vam->json_tree);
12978 vam->json_tree.type = VAT_JSON_NONE;
12982 if (VAT_JSON_ARRAY != vam->json_tree.type)
12984 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12985 vat_json_init_array (&vam->json_tree);
12988 vec_foreach (ls, vam->locator_set_msg)
12990 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12993 vec_free (ls->locator_set_name);
12994 vec_free (vam->locator_msg);
12995 vec_free (vam->locator_set_msg);
12996 vat_json_free (&vam->json_tree);
12997 vam->json_tree.type = VAT_JSON_NONE;
13001 node = vat_json_array_add (&vam->json_tree);
13002 vat_json_init_object (node);
13004 vat_json_object_add_uint (node, "locator-set-index",
13005 ls->locator_set_index);
13006 vat_json_object_add_string_copy (node, "locator-set",
13007 ls->locator_set_name);
13008 locator_array = vat_json_object_add_list (node, "locator");
13009 vec_foreach (loc, vam->locator_msg)
13011 locator = vat_json_array_add (locator_array);
13012 vat_json_init_object (locator);
13015 vat_json_object_add_uint (locator, "locator-index",
13022 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13023 vat_json_object_add_ip6 (locator, "locator", ip6);
13027 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13028 vat_json_object_add_ip4 (locator, "locator", ip4);
13031 vat_json_object_add_uint (locator, "priority", loc->priority);
13032 vat_json_object_add_uint (locator, "weight", loc->weight);
13035 vec_free (ls->locator_set_name);
13036 vec_free (vam->locator_msg);
13039 vat_json_print (vam->ofp, &vam->json_tree);
13040 vat_json_free (&vam->json_tree);
13041 vam->json_tree.type = VAT_JSON_NONE;
13043 vec_free (vam->locator_set_msg);
13049 get_locator_set_index_from_msg (vat_main_t * vam, u8 * locator_set,
13050 u32 * locator_set_index)
13052 locator_set_msg_t *ls;
13055 *locator_set_index = ~0;
13057 if (!vec_len (vam->locator_set_msg))
13062 vec_foreach (ls, vam->locator_set_msg)
13064 if (!strcmp ((char *) locator_set, (char *) ls->locator_set_name))
13066 *locator_set_index = ls->locator_set_index;
13067 vec_free (vam->locator_set_msg);
13072 vec_free (vam->locator_set_msg);
13078 get_locator_set_index (vat_main_t * vam, u8 * locator_set,
13079 u32 * locator_set_index)
13081 vl_api_lisp_locator_set_dump_t *mp;
13084 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13088 /* Use a control ping for synchronization */
13090 vl_api_noprint_control_ping_t *mp;
13091 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13095 vam->noprint_msg = 1;
13096 /* Wait for a reply... */
13100 get_locator_set_index_from_msg (vam, locator_set, locator_set_index);
13101 vam->noprint_msg = 0;
13110 lisp_locator_dump (vat_main_t * vam, u32 locator_set_index, u8 * locator_set,
13117 if (!vam->json_output)
13119 fformat (vam->ofp, "%=20s%=16s%=16s\n",
13120 "locator", "priority", "weight");
13125 ret = get_locator_set_index (vam, locator_set, &locator_set_index);
13128 if (!ret && ~0 == locator_set_index)
13133 ret = lisp_locator_dump_send_msg (vam, locator_set_index, filter);
13139 lisp_locator_set_dump (vat_main_t * vam, u8 filter)
13141 vl_api_lisp_locator_set_dump_t *mp;
13144 if (!vam->json_output)
13146 fformat (vam->ofp, "%=20s%=16s%=16s%=16s%=16s\n",
13147 "locator-set", "locator-set-index", "locator", "priority",
13151 vam->noprint_msg = 1;
13153 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13155 mp->filter = filter;
13160 /* Use a control ping for synchronization */
13162 vl_api_noprint_control_ping_t *mp;
13163 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13167 /* Wait for a reply... */
13171 if (vam->noprint_msg)
13173 if (!vam->json_output)
13175 print_locator_in_locator_set(vam, filter);
13179 json_locator_in_locator_set(vam, filter);
13182 vam->noprint_msg = 0;
13191 api_lisp_locator_set_dump (vat_main_t * vam)
13193 unformat_input_t *input = vam->input;
13194 vam->noprint_msg = 0;
13195 u32 locator_set_index = ~0;
13196 u8 locator_set_index_set = 0;
13197 u8 *locator_set = 0;
13198 u8 locator_set_set = 0;
13202 /* Parse args required to build the message */
13203 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13205 if (unformat (input, "locator-set-index %u", &locator_set_index))
13207 locator_set_index_set = 1;
13209 else if (unformat (input, "locator-set %s", &locator_set))
13211 locator_set_set = 1;
13213 else if (unformat (input, "local"))
13217 else if (unformat (input, "remote"))
13227 if (locator_set_index_set && locator_set_set)
13229 errmsg ("use only input parameter!\n");
13233 if (locator_set_index_set || locator_set_set)
13235 ret = lisp_locator_dump (vam, locator_set_index, locator_set, filter);
13239 ret = lisp_locator_set_dump (vam, filter);
13242 vec_free (locator_set);
13248 api_lisp_eid_table_map_dump (vat_main_t * vam)
13252 unformat_input_t *input = vam->input;
13253 vl_api_lisp_eid_table_map_dump_t *mp;
13256 /* Parse args required to build the message */
13257 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13259 if (unformat (input, "l2"))
13264 else if (unformat (input, "l3"))
13271 errmsg ("parse error '%U'", format_unformat_error, input);
13278 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13282 if (!vam->json_output)
13284 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
13287 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
13293 /* Use a control ping for synchronization */
13295 vl_api_control_ping_t *mp;
13296 M (CONTROL_PING, control_ping);
13299 /* Wait for a reply... */
13307 api_lisp_eid_table_vni_dump (vat_main_t * vam)
13309 vl_api_lisp_eid_table_vni_dump_t *mp;
13312 if (!vam->json_output)
13314 fformat (vam->ofp, "VNI\n");
13317 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
13322 /* Use a control ping for synchronization */
13324 vl_api_control_ping_t *mp;
13325 M (CONTROL_PING, control_ping);
13328 /* Wait for a reply... */
13336 get_locator_set (vat_main_t * vam)
13338 vl_api_lisp_locator_set_dump_t *mp;
13341 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13345 /* Use a control ping for synchronization */
13347 vl_api_noprint_control_ping_t *mp;
13348 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13352 /* Wait for a reply... */
13360 format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table,
13363 u8 *(*format_eid) (u8 *, va_list *) = 0;
13365 ASSERT (vam != NULL);
13366 ASSERT (eid_table != NULL);
13373 switch (eid_table->eid_type)
13377 format_eid = (eid_table->eid_type ? format_ip6_address :
13378 format_ip4_address);
13379 str = format (0, "[%d] %U/%d", eid_table->vni,
13380 format_eid, eid_table->eid, eid_table->eid_prefix_len);
13383 str = format (0, "[%d] %U", eid_table->vni,
13384 format_ethernet_address, eid_table->eid);
13387 errmsg ("unknown EID type %d!", eid_table->eid_type);
13399 format_locator_set_for_eid_table (vat_main_t * vam, u8 * str,
13400 eid_table_t * eid_table)
13402 locator_set_msg_t *ls = 0;
13404 ASSERT (vam != NULL);
13405 ASSERT (eid_table != NULL);
13407 if (eid_table->is_local)
13409 vec_foreach (ls, vam->locator_set_msg)
13411 if (ls->locator_set_index == eid_table->locator_set_index)
13413 str = format (0, "local(%s)", ls->locator_set_name);
13418 str = format (0, "local(N/A)");
13422 str = format (0, "remote");
13429 format_locator_for_eid_table (vat_main_t * vam, u8 * str,
13430 eid_table_t * eid_table)
13432 locator_msg_t *loc = 0;
13433 int first_line = 1;
13435 ASSERT (vam != NULL);
13436 ASSERT (eid_table != NULL);
13438 if (~0 == eid_table->locator_set_index)
13440 return format (0, "action: %d\n", eid_table->action);
13443 vec_foreach (loc, vam->locator_msg)
13449 str = format (str, "%-55s%-d\n", " ", loc->sw_if_index);
13453 str = format (str, "%=55s%-U\n", " ",
13454 loc->is_ipv6 ? format_ip6_address :
13455 format_ip4_address, loc->ip_address);
13463 str = format (str, "%-30d%-20u%-u\n", loc->sw_if_index,
13464 eid_table->ttl, eid_table->authoritative);
13468 str = format (str, "%-30U%-20u%-u\n",
13469 loc->is_ipv6 ? format_ip6_address :
13470 format_ip4_address,
13471 loc->ip_address, eid_table->ttl,
13472 eid_table->authoritative);
13481 print_lisp_eid_table_dump (vat_main_t * vam)
13483 eid_table_t *eid_table = 0;
13484 u8 *tmp_str = 0, *tmp_str2 = 0;
13487 ASSERT (vam != NULL);
13489 ret = get_locator_set (vam);
13492 vec_free (vam->eid_tables);
13496 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", "locators",
13497 "ttl", "authoritative");
13499 vec_foreach (eid_table, vam->eid_tables)
13501 if (~0 != eid_table->locator_set_index)
13503 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index,
13507 vec_free (vam->locator_msg);
13508 clean_locator_set_message (vam);
13509 vec_free (vam->eid_tables);
13514 tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret);
13517 vec_free (vam->locator_msg);
13518 clean_locator_set_message (vam);
13519 vec_free (vam->eid_tables);
13523 tmp_str = format (0, "%-35s", tmp_str2);
13524 vec_free (tmp_str2);
13526 tmp_str2 = format_locator_set_for_eid_table (vam, tmp_str2, eid_table);
13527 tmp_str = format (tmp_str, "%-20s", tmp_str2);
13528 vec_free (tmp_str2);
13530 tmp_str2 = format_locator_for_eid_table (vam, tmp_str2, eid_table);
13531 tmp_str = format (tmp_str, "%-s", tmp_str2);
13532 vec_free (tmp_str2);
13534 fformat (vam->ofp, "%s", tmp_str);
13535 vec_free (tmp_str);
13536 vec_free (vam->locator_msg);
13539 clean_locator_set_message (vam);
13540 vec_free (vam->eid_tables);
13546 json_locator_set_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13547 eid_table_t * eid_table)
13549 locator_set_msg_t *ls = 0;
13552 ASSERT (vam != NULL);
13553 ASSERT (node != NULL);
13554 ASSERT (eid_table != NULL);
13556 if (eid_table->is_local)
13558 vec_foreach (ls, vam->locator_set_msg)
13560 if (ls->locator_set_index == eid_table->locator_set_index)
13562 vat_json_object_add_string_copy (node, "locator-set",
13563 ls->locator_set_name);
13568 s = format (0, "N/A");
13570 vat_json_object_add_string_copy (node, "locator-set", s);
13575 s = format (0, "remote");
13577 vat_json_object_add_string_copy (node, "locator-set", s);
13583 json_eid_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13584 eid_table_t * eid_table)
13587 struct in6_addr ip6;
13588 struct in_addr ip4;
13590 ASSERT (vam != NULL);
13591 ASSERT (node != NULL);
13592 ASSERT (eid_table != NULL);
13594 switch (eid_table->eid_type)
13597 clib_memcpy (&ip4, eid_table->eid, sizeof (ip4));
13598 vat_json_object_add_ip4 (node, "eid", ip4);
13599 vat_json_object_add_uint (node, "eid-prefix-len",
13600 eid_table->eid_prefix_len);
13603 clib_memcpy (&ip6, eid_table->eid, sizeof (ip6));
13604 vat_json_object_add_ip6 (node, "eid", ip6);
13605 vat_json_object_add_uint (node, "eid-prefix-len",
13606 eid_table->eid_prefix_len);
13609 s = format (0, "%U", format_ethernet_address, eid_table->eid);
13611 vat_json_object_add_string_copy (node, "eid", s);
13615 errmsg ("unknown EID type %d!", eid_table->eid_type);
13623 json_locator_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13624 eid_table_t * eid_table)
13626 locator_msg_t *loc = 0;
13627 vat_json_node_t *locator_array = 0;
13628 vat_json_node_t *locator = 0;
13629 struct in6_addr ip6;
13630 struct in_addr ip4;
13632 ASSERT (vam != NULL);
13633 ASSERT (node != NULL);
13634 ASSERT (eid_table != NULL);
13636 locator_array = vat_json_object_add_list (node, "locator");
13637 vec_foreach (loc, vam->locator_msg)
13639 locator = vat_json_array_add (locator_array);
13640 vat_json_init_object (locator);
13643 vat_json_object_add_uint (locator, "locator-index", loc->sw_if_index);
13649 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13650 vat_json_object_add_ip6 (locator, "locator", ip6);
13654 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13655 vat_json_object_add_ip4 (locator, "locator", ip4);
13662 json_lisp_eid_table_dump (vat_main_t * vam)
13664 eid_table_t *eid_table;
13665 vat_json_node_t *node = 0;
13668 ASSERT (vam != NULL);
13670 ret = get_locator_set (vam);
13673 vec_free (vam->eid_tables);
13677 if (!vec_len (vam->eid_tables))
13679 /* just print [] */
13680 vat_json_init_array (&vam->json_tree);
13681 vat_json_print (vam->ofp, &vam->json_tree);
13682 vam->json_tree.type = VAT_JSON_NONE;
13686 if (VAT_JSON_ARRAY != vam->json_tree.type)
13688 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13689 vat_json_init_array (&vam->json_tree);
13692 vec_foreach (eid_table, vam->eid_tables)
13694 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0);
13697 vec_free (vam->locator_msg);
13698 vec_free (vam->eid_tables);
13699 clean_locator_set_message (vam);
13700 vat_json_free (&vam->json_tree);
13701 vam->json_tree.type = VAT_JSON_NONE;
13705 node = vat_json_array_add (&vam->json_tree);
13706 vat_json_init_object (node);
13708 vat_json_object_add_uint (node, "vni", eid_table->vni);
13710 json_locator_set_for_eid_table (vam, node, eid_table);
13711 ret = json_eid_for_eid_table (vam, node, eid_table);
13714 vec_free (vam->locator_msg);
13715 vec_free (vam->eid_tables);
13716 clean_locator_set_message (vam);
13717 vat_json_free (&vam->json_tree);
13718 vam->json_tree.type = VAT_JSON_NONE;
13722 json_locator_for_eid_table (vam, node, eid_table);
13724 vat_json_object_add_uint (node, "ttl", eid_table->ttl);
13725 vat_json_object_add_uint (node, "authoritative",
13726 eid_table->authoritative);
13728 vec_free (vam->locator_msg);
13731 vat_json_print (vam->ofp, &vam->json_tree);
13732 vat_json_free (&vam->json_tree);
13733 vam->json_tree.type = VAT_JSON_NONE;
13735 clean_locator_set_message (vam);
13736 vec_free (vam->eid_tables);
13742 api_lisp_eid_table_dump (vat_main_t * vam)
13744 unformat_input_t *i = vam->input;
13745 vl_api_lisp_eid_table_dump_t *mp;
13747 struct in_addr ip4;
13748 struct in6_addr ip6;
13750 u8 eid_type = ~0, eid_set = 0;
13751 u32 prefix_length = ~0, t, vni = 0;
13754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13756 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
13762 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
13768 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
13773 else if (unformat (i, "vni %d", &t))
13777 else if (unformat (i, "local"))
13781 else if (unformat (i, "remote"))
13787 errmsg ("parse error '%U'", format_unformat_error, i);
13792 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
13794 mp->filter = filter;
13798 mp->vni = htonl (vni);
13799 mp->eid_type = eid_type;
13803 mp->prefix_length = prefix_length;
13804 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
13807 mp->prefix_length = prefix_length;
13808 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
13811 clib_memcpy (mp->eid, mac, sizeof (mac));
13814 errmsg ("unknown EID type %d!", eid_type);
13819 vam->noprint_msg = 1;
13824 /* Use a control ping for synchronization */
13826 vl_api_noprint_control_ping_t *mp;
13827 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13831 /* Wait for a reply... */
13835 if (vam->noprint_msg)
13837 if (!vam->json_output)
13839 vam->retval = print_lisp_eid_table_dump(vam);
13843 vam->retval = json_lisp_eid_table_dump(vam);
13846 vam->noprint_msg = 0;
13855 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
13857 vl_api_lisp_gpe_tunnel_dump_t *mp;
13860 if (!vam->json_output)
13862 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
13863 "%=16s%=16s%=16s%=16s%=16s\n",
13864 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
13865 "Decap next", "Lisp version", "Flags", "Next protocol",
13866 "ver_res", "res", "iid");
13869 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
13873 /* Use a control ping for synchronization */
13875 vl_api_control_ping_t *mp;
13876 M (CONTROL_PING, control_ping);
13879 /* Wait for a reply... */
13887 api_lisp_map_resolver_dump (vat_main_t * vam)
13889 vl_api_lisp_map_resolver_dump_t *mp;
13892 if (!vam->json_output)
13894 fformat (vam->ofp, "%=20s\n", "Map resolver");
13897 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
13901 /* Use a control ping for synchronization */
13903 vl_api_control_ping_t *mp;
13904 M (CONTROL_PING, control_ping);
13907 /* Wait for a reply... */
13915 api_show_lisp_status (vat_main_t * vam)
13917 vl_api_show_lisp_status_t *mp;
13920 if (!vam->json_output)
13922 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
13925 M (SHOW_LISP_STATUS, show_lisp_status);
13928 /* Wait for a reply... */
13936 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
13938 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
13941 if (!vam->json_output)
13943 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
13946 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
13949 /* Wait for a reply... */
13957 api_af_packet_create (vat_main_t * vam)
13959 unformat_input_t *i = vam->input;
13960 vl_api_af_packet_create_t *mp;
13962 u8 *host_if_name = 0;
13964 u8 random_hw_addr = 1;
13966 memset (hw_addr, 0, sizeof (hw_addr));
13968 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13970 if (unformat (i, "name %s", &host_if_name))
13971 vec_add1 (host_if_name, 0);
13972 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
13973 random_hw_addr = 0;
13978 if (!vec_len (host_if_name))
13980 errmsg ("host-interface name must be specified");
13984 if (vec_len (host_if_name) > 64)
13986 errmsg ("host-interface name too long");
13990 M (AF_PACKET_CREATE, af_packet_create);
13992 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
13993 clib_memcpy (mp->hw_addr, hw_addr, 6);
13994 mp->use_random_hw_addr = random_hw_addr;
13995 vec_free (host_if_name);
13998 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14004 api_af_packet_delete (vat_main_t * vam)
14006 unformat_input_t *i = vam->input;
14007 vl_api_af_packet_delete_t *mp;
14009 u8 *host_if_name = 0;
14011 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14013 if (unformat (i, "name %s", &host_if_name))
14014 vec_add1 (host_if_name, 0);
14019 if (!vec_len (host_if_name))
14021 errmsg ("host-interface name must be specified");
14025 if (vec_len (host_if_name) > 64)
14027 errmsg ("host-interface name too long");
14031 M (AF_PACKET_DELETE, af_packet_delete);
14033 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14034 vec_free (host_if_name);
14043 api_policer_add_del (vat_main_t * vam)
14045 unformat_input_t *i = vam->input;
14046 vl_api_policer_add_del_t *mp;
14057 u8 color_aware = 0;
14058 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
14060 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14061 conform_action.dscp = 0;
14062 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14063 exceed_action.dscp = 0;
14064 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14065 violate_action.dscp = 0;
14067 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14069 if (unformat (i, "del"))
14071 else if (unformat (i, "name %s", &name))
14072 vec_add1 (name, 0);
14073 else if (unformat (i, "cir %u", &cir))
14075 else if (unformat (i, "eir %u", &eir))
14077 else if (unformat (i, "cb %u", &cb))
14079 else if (unformat (i, "eb %u", &eb))
14081 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14084 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14087 else if (unformat (i, "type %U", unformat_policer_type, &type))
14089 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14092 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14095 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14098 else if (unformat (i, "color-aware"))
14104 if (!vec_len (name))
14106 errmsg ("policer name must be specified");
14110 if (vec_len (name) > 64)
14112 errmsg ("policer name too long");
14116 M (POLICER_ADD_DEL, policer_add_del);
14118 clib_memcpy (mp->name, name, vec_len (name));
14120 mp->is_add = is_add;
14125 mp->rate_type = rate_type;
14126 mp->round_type = round_type;
14128 mp->conform_action_type = conform_action.action_type;
14129 mp->conform_dscp = conform_action.dscp;
14130 mp->exceed_action_type = exceed_action.action_type;
14131 mp->exceed_dscp = exceed_action.dscp;
14132 mp->violate_action_type = violate_action.action_type;
14133 mp->violate_dscp = violate_action.dscp;
14134 mp->color_aware = color_aware;
14143 api_policer_dump (vat_main_t * vam)
14145 unformat_input_t *i = vam->input;
14146 vl_api_policer_dump_t *mp;
14148 u8 *match_name = 0;
14149 u8 match_name_valid = 0;
14151 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14153 if (unformat (i, "name %s", &match_name))
14155 vec_add1 (match_name, 0);
14156 match_name_valid = 1;
14162 M (POLICER_DUMP, policer_dump);
14163 mp->match_name_valid = match_name_valid;
14164 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14165 vec_free (match_name);
14169 /* Use a control ping for synchronization */
14171 vl_api_control_ping_t *mp;
14172 M (CONTROL_PING, control_ping);
14175 /* Wait for a reply... */
14183 api_policer_classify_set_interface (vat_main_t * vam)
14185 unformat_input_t *i = vam->input;
14186 vl_api_policer_classify_set_interface_t *mp;
14189 int sw_if_index_set;
14190 u32 ip4_table_index = ~0;
14191 u32 ip6_table_index = ~0;
14192 u32 l2_table_index = ~0;
14195 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14197 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14198 sw_if_index_set = 1;
14199 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14200 sw_if_index_set = 1;
14201 else if (unformat (i, "del"))
14203 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14205 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14207 else if (unformat (i, "l2-table %d", &l2_table_index))
14211 clib_warning ("parse error '%U'", format_unformat_error, i);
14216 if (sw_if_index_set == 0)
14218 errmsg ("missing interface name or sw_if_index\n");
14222 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14224 mp->sw_if_index = ntohl (sw_if_index);
14225 mp->ip4_table_index = ntohl (ip4_table_index);
14226 mp->ip6_table_index = ntohl (ip6_table_index);
14227 mp->l2_table_index = ntohl (l2_table_index);
14228 mp->is_add = is_add;
14237 api_policer_classify_dump (vat_main_t * vam)
14239 unformat_input_t *i = vam->input;
14240 vl_api_policer_classify_dump_t *mp;
14242 u8 type = POLICER_CLASSIFY_N_TABLES;
14244 if (unformat (i, "type %U", unformat_classify_table_type, &type))
14248 errmsg ("classify table type must be specified\n");
14252 if (!vam->json_output)
14254 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14257 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14262 /* Use a control ping for synchronization */
14264 vl_api_control_ping_t *mp;
14265 M (CONTROL_PING, control_ping);
14268 /* Wait for a reply... */
14276 api_netmap_create (vat_main_t * vam)
14278 unformat_input_t *i = vam->input;
14279 vl_api_netmap_create_t *mp;
14283 u8 random_hw_addr = 1;
14287 memset (hw_addr, 0, sizeof (hw_addr));
14289 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14291 if (unformat (i, "name %s", &if_name))
14292 vec_add1 (if_name, 0);
14293 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14294 random_hw_addr = 0;
14295 else if (unformat (i, "pipe"))
14297 else if (unformat (i, "master"))
14299 else if (unformat (i, "slave"))
14305 if (!vec_len (if_name))
14307 errmsg ("interface name must be specified");
14311 if (vec_len (if_name) > 64)
14313 errmsg ("interface name too long");
14317 M (NETMAP_CREATE, netmap_create);
14319 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14320 clib_memcpy (mp->hw_addr, hw_addr, 6);
14321 mp->use_random_hw_addr = random_hw_addr;
14322 mp->is_pipe = is_pipe;
14323 mp->is_master = is_master;
14324 vec_free (if_name);
14333 api_netmap_delete (vat_main_t * vam)
14335 unformat_input_t *i = vam->input;
14336 vl_api_netmap_delete_t *mp;
14340 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14342 if (unformat (i, "name %s", &if_name))
14343 vec_add1 (if_name, 0);
14348 if (!vec_len (if_name))
14350 errmsg ("interface name must be specified");
14354 if (vec_len (if_name) > 64)
14356 errmsg ("interface name too long");
14360 M (NETMAP_DELETE, netmap_delete);
14362 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14363 vec_free (if_name);
14371 static void vl_api_mpls_gre_tunnel_details_t_handler
14372 (vl_api_mpls_gre_tunnel_details_t * mp)
14374 vat_main_t *vam = &vat_main;
14376 i32 len = ntohl (mp->nlabels);
14378 if (mp->l2_only == 0)
14380 fformat (vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
14381 ntohl (mp->tunnel_index),
14382 format_ip4_address, &mp->tunnel_src,
14383 format_ip4_address, &mp->tunnel_dst,
14384 format_ip4_address, &mp->intfc_address,
14385 ntohl (mp->mask_width));
14386 for (i = 0; i < len; i++)
14388 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14390 fformat (vam->ofp, "\n");
14391 fformat (vam->ofp, " inner fib index %d, outer fib index %d\n",
14392 ntohl (mp->inner_fib_index), ntohl (mp->outer_fib_index));
14396 fformat (vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
14397 ntohl (mp->tunnel_index),
14398 format_ip4_address, &mp->tunnel_src,
14399 format_ip4_address, &mp->tunnel_dst,
14400 format_ip4_address, &mp->intfc_address);
14401 for (i = 0; i < len; i++)
14403 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14405 fformat (vam->ofp, "\n");
14406 fformat (vam->ofp, " l2 interface %d, outer fib index %d\n",
14407 ntohl (mp->hw_if_index), ntohl (mp->outer_fib_index));
14411 static void vl_api_mpls_gre_tunnel_details_t_handler_json
14412 (vl_api_mpls_gre_tunnel_details_t * mp)
14414 vat_main_t *vam = &vat_main;
14415 vat_json_node_t *node = NULL;
14416 struct in_addr ip4;
14418 i32 len = ntohl (mp->nlabels);
14420 if (VAT_JSON_ARRAY != vam->json_tree.type)
14422 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14423 vat_json_init_array (&vam->json_tree);
14425 node = vat_json_array_add (&vam->json_tree);
14427 vat_json_init_object (node);
14428 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14429 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14430 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14431 vat_json_object_add_uint (node, "inner_fib_index",
14432 ntohl (mp->inner_fib_index));
14433 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14434 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14435 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14436 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14437 clib_memcpy (&ip4, &(mp->tunnel_src), sizeof (ip4));
14438 vat_json_object_add_ip4 (node, "tunnel_src", ip4);
14439 clib_memcpy (&ip4, &(mp->tunnel_dst), sizeof (ip4));
14440 vat_json_object_add_ip4 (node, "tunnel_dst", ip4);
14441 vat_json_object_add_uint (node, "outer_fib_index",
14442 ntohl (mp->outer_fib_index));
14443 vat_json_object_add_uint (node, "label_count", len);
14444 for (i = 0; i < len; i++)
14446 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14451 api_mpls_gre_tunnel_dump (vat_main_t * vam)
14453 vl_api_mpls_gre_tunnel_dump_t *mp;
14457 /* Parse args required to build the message */
14458 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14460 if (!unformat (vam->input, "tunnel_index %d", &index))
14467 fformat (vam->ofp, " tunnel_index %d\n", index);
14469 M (MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
14470 mp->tunnel_index = htonl (index);
14473 /* Use a control ping for synchronization */
14475 vl_api_control_ping_t *mp;
14476 M (CONTROL_PING, control_ping);
14482 static void vl_api_mpls_eth_tunnel_details_t_handler
14483 (vl_api_mpls_eth_tunnel_details_t * mp)
14485 vat_main_t *vam = &vat_main;
14487 i32 len = ntohl (mp->nlabels);
14489 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14490 ntohl (mp->tunnel_index),
14491 format_ethernet_address, &mp->tunnel_dst_mac,
14492 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14493 for (i = 0; i < len; i++)
14495 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14497 fformat (vam->ofp, "\n");
14498 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14499 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14502 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14503 (vl_api_mpls_eth_tunnel_details_t * mp)
14505 vat_main_t *vam = &vat_main;
14506 vat_json_node_t *node = NULL;
14507 struct in_addr ip4;
14509 i32 len = ntohl (mp->nlabels);
14511 if (VAT_JSON_ARRAY != vam->json_tree.type)
14513 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14514 vat_json_init_array (&vam->json_tree);
14516 node = vat_json_array_add (&vam->json_tree);
14518 vat_json_init_object (node);
14519 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14520 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14521 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14522 vat_json_object_add_uint (node, "inner_fib_index",
14523 ntohl (mp->inner_fib_index));
14524 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14525 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14526 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14527 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14528 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14529 format (0, "%U", format_ethernet_address,
14530 &mp->tunnel_dst_mac));
14531 vat_json_object_add_uint (node, "tx_sw_if_index",
14532 ntohl (mp->tx_sw_if_index));
14533 vat_json_object_add_uint (node, "label_count", len);
14534 for (i = 0; i < len; i++)
14536 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14541 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14543 vl_api_mpls_eth_tunnel_dump_t *mp;
14547 /* Parse args required to build the message */
14548 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14550 if (!unformat (vam->input, "tunnel_index %d", &index))
14557 fformat (vam->ofp, " tunnel_index %d\n", index);
14559 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14560 mp->tunnel_index = htonl (index);
14563 /* Use a control ping for synchronization */
14565 vl_api_control_ping_t *mp;
14566 M (CONTROL_PING, control_ping);
14572 static void vl_api_mpls_fib_encap_details_t_handler
14573 (vl_api_mpls_fib_encap_details_t * mp)
14575 vat_main_t *vam = &vat_main;
14577 i32 len = ntohl (mp->nlabels);
14579 fformat (vam->ofp, "table %d, dest %U, label ",
14580 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14581 for (i = 0; i < len; i++)
14583 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14585 fformat (vam->ofp, "\n");
14588 static void vl_api_mpls_fib_encap_details_t_handler_json
14589 (vl_api_mpls_fib_encap_details_t * mp)
14591 vat_main_t *vam = &vat_main;
14592 vat_json_node_t *node = NULL;
14594 i32 len = ntohl (mp->nlabels);
14595 struct in_addr ip4;
14597 if (VAT_JSON_ARRAY != vam->json_tree.type)
14599 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14600 vat_json_init_array (&vam->json_tree);
14602 node = vat_json_array_add (&vam->json_tree);
14604 vat_json_init_object (node);
14605 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14606 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14607 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14608 vat_json_object_add_ip4 (node, "dest", ip4);
14609 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14610 vat_json_object_add_uint (node, "label_count", len);
14611 for (i = 0; i < len; i++)
14613 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14618 api_mpls_fib_encap_dump (vat_main_t * vam)
14620 vl_api_mpls_fib_encap_dump_t *mp;
14623 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14626 /* Use a control ping for synchronization */
14628 vl_api_control_ping_t *mp;
14629 M (CONTROL_PING, control_ping);
14635 static void vl_api_mpls_fib_decap_details_t_handler
14636 (vl_api_mpls_fib_decap_details_t * mp)
14638 vat_main_t *vam = &vat_main;
14641 "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
14642 ntohl (mp->rx_table_id), ntohl (mp->tx_table_id), mp->swif_tag,
14643 ntohl (mp->label), ntohl (mp->s_bit));
14646 static void vl_api_mpls_fib_decap_details_t_handler_json
14647 (vl_api_mpls_fib_decap_details_t * mp)
14649 vat_main_t *vam = &vat_main;
14650 vat_json_node_t *node = NULL;
14651 struct in_addr ip4;
14653 if (VAT_JSON_ARRAY != vam->json_tree.type)
14655 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14656 vat_json_init_array (&vam->json_tree);
14658 node = vat_json_array_add (&vam->json_tree);
14660 vat_json_init_object (node);
14661 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14662 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14663 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14664 vat_json_object_add_ip4 (node, "dest", ip4);
14665 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14666 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14667 vat_json_object_add_uint (node, "rx_table_id", ntohl (mp->rx_table_id));
14668 vat_json_object_add_uint (node, "tx_table_id", ntohl (mp->tx_table_id));
14669 vat_json_object_add_string_copy (node, "swif_tag", mp->swif_tag);
14673 api_mpls_fib_decap_dump (vat_main_t * vam)
14675 vl_api_mpls_fib_decap_dump_t *mp;
14678 M (MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
14681 /* Use a control ping for synchronization */
14683 vl_api_control_ping_t *mp;
14684 M (CONTROL_PING, control_ping);
14691 api_classify_table_ids (vat_main_t * vam)
14693 vl_api_classify_table_ids_t *mp;
14696 /* Construct the API message */
14697 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14707 api_classify_table_by_interface (vat_main_t * vam)
14709 unformat_input_t *input = vam->input;
14710 vl_api_classify_table_by_interface_t *mp;
14713 u32 sw_if_index = ~0;
14714 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14716 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14718 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14723 if (sw_if_index == ~0)
14725 errmsg ("missing interface name or sw_if_index\n");
14729 /* Construct the API message */
14730 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14732 mp->sw_if_index = ntohl (sw_if_index);
14741 api_classify_table_info (vat_main_t * vam)
14743 unformat_input_t *input = vam->input;
14744 vl_api_classify_table_info_t *mp;
14748 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14750 if (unformat (input, "table_id %d", &table_id))
14755 if (table_id == ~0)
14757 errmsg ("missing table id\n");
14761 /* Construct the API message */
14762 M (CLASSIFY_TABLE_INFO, classify_table_info);
14764 mp->table_id = ntohl (table_id);
14773 api_classify_session_dump (vat_main_t * vam)
14775 unformat_input_t *input = vam->input;
14776 vl_api_classify_session_dump_t *mp;
14780 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14782 if (unformat (input, "table_id %d", &table_id))
14787 if (table_id == ~0)
14789 errmsg ("missing table id\n");
14793 /* Construct the API message */
14794 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
14796 mp->table_id = ntohl (table_id);
14799 /* Use a control ping for synchronization */
14801 vl_api_control_ping_t *mp;
14802 M (CONTROL_PING, control_ping);
14811 vl_api_ipfix_details_t_handler (vl_api_ipfix_details_t * mp)
14813 vat_main_t *vam = &vat_main;
14815 fformat (vam->ofp, "collector_address %U, collector_port %d, "
14816 "src_address %U, fib_index %u, path_mtu %u, "
14817 "template_interval %u\n",
14818 format_ip4_address, mp->collector_address,
14819 ntohs (mp->collector_port),
14820 format_ip4_address, mp->src_address,
14821 ntohl (mp->fib_index),
14822 ntohl (mp->path_mtu), ntohl (mp->template_interval));
14825 vam->result_ready = 1;
14829 vl_api_ipfix_details_t_handler_json (vl_api_ipfix_details_t * mp)
14831 vat_main_t *vam = &vat_main;
14832 vat_json_node_t node;
14833 struct in_addr collector_address;
14834 struct in_addr src_address;
14836 vat_json_init_object (&node);
14837 clib_memcpy (&collector_address, &mp->collector_address,
14838 sizeof (collector_address));
14839 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
14840 vat_json_object_add_uint (&node, "collector_port",
14841 ntohs (mp->collector_port));
14842 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
14843 vat_json_object_add_ip4 (&node, "src_address", src_address);
14844 vat_json_object_add_uint (&node, "fib_index", ntohl (mp->fib_index));
14845 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
14846 vat_json_object_add_uint (&node, "template_interval",
14847 ntohl (mp->template_interval));
14849 vat_json_print (vam->ofp, &node);
14850 vat_json_free (&node);
14852 vam->result_ready = 1;
14856 api_ipfix_dump (vat_main_t * vam)
14858 vl_api_ipfix_dump_t *mp;
14861 /* Construct the API message */
14862 M (IPFIX_DUMP, ipfix_dump);
14872 api_pg_create_interface (vat_main_t * vam)
14874 unformat_input_t *input = vam->input;
14875 vl_api_pg_create_interface_t *mp;
14879 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14881 if (unformat (input, "if_id %d", &if_id))
14888 errmsg ("missing pg interface index\n");
14892 /* Construct the API message */
14893 M (PG_CREATE_INTERFACE, pg_create_interface);
14895 mp->interface_id = ntohl (if_id);
14904 api_pg_capture (vat_main_t * vam)
14906 unformat_input_t *input = vam->input;
14907 vl_api_pg_capture_t *mp;
14913 u8 pcap_file_set = 0;
14915 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14917 if (unformat (input, "if_id %d", &if_id))
14919 else if (unformat (input, "pcap %s", &pcap_file))
14921 else if (unformat (input, "count %d", &count))
14923 else if (unformat (input, "disable"))
14930 errmsg ("missing pg interface index\n");
14933 if (pcap_file_set > 0)
14935 if (vec_len (pcap_file) > 255)
14937 errmsg ("pcap file name is too long\n");
14942 u32 name_len = vec_len (pcap_file);
14943 /* Construct the API message */
14944 M (PG_CAPTURE, pg_capture);
14946 mp->interface_id = ntohl (if_id);
14947 mp->is_enabled = enable;
14948 mp->count = ntohl (count);
14949 mp->pcap_name_length = ntohl (name_len);
14950 if (pcap_file_set != 0)
14952 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
14954 vec_free (pcap_file);
14963 api_pg_enable_disable (vat_main_t * vam)
14965 unformat_input_t *input = vam->input;
14966 vl_api_pg_enable_disable_t *mp;
14970 u8 stream_name_set = 0;
14971 u8 *stream_name = 0;
14972 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14974 if (unformat (input, "stream %s", &stream_name))
14975 stream_name_set = 1;
14976 else if (unformat (input, "disable"))
14982 if (stream_name_set > 0)
14984 if (vec_len (stream_name) > 255)
14986 errmsg ("stream name too long\n");
14991 u32 name_len = vec_len (stream_name);
14992 /* Construct the API message */
14993 M (PG_ENABLE_DISABLE, pg_enable_disable);
14995 mp->is_enabled = enable;
14996 if (stream_name_set != 0)
14998 mp->stream_name_length = ntohl (name_len);
14999 clib_memcpy (mp->stream_name, stream_name, name_len);
15001 vec_free (stream_name);
15010 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15012 unformat_input_t *input = vam->input;
15013 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15016 u16 *low_ports = 0;
15017 u16 *high_ports = 0;
15020 ip4_address_t ip4_addr;
15021 ip6_address_t ip6_addr;
15029 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15031 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15037 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15042 else if (unformat (input, "vrf %d", &vrf_id))
15044 else if (unformat (input, "del"))
15046 else if (unformat (input, "port %d", &tmp))
15048 if (tmp == 0 || tmp > 65535)
15050 errmsg ("port %d out of range", tmp);
15054 this_hi = this_low + 1;
15055 vec_add1 (low_ports, this_low);
15056 vec_add1 (high_ports, this_hi);
15058 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15060 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15062 errmsg ("incorrect range parameters\n");
15066 /* Note: in debug CLI +1 is added to high before
15067 passing to real fn that does "the work"
15068 (ip_source_and_port_range_check_add_del).
15069 This fn is a wrapper around the binary API fn a
15070 control plane will call, which expects this increment
15071 to have occurred. Hence letting the binary API control
15072 plane fn do the increment for consistency between VAT
15073 and other control planes.
15076 vec_add1 (low_ports, this_low);
15077 vec_add1 (high_ports, this_hi);
15083 if (prefix_set == 0)
15085 errmsg ("<address>/<mask> not specified\n");
15091 errmsg ("VRF ID required, not specified\n");
15098 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15102 if (vec_len (low_ports) == 0)
15104 errmsg ("At least one port or port range required\n");
15108 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15109 ip_source_and_port_range_check_add_del);
15111 mp->is_add = is_add;
15116 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15121 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15124 mp->mask_length = length;
15125 mp->number_of_ranges = vec_len (low_ports);
15127 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15128 vec_free (low_ports);
15130 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15131 vec_free (high_ports);
15133 mp->vrf_id = ntohl (vrf_id);
15142 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15144 unformat_input_t *input = vam->input;
15145 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15147 u32 sw_if_index = ~0;
15149 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15150 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15153 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15155 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15157 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15159 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15161 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15163 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15165 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15167 else if (unformat (input, "del"))
15173 if (sw_if_index == ~0)
15175 errmsg ("Interface required but not specified\n");
15181 errmsg ("VRF ID required but not specified\n");
15185 if (tcp_out_vrf_id == 0
15186 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15189 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15193 /* Construct the API message */
15194 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15195 ip_source_and_port_range_check_interface_add_del);
15197 mp->sw_if_index = ntohl (sw_if_index);
15198 mp->is_add = is_add;
15199 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15200 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15201 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15202 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15207 /* Wait for a reply... */
15212 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15214 unformat_input_t *i = vam->input;
15215 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15217 u32 local_sa_id = 0;
15218 u32 remote_sa_id = 0;
15219 ip4_address_t src_address;
15220 ip4_address_t dst_address;
15223 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15225 if (unformat (i, "local_sa %d", &local_sa_id))
15227 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15229 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15231 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15233 else if (unformat (i, "del"))
15237 clib_warning ("parse error '%U'", format_unformat_error, i);
15242 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15244 mp->local_sa_id = ntohl (local_sa_id);
15245 mp->remote_sa_id = ntohl (remote_sa_id);
15246 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15247 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15248 mp->is_add = is_add;
15256 static void vl_api_ipsec_gre_tunnel_details_t_handler
15257 (vl_api_ipsec_gre_tunnel_details_t * mp)
15259 vat_main_t *vam = &vat_main;
15261 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15262 ntohl (mp->sw_if_index),
15263 format_ip4_address, &mp->src_address,
15264 format_ip4_address, &mp->dst_address,
15265 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15268 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15269 (vl_api_ipsec_gre_tunnel_details_t * mp)
15271 vat_main_t *vam = &vat_main;
15272 vat_json_node_t *node = NULL;
15273 struct in_addr ip4;
15275 if (VAT_JSON_ARRAY != vam->json_tree.type)
15277 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15278 vat_json_init_array (&vam->json_tree);
15280 node = vat_json_array_add (&vam->json_tree);
15282 vat_json_init_object (node);
15283 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15284 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15285 vat_json_object_add_ip4 (node, "src_address", ip4);
15286 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15287 vat_json_object_add_ip4 (node, "dst_address", ip4);
15288 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15289 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15293 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15295 unformat_input_t *i = vam->input;
15296 vl_api_ipsec_gre_tunnel_dump_t *mp;
15299 u8 sw_if_index_set = 0;
15301 /* Parse args required to build the message */
15302 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15304 if (unformat (i, "sw_if_index %d", &sw_if_index))
15305 sw_if_index_set = 1;
15310 if (sw_if_index_set == 0)
15315 if (!vam->json_output)
15317 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15318 "sw_if_index", "src_address", "dst_address",
15319 "local_sa_id", "remote_sa_id");
15322 /* Get list of gre-tunnel interfaces */
15323 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15325 mp->sw_if_index = htonl (sw_if_index);
15329 /* Use a control ping for synchronization */
15331 vl_api_control_ping_t *mp;
15332 M (CONTROL_PING, control_ping);
15339 api_delete_subif (vat_main_t * vam)
15341 unformat_input_t *i = vam->input;
15342 vl_api_delete_subif_t *mp;
15344 u32 sw_if_index = ~0;
15346 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15348 if (unformat (i, "sw_if_index %d", &sw_if_index))
15354 if (sw_if_index == ~0)
15356 errmsg ("missing sw_if_index\n");
15360 /* Construct the API message */
15361 M (DELETE_SUBIF, delete_subif);
15362 mp->sw_if_index = ntohl (sw_if_index);
15369 q_or_quit (vat_main_t * vam)
15371 longjmp (vam->jump_buf, 1);
15372 return 0; /* not so much */
15376 q (vat_main_t * vam)
15378 return q_or_quit (vam);
15382 quit (vat_main_t * vam)
15384 return q_or_quit (vam);
15388 comment (vat_main_t * vam)
15394 cmd_cmp (void *a1, void *a2)
15399 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15403 help (vat_main_t * vam)
15408 unformat_input_t *i = vam->input;
15411 if (unformat (i, "%s", &name))
15415 vec_add1 (name, 0);
15417 hs = hash_get_mem (vam->help_by_name, name);
15419 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15421 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15426 fformat (vam->ofp, "Help is available for the following:\n");
15429 hash_foreach_pair (p, vam->function_by_name,
15431 vec_add1 (cmds, (u8 *)(p->key));
15435 vec_sort_with_function (cmds, cmd_cmp);
15437 for (j = 0; j < vec_len (cmds); j++)
15438 fformat (vam->ofp, "%s\n", cmds[j]);
15445 set (vat_main_t * vam)
15447 u8 *name = 0, *value = 0;
15448 unformat_input_t *i = vam->input;
15450 if (unformat (i, "%s", &name))
15452 /* The input buffer is a vector, not a string. */
15453 value = vec_dup (i->buffer);
15454 vec_delete (value, i->index, 0);
15455 /* Almost certainly has a trailing newline */
15456 if (value[vec_len (value) - 1] == '\n')
15457 value[vec_len (value) - 1] = 0;
15458 /* Make sure it's a proper string, one way or the other */
15459 vec_add1 (value, 0);
15460 (void) clib_macro_set_value (&vam->macro_main,
15461 (char *) name, (char *) value);
15464 errmsg ("usage: set <name> <value>\n");
15472 unset (vat_main_t * vam)
15476 if (unformat (vam->input, "%s", &name))
15477 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
15478 errmsg ("unset: %s wasn't set\n", name);
15491 macro_sort_cmp (void *a1, void *a2)
15493 macro_sort_t *s1 = a1;
15494 macro_sort_t *s2 = a2;
15496 return strcmp ((char *) (s1->name), (char *) (s2->name));
15500 dump_macro_table (vat_main_t * vam)
15502 macro_sort_t *sort_me = 0, *sm;
15507 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
15509 vec_add2 (sort_me, sm, 1);
15510 sm->name = (u8 *)(p->key);
15511 sm->value = (u8 *) (p->value[0]);
15515 vec_sort_with_function (sort_me, macro_sort_cmp);
15517 if (vec_len (sort_me))
15518 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
15520 fformat (vam->ofp, "The macro table is empty...\n");
15522 for (i = 0; i < vec_len (sort_me); i++)
15523 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
15528 dump_node_table (vat_main_t * vam)
15531 vlib_node_t *node, *next_node;
15533 if (vec_len (vam->graph_nodes) == 0)
15535 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15539 for (i = 0; i < vec_len (vam->graph_nodes); i++)
15541 node = vam->graph_nodes[i];
15542 fformat (vam->ofp, "[%d] %s\n", i, node->name);
15543 for (j = 0; j < vec_len (node->next_nodes); j++)
15545 if (node->next_nodes[j] != ~0)
15547 next_node = vam->graph_nodes[node->next_nodes[j]];
15548 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15556 search_node_table (vat_main_t * vam)
15558 unformat_input_t *line_input = vam->input;
15561 vlib_node_t *node, *next_node;
15564 if (vam->graph_node_index_by_name == 0)
15566 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15570 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15572 if (unformat (line_input, "%s", &node_to_find))
15574 vec_add1 (node_to_find, 0);
15575 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
15578 fformat (vam->ofp, "%s not found...\n", node_to_find);
15581 node = vam->graph_nodes[p[0]];
15582 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
15583 for (j = 0; j < vec_len (node->next_nodes); j++)
15585 if (node->next_nodes[j] != ~0)
15587 next_node = vam->graph_nodes[node->next_nodes[j]];
15588 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15595 clib_warning ("parse error '%U'", format_unformat_error,
15601 vec_free (node_to_find);
15610 script (vat_main_t * vam)
15613 char *save_current_file;
15614 unformat_input_t save_input;
15615 jmp_buf save_jump_buf;
15616 u32 save_line_number;
15618 FILE *new_fp, *save_ifp;
15620 if (unformat (vam->input, "%s", &s))
15622 new_fp = fopen ((char *) s, "r");
15625 errmsg ("Couldn't open script file %s\n", s);
15632 errmsg ("Missing script name\n");
15636 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
15637 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
15638 save_ifp = vam->ifp;
15639 save_line_number = vam->input_line_number;
15640 save_current_file = (char *) vam->current_file;
15642 vam->input_line_number = 0;
15644 vam->current_file = s;
15647 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
15648 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
15649 vam->ifp = save_ifp;
15650 vam->input_line_number = save_line_number;
15651 vam->current_file = (u8 *) save_current_file;
15658 echo (vat_main_t * vam)
15660 fformat (vam->ofp, "%v", vam->input->buffer);
15664 /* List of API message constructors, CLI names map to api_xxx */
15665 #define foreach_vpe_api_msg \
15666 _(create_loopback,"[mac <mac-addr>]") \
15667 _(sw_interface_dump,"") \
15668 _(sw_interface_set_flags, \
15669 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
15670 _(sw_interface_add_del_address, \
15671 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
15672 _(sw_interface_set_table, \
15673 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
15674 _(sw_interface_set_vpath, \
15675 "<intfc> | sw_if_index <id> enable | disable") \
15676 _(sw_interface_set_l2_xconnect, \
15677 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15678 "enable | disable") \
15679 _(sw_interface_set_l2_bridge, \
15680 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
15681 "[shg <split-horizon-group>] [bvi]\n" \
15682 "enable | disable") \
15683 _(bridge_domain_add_del, \
15684 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
15685 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
15687 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
15689 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
15691 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
15693 "tapname <name> mac <mac-addr> | random-mac") \
15695 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
15697 "<vpp-if-name> | sw_if_index <id>") \
15698 _(sw_interface_tap_dump, "") \
15699 _(ip_add_del_route, \
15700 "<addr>/<mask> via <addr> [vrf <n>]\n" \
15701 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
15702 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
15703 "[multipath] [count <n>]") \
15704 _(proxy_arp_add_del, \
15705 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
15706 _(proxy_arp_intfc_enable_disable, \
15707 "<intfc> | sw_if_index <id> enable | disable") \
15708 _(mpls_add_del_encap, \
15709 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
15710 _(mpls_add_del_decap, \
15711 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
15712 _(mpls_gre_add_del_tunnel, \
15713 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
15714 "adj <ip4-address>/<mask-width> [del]") \
15715 _(sw_interface_set_unnumbered, \
15716 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
15717 _(ip_neighbor_add_del, \
15718 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
15719 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
15720 _(reset_vrf, "vrf <id> [ipv6]") \
15721 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
15722 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
15723 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
15724 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
15725 "[outer_vlan_id_any][inner_vlan_id_any]") \
15726 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
15727 _(reset_fib, "vrf <n> [ipv6]") \
15728 _(dhcp_proxy_config, \
15729 "svr <v46-address> src <v46-address>\n" \
15730 "insert-cid <n> [del]") \
15731 _(dhcp_proxy_config_2, \
15732 "svr <v46-address> src <v46-address>\n" \
15733 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
15734 _(dhcp_proxy_set_vss, \
15735 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
15736 _(dhcp_client_config, \
15737 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
15738 _(set_ip_flow_hash, \
15739 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
15740 _(sw_interface_ip6_enable_disable, \
15741 "<intfc> | sw_if_index <id> enable | disable") \
15742 _(sw_interface_ip6_set_link_local_address, \
15743 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
15744 _(sw_interface_ip6nd_ra_prefix, \
15745 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
15746 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
15747 "[nolink] [isno]") \
15748 _(sw_interface_ip6nd_ra_config, \
15749 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
15750 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
15751 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
15752 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
15753 _(l2_patch_add_del, \
15754 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15755 "enable | disable") \
15756 _(mpls_ethernet_add_del_tunnel, \
15757 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
15758 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
15759 _(mpls_ethernet_add_del_tunnel_2, \
15760 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
15761 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
15762 _(sr_tunnel_add_del, \
15763 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
15764 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
15765 "[policy <policy_name>]") \
15766 _(sr_policy_add_del, \
15767 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
15768 _(sr_multicast_map_add_del, \
15769 "address [ip6 multicast address] sr-policy [policy name] [del]") \
15770 _(classify_add_del_table, \
15771 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
15772 "[del] mask <mask-value>\n" \
15773 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
15774 _(classify_add_del_session, \
15775 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
15776 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
15777 " [l3 [ip4|ip6]]") \
15778 _(classify_set_interface_ip_table, \
15779 "<intfc> | sw_if_index <nn> table <nn>") \
15780 _(classify_set_interface_l2_tables, \
15781 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15782 " [other-table <nn>]") \
15783 _(get_node_index, "node <node-name") \
15784 _(add_node_next, "node <node-name> next <next-node-name>") \
15785 _(l2tpv3_create_tunnel, \
15786 "client_address <ip6-addr> our_address <ip6-addr>\n" \
15787 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
15788 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
15789 _(l2tpv3_set_tunnel_cookies, \
15790 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
15791 "[new_remote_cookie <nn>]\n") \
15792 _(l2tpv3_interface_enable_disable, \
15793 "<intfc> | sw_if_index <nn> enable | disable") \
15794 _(l2tpv3_set_lookup_key, \
15795 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
15796 _(sw_if_l2tpv3_tunnel_dump, "") \
15797 _(vxlan_add_del_tunnel, \
15798 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
15799 " [decap-next l2|ip4|ip6] [del]") \
15800 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15801 _(gre_add_del_tunnel, \
15802 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
15803 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15804 _(l2_fib_clear_table, "") \
15805 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
15806 _(l2_interface_vlan_tag_rewrite, \
15807 "<intfc> | sw_if_index <nn> \n" \
15808 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
15809 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
15810 _(create_vhost_user_if, \
15811 "socket <filename> [server] [renumber <dev_instance>] " \
15812 "[mac <mac_address>]") \
15813 _(modify_vhost_user_if, \
15814 "<intfc> | sw_if_index <nn> socket <filename>\n" \
15815 "[server] [renumber <dev_instance>]") \
15816 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
15817 _(sw_interface_vhost_user_dump, "") \
15818 _(show_version, "") \
15819 _(vxlan_gpe_add_del_tunnel, \
15820 "local <addr> remote <addr> vni <nn>\n" \
15821 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
15822 "[next-ethernet] [next-nsh]\n") \
15823 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15824 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
15825 _(interface_name_renumber, \
15826 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
15827 _(input_acl_set_interface, \
15828 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15829 " [l2-table <nn>] [del]") \
15830 _(want_ip4_arp_events, "address <ip4-address> [del]") \
15831 _(want_ip6_nd_events, "address <ip6-address> [del]") \
15832 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
15833 _(ip_dump, "ipv4 | ipv6") \
15834 _(ipsec_spd_add_del, "spd_id <n> [del]") \
15835 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
15837 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
15838 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
15839 " integ_alg <alg> integ_key <hex>") \
15840 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
15841 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
15842 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
15843 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
15844 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
15845 _(ikev2_profile_add_del, "name <profile_name> [del]") \
15846 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
15847 "(auth_data 0x<data> | auth_data <data>)") \
15848 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
15849 "(id_data 0x<data> | id_data <data>) (local|remote)") \
15850 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
15851 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
15852 "(local|remote)") \
15853 _(ikev2_set_local_key, "file <absolute_file_path>") \
15854 _(delete_loopback,"sw_if_index <nn>") \
15855 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
15856 _(map_add_domain, \
15857 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
15858 "ip6-src <ip6addr> " \
15859 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
15860 _(map_del_domain, "index <n>") \
15861 _(map_add_del_rule, \
15862 "index <n> psid <n> dst <ip6addr> [del]") \
15863 _(map_domain_dump, "") \
15864 _(map_rule_dump, "index <map-domain>") \
15865 _(want_interface_events, "enable|disable") \
15866 _(want_stats,"enable|disable") \
15867 _(get_first_msg_id, "client <name>") \
15868 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
15869 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
15870 "fib-id <nn> [ip4][ip6][default]") \
15871 _(get_node_graph, " ") \
15872 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
15873 _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> " \
15874 "trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> " \
15875 "app-data <app_data in hex> [pow] [ppc <encap|decap>]") \
15876 _(trace_profile_apply, "id <nn> <ip6-address>/<width>" \
15877 " vrf_id <nn> add | pop | none") \
15878 _(trace_profile_del, "") \
15879 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
15880 " sw_if_index <sw_if_index> p <priority> " \
15881 "w <weight>] [del]") \
15882 _(lisp_add_del_locator, "locator-set <locator_name> " \
15883 "iface <intf> | sw_if_index <sw_if_index> " \
15884 "p <priority> w <weight> [del]") \
15885 _(lisp_add_del_local_eid,"vni <vni> eid " \
15886 "<ipv4|ipv6>/<prefix> | <L2 address> " \
15887 "locator-set <locator_name> [del]") \
15888 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
15889 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
15890 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
15891 _(lisp_gpe_enable_disable, "enable|disable") \
15892 _(lisp_enable_disable, "enable|disable") \
15893 _(lisp_gpe_add_del_iface, "up|down") \
15894 _(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> " \
15895 "rloc <locator> p <prio> " \
15896 "w <weight> [rloc <loc> ... ] " \
15897 "action <action> [del-all]") \
15898 _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
15899 "<src-eid> rloc <locator> p <prio> w <weight>"\
15900 "[rloc <loc> ... ] action <action>") \
15901 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
15902 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
15903 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
15904 _(lisp_locator_set_dump, "[locator-set-index <ls-index> | " \
15905 "locator-set <loc-set-name>] [local | remote]")\
15906 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
15907 "[local] | [remote]") \
15908 _(lisp_eid_table_vni_dump, "") \
15909 _(lisp_eid_table_map_dump, "l2|l3") \
15910 _(lisp_gpe_tunnel_dump, "") \
15911 _(lisp_map_resolver_dump, "") \
15912 _(show_lisp_status, "") \
15913 _(lisp_get_map_request_itr_rlocs, "") \
15914 _(show_lisp_pitr, "") \
15915 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
15916 _(af_packet_delete, "name <host interface name>") \
15917 _(policer_add_del, "name <policer name> <params> [del]") \
15918 _(policer_dump, "[name <policer name>]") \
15919 _(policer_classify_set_interface, \
15920 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15921 " [l2-table <nn>] [del]") \
15922 _(policer_classify_dump, "type [ip4|ip6|l2]") \
15923 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
15924 "[master|slave]") \
15925 _(netmap_delete, "name <interface name>") \
15926 _(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
15927 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
15928 _(mpls_fib_encap_dump, "") \
15929 _(mpls_fib_decap_dump, "") \
15930 _(classify_table_ids, "") \
15931 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
15932 _(classify_table_info, "table_id <nn>") \
15933 _(classify_session_dump, "table_id <nn>") \
15934 _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \
15935 "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \
15936 "[template_interval <nn>]") \
15937 _(ipfix_dump, "") \
15938 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
15939 _(pg_create_interface, "if_id <nn>") \
15940 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
15941 _(pg_enable_disable, "[stream <id>] disable") \
15942 _(ip_source_and_port_range_check_add_del, \
15943 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
15944 _(ip_source_and_port_range_check_interface_add_del, \
15945 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
15946 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
15947 _(ipsec_gre_add_del_tunnel, \
15948 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
15949 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
15950 _(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>")
15952 /* List of command functions, CLI names map directly to functions */
15953 #define foreach_cli_function \
15954 _(comment, "usage: comment <ignore-rest-of-line>") \
15955 _(dump_interface_table, "usage: dump_interface_table") \
15956 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
15957 _(dump_ipv4_table, "usage: dump_ipv4_table") \
15958 _(dump_ipv6_table, "usage: dump_ipv6_table") \
15959 _(dump_stats_table, "usage: dump_stats_table") \
15960 _(dump_macro_table, "usage: dump_macro_table ") \
15961 _(dump_node_table, "usage: dump_node_table") \
15962 _(echo, "usage: echo <message>") \
15963 _(exec, "usage: exec <vpe-debug-CLI-command>") \
15964 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
15965 _(help, "usage: help") \
15966 _(q, "usage: quit") \
15967 _(quit, "usage: quit") \
15968 _(search_node_table, "usage: search_node_table <name>...") \
15969 _(set, "usage: set <variable-name> <value>") \
15970 _(script, "usage: script <file-name>") \
15971 _(unset, "usage: unset <variable-name>")
15974 static void vl_api_##n##_t_handler_uni \
15975 (vl_api_##n##_t * mp) \
15977 vat_main_t * vam = &vat_main; \
15978 if (vam->json_output) { \
15979 vl_api_##n##_t_handler_json(mp); \
15981 vl_api_##n##_t_handler(mp); \
15984 foreach_vpe_api_reply_msg;
15988 vat_api_hookup (vat_main_t * vam)
15991 vl_msg_api_set_handlers(VL_API_##N, #n, \
15992 vl_api_##n##_t_handler_uni, \
15994 vl_api_##n##_t_endian, \
15995 vl_api_##n##_t_print, \
15996 sizeof(vl_api_##n##_t), 1);
15997 foreach_vpe_api_reply_msg;
16000 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
16002 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
16004 vam->function_by_name = hash_create_string (0, sizeof (uword));
16006 vam->help_by_name = hash_create_string (0, sizeof (uword));
16008 /* API messages we can send */
16009 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
16010 foreach_vpe_api_msg;
16014 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16015 foreach_vpe_api_msg;
16018 /* CLI functions */
16019 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
16020 foreach_cli_function;
16024 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16025 foreach_cli_function;
16029 #undef vl_api_version
16030 #define vl_api_version(n,v) static u32 vpe_api_version = v;
16031 #include <vpp-api/vpe.api.h>
16032 #undef vl_api_version
16035 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
16038 * Send the main API signature in slot 0. This bit of code must
16039 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16041 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
16045 * fd.io coding-style-patch-verification: ON
16048 * eval: (c-set-style "gnu")