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;
896 static void vl_api_classify_add_del_table_reply_t_handler
897 (vl_api_classify_add_del_table_reply_t * mp)
899 vat_main_t *vam = &vat_main;
900 i32 retval = ntohl (mp->retval);
903 vam->async_errors += (retval < 0);
907 vam->retval = retval;
909 ((mp->new_table_index != 0xFFFFFFFF) ||
910 (mp->skip_n_vectors != 0xFFFFFFFF) ||
911 (mp->match_n_vectors != 0xFFFFFFFF)))
913 * Note: this is just barely thread-safe, depends on
914 * the main thread spinning waiting for an answer...
916 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
917 ntohl (mp->new_table_index),
918 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
919 vam->result_ready = 1;
923 static void vl_api_classify_add_del_table_reply_t_handler_json
924 (vl_api_classify_add_del_table_reply_t * mp)
926 vat_main_t *vam = &vat_main;
927 vat_json_node_t node;
929 vat_json_init_object (&node);
930 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
931 vat_json_object_add_uint (&node, "new_table_index",
932 ntohl (mp->new_table_index));
933 vat_json_object_add_uint (&node, "skip_n_vectors",
934 ntohl (mp->skip_n_vectors));
935 vat_json_object_add_uint (&node, "match_n_vectors",
936 ntohl (mp->match_n_vectors));
938 vat_json_print (vam->ofp, &node);
939 vat_json_free (&node);
941 vam->retval = ntohl (mp->retval);
942 vam->result_ready = 1;
945 static void vl_api_get_node_index_reply_t_handler
946 (vl_api_get_node_index_reply_t * mp)
948 vat_main_t *vam = &vat_main;
949 i32 retval = ntohl (mp->retval);
952 vam->async_errors += (retval < 0);
956 vam->retval = retval;
958 errmsg ("node index %d\n", ntohl (mp->node_index));
959 vam->result_ready = 1;
963 static void vl_api_get_node_index_reply_t_handler_json
964 (vl_api_get_node_index_reply_t * mp)
966 vat_main_t *vam = &vat_main;
967 vat_json_node_t node;
969 vat_json_init_object (&node);
970 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
971 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
973 vat_json_print (vam->ofp, &node);
974 vat_json_free (&node);
976 vam->retval = ntohl (mp->retval);
977 vam->result_ready = 1;
980 static void vl_api_get_next_index_reply_t_handler
981 (vl_api_get_next_index_reply_t * mp)
983 vat_main_t *vam = &vat_main;
984 i32 retval = ntohl (mp->retval);
987 vam->async_errors += (retval < 0);
991 vam->retval = retval;
993 errmsg ("next node index %d\n", ntohl (mp->next_index));
994 vam->result_ready = 1;
998 static void vl_api_get_next_index_reply_t_handler_json
999 (vl_api_get_next_index_reply_t * mp)
1001 vat_main_t *vam = &vat_main;
1002 vat_json_node_t node;
1004 vat_json_init_object (&node);
1005 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1006 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1008 vat_json_print (vam->ofp, &node);
1009 vat_json_free (&node);
1011 vam->retval = ntohl (mp->retval);
1012 vam->result_ready = 1;
1015 static void vl_api_add_node_next_reply_t_handler
1016 (vl_api_add_node_next_reply_t * mp)
1018 vat_main_t *vam = &vat_main;
1019 i32 retval = ntohl (mp->retval);
1020 if (vam->async_mode)
1022 vam->async_errors += (retval < 0);
1026 vam->retval = retval;
1028 errmsg ("next index %d\n", ntohl (mp->next_index));
1029 vam->result_ready = 1;
1033 static void vl_api_add_node_next_reply_t_handler_json
1034 (vl_api_add_node_next_reply_t * mp)
1036 vat_main_t *vam = &vat_main;
1037 vat_json_node_t node;
1039 vat_json_init_object (&node);
1040 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1041 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1043 vat_json_print (vam->ofp, &node);
1044 vat_json_free (&node);
1046 vam->retval = ntohl (mp->retval);
1047 vam->result_ready = 1;
1050 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
1051 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1053 vat_main_t *vam = &vat_main;
1054 i32 retval = ntohl (mp->retval);
1055 u32 sw_if_index = ntohl (mp->tunnel_sw_if_index);
1057 if (retval >= 0 && sw_if_index != (u32) ~ 0)
1059 errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
1061 vam->retval = retval;
1062 vam->result_ready = 1;
1065 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
1066 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1068 vat_main_t *vam = &vat_main;
1069 vat_json_node_t node;
1071 vat_json_init_object (&node);
1072 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1073 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1074 ntohl (mp->tunnel_sw_if_index));
1076 vat_json_print (vam->ofp, &node);
1077 vat_json_free (&node);
1079 vam->retval = ntohl (mp->retval);
1080 vam->result_ready = 1;
1084 static void vl_api_show_version_reply_t_handler
1085 (vl_api_show_version_reply_t * mp)
1087 vat_main_t *vam = &vat_main;
1088 i32 retval = ntohl (mp->retval);
1092 errmsg (" program: %s\n", mp->program);
1093 errmsg (" version: %s\n", mp->version);
1094 errmsg (" build date: %s\n", mp->build_date);
1095 errmsg ("build directory: %s\n", mp->build_directory);
1097 vam->retval = retval;
1098 vam->result_ready = 1;
1101 static void vl_api_show_version_reply_t_handler_json
1102 (vl_api_show_version_reply_t * mp)
1104 vat_main_t *vam = &vat_main;
1105 vat_json_node_t node;
1107 vat_json_init_object (&node);
1108 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1109 vat_json_object_add_string_copy (&node, "program", mp->program);
1110 vat_json_object_add_string_copy (&node, "version", mp->version);
1111 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1112 vat_json_object_add_string_copy (&node, "build_directory",
1113 mp->build_directory);
1115 vat_json_print (vam->ofp, &node);
1116 vat_json_free (&node);
1118 vam->retval = ntohl (mp->retval);
1119 vam->result_ready = 1;
1123 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1125 vat_main_t *vam = &vat_main;
1126 errmsg ("arp event: address %U new mac %U sw_if_index %d\n",
1127 format_ip4_address, &mp->address,
1128 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1132 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1134 /* JSON output not supported */
1138 * Special-case: build the bridge domain table, maintain
1139 * the next bd id vbl.
1141 static void vl_api_bridge_domain_details_t_handler
1142 (vl_api_bridge_domain_details_t * mp)
1144 vat_main_t *vam = &vat_main;
1145 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1147 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1148 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1150 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1151 ntohl (mp->bd_id), mp->learn, mp->forward,
1152 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1155 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1159 static void vl_api_bridge_domain_details_t_handler_json
1160 (vl_api_bridge_domain_details_t * mp)
1162 vat_main_t *vam = &vat_main;
1163 vat_json_node_t *node, *array = NULL;
1165 if (VAT_JSON_ARRAY != vam->json_tree.type)
1167 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1168 vat_json_init_array (&vam->json_tree);
1170 node = vat_json_array_add (&vam->json_tree);
1172 vat_json_init_object (node);
1173 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1174 vat_json_object_add_uint (node, "flood", mp->flood);
1175 vat_json_object_add_uint (node, "forward", mp->forward);
1176 vat_json_object_add_uint (node, "learn", mp->learn);
1177 vat_json_object_add_uint (node, "bvi_sw_if_index",
1178 ntohl (mp->bvi_sw_if_index));
1179 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1180 array = vat_json_object_add (node, "sw_if");
1181 vat_json_init_array (array);
1185 * Special-case: build the bridge domain sw if table.
1187 static void vl_api_bridge_domain_sw_if_details_t_handler
1188 (vl_api_bridge_domain_sw_if_details_t * mp)
1190 vat_main_t *vam = &vat_main;
1195 sw_if_index = ntohl (mp->sw_if_index);
1197 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1199 if ((u32) p->value[0] == sw_if_index)
1201 sw_if_name = (u8 *)(p->key);
1207 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1208 mp->shg, sw_if_name ? (char *) sw_if_name :
1209 "sw_if_index not found!");
1212 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1213 (vl_api_bridge_domain_sw_if_details_t * mp)
1215 vat_main_t *vam = &vat_main;
1216 vat_json_node_t *node = NULL;
1217 uword last_index = 0;
1219 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1220 ASSERT (vec_len (vam->json_tree.array) >= 1);
1221 last_index = vec_len (vam->json_tree.array) - 1;
1222 node = &vam->json_tree.array[last_index];
1223 node = vat_json_object_get_element (node, "sw_if");
1224 ASSERT (NULL != node);
1225 node = vat_json_array_add (node);
1227 vat_json_init_object (node);
1228 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1229 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1230 vat_json_object_add_uint (node, "shg", mp->shg);
1233 static void vl_api_control_ping_reply_t_handler
1234 (vl_api_control_ping_reply_t * mp)
1236 vat_main_t *vam = &vat_main;
1237 i32 retval = ntohl (mp->retval);
1238 if (vam->async_mode)
1240 vam->async_errors += (retval < 0);
1244 vam->retval = retval;
1245 vam->result_ready = 1;
1249 static void vl_api_control_ping_reply_t_handler_json
1250 (vl_api_control_ping_reply_t * mp)
1252 vat_main_t *vam = &vat_main;
1253 i32 retval = ntohl (mp->retval);
1255 if (VAT_JSON_NONE != vam->json_tree.type)
1257 vat_json_print (vam->ofp, &vam->json_tree);
1258 vat_json_free (&vam->json_tree);
1259 vam->json_tree.type = VAT_JSON_NONE;
1264 vat_json_init_array (&vam->json_tree);
1265 vat_json_print (vam->ofp, &vam->json_tree);
1266 vam->json_tree.type = VAT_JSON_NONE;
1269 vam->retval = retval;
1270 vam->result_ready = 1;
1273 static void vl_api_noprint_control_ping_reply_t_handler
1274 (vl_api_noprint_control_ping_reply_t * mp)
1276 vat_main_t *vam = &vat_main;
1277 i32 retval = ntohl (mp->retval);
1278 if (vam->async_mode)
1280 vam->async_errors += (retval < 0);
1284 vam->retval = retval;
1285 vam->result_ready = 1;
1289 static void vl_api_noprint_control_ping_reply_t_handler_json
1290 (vl_api_noprint_control_ping_reply_t * mp)
1292 vat_main_t *vam = &vat_main;
1293 i32 retval = ntohl (mp->retval);
1295 if (vam->noprint_msg)
1297 vam->retval = retval;
1298 vam->result_ready = 1;
1302 if (VAT_JSON_NONE != vam->json_tree.type)
1304 vat_json_print (vam->ofp, &vam->json_tree);
1305 vat_json_free (&vam->json_tree);
1306 vam->json_tree.type = VAT_JSON_NONE;
1311 vat_json_init_array (&vam->json_tree);
1312 vat_json_print (vam->ofp, &vam->json_tree);
1313 vam->json_tree.type = VAT_JSON_NONE;
1316 vam->retval = retval;
1317 vam->result_ready = 1;
1321 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1323 vat_main_t *vam = &vat_main;
1324 i32 retval = ntohl (mp->retval);
1325 if (vam->async_mode)
1327 vam->async_errors += (retval < 0);
1331 vam->retval = retval;
1332 vam->result_ready = 1;
1336 static void vl_api_l2_flags_reply_t_handler_json
1337 (vl_api_l2_flags_reply_t * mp)
1339 vat_main_t *vam = &vat_main;
1340 vat_json_node_t node;
1342 vat_json_init_object (&node);
1343 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1344 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1345 ntohl (mp->resulting_feature_bitmap));
1347 vat_json_print (vam->ofp, &node);
1348 vat_json_free (&node);
1350 vam->retval = ntohl (mp->retval);
1351 vam->result_ready = 1;
1354 static void vl_api_bridge_flags_reply_t_handler
1355 (vl_api_bridge_flags_reply_t * mp)
1357 vat_main_t *vam = &vat_main;
1358 i32 retval = ntohl (mp->retval);
1359 if (vam->async_mode)
1361 vam->async_errors += (retval < 0);
1365 vam->retval = retval;
1366 vam->result_ready = 1;
1370 static void vl_api_bridge_flags_reply_t_handler_json
1371 (vl_api_bridge_flags_reply_t * mp)
1373 vat_main_t *vam = &vat_main;
1374 vat_json_node_t node;
1376 vat_json_init_object (&node);
1377 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1378 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1379 ntohl (mp->resulting_feature_bitmap));
1381 vat_json_print (vam->ofp, &node);
1382 vat_json_free (&node);
1384 vam->retval = ntohl (mp->retval);
1385 vam->result_ready = 1;
1388 static void vl_api_tap_connect_reply_t_handler
1389 (vl_api_tap_connect_reply_t * mp)
1391 vat_main_t *vam = &vat_main;
1392 i32 retval = ntohl (mp->retval);
1393 if (vam->async_mode)
1395 vam->async_errors += (retval < 0);
1399 vam->retval = retval;
1400 vam->sw_if_index = ntohl (mp->sw_if_index);
1401 vam->result_ready = 1;
1406 static void vl_api_tap_connect_reply_t_handler_json
1407 (vl_api_tap_connect_reply_t * mp)
1409 vat_main_t *vam = &vat_main;
1410 vat_json_node_t node;
1412 vat_json_init_object (&node);
1413 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1414 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1416 vat_json_print (vam->ofp, &node);
1417 vat_json_free (&node);
1419 vam->retval = ntohl (mp->retval);
1420 vam->result_ready = 1;
1425 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1427 vat_main_t *vam = &vat_main;
1428 i32 retval = ntohl (mp->retval);
1429 if (vam->async_mode)
1431 vam->async_errors += (retval < 0);
1435 vam->retval = retval;
1436 vam->sw_if_index = ntohl (mp->sw_if_index);
1437 vam->result_ready = 1;
1441 static void vl_api_tap_modify_reply_t_handler_json
1442 (vl_api_tap_modify_reply_t * mp)
1444 vat_main_t *vam = &vat_main;
1445 vat_json_node_t node;
1447 vat_json_init_object (&node);
1448 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1449 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1451 vat_json_print (vam->ofp, &node);
1452 vat_json_free (&node);
1454 vam->retval = ntohl (mp->retval);
1455 vam->result_ready = 1;
1459 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1461 vat_main_t *vam = &vat_main;
1462 i32 retval = ntohl (mp->retval);
1463 if (vam->async_mode)
1465 vam->async_errors += (retval < 0);
1469 vam->retval = retval;
1470 vam->result_ready = 1;
1474 static void vl_api_tap_delete_reply_t_handler_json
1475 (vl_api_tap_delete_reply_t * mp)
1477 vat_main_t *vam = &vat_main;
1478 vat_json_node_t node;
1480 vat_json_init_object (&node);
1481 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1483 vat_json_print (vam->ofp, &node);
1484 vat_json_free (&node);
1486 vam->retval = ntohl (mp->retval);
1487 vam->result_ready = 1;
1490 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1491 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1493 vat_main_t *vam = &vat_main;
1494 i32 retval = ntohl (mp->retval);
1495 if (vam->async_mode)
1497 vam->async_errors += (retval < 0);
1501 vam->retval = retval;
1502 vam->result_ready = 1;
1506 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1507 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1509 vat_main_t *vam = &vat_main;
1510 vat_json_node_t node;
1512 vat_json_init_object (&node);
1513 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1514 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1515 ntohl (mp->tunnel_sw_if_index));
1517 vat_json_print (vam->ofp, &node);
1518 vat_json_free (&node);
1520 vam->retval = ntohl (mp->retval);
1521 vam->result_ready = 1;
1524 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1525 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1527 vat_main_t *vam = &vat_main;
1528 i32 retval = ntohl (mp->retval);
1529 if (vam->async_mode)
1531 vam->async_errors += (retval < 0);
1535 vam->retval = retval;
1536 vam->sw_if_index = ntohl (mp->sw_if_index);
1537 vam->result_ready = 1;
1541 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1542 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1544 vat_main_t *vam = &vat_main;
1545 vat_json_node_t node;
1547 vat_json_init_object (&node);
1548 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1549 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1551 vat_json_print (vam->ofp, &node);
1552 vat_json_free (&node);
1554 vam->retval = ntohl (mp->retval);
1555 vam->result_ready = 1;
1559 static void vl_api_lisp_add_del_locator_set_reply_t_handler
1560 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1562 vat_main_t *vam = &vat_main;
1563 i32 retval = ntohl (mp->retval);
1564 if (vam->async_mode)
1566 vam->async_errors += (retval < 0);
1570 vam->retval = retval;
1571 vam->result_ready = 1;
1575 static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1576 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1578 vat_main_t *vam = &vat_main;
1579 vat_json_node_t node;
1581 vat_json_init_object (&node);
1582 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1583 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1585 vat_json_print (vam->ofp, &node);
1586 vat_json_free (&node);
1588 vam->retval = ntohl (mp->retval);
1589 vam->result_ready = 1;
1592 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1593 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1595 vat_main_t *vam = &vat_main;
1596 i32 retval = ntohl (mp->retval);
1597 if (vam->async_mode)
1599 vam->async_errors += (retval < 0);
1603 vam->retval = retval;
1604 vam->sw_if_index = ntohl (mp->sw_if_index);
1605 vam->result_ready = 1;
1609 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1610 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1612 vat_main_t *vam = &vat_main;
1613 vat_json_node_t node;
1615 vat_json_init_object (&node);
1616 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1617 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1619 vat_json_print (vam->ofp, &node);
1620 vat_json_free (&node);
1622 vam->retval = ntohl (mp->retval);
1623 vam->result_ready = 1;
1626 static void vl_api_gre_add_del_tunnel_reply_t_handler
1627 (vl_api_gre_add_del_tunnel_reply_t * mp)
1629 vat_main_t *vam = &vat_main;
1630 i32 retval = ntohl (mp->retval);
1631 if (vam->async_mode)
1633 vam->async_errors += (retval < 0);
1637 vam->retval = retval;
1638 vam->sw_if_index = ntohl (mp->sw_if_index);
1639 vam->result_ready = 1;
1643 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1644 (vl_api_gre_add_del_tunnel_reply_t * mp)
1646 vat_main_t *vam = &vat_main;
1647 vat_json_node_t node;
1649 vat_json_init_object (&node);
1650 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1651 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1653 vat_json_print (vam->ofp, &node);
1654 vat_json_free (&node);
1656 vam->retval = ntohl (mp->retval);
1657 vam->result_ready = 1;
1660 static void vl_api_create_vhost_user_if_reply_t_handler
1661 (vl_api_create_vhost_user_if_reply_t * mp)
1663 vat_main_t *vam = &vat_main;
1664 i32 retval = ntohl (mp->retval);
1665 if (vam->async_mode)
1667 vam->async_errors += (retval < 0);
1671 vam->retval = retval;
1672 vam->sw_if_index = ntohl (mp->sw_if_index);
1673 vam->result_ready = 1;
1677 static void vl_api_create_vhost_user_if_reply_t_handler_json
1678 (vl_api_create_vhost_user_if_reply_t * mp)
1680 vat_main_t *vam = &vat_main;
1681 vat_json_node_t node;
1683 vat_json_init_object (&node);
1684 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1685 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1687 vat_json_print (vam->ofp, &node);
1688 vat_json_free (&node);
1690 vam->retval = ntohl (mp->retval);
1691 vam->result_ready = 1;
1694 static void vl_api_ip_address_details_t_handler
1695 (vl_api_ip_address_details_t * mp)
1697 vat_main_t *vam = &vat_main;
1698 static ip_address_details_t empty_ip_address_details = { {0} };
1699 ip_address_details_t *address = NULL;
1700 ip_details_t *current_ip_details = NULL;
1701 ip_details_t *details = NULL;
1703 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1705 if (!details || vam->current_sw_if_index >= vec_len (details)
1706 || !details[vam->current_sw_if_index].present)
1708 errmsg ("ip address details arrived but not stored\n");
1709 errmsg ("ip_dump should be called first\n");
1713 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1715 #define addresses (current_ip_details->addr)
1717 vec_validate_init_empty (addresses, vec_len (addresses),
1718 empty_ip_address_details);
1720 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1722 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1723 address->prefix_length = mp->prefix_length;
1727 static void vl_api_ip_address_details_t_handler_json
1728 (vl_api_ip_address_details_t * mp)
1730 vat_main_t *vam = &vat_main;
1731 vat_json_node_t *node = NULL;
1732 struct in6_addr ip6;
1735 if (VAT_JSON_ARRAY != vam->json_tree.type)
1737 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1738 vat_json_init_array (&vam->json_tree);
1740 node = vat_json_array_add (&vam->json_tree);
1742 vat_json_init_object (node);
1745 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1746 vat_json_object_add_ip6 (node, "ip", ip6);
1750 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1751 vat_json_object_add_ip4 (node, "ip", ip4);
1753 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1757 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1759 vat_main_t *vam = &vat_main;
1760 static ip_details_t empty_ip_details = { 0 };
1761 ip_details_t *ip = NULL;
1762 u32 sw_if_index = ~0;
1764 sw_if_index = ntohl (mp->sw_if_index);
1766 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1767 sw_if_index, empty_ip_details);
1769 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1776 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1778 vat_main_t *vam = &vat_main;
1780 if (VAT_JSON_ARRAY != vam->json_tree.type)
1782 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1783 vat_json_init_array (&vam->json_tree);
1785 vat_json_array_add_uint (&vam->json_tree,
1786 clib_net_to_host_u32 (mp->sw_if_index));
1789 static void vl_api_map_domain_details_t_handler_json
1790 (vl_api_map_domain_details_t * mp)
1792 vat_json_node_t *node = NULL;
1793 vat_main_t *vam = &vat_main;
1794 struct in6_addr ip6;
1797 if (VAT_JSON_ARRAY != vam->json_tree.type)
1799 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1800 vat_json_init_array (&vam->json_tree);
1803 node = vat_json_array_add (&vam->json_tree);
1804 vat_json_init_object (node);
1806 vat_json_object_add_uint (node, "domain_index",
1807 clib_net_to_host_u32 (mp->domain_index));
1808 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1809 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1810 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1811 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1812 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1813 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1814 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1815 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1816 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1817 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1818 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1819 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1820 vat_json_object_add_uint (node, "flags", mp->flags);
1821 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1822 vat_json_object_add_int (node, "is_translation", mp->is_translation);
1825 static void vl_api_map_domain_details_t_handler
1826 (vl_api_map_domain_details_t * mp)
1828 vat_main_t *vam = &vat_main;
1830 if (mp->is_translation)
1833 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1834 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1835 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1836 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1837 clib_net_to_host_u32 (mp->domain_index));
1842 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1843 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1844 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1845 format_ip6_address, mp->ip6_src,
1846 clib_net_to_host_u32 (mp->domain_index));
1848 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1849 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1850 mp->is_translation ? "map-t" : "");
1853 static void vl_api_map_rule_details_t_handler_json
1854 (vl_api_map_rule_details_t * mp)
1856 struct in6_addr ip6;
1857 vat_json_node_t *node = NULL;
1858 vat_main_t *vam = &vat_main;
1860 if (VAT_JSON_ARRAY != vam->json_tree.type)
1862 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1863 vat_json_init_array (&vam->json_tree);
1866 node = vat_json_array_add (&vam->json_tree);
1867 vat_json_init_object (node);
1869 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
1870 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1871 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
1875 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
1877 vat_main_t *vam = &vat_main;
1878 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1879 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
1883 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
1885 vat_main_t *vam = &vat_main;
1886 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1887 "router_addr %U host_mac %U\n",
1888 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1889 format_ip4_address, &mp->host_address,
1890 format_ip4_address, &mp->router_address,
1891 format_ethernet_address, mp->host_mac);
1894 static void vl_api_dhcp_compl_event_t_handler_json
1895 (vl_api_dhcp_compl_event_t * mp)
1897 /* JSON output not supported */
1901 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1904 vat_main_t *vam = &vat_main;
1905 static u64 default_counter = 0;
1907 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1909 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1910 sw_if_index, default_counter);
1911 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1915 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1916 interface_counter_t counter)
1918 vat_main_t *vam = &vat_main;
1919 static interface_counter_t default_counter = { 0, };
1921 vec_validate_init_empty (vam->combined_interface_counters,
1922 vnet_counter_type, NULL);
1923 vec_validate_init_empty (vam->combined_interface_counters
1924 [vnet_counter_type], sw_if_index, default_counter);
1925 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1928 static void vl_api_vnet_interface_counters_t_handler
1929 (vl_api_vnet_interface_counters_t * mp)
1934 static void vl_api_vnet_interface_counters_t_handler_json
1935 (vl_api_vnet_interface_counters_t * mp)
1937 interface_counter_t counter;
1942 u32 first_sw_if_index;
1945 count = ntohl (mp->count);
1946 first_sw_if_index = ntohl (mp->first_sw_if_index);
1948 if (!mp->is_combined)
1950 v_packets = (u64 *) & mp->data;
1951 for (i = 0; i < count; i++)
1954 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
1955 set_simple_interface_counter (mp->vnet_counter_type,
1956 first_sw_if_index + i, packets);
1962 v = (vlib_counter_t *) & mp->data;
1963 for (i = 0; i < count; i++)
1966 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
1968 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
1969 set_combined_interface_counter (mp->vnet_counter_type,
1970 first_sw_if_index + i, counter);
1977 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1979 vat_main_t *vam = &vat_main;
1982 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
1984 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
1993 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1995 vat_main_t *vam = &vat_main;
1998 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2000 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2008 static void vl_api_vnet_ip4_fib_counters_t_handler
2009 (vl_api_vnet_ip4_fib_counters_t * mp)
2014 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2015 (vl_api_vnet_ip4_fib_counters_t * mp)
2017 vat_main_t *vam = &vat_main;
2018 vl_api_ip4_fib_counter_t *v;
2019 ip4_fib_counter_t *counter;
2026 vrf_id = ntohl (mp->vrf_id);
2027 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2028 if (~0 == vrf_index)
2030 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2031 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2032 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2033 vec_validate (vam->ip4_fib_counters, vrf_index);
2034 vam->ip4_fib_counters[vrf_index] = NULL;
2037 vec_free (vam->ip4_fib_counters[vrf_index]);
2038 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2039 count = ntohl (mp->count);
2040 for (i = 0; i < count; i++)
2042 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2043 counter = &vam->ip4_fib_counters[vrf_index][i];
2044 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2045 counter->address = ip4;
2046 counter->address_length = v->address_length;
2047 counter->packets = clib_net_to_host_u64 (v->packets);
2048 counter->bytes = clib_net_to_host_u64 (v->bytes);
2053 static void vl_api_vnet_ip6_fib_counters_t_handler
2054 (vl_api_vnet_ip6_fib_counters_t * mp)
2059 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2060 (vl_api_vnet_ip6_fib_counters_t * mp)
2062 vat_main_t *vam = &vat_main;
2063 vl_api_ip6_fib_counter_t *v;
2064 ip6_fib_counter_t *counter;
2065 struct in6_addr ip6;
2071 vrf_id = ntohl (mp->vrf_id);
2072 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2073 if (~0 == vrf_index)
2075 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2076 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2077 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2078 vec_validate (vam->ip6_fib_counters, vrf_index);
2079 vam->ip6_fib_counters[vrf_index] = NULL;
2082 vec_free (vam->ip6_fib_counters[vrf_index]);
2083 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2084 count = ntohl (mp->count);
2085 for (i = 0; i < count; i++)
2087 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2088 counter = &vam->ip6_fib_counters[vrf_index][i];
2089 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2090 counter->address = ip6;
2091 counter->address_length = v->address_length;
2092 counter->packets = clib_net_to_host_u64 (v->packets);
2093 counter->bytes = clib_net_to_host_u64 (v->bytes);
2098 static void vl_api_get_first_msg_id_reply_t_handler
2099 (vl_api_get_first_msg_id_reply_t * mp)
2101 vat_main_t *vam = &vat_main;
2102 i32 retval = ntohl (mp->retval);
2104 if (vam->async_mode)
2106 vam->async_errors += (retval < 0);
2110 vam->retval = retval;
2111 vam->result_ready = 1;
2115 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
2119 static void vl_api_get_first_msg_id_reply_t_handler_json
2120 (vl_api_get_first_msg_id_reply_t * mp)
2122 vat_main_t *vam = &vat_main;
2123 vat_json_node_t node;
2125 vat_json_init_object (&node);
2126 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2127 vat_json_object_add_uint (&node, "first_msg_id",
2128 (uint) ntohs (mp->first_msg_id));
2130 vat_json_print (vam->ofp, &node);
2131 vat_json_free (&node);
2133 vam->retval = ntohl (mp->retval);
2134 vam->result_ready = 1;
2137 static void vl_api_get_node_graph_reply_t_handler
2138 (vl_api_get_node_graph_reply_t * mp)
2140 vat_main_t *vam = &vat_main;
2141 api_main_t *am = &api_main;
2142 i32 retval = ntohl (mp->retval);
2143 u8 *pvt_copy, *reply;
2148 if (vam->async_mode)
2150 vam->async_errors += (retval < 0);
2154 vam->retval = retval;
2155 vam->result_ready = 1;
2158 /* "Should never happen..." */
2162 reply = (u8 *) (mp->reply_in_shmem);
2163 pvt_copy = vec_dup (reply);
2165 /* Toss the shared-memory original... */
2166 pthread_mutex_lock (&am->vlib_rp->mutex);
2167 oldheap = svm_push_data_heap (am->vlib_rp);
2171 svm_pop_heap (oldheap);
2172 pthread_mutex_unlock (&am->vlib_rp->mutex);
2174 if (vam->graph_nodes)
2176 hash_free (vam->graph_node_index_by_name);
2178 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2180 node = vam->graph_nodes[i];
2181 vec_free (node->name);
2182 vec_free (node->next_nodes);
2185 vec_free (vam->graph_nodes);
2188 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2189 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2190 vec_free (pvt_copy);
2192 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2194 node = vam->graph_nodes[i];
2195 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2199 static void vl_api_get_node_graph_reply_t_handler_json
2200 (vl_api_get_node_graph_reply_t * mp)
2202 vat_main_t *vam = &vat_main;
2203 api_main_t *am = &api_main;
2205 vat_json_node_t node;
2208 /* $$$$ make this real? */
2209 vat_json_init_object (&node);
2210 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2211 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2213 reply = (u8 *) (mp->reply_in_shmem);
2215 /* Toss the shared-memory original... */
2216 pthread_mutex_lock (&am->vlib_rp->mutex);
2217 oldheap = svm_push_data_heap (am->vlib_rp);
2221 svm_pop_heap (oldheap);
2222 pthread_mutex_unlock (&am->vlib_rp->mutex);
2224 vat_json_print (vam->ofp, &node);
2225 vat_json_free (&node);
2227 vam->retval = ntohl (mp->retval);
2228 vam->result_ready = 1;
2232 vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
2234 vat_main_t *vam = &vat_main;
2238 memset (&loc, 0, sizeof (loc));
2239 if (vam->noprint_msg)
2241 loc.local = mp->local;
2242 loc.priority = mp->priority;
2243 loc.weight = mp->weight;
2246 loc.sw_if_index = ntohl (mp->sw_if_index);
2250 loc.is_ipv6 = mp->is_ipv6;
2251 clib_memcpy (loc.ip_address, mp->ip_address,
2252 sizeof (loc.ip_address));
2254 vec_add1 (vam->locator_msg, loc);
2260 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
2261 ntohl (mp->sw_if_index),
2262 mp->priority, mp->weight);
2266 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
2267 mp->is_ipv6 ? format_ip6_address :
2269 mp->ip_address, mp->priority, mp->weight);
2272 fformat (vam->ofp, "%s", tmp_str);
2279 vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2282 vat_main_t *vam = &vat_main;
2283 vat_json_node_t *node = NULL;
2285 struct in6_addr ip6;
2288 memset (&loc, 0, sizeof (loc));
2289 if (vam->noprint_msg)
2291 loc.local = mp->local;
2292 loc.priority = mp->priority;
2293 loc.weight = mp->weight;
2296 loc.sw_if_index = ntohl (mp->sw_if_index);
2300 loc.is_ipv6 = mp->is_ipv6;
2301 clib_memcpy (loc.ip_address, mp->ip_address,
2302 sizeof (loc.ip_address));
2304 vec_add1 (vam->locator_msg, loc);
2308 if (VAT_JSON_ARRAY != vam->json_tree.type)
2310 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2311 vat_json_init_array (&vam->json_tree);
2313 node = vat_json_array_add (&vam->json_tree);
2315 vat_json_init_object (node);
2319 vat_json_object_add_uint (node, "locator_index",
2320 ntohl (mp->sw_if_index));
2326 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2327 vat_json_object_add_ip6 (node, "locator", ip6);
2331 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2332 vat_json_object_add_ip4 (node, "locator", ip4);
2335 vat_json_object_add_uint (node, "priority", mp->priority);
2336 vat_json_object_add_uint (node, "weight", mp->weight);
2340 vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2343 vat_main_t *vam = &vat_main;
2344 locator_set_msg_t ls;
2346 ls.locator_set_index = ntohl (mp->locator_set_index);
2347 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2348 vec_add1 (vam->locator_set_msg, ls);
2352 vl_api_lisp_locator_set_details_t_handler_json
2353 (vl_api_lisp_locator_set_details_t * mp)
2355 vat_main_t *vam = &vat_main;
2356 locator_set_msg_t ls;
2358 ls.locator_set_index = ntohl (mp->locator_set_index);
2359 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2360 vec_add1 (vam->locator_set_msg, ls);
2364 add_lisp_eid_table_entry (vat_main_t * vam,
2365 vl_api_lisp_eid_table_details_t * mp)
2367 eid_table_t eid_table;
2369 memset (&eid_table, 0, sizeof (eid_table));
2370 eid_table.is_local = mp->is_local;
2371 eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index);
2372 eid_table.eid_type = mp->eid_type;
2373 eid_table.vni = clib_net_to_host_u32 (mp->vni);
2374 eid_table.eid_prefix_len = mp->eid_prefix_len;
2375 eid_table.ttl = clib_net_to_host_u32 (mp->ttl);
2376 eid_table.action = mp->action;
2377 eid_table.authoritative = mp->authoritative;
2378 clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
2379 vec_add1 (vam->eid_tables, eid_table);
2383 vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2385 vat_main_t *vam = &vat_main;
2386 add_lisp_eid_table_entry (vam, mp);
2390 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2393 vat_main_t *vam = &vat_main;
2394 add_lisp_eid_table_entry (vam, mp);
2398 vl_api_lisp_eid_table_map_details_t_handler
2399 (vl_api_lisp_eid_table_map_details_t * mp)
2401 vat_main_t *vam = &vat_main;
2403 u8 *line = format (0, "%=10d%=10d",
2404 clib_net_to_host_u32 (mp->vni),
2405 clib_net_to_host_u32 (mp->dp_table));
2406 fformat (vam->ofp, "%v\n", line);
2411 vl_api_lisp_eid_table_map_details_t_handler_json
2412 (vl_api_lisp_eid_table_map_details_t * mp)
2414 vat_main_t *vam = &vat_main;
2415 vat_json_node_t *node = NULL;
2417 if (VAT_JSON_ARRAY != vam->json_tree.type)
2419 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2420 vat_json_init_array (&vam->json_tree);
2422 node = vat_json_array_add (&vam->json_tree);
2423 vat_json_init_object (node);
2424 vat_json_object_add_uint (node, "dp_table",
2425 clib_net_to_host_u32 (mp->dp_table));
2426 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2430 vl_api_lisp_eid_table_vni_details_t_handler
2431 (vl_api_lisp_eid_table_vni_details_t * mp)
2433 vat_main_t *vam = &vat_main;
2435 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2436 fformat (vam->ofp, "%v\n", line);
2441 vl_api_lisp_eid_table_vni_details_t_handler_json
2442 (vl_api_lisp_eid_table_vni_details_t * mp)
2444 vat_main_t *vam = &vat_main;
2445 vat_json_node_t *node = NULL;
2447 if (VAT_JSON_ARRAY != vam->json_tree.type)
2449 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2450 vat_json_init_array (&vam->json_tree);
2452 node = vat_json_array_add (&vam->json_tree);
2453 vat_json_init_object (node);
2454 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2458 format_decap_next (u8 * s, va_list * args)
2460 u32 next_index = va_arg (*args, u32);
2464 case LISP_GPE_INPUT_NEXT_DROP:
2465 return format (s, "drop");
2466 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2467 return format (s, "ip4");
2468 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2469 return format (s, "ip6");
2471 return format (s, "unknown %d", next_index);
2477 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2480 vat_main_t *vam = &vat_main;
2482 u8 *flag_str = NULL;
2484 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
2486 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2487 foreach_lisp_gpe_flag_bit;
2490 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2491 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2493 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2495 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2497 ntohl (mp->encap_fib_id),
2498 ntohl (mp->decap_fib_id),
2499 format_decap_next, ntohl (mp->dcap_next),
2501 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
2507 vl_api_lisp_gpe_tunnel_details_t_handler_json
2508 (vl_api_lisp_gpe_tunnel_details_t * mp)
2510 vat_main_t *vam = &vat_main;
2511 vat_json_node_t *node = NULL;
2512 struct in6_addr ip6;
2516 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
2518 if (VAT_JSON_ARRAY != vam->json_tree.type)
2520 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2521 vat_json_init_array (&vam->json_tree);
2523 node = vat_json_array_add (&vam->json_tree);
2525 vat_json_init_object (node);
2526 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2529 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2530 vat_json_object_add_ip6 (node, "source address", ip6);
2531 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2532 vat_json_object_add_ip6 (node, "destination address", ip6);
2536 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2537 vat_json_object_add_ip4 (node, "source address", ip4);
2538 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2539 vat_json_object_add_ip4 (node, "destination address", ip4);
2541 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2542 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2543 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2544 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2545 vat_json_object_add_uint (node, "flags", mp->flags);
2546 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2547 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2548 vat_json_object_add_uint (node, "res", mp->res);
2549 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
2551 vec_free (next_decap_str);
2555 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2558 vat_main_t *vam = &vat_main;
2560 fformat (vam->ofp, "%=20U\n",
2561 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2566 vl_api_lisp_map_resolver_details_t_handler_json
2567 (vl_api_lisp_map_resolver_details_t * mp)
2569 vat_main_t *vam = &vat_main;
2570 vat_json_node_t *node = NULL;
2571 struct in6_addr ip6;
2574 if (VAT_JSON_ARRAY != vam->json_tree.type)
2576 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2577 vat_json_init_array (&vam->json_tree);
2579 node = vat_json_array_add (&vam->json_tree);
2581 vat_json_init_object (node);
2584 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2585 vat_json_object_add_ip6 (node, "map resolver", ip6);
2589 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2590 vat_json_object_add_ip4 (node, "map resolver", ip4);
2595 vl_api_show_lisp_status_reply_t_handler
2596 (vl_api_show_lisp_status_reply_t * mp)
2598 vat_main_t *vam = &vat_main;
2599 i32 retval = ntohl (mp->retval);
2603 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2604 mp->feature_status ? "enabled" : "disabled",
2605 mp->gpe_status ? "enabled" : "disabled");
2608 vam->retval = retval;
2609 vam->result_ready = 1;
2613 vl_api_show_lisp_status_reply_t_handler_json
2614 (vl_api_show_lisp_status_reply_t * mp)
2616 vat_main_t *vam = &vat_main;
2617 vat_json_node_t node;
2618 u8 *gpe_status = NULL;
2619 u8 *feature_status = NULL;
2621 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2622 feature_status = format (0, "%s",
2623 mp->feature_status ? "enabled" : "disabled");
2624 vec_add1 (gpe_status, 0);
2625 vec_add1 (feature_status, 0);
2627 vat_json_init_object (&node);
2628 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2629 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
2631 vec_free (gpe_status);
2632 vec_free (feature_status);
2634 vat_json_print (vam->ofp, &node);
2635 vat_json_free (&node);
2637 vam->retval = ntohl (mp->retval);
2638 vam->result_ready = 1;
2642 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2643 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2645 vat_main_t *vam = &vat_main;
2646 i32 retval = ntohl (mp->retval);
2650 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
2653 vam->retval = retval;
2654 vam->result_ready = 1;
2658 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2659 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2661 vat_main_t *vam = &vat_main;
2662 vat_json_node_t *node = NULL;
2664 if (VAT_JSON_ARRAY != vam->json_tree.type)
2666 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2667 vat_json_init_array (&vam->json_tree);
2669 node = vat_json_array_add (&vam->json_tree);
2671 vat_json_init_object (node);
2672 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
2674 vat_json_print (vam->ofp, node);
2675 vat_json_free (node);
2677 vam->retval = ntohl (mp->retval);
2678 vam->result_ready = 1;
2682 vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2684 vat_main_t *vam = &vat_main;
2685 i32 retval = ntohl (mp->retval);
2689 fformat (vam->ofp, "%-20s%-16s\n",
2690 mp->status ? "enabled" : "disabled",
2691 mp->status ? (char *) mp->locator_set_name : "");
2694 vam->retval = retval;
2695 vam->result_ready = 1;
2699 vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2702 vat_main_t *vam = &vat_main;
2703 vat_json_node_t node;
2706 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2707 vec_add1 (status, 0);
2709 vat_json_init_object (&node);
2710 vat_json_object_add_string_copy (&node, "status", status);
2713 vat_json_object_add_string_copy (&node, "locator_set",
2714 mp->locator_set_name);
2719 vat_json_print (vam->ofp, &node);
2720 vat_json_free (&node);
2722 vam->retval = ntohl (mp->retval);
2723 vam->result_ready = 1;
2727 format_policer_type (u8 * s, va_list * va)
2729 u32 i = va_arg (*va, u32);
2731 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2732 s = format (s, "1r2c");
2733 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2734 s = format (s, "1r3c");
2735 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2736 s = format (s, "2r3c-2698");
2737 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2738 s = format (s, "2r3c-4115");
2739 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2740 s = format (s, "2r3c-mef5cf1");
2742 s = format (s, "ILLEGAL");
2747 format_policer_rate_type (u8 * s, va_list * va)
2749 u32 i = va_arg (*va, u32);
2751 if (i == SSE2_QOS_RATE_KBPS)
2752 s = format (s, "kbps");
2753 else if (i == SSE2_QOS_RATE_PPS)
2754 s = format (s, "pps");
2756 s = format (s, "ILLEGAL");
2761 format_policer_round_type (u8 * s, va_list * va)
2763 u32 i = va_arg (*va, u32);
2765 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2766 s = format (s, "closest");
2767 else if (i == SSE2_QOS_ROUND_TO_UP)
2768 s = format (s, "up");
2769 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2770 s = format (s, "down");
2772 s = format (s, "ILLEGAL");
2777 format_policer_action_type (u8 * s, va_list * va)
2779 u32 i = va_arg (*va, u32);
2781 if (i == SSE2_QOS_ACTION_DROP)
2782 s = format (s, "drop");
2783 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2784 s = format (s, "transmit");
2785 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2786 s = format (s, "mark-and-transmit");
2788 s = format (s, "ILLEGAL");
2793 format_dscp (u8 * s, va_list * va)
2795 u32 i = va_arg (*va, u32);
2800 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2804 return format (s, "ILLEGAL");
2806 s = format (s, "%s", t);
2811 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
2813 vat_main_t *vam = &vat_main;
2814 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
2816 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2817 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2819 conform_dscp_str = format (0, "");
2821 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2822 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2824 exceed_dscp_str = format (0, "");
2826 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2827 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2829 violate_dscp_str = format (0, "");
2831 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2832 "rate type %U, round type %U, %s rate, %s color-aware, "
2833 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2834 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2835 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2837 format_policer_type, mp->type,
2840 clib_net_to_host_u64 (mp->cb),
2841 clib_net_to_host_u64 (mp->eb),
2842 format_policer_rate_type, mp->rate_type,
2843 format_policer_round_type, mp->round_type,
2844 mp->single_rate ? "single" : "dual",
2845 mp->color_aware ? "is" : "not",
2846 ntohl (mp->cir_tokens_per_period),
2847 ntohl (mp->pir_tokens_per_period),
2849 ntohl (mp->current_limit),
2850 ntohl (mp->current_bucket),
2851 ntohl (mp->extended_limit),
2852 ntohl (mp->extended_bucket),
2853 clib_net_to_host_u64 (mp->last_update_time),
2854 format_policer_action_type, mp->conform_action_type,
2856 format_policer_action_type, mp->exceed_action_type,
2858 format_policer_action_type, mp->violate_action_type,
2861 vec_free (conform_dscp_str);
2862 vec_free (exceed_dscp_str);
2863 vec_free (violate_dscp_str);
2866 static void vl_api_policer_details_t_handler_json
2867 (vl_api_policer_details_t * mp)
2869 vat_main_t *vam = &vat_main;
2870 vat_json_node_t *node;
2871 u8 *rate_type_str, *round_type_str, *type_str;
2872 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
2874 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
2876 format (0, "%U", format_policer_round_type, mp->round_type);
2877 type_str = format (0, "%U", format_policer_type, mp->type);
2878 conform_action_str = format (0, "%U", format_policer_action_type,
2879 mp->conform_action_type);
2880 exceed_action_str = format (0, "%U", format_policer_action_type,
2881 mp->exceed_action_type);
2882 violate_action_str = format (0, "%U", format_policer_action_type,
2883 mp->violate_action_type);
2885 if (VAT_JSON_ARRAY != vam->json_tree.type)
2887 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2888 vat_json_init_array (&vam->json_tree);
2890 node = vat_json_array_add (&vam->json_tree);
2892 vat_json_init_object (node);
2893 vat_json_object_add_string_copy (node, "name", mp->name);
2894 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
2895 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
2896 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
2897 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
2898 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
2899 vat_json_object_add_string_copy (node, "round_type", round_type_str);
2900 vat_json_object_add_string_copy (node, "type", type_str);
2901 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
2902 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
2903 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
2904 vat_json_object_add_uint (node, "cir_tokens_per_period",
2905 ntohl (mp->cir_tokens_per_period));
2906 vat_json_object_add_uint (node, "eir_tokens_per_period",
2907 ntohl (mp->pir_tokens_per_period));
2908 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
2909 vat_json_object_add_uint (node, "current_bucket",
2910 ntohl (mp->current_bucket));
2911 vat_json_object_add_uint (node, "extended_limit",
2912 ntohl (mp->extended_limit));
2913 vat_json_object_add_uint (node, "extended_bucket",
2914 ntohl (mp->extended_bucket));
2915 vat_json_object_add_uint (node, "last_update_time",
2916 ntohl (mp->last_update_time));
2917 vat_json_object_add_string_copy (node, "conform_action",
2918 conform_action_str);
2919 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2921 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2922 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
2923 vec_free (dscp_str);
2925 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
2926 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2928 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2929 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
2930 vec_free (dscp_str);
2932 vat_json_object_add_string_copy (node, "violate_action",
2933 violate_action_str);
2934 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2936 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2937 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
2938 vec_free (dscp_str);
2941 vec_free (rate_type_str);
2942 vec_free (round_type_str);
2943 vec_free (type_str);
2944 vec_free (conform_action_str);
2945 vec_free (exceed_action_str);
2946 vec_free (violate_action_str);
2950 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
2953 vat_main_t *vam = &vat_main;
2954 int i, count = ntohl (mp->count);
2957 fformat (vam->ofp, "classify table ids (%d) : ", count);
2958 for (i = 0; i < count; i++)
2960 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
2961 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
2963 vam->retval = ntohl (mp->retval);
2964 vam->result_ready = 1;
2968 vl_api_classify_table_ids_reply_t_handler_json
2969 (vl_api_classify_table_ids_reply_t * mp)
2971 vat_main_t *vam = &vat_main;
2972 int i, count = ntohl (mp->count);
2976 vat_json_node_t node;
2978 vat_json_init_object (&node);
2979 for (i = 0; i < count; i++)
2981 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
2983 vat_json_print (vam->ofp, &node);
2984 vat_json_free (&node);
2986 vam->retval = ntohl (mp->retval);
2987 vam->result_ready = 1;
2991 vl_api_classify_table_by_interface_reply_t_handler
2992 (vl_api_classify_table_by_interface_reply_t * mp)
2994 vat_main_t *vam = &vat_main;
2997 table_id = ntohl (mp->l2_table_id);
2999 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3001 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3002 table_id = ntohl (mp->ip4_table_id);
3004 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3006 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3007 table_id = ntohl (mp->ip6_table_id);
3009 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3011 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3012 vam->retval = ntohl (mp->retval);
3013 vam->result_ready = 1;
3017 vl_api_classify_table_by_interface_reply_t_handler_json
3018 (vl_api_classify_table_by_interface_reply_t * mp)
3020 vat_main_t *vam = &vat_main;
3021 vat_json_node_t node;
3023 vat_json_init_object (&node);
3025 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3026 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3027 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3029 vat_json_print (vam->ofp, &node);
3030 vat_json_free (&node);
3032 vam->retval = ntohl (mp->retval);
3033 vam->result_ready = 1;
3036 static void vl_api_policer_add_del_reply_t_handler
3037 (vl_api_policer_add_del_reply_t * mp)
3039 vat_main_t *vam = &vat_main;
3040 i32 retval = ntohl (mp->retval);
3041 if (vam->async_mode)
3043 vam->async_errors += (retval < 0);
3047 vam->retval = retval;
3048 vam->result_ready = 1;
3049 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3051 * Note: this is just barely thread-safe, depends on
3052 * the main thread spinning waiting for an answer...
3054 errmsg ("policer index %d\n", ntohl (mp->policer_index));
3058 static void vl_api_policer_add_del_reply_t_handler_json
3059 (vl_api_policer_add_del_reply_t * mp)
3061 vat_main_t *vam = &vat_main;
3062 vat_json_node_t node;
3064 vat_json_init_object (&node);
3065 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3066 vat_json_object_add_uint (&node, "policer_index",
3067 ntohl (mp->policer_index));
3069 vat_json_print (vam->ofp, &node);
3070 vat_json_free (&node);
3072 vam->retval = ntohl (mp->retval);
3073 vam->result_ready = 1;
3076 /* Format hex dump. */
3078 format_hex_bytes (u8 * s, va_list * va)
3080 u8 *bytes = va_arg (*va, u8 *);
3081 int n_bytes = va_arg (*va, int);
3084 /* Print short or long form depending on byte count. */
3085 uword short_form = n_bytes <= 32;
3086 uword indent = format_get_indent (s);
3091 for (i = 0; i < n_bytes; i++)
3093 if (!short_form && (i % 32) == 0)
3094 s = format (s, "%08x: ", i);
3095 s = format (s, "%02x", bytes[i]);
3096 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3097 s = format (s, "\n%U", format_white_space, indent);
3104 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3107 vat_main_t *vam = &vat_main;
3108 i32 retval = ntohl (mp->retval);
3111 fformat (vam->ofp, "classify table info :\n");
3112 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3113 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3114 ntohl (mp->miss_next_index));
3115 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3116 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3117 ntohl (mp->match_n_vectors));
3118 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3119 ntohl (mp->mask_length));
3121 vam->retval = retval;
3122 vam->result_ready = 1;
3126 vl_api_classify_table_info_reply_t_handler_json
3127 (vl_api_classify_table_info_reply_t * mp)
3129 vat_main_t *vam = &vat_main;
3130 vat_json_node_t node;
3132 i32 retval = ntohl (mp->retval);
3135 vat_json_init_object (&node);
3137 vat_json_object_add_int (&node, "sessions",
3138 ntohl (mp->active_sessions));
3139 vat_json_object_add_int (&node, "nexttbl",
3140 ntohl (mp->next_table_index));
3141 vat_json_object_add_int (&node, "nextnode",
3142 ntohl (mp->miss_next_index));
3143 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3144 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3145 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3146 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3147 ntohl (mp->mask_length), 0);
3148 vat_json_object_add_string_copy (&node, "mask", s);
3150 vat_json_print (vam->ofp, &node);
3151 vat_json_free (&node);
3153 vam->retval = ntohl (mp->retval);
3154 vam->result_ready = 1;
3158 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3161 vat_main_t *vam = &vat_main;
3163 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3164 ntohl (mp->hit_next_index), ntohl (mp->advance),
3165 ntohl (mp->opaque_index));
3166 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3167 ntohl (mp->match_length));
3171 vl_api_classify_session_details_t_handler_json
3172 (vl_api_classify_session_details_t * mp)
3174 vat_main_t *vam = &vat_main;
3175 vat_json_node_t *node = NULL;
3177 if (VAT_JSON_ARRAY != vam->json_tree.type)
3179 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3180 vat_json_init_array (&vam->json_tree);
3182 node = vat_json_array_add (&vam->json_tree);
3184 vat_json_init_object (node);
3185 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3186 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3187 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3189 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3191 vat_json_object_add_string_copy (node, "match", s);
3194 static void vl_api_pg_create_interface_reply_t_handler
3195 (vl_api_pg_create_interface_reply_t * mp)
3197 vat_main_t *vam = &vat_main;
3199 vam->retval = ntohl (mp->retval);
3200 vam->result_ready = 1;
3203 static void vl_api_pg_create_interface_reply_t_handler_json
3204 (vl_api_pg_create_interface_reply_t * mp)
3206 vat_main_t *vam = &vat_main;
3207 vat_json_node_t node;
3209 i32 retval = ntohl (mp->retval);
3212 vat_json_init_object (&node);
3214 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
3216 vat_json_print (vam->ofp, &node);
3217 vat_json_free (&node);
3219 vam->retval = ntohl (mp->retval);
3220 vam->result_ready = 1;
3223 static void vl_api_policer_classify_details_t_handler
3224 (vl_api_policer_classify_details_t * mp)
3226 vat_main_t *vam = &vat_main;
3228 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3229 ntohl (mp->table_index));
3232 static void vl_api_policer_classify_details_t_handler_json
3233 (vl_api_policer_classify_details_t * mp)
3235 vat_main_t *vam = &vat_main;
3236 vat_json_node_t *node;
3238 if (VAT_JSON_ARRAY != vam->json_tree.type)
3240 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3241 vat_json_init_array (&vam->json_tree);
3243 node = vat_json_array_add (&vam->json_tree);
3245 vat_json_init_object (node);
3246 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3247 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3250 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3251 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3253 vat_main_t *vam = &vat_main;
3254 i32 retval = ntohl (mp->retval);
3255 if (vam->async_mode)
3257 vam->async_errors += (retval < 0);
3261 vam->retval = retval;
3262 vam->sw_if_index = ntohl (mp->sw_if_index);
3263 vam->result_ready = 1;
3267 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3268 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3270 vat_main_t *vam = &vat_main;
3271 vat_json_node_t node;
3273 vat_json_init_object (&node);
3274 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3275 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3277 vat_json_print (vam->ofp, &node);
3278 vat_json_free (&node);
3280 vam->retval = ntohl (mp->retval);
3281 vam->result_ready = 1;
3284 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3285 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3286 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3287 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
3290 * Generate boilerplate reply handlers, which
3291 * dig the return value out of the xxx_reply_t API message,
3292 * stick it into vam->retval, and set vam->result_ready
3294 * Could also do this by pointing N message decode slots at
3295 * a single function, but that could break in subtle ways.
3298 #define foreach_standard_reply_retval_handler \
3299 _(sw_interface_set_flags_reply) \
3300 _(sw_interface_add_del_address_reply) \
3301 _(sw_interface_set_table_reply) \
3302 _(sw_interface_set_vpath_reply) \
3303 _(sw_interface_set_l2_bridge_reply) \
3304 _(bridge_domain_add_del_reply) \
3305 _(sw_interface_set_l2_xconnect_reply) \
3306 _(l2fib_add_del_reply) \
3307 _(ip_add_del_route_reply) \
3308 _(proxy_arp_add_del_reply) \
3309 _(proxy_arp_intfc_enable_disable_reply) \
3310 _(mpls_add_del_encap_reply) \
3311 _(mpls_add_del_decap_reply) \
3312 _(mpls_ethernet_add_del_tunnel_2_reply) \
3313 _(sw_interface_set_unnumbered_reply) \
3314 _(ip_neighbor_add_del_reply) \
3315 _(reset_vrf_reply) \
3316 _(oam_add_del_reply) \
3317 _(reset_fib_reply) \
3318 _(dhcp_proxy_config_reply) \
3319 _(dhcp_proxy_config_2_reply) \
3320 _(dhcp_proxy_set_vss_reply) \
3321 _(dhcp_client_config_reply) \
3322 _(set_ip_flow_hash_reply) \
3323 _(sw_interface_ip6_enable_disable_reply) \
3324 _(sw_interface_ip6_set_link_local_address_reply) \
3325 _(sw_interface_ip6nd_ra_prefix_reply) \
3326 _(sw_interface_ip6nd_ra_config_reply) \
3327 _(set_arp_neighbor_limit_reply) \
3328 _(l2_patch_add_del_reply) \
3329 _(sr_tunnel_add_del_reply) \
3330 _(sr_policy_add_del_reply) \
3331 _(sr_multicast_map_add_del_reply) \
3332 _(classify_add_del_session_reply) \
3333 _(classify_set_interface_ip_table_reply) \
3334 _(classify_set_interface_l2_tables_reply) \
3335 _(l2tpv3_set_tunnel_cookies_reply) \
3336 _(l2tpv3_interface_enable_disable_reply) \
3337 _(l2tpv3_set_lookup_key_reply) \
3338 _(l2_fib_clear_table_reply) \
3339 _(l2_interface_efp_filter_reply) \
3340 _(l2_interface_vlan_tag_rewrite_reply) \
3341 _(modify_vhost_user_if_reply) \
3342 _(delete_vhost_user_if_reply) \
3343 _(want_ip4_arp_events_reply) \
3344 _(input_acl_set_interface_reply) \
3345 _(ipsec_spd_add_del_reply) \
3346 _(ipsec_interface_add_del_spd_reply) \
3347 _(ipsec_spd_add_del_entry_reply) \
3348 _(ipsec_sad_add_del_entry_reply) \
3349 _(ipsec_sa_set_key_reply) \
3350 _(ikev2_profile_add_del_reply) \
3351 _(ikev2_profile_set_auth_reply) \
3352 _(ikev2_profile_set_id_reply) \
3353 _(ikev2_profile_set_ts_reply) \
3354 _(ikev2_set_local_key_reply) \
3355 _(delete_loopback_reply) \
3356 _(bd_ip_mac_add_del_reply) \
3357 _(map_del_domain_reply) \
3358 _(map_add_del_rule_reply) \
3359 _(want_interface_events_reply) \
3360 _(want_stats_reply) \
3361 _(cop_interface_enable_disable_reply) \
3362 _(cop_whitelist_enable_disable_reply) \
3363 _(sw_interface_clear_stats_reply) \
3364 _(trace_profile_add_reply) \
3365 _(trace_profile_apply_reply) \
3366 _(trace_profile_del_reply) \
3367 _(lisp_add_del_locator_reply) \
3368 _(lisp_add_del_local_eid_reply) \
3369 _(lisp_add_del_remote_mapping_reply) \
3370 _(lisp_add_del_adjacency_reply) \
3371 _(lisp_gpe_add_del_fwd_entry_reply) \
3372 _(lisp_add_del_map_resolver_reply) \
3373 _(lisp_gpe_enable_disable_reply) \
3374 _(lisp_gpe_add_del_iface_reply) \
3375 _(lisp_enable_disable_reply) \
3376 _(lisp_pitr_set_locator_set_reply) \
3377 _(lisp_add_del_map_request_itr_rlocs_reply) \
3378 _(lisp_eid_table_add_del_map_reply) \
3379 _(vxlan_gpe_add_del_tunnel_reply) \
3380 _(af_packet_delete_reply) \
3381 _(policer_classify_set_interface_reply) \
3382 _(netmap_create_reply) \
3383 _(netmap_delete_reply) \
3384 _(ipfix_enable_reply) \
3385 _(pg_capture_reply) \
3386 _(pg_enable_disable_reply) \
3387 _(ip_source_and_port_range_check_add_del_reply) \
3388 _(ip_source_and_port_range_check_interface_add_del_reply)
3391 static void vl_api_##n##_t_handler \
3392 (vl_api_##n##_t * mp) \
3394 vat_main_t * vam = &vat_main; \
3395 i32 retval = ntohl(mp->retval); \
3396 if (vam->async_mode) { \
3397 vam->async_errors += (retval < 0); \
3399 vam->retval = retval; \
3400 vam->result_ready = 1; \
3403 foreach_standard_reply_retval_handler;
3407 static void vl_api_##n##_t_handler_json \
3408 (vl_api_##n##_t * mp) \
3410 vat_main_t * vam = &vat_main; \
3411 vat_json_node_t node; \
3412 vat_json_init_object(&node); \
3413 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3414 vat_json_print(vam->ofp, &node); \
3415 vam->retval = ntohl(mp->retval); \
3416 vam->result_ready = 1; \
3418 foreach_standard_reply_retval_handler;
3422 * Table of message reply handlers, must include boilerplate handlers
3426 #define foreach_vpe_api_reply_msg \
3427 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3428 _(SW_INTERFACE_DETAILS, sw_interface_details) \
3429 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3430 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3431 _(CONTROL_PING_REPLY, control_ping_reply) \
3432 _(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply) \
3433 _(CLI_REPLY, cli_reply) \
3434 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3435 sw_interface_add_del_address_reply) \
3436 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
3437 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3438 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3439 sw_interface_set_l2_xconnect_reply) \
3440 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3441 sw_interface_set_l2_bridge_reply) \
3442 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3443 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3444 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3445 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3446 _(L2_FLAGS_REPLY, l2_flags_reply) \
3447 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3448 _(TAP_CONNECT_REPLY, tap_connect_reply) \
3449 _(TAP_MODIFY_REPLY, tap_modify_reply) \
3450 _(TAP_DELETE_REPLY, tap_delete_reply) \
3451 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3452 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
3453 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3454 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3455 proxy_arp_intfc_enable_disable_reply) \
3456 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
3457 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
3458 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
3459 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3460 mpls_ethernet_add_del_tunnel_reply) \
3461 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3462 mpls_ethernet_add_del_tunnel_2_reply) \
3463 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3464 sw_interface_set_unnumbered_reply) \
3465 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3466 _(RESET_VRF_REPLY, reset_vrf_reply) \
3467 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3468 _(CREATE_SUBIF_REPLY, create_subif_reply) \
3469 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3470 _(RESET_FIB_REPLY, reset_fib_reply) \
3471 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3472 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3473 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3474 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3475 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3476 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3477 sw_interface_ip6_enable_disable_reply) \
3478 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3479 sw_interface_ip6_set_link_local_address_reply) \
3480 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3481 sw_interface_ip6nd_ra_prefix_reply) \
3482 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3483 sw_interface_ip6nd_ra_config_reply) \
3484 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3485 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3486 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
3487 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3488 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
3489 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3490 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3491 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3492 classify_set_interface_ip_table_reply) \
3493 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3494 classify_set_interface_l2_tables_reply) \
3495 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3496 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3497 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3498 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3499 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3500 l2tpv3_interface_enable_disable_reply) \
3501 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3502 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3503 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
3504 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
3505 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3506 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
3507 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3508 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3509 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3510 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3511 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3512 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3513 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3514 _(SHOW_VERSION_REPLY, show_version_reply) \
3515 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
3516 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3517 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
3518 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3519 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3520 _(IP4_ARP_EVENT, ip4_arp_event) \
3521 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3522 _(IP_ADDRESS_DETAILS, ip_address_details) \
3523 _(IP_DETAILS, ip_details) \
3524 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3525 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3526 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3527 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3528 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
3529 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3530 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3531 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3532 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3533 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
3534 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3535 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3536 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
3537 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3538 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3539 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3540 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3541 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
3542 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
3543 _(MAP_DOMAIN_DETAILS, map_domain_details) \
3544 _(MAP_RULE_DETAILS, map_rule_details) \
3545 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3546 _(WANT_STATS_REPLY, want_stats_reply) \
3547 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3548 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
3549 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
3550 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
3551 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
3552 _(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
3553 _(TRACE_PROFILE_APPLY_REPLY, trace_profile_apply_reply) \
3554 _(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
3555 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3556 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3557 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
3558 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3559 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
3560 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3561 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
3562 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
3563 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
3564 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
3565 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
3566 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3567 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
3568 _(LISP_LOCATOR_DETAILS, lisp_locator_details) \
3569 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
3570 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
3571 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
3572 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
3573 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
3574 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
3575 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3576 lisp_add_del_map_request_itr_rlocs_reply) \
3577 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3578 lisp_get_map_request_itr_rlocs_reply) \
3579 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
3580 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
3581 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
3582 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
3583 _(POLICER_DETAILS, policer_details) \
3584 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3585 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
3586 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
3587 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
3588 _(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
3589 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3590 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
3591 _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
3592 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3593 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3594 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
3595 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
3596 _(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \
3597 _(IPFIX_DETAILS, ipfix_details) \
3598 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3599 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3600 _(PG_CAPTURE_REPLY, pg_capture_reply) \
3601 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3602 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3603 ip_source_and_port_range_check_add_del_reply) \
3604 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
3605 ip_source_and_port_range_check_interface_add_del_reply) \
3606 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
3607 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details)
3609 /* M: construct, but don't yet send a message */
3613 vam->result_ready = 0; \
3614 mp = vl_msg_api_alloc(sizeof(*mp)); \
3615 memset (mp, 0, sizeof (*mp)); \
3616 mp->_vl_msg_id = ntohs (VL_API_##T); \
3617 mp->client_index = vam->my_client_index; \
3622 vam->result_ready = 0; \
3623 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3624 memset (mp, 0, sizeof (*mp)); \
3625 mp->_vl_msg_id = ntohs (VL_API_##T); \
3626 mp->client_index = vam->my_client_index; \
3630 /* S: send a message */
3631 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3633 /* W: wait for results, with timeout */
3636 timeout = vat_time_now (vam) + 1.0; \
3638 while (vat_time_now (vam) < timeout) { \
3639 if (vam->result_ready == 1) { \
3640 return (vam->retval); \
3646 /* W2: wait for results, with timeout */
3649 timeout = vat_time_now (vam) + 1.0; \
3651 while (vat_time_now (vam) < timeout) { \
3652 if (vam->result_ready == 1) { \
3654 return (vam->retval); \
3660 /* W_L: wait for results, with timeout */
3663 timeout = vat_time_now (vam) + 1.0; \
3665 while (vat_time_now (vam) < timeout) { \
3666 if (vam->result_ready == 1) { \
3668 return (vam->retval); \
3671 vam->noprint_msg = 0; \
3682 #define STR_VTR_OP_CASE(op) \
3683 case L2_VTR_ ## op: \
3687 str_vtr_op (u32 vtr_op)
3691 STR_VTR_OP_CASE (DISABLED);
3692 STR_VTR_OP_CASE (PUSH_1);
3693 STR_VTR_OP_CASE (PUSH_2);
3694 STR_VTR_OP_CASE (POP_1);
3695 STR_VTR_OP_CASE (POP_2);
3696 STR_VTR_OP_CASE (TRANSLATE_1_1);
3697 STR_VTR_OP_CASE (TRANSLATE_1_2);
3698 STR_VTR_OP_CASE (TRANSLATE_2_1);
3699 STR_VTR_OP_CASE (TRANSLATE_2_2);
3706 dump_sub_interface_table (vat_main_t * vam)
3708 const sw_interface_subif_t *sub = NULL;
3710 if (vam->json_output)
3713 ("JSON output supported only for VPE API calls and dump_stats_table");
3718 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3719 "Interface", "sw_if_index",
3720 "sub id", "dot1ad", "tags", "outer id",
3721 "inner id", "exact", "default", "outer any", "inner any");
3723 vec_foreach (sub, vam->sw_if_subif_table)
3726 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3727 sub->interface_name,
3729 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3730 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3731 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3732 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3733 if (sub->vtr_op != L2_VTR_DISABLED)
3736 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3737 "tag1: %d tag2: %d ]\n",
3738 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3739 sub->vtr_tag1, sub->vtr_tag2);
3747 name_sort_cmp (void *a1, void *a2)
3749 name_sort_t *n1 = a1;
3750 name_sort_t *n2 = a2;
3752 return strcmp ((char *) n1->name, (char *) n2->name);
3756 dump_interface_table (vat_main_t * vam)
3759 name_sort_t *nses = 0, *ns;
3761 if (vam->json_output)
3764 ("JSON output supported only for VPE API calls and dump_stats_table");
3769 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3771 vec_add2 (nses, ns, 1);
3772 ns->name = (u8 *)(p->key);
3773 ns->value = (u32) p->value[0];
3777 vec_sort_with_function (nses, name_sort_cmp);
3779 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3780 vec_foreach (ns, nses)
3782 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3789 dump_ip_table (vat_main_t * vam, int is_ipv6)
3791 const ip_details_t *det = NULL;
3792 const ip_address_details_t *address = NULL;
3795 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3797 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3804 fformat (vam->ofp, "%-12d\n", i);
3806 " %-30s%-13s\n", "Address", "Prefix length");
3811 vec_foreach (address, det->addr)
3815 is_ipv6 ? format_ip6_address : format_ip4_address,
3816 address->ip, address->prefix_length);
3824 dump_ipv4_table (vat_main_t * vam)
3826 if (vam->json_output)
3829 ("JSON output supported only for VPE API calls and dump_stats_table");
3833 return dump_ip_table (vam, 0);
3837 dump_ipv6_table (vat_main_t * vam)
3839 if (vam->json_output)
3842 ("JSON output supported only for VPE API calls and dump_stats_table");
3846 return dump_ip_table (vam, 1);
3850 counter_type_to_str (u8 counter_type, u8 is_combined)
3854 switch (counter_type)
3856 case VNET_INTERFACE_COUNTER_DROP:
3858 case VNET_INTERFACE_COUNTER_PUNT:
3860 case VNET_INTERFACE_COUNTER_IP4:
3862 case VNET_INTERFACE_COUNTER_IP6:
3864 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
3866 case VNET_INTERFACE_COUNTER_RX_MISS:
3868 case VNET_INTERFACE_COUNTER_RX_ERROR:
3870 case VNET_INTERFACE_COUNTER_TX_ERROR:
3873 return "INVALID-COUNTER-TYPE";
3878 switch (counter_type)
3880 case VNET_INTERFACE_COUNTER_RX:
3882 case VNET_INTERFACE_COUNTER_TX:
3885 return "INVALID-COUNTER-TYPE";
3891 dump_stats_table (vat_main_t * vam)
3893 vat_json_node_t node;
3894 vat_json_node_t *msg_array;
3895 vat_json_node_t *msg;
3896 vat_json_node_t *counter_array;
3897 vat_json_node_t *counter;
3898 interface_counter_t c;
3900 ip4_fib_counter_t *c4;
3901 ip6_fib_counter_t *c6;
3904 if (!vam->json_output)
3906 clib_warning ("dump_stats_table supported only in JSON format");
3910 vat_json_init_object (&node);
3912 /* interface counters */
3913 msg_array = vat_json_object_add (&node, "interface_counters");
3914 vat_json_init_array (msg_array);
3915 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
3917 msg = vat_json_array_add (msg_array);
3918 vat_json_init_object (msg);
3919 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3920 (u8 *) counter_type_to_str (i, 0));
3921 vat_json_object_add_int (msg, "is_combined", 0);
3922 counter_array = vat_json_object_add (msg, "data");
3923 vat_json_init_array (counter_array);
3924 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
3926 packets = vam->simple_interface_counters[i][j];
3927 vat_json_array_add_uint (counter_array, packets);
3930 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
3932 msg = vat_json_array_add (msg_array);
3933 vat_json_init_object (msg);
3934 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3935 (u8 *) counter_type_to_str (i, 1));
3936 vat_json_object_add_int (msg, "is_combined", 1);
3937 counter_array = vat_json_object_add (msg, "data");
3938 vat_json_init_array (counter_array);
3939 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
3941 c = vam->combined_interface_counters[i][j];
3942 counter = vat_json_array_add (counter_array);
3943 vat_json_init_object (counter);
3944 vat_json_object_add_uint (counter, "packets", c.packets);
3945 vat_json_object_add_uint (counter, "bytes", c.bytes);
3949 /* ip4 fib counters */
3950 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
3951 vat_json_init_array (msg_array);
3952 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
3954 msg = vat_json_array_add (msg_array);
3955 vat_json_init_object (msg);
3956 vat_json_object_add_uint (msg, "vrf_id",
3957 vam->ip4_fib_counters_vrf_id_by_index[i]);
3958 counter_array = vat_json_object_add (msg, "c");
3959 vat_json_init_array (counter_array);
3960 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
3962 counter = vat_json_array_add (counter_array);
3963 vat_json_init_object (counter);
3964 c4 = &vam->ip4_fib_counters[i][j];
3965 vat_json_object_add_ip4 (counter, "address", c4->address);
3966 vat_json_object_add_uint (counter, "address_length",
3967 c4->address_length);
3968 vat_json_object_add_uint (counter, "packets", c4->packets);
3969 vat_json_object_add_uint (counter, "bytes", c4->bytes);
3973 /* ip6 fib counters */
3974 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
3975 vat_json_init_array (msg_array);
3976 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
3978 msg = vat_json_array_add (msg_array);
3979 vat_json_init_object (msg);
3980 vat_json_object_add_uint (msg, "vrf_id",
3981 vam->ip6_fib_counters_vrf_id_by_index[i]);
3982 counter_array = vat_json_object_add (msg, "c");
3983 vat_json_init_array (counter_array);
3984 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
3986 counter = vat_json_array_add (counter_array);
3987 vat_json_init_object (counter);
3988 c6 = &vam->ip6_fib_counters[i][j];
3989 vat_json_object_add_ip6 (counter, "address", c6->address);
3990 vat_json_object_add_uint (counter, "address_length",
3991 c6->address_length);
3992 vat_json_object_add_uint (counter, "packets", c6->packets);
3993 vat_json_object_add_uint (counter, "bytes", c6->bytes);
3997 vat_json_print (vam->ofp, &node);
3998 vat_json_free (&node);
4004 exec (vat_main_t * vam)
4006 api_main_t *am = &api_main;
4007 vl_api_cli_request_t *mp;
4011 unformat_input_t *i = vam->input;
4013 if (vec_len (i->buffer) == 0)
4016 if (vam->exec_mode == 0 && unformat (i, "mode"))
4021 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4028 M (CLI_REQUEST, cli_request);
4031 * Copy cmd into shared memory.
4032 * In order for the CLI command to work, it
4033 * must be a vector ending in \n, not a C-string ending
4036 pthread_mutex_lock (&am->vlib_rp->mutex);
4037 oldheap = svm_push_data_heap (am->vlib_rp);
4039 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4040 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4042 svm_pop_heap (oldheap);
4043 pthread_mutex_unlock (&am->vlib_rp->mutex);
4045 mp->cmd_in_shmem = (u64) cmd;
4047 timeout = vat_time_now (vam) + 10.0;
4049 while (vat_time_now (vam) < timeout)
4051 if (vam->result_ready == 1)
4054 if (vam->shmem_result != NULL)
4055 fformat (vam->ofp, "%s", vam->shmem_result);
4056 pthread_mutex_lock (&am->vlib_rp->mutex);
4057 oldheap = svm_push_data_heap (am->vlib_rp);
4059 free_me = (u8 *) vam->shmem_result;
4062 svm_pop_heap (oldheap);
4063 pthread_mutex_unlock (&am->vlib_rp->mutex);
4071 api_create_loopback (vat_main_t * vam)
4073 unformat_input_t *i = vam->input;
4074 vl_api_create_loopback_t *mp;
4079 memset (mac_address, 0, sizeof (mac_address));
4081 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4083 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4089 /* Construct the API message */
4090 M (CREATE_LOOPBACK, create_loopback);
4092 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4099 api_delete_loopback (vat_main_t * vam)
4101 unformat_input_t *i = vam->input;
4102 vl_api_delete_loopback_t *mp;
4104 u32 sw_if_index = ~0;
4106 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4108 if (unformat (i, "sw_if_index %d", &sw_if_index))
4114 if (sw_if_index == ~0)
4116 errmsg ("missing sw_if_index\n");
4120 /* Construct the API message */
4121 M (DELETE_LOOPBACK, delete_loopback);
4122 mp->sw_if_index = ntohl (sw_if_index);
4129 api_want_stats (vat_main_t * vam)
4131 unformat_input_t *i = vam->input;
4132 vl_api_want_stats_t *mp;
4136 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4138 if (unformat (i, "enable"))
4140 else if (unformat (i, "disable"))
4148 errmsg ("missing enable|disable\n");
4152 M (WANT_STATS, want_stats);
4153 mp->enable_disable = enable;
4160 api_want_interface_events (vat_main_t * vam)
4162 unformat_input_t *i = vam->input;
4163 vl_api_want_interface_events_t *mp;
4167 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4169 if (unformat (i, "enable"))
4171 else if (unformat (i, "disable"))
4179 errmsg ("missing enable|disable\n");
4183 M (WANT_INTERFACE_EVENTS, want_interface_events);
4184 mp->enable_disable = enable;
4186 vam->interface_event_display = enable;
4193 /* Note: non-static, called once to set up the initial intfc table */
4195 api_sw_interface_dump (vat_main_t * vam)
4197 vl_api_sw_interface_dump_t *mp;
4200 name_sort_t *nses = 0, *ns;
4201 sw_interface_subif_t *sub = NULL;
4203 /* Toss the old name table */
4205 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4207 vec_add2 (nses, ns, 1);
4208 ns->name = (u8 *)(p->key);
4209 ns->value = (u32) p->value[0];
4213 hash_free (vam->sw_if_index_by_interface_name);
4215 vec_foreach (ns, nses) vec_free (ns->name);
4219 vec_foreach (sub, vam->sw_if_subif_table)
4221 vec_free (sub->interface_name);
4223 vec_free (vam->sw_if_subif_table);
4225 /* recreate the interface name hash table */
4226 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
4228 /* Get list of ethernets */
4229 M (SW_INTERFACE_DUMP, sw_interface_dump);
4230 mp->name_filter_valid = 1;
4231 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4234 /* and local / loopback interfaces */
4235 M (SW_INTERFACE_DUMP, sw_interface_dump);
4236 mp->name_filter_valid = 1;
4237 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4241 /* and vxlan-gpe tunnel interfaces */
4242 M (SW_INTERFACE_DUMP, sw_interface_dump);
4243 mp->name_filter_valid = 1;
4244 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4245 sizeof (mp->name_filter) - 1);
4248 /* and vxlan tunnel interfaces */
4249 M (SW_INTERFACE_DUMP, sw_interface_dump);
4250 mp->name_filter_valid = 1;
4251 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4254 /* and host (af_packet) interfaces */
4255 M (SW_INTERFACE_DUMP, sw_interface_dump);
4256 mp->name_filter_valid = 1;
4257 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4260 /* and l2tpv3 tunnel interfaces */
4261 M (SW_INTERFACE_DUMP, sw_interface_dump);
4262 mp->name_filter_valid = 1;
4263 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4264 sizeof (mp->name_filter) - 1);
4267 /* and GRE tunnel interfaces */
4268 M (SW_INTERFACE_DUMP, sw_interface_dump);
4269 mp->name_filter_valid = 1;
4270 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4273 /* Use a control ping for synchronization */
4275 vl_api_control_ping_t *mp;
4276 M (CONTROL_PING, control_ping);
4283 api_sw_interface_set_flags (vat_main_t * vam)
4285 unformat_input_t *i = vam->input;
4286 vl_api_sw_interface_set_flags_t *mp;
4289 u8 sw_if_index_set = 0;
4290 u8 admin_up = 0, link_up = 0;
4292 /* Parse args required to build the message */
4293 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4295 if (unformat (i, "admin-up"))
4297 else if (unformat (i, "admin-down"))
4299 else if (unformat (i, "link-up"))
4301 else if (unformat (i, "link-down"))
4303 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4304 sw_if_index_set = 1;
4305 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4306 sw_if_index_set = 1;
4311 if (sw_if_index_set == 0)
4313 errmsg ("missing interface name or sw_if_index\n");
4317 /* Construct the API message */
4318 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4319 mp->sw_if_index = ntohl (sw_if_index);
4320 mp->admin_up_down = admin_up;
4321 mp->link_up_down = link_up;
4326 /* Wait for a reply, return the good/bad news... */
4331 api_sw_interface_clear_stats (vat_main_t * vam)
4333 unformat_input_t *i = vam->input;
4334 vl_api_sw_interface_clear_stats_t *mp;
4337 u8 sw_if_index_set = 0;
4339 /* Parse args required to build the message */
4340 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4342 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4343 sw_if_index_set = 1;
4344 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4345 sw_if_index_set = 1;
4350 /* Construct the API message */
4351 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
4353 if (sw_if_index_set == 1)
4354 mp->sw_if_index = ntohl (sw_if_index);
4356 mp->sw_if_index = ~0;
4361 /* Wait for a reply, return the good/bad news... */
4366 api_sw_interface_add_del_address (vat_main_t * vam)
4368 unformat_input_t *i = vam->input;
4369 vl_api_sw_interface_add_del_address_t *mp;
4372 u8 sw_if_index_set = 0;
4373 u8 is_add = 1, del_all = 0;
4374 u32 address_length = 0;
4375 u8 v4_address_set = 0;
4376 u8 v6_address_set = 0;
4377 ip4_address_t v4address;
4378 ip6_address_t v6address;
4380 /* Parse args required to build the message */
4381 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4383 if (unformat (i, "del-all"))
4385 else if (unformat (i, "del"))
4387 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4388 sw_if_index_set = 1;
4389 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4390 sw_if_index_set = 1;
4391 else if (unformat (i, "%U/%d",
4392 unformat_ip4_address, &v4address, &address_length))
4394 else if (unformat (i, "%U/%d",
4395 unformat_ip6_address, &v6address, &address_length))
4401 if (sw_if_index_set == 0)
4403 errmsg ("missing interface name or sw_if_index\n");
4406 if (v4_address_set && v6_address_set)
4408 errmsg ("both v4 and v6 addresses set\n");
4411 if (!v4_address_set && !v6_address_set && !del_all)
4413 errmsg ("no addresses set\n");
4417 /* Construct the API message */
4418 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4420 mp->sw_if_index = ntohl (sw_if_index);
4421 mp->is_add = is_add;
4422 mp->del_all = del_all;
4426 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4430 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4432 mp->address_length = address_length;
4437 /* Wait for a reply, return good/bad news */
4442 api_sw_interface_set_table (vat_main_t * vam)
4444 unformat_input_t *i = vam->input;
4445 vl_api_sw_interface_set_table_t *mp;
4447 u32 sw_if_index, vrf_id = 0;
4448 u8 sw_if_index_set = 0;
4451 /* Parse args required to build the message */
4452 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4454 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4455 sw_if_index_set = 1;
4456 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4457 sw_if_index_set = 1;
4458 else if (unformat (i, "vrf %d", &vrf_id))
4460 else if (unformat (i, "ipv6"))
4466 if (sw_if_index_set == 0)
4468 errmsg ("missing interface name or sw_if_index\n");
4472 /* Construct the API message */
4473 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4475 mp->sw_if_index = ntohl (sw_if_index);
4476 mp->is_ipv6 = is_ipv6;
4477 mp->vrf_id = ntohl (vrf_id);
4482 /* Wait for a reply... */
4487 api_sw_interface_set_vpath (vat_main_t * vam)
4489 unformat_input_t *i = vam->input;
4490 vl_api_sw_interface_set_vpath_t *mp;
4492 u32 sw_if_index = 0;
4493 u8 sw_if_index_set = 0;
4496 /* Parse args required to build the message */
4497 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4499 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4500 sw_if_index_set = 1;
4501 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4502 sw_if_index_set = 1;
4503 else if (unformat (i, "enable"))
4505 else if (unformat (i, "disable"))
4511 if (sw_if_index_set == 0)
4513 errmsg ("missing interface name or sw_if_index\n");
4517 /* Construct the API message */
4518 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
4520 mp->sw_if_index = ntohl (sw_if_index);
4521 mp->enable = is_enable;
4526 /* Wait for a reply... */
4531 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
4533 unformat_input_t *i = vam->input;
4534 vl_api_sw_interface_set_l2_xconnect_t *mp;
4537 u8 rx_sw_if_index_set = 0;
4539 u8 tx_sw_if_index_set = 0;
4542 /* Parse args required to build the message */
4543 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4545 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
4546 rx_sw_if_index_set = 1;
4547 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4548 tx_sw_if_index_set = 1;
4549 else if (unformat (i, "rx"))
4551 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4553 if (unformat (i, "%U", unformat_sw_if_index, vam,
4555 rx_sw_if_index_set = 1;
4560 else if (unformat (i, "tx"))
4562 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4564 if (unformat (i, "%U", unformat_sw_if_index, vam,
4566 tx_sw_if_index_set = 1;
4571 else if (unformat (i, "enable"))
4573 else if (unformat (i, "disable"))
4579 if (rx_sw_if_index_set == 0)
4581 errmsg ("missing rx interface name or rx_sw_if_index\n");
4585 if (enable && (tx_sw_if_index_set == 0))
4587 errmsg ("missing tx interface name or tx_sw_if_index\n");
4591 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
4593 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4594 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
4595 mp->enable = enable;
4604 api_sw_interface_set_l2_bridge (vat_main_t * vam)
4606 unformat_input_t *i = vam->input;
4607 vl_api_sw_interface_set_l2_bridge_t *mp;
4610 u8 rx_sw_if_index_set = 0;
4617 /* Parse args required to build the message */
4618 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4620 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
4621 rx_sw_if_index_set = 1;
4622 else if (unformat (i, "bd_id %d", &bd_id))
4624 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
4625 rx_sw_if_index_set = 1;
4626 else if (unformat (i, "shg %d", &shg))
4628 else if (unformat (i, "bvi"))
4630 else if (unformat (i, "enable"))
4632 else if (unformat (i, "disable"))
4638 if (rx_sw_if_index_set == 0)
4640 errmsg ("missing rx interface name or sw_if_index\n");
4644 if (enable && (bd_id_set == 0))
4646 errmsg ("missing bridge domain\n");
4650 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
4652 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4653 mp->bd_id = ntohl (bd_id);
4656 mp->enable = enable;
4665 api_bridge_domain_dump (vat_main_t * vam)
4667 unformat_input_t *i = vam->input;
4668 vl_api_bridge_domain_dump_t *mp;
4672 /* Parse args required to build the message */
4673 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4675 if (unformat (i, "bd_id %d", &bd_id))
4681 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
4682 mp->bd_id = ntohl (bd_id);
4685 /* Use a control ping for synchronization */
4687 vl_api_control_ping_t *mp;
4688 M (CONTROL_PING, control_ping);
4698 api_bridge_domain_add_del (vat_main_t * vam)
4700 unformat_input_t *i = vam->input;
4701 vl_api_bridge_domain_add_del_t *mp;
4705 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
4707 /* Parse args required to build the message */
4708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4710 if (unformat (i, "bd_id %d", &bd_id))
4712 else if (unformat (i, "flood %d", &flood))
4714 else if (unformat (i, "uu-flood %d", &uu_flood))
4716 else if (unformat (i, "forward %d", &forward))
4718 else if (unformat (i, "learn %d", &learn))
4720 else if (unformat (i, "arp-term %d", &arp_term))
4722 else if (unformat (i, "del"))
4725 flood = uu_flood = forward = learn = 0;
4733 errmsg ("missing bridge domain\n");
4737 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
4739 mp->bd_id = ntohl (bd_id);
4741 mp->uu_flood = uu_flood;
4742 mp->forward = forward;
4744 mp->arp_term = arp_term;
4745 mp->is_add = is_add;
4754 api_l2fib_add_del (vat_main_t * vam)
4756 unformat_input_t *i = vam->input;
4757 vl_api_l2fib_add_del_t *mp;
4764 u8 sw_if_index_set = 0;
4773 /* Parse args required to build the message */
4774 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4776 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
4778 else if (unformat (i, "bd_id %d", &bd_id))
4780 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4781 sw_if_index_set = 1;
4782 else if (unformat (i, "sw_if"))
4784 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4786 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4787 sw_if_index_set = 1;
4792 else if (unformat (i, "static"))
4794 else if (unformat (i, "filter"))
4799 else if (unformat (i, "bvi"))
4804 else if (unformat (i, "del"))
4806 else if (unformat (i, "count %d", &count))
4814 errmsg ("missing mac address\n");
4820 errmsg ("missing bridge domain\n");
4824 if (is_add && (sw_if_index_set == 0))
4826 errmsg ("missing interface name or sw_if_index\n");
4832 /* Turn on async mode */
4833 vam->async_mode = 1;
4834 vam->async_errors = 0;
4835 before = vat_time_now (vam);
4838 for (j = 0; j < count; j++)
4840 M (L2FIB_ADD_DEL, l2fib_add_del);
4843 mp->bd_id = ntohl (bd_id);
4844 mp->is_add = is_add;
4848 mp->sw_if_index = ntohl (sw_if_index);
4849 mp->static_mac = static_mac;
4850 mp->filter_mac = filter_mac;
4851 mp->bvi_mac = bvi_mac;
4853 increment_mac_address (&mac);
4860 vl_api_control_ping_t *mp;
4863 /* Shut off async mode */
4864 vam->async_mode = 0;
4866 M (CONTROL_PING, control_ping);
4869 timeout = vat_time_now (vam) + 1.0;
4870 while (vat_time_now (vam) < timeout)
4871 if (vam->result_ready == 1)
4876 if (vam->retval == -99)
4877 errmsg ("timeout\n");
4879 if (vam->async_errors > 0)
4881 errmsg ("%d asynchronous errors\n", vam->async_errors);
4884 vam->async_errors = 0;
4885 after = vat_time_now (vam);
4887 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4888 count, after - before, count / (after - before));
4892 /* Wait for a reply... */
4895 /* Return the good/bad news */
4896 return (vam->retval);
4900 api_l2_flags (vat_main_t * vam)
4902 unformat_input_t *i = vam->input;
4903 vl_api_l2_flags_t *mp;
4906 u32 feature_bitmap = 0;
4907 u8 sw_if_index_set = 0;
4909 /* Parse args required to build the message */
4910 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4912 if (unformat (i, "sw_if_index %d", &sw_if_index))
4913 sw_if_index_set = 1;
4914 else if (unformat (i, "sw_if"))
4916 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4918 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4919 sw_if_index_set = 1;
4924 else if (unformat (i, "learn"))
4925 feature_bitmap |= L2INPUT_FEAT_LEARN;
4926 else if (unformat (i, "forward"))
4927 feature_bitmap |= L2INPUT_FEAT_FWD;
4928 else if (unformat (i, "flood"))
4929 feature_bitmap |= L2INPUT_FEAT_FLOOD;
4930 else if (unformat (i, "uu-flood"))
4931 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
4936 if (sw_if_index_set == 0)
4938 errmsg ("missing interface name or sw_if_index\n");
4942 M (L2_FLAGS, l2_flags);
4944 mp->sw_if_index = ntohl (sw_if_index);
4945 mp->feature_bitmap = ntohl (feature_bitmap);
4954 api_bridge_flags (vat_main_t * vam)
4956 unformat_input_t *i = vam->input;
4957 vl_api_bridge_flags_t *mp;
4964 /* Parse args required to build the message */
4965 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4967 if (unformat (i, "bd_id %d", &bd_id))
4969 else if (unformat (i, "learn"))
4971 else if (unformat (i, "forward"))
4973 else if (unformat (i, "flood"))
4975 else if (unformat (i, "uu-flood"))
4976 flags |= L2_UU_FLOOD;
4977 else if (unformat (i, "arp-term"))
4978 flags |= L2_ARP_TERM;
4979 else if (unformat (i, "off"))
4981 else if (unformat (i, "disable"))
4989 errmsg ("missing bridge domain\n");
4993 M (BRIDGE_FLAGS, bridge_flags);
4995 mp->bd_id = ntohl (bd_id);
4996 mp->feature_bitmap = ntohl (flags);
4997 mp->is_set = is_set;
5006 api_bd_ip_mac_add_del (vat_main_t * vam)
5008 unformat_input_t *i = vam->input;
5009 vl_api_bd_ip_mac_add_del_t *mp;
5017 ip4_address_t v4addr;
5018 ip6_address_t v6addr;
5022 /* Parse args required to build the message */
5023 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5025 if (unformat (i, "bd_id %d", &bd_id))
5029 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5033 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5038 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5042 else if (unformat (i, "del"))
5050 errmsg ("missing bridge domain\n");
5053 else if (ip_set == 0)
5055 errmsg ("missing IP address\n");
5058 else if (mac_set == 0)
5060 errmsg ("missing MAC address\n");
5064 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
5066 mp->bd_id = ntohl (bd_id);
5067 mp->is_ipv6 = is_ipv6;
5068 mp->is_add = is_add;
5070 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5072 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5073 clib_memcpy (mp->mac_address, macaddr, 6);
5081 api_tap_connect (vat_main_t * vam)
5083 unformat_input_t *i = vam->input;
5084 vl_api_tap_connect_t *mp;
5091 memset (mac_address, 0, sizeof (mac_address));
5093 /* Parse args required to build the message */
5094 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5096 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5100 else if (unformat (i, "random-mac"))
5102 else if (unformat (i, "tapname %s", &tap_name))
5110 errmsg ("missing tap name\n");
5113 if (vec_len (tap_name) > 63)
5115 errmsg ("tap name too long\n");
5117 vec_add1 (tap_name, 0);
5119 /* Construct the API message */
5120 M (TAP_CONNECT, tap_connect);
5122 mp->use_random_mac = random_mac;
5123 clib_memcpy (mp->mac_address, mac_address, 6);
5124 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5125 vec_free (tap_name);
5130 /* Wait for a reply... */
5135 api_tap_modify (vat_main_t * vam)
5137 unformat_input_t *i = vam->input;
5138 vl_api_tap_modify_t *mp;
5144 u32 sw_if_index = ~0;
5145 u8 sw_if_index_set = 0;
5147 memset (mac_address, 0, sizeof (mac_address));
5149 /* Parse args required to build the message */
5150 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5152 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5153 sw_if_index_set = 1;
5154 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5155 sw_if_index_set = 1;
5156 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5160 else if (unformat (i, "random-mac"))
5162 else if (unformat (i, "tapname %s", &tap_name))
5168 if (sw_if_index_set == 0)
5170 errmsg ("missing vpp interface name");
5175 errmsg ("missing tap name\n");
5178 if (vec_len (tap_name) > 63)
5180 errmsg ("tap name too long\n");
5182 vec_add1 (tap_name, 0);
5184 /* Construct the API message */
5185 M (TAP_MODIFY, tap_modify);
5187 mp->use_random_mac = random_mac;
5188 mp->sw_if_index = ntohl (sw_if_index);
5189 clib_memcpy (mp->mac_address, mac_address, 6);
5190 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5191 vec_free (tap_name);
5196 /* Wait for a reply... */
5201 api_tap_delete (vat_main_t * vam)
5203 unformat_input_t *i = vam->input;
5204 vl_api_tap_delete_t *mp;
5206 u32 sw_if_index = ~0;
5207 u8 sw_if_index_set = 0;
5209 /* Parse args required to build the message */
5210 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5212 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5213 sw_if_index_set = 1;
5214 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5215 sw_if_index_set = 1;
5220 if (sw_if_index_set == 0)
5222 errmsg ("missing vpp interface name");
5226 /* Construct the API message */
5227 M (TAP_DELETE, tap_delete);
5229 mp->sw_if_index = ntohl (sw_if_index);
5234 /* Wait for a reply... */
5239 api_ip_add_del_route (vat_main_t * vam)
5241 unformat_input_t *i = vam->input;
5242 vl_api_ip_add_del_route_t *mp;
5244 u32 sw_if_index = ~0, vrf_id = 0;
5245 u8 sw_if_index_set = 0;
5247 u8 is_local = 0, is_drop = 0;
5248 u8 create_vrf_if_needed = 0;
5250 u8 next_hop_weight = 1;
5252 u8 is_multipath = 0;
5254 u8 address_length_set = 0;
5255 u32 lookup_in_vrf = 0;
5256 u32 resolve_attempts = 0;
5257 u32 dst_address_length = 0;
5258 u8 next_hop_set = 0;
5259 ip4_address_t v4_dst_address, v4_next_hop_address;
5260 ip6_address_t v6_dst_address, v6_next_hop_address;
5264 u32 random_add_del = 0;
5265 u32 *random_vector = 0;
5267 u32 random_seed = 0xdeaddabe;
5268 u32 classify_table_index = ~0;
5271 /* Parse args required to build the message */
5272 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5274 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5275 sw_if_index_set = 1;
5276 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5277 sw_if_index_set = 1;
5278 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5283 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5288 else if (unformat (i, "/%d", &dst_address_length))
5290 address_length_set = 1;
5293 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5294 &v4_next_hop_address))
5298 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5299 &v6_next_hop_address))
5303 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5305 else if (unformat (i, "weight %d", &next_hop_weight))
5307 else if (unformat (i, "drop"))
5311 else if (unformat (i, "local"))
5315 else if (unformat (i, "classify %d", &classify_table_index))
5319 else if (unformat (i, "del"))
5321 else if (unformat (i, "add"))
5323 else if (unformat (i, "not-last"))
5325 else if (unformat (i, "multipath"))
5327 else if (unformat (i, "vrf %d", &vrf_id))
5329 else if (unformat (i, "create-vrf"))
5330 create_vrf_if_needed = 1;
5331 else if (unformat (i, "count %d", &count))
5333 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
5335 else if (unformat (i, "random"))
5337 else if (unformat (i, "seed %d", &random_seed))
5341 clib_warning ("parse error '%U'", format_unformat_error, i);
5346 if (resolve_attempts > 0 && sw_if_index_set == 0)
5348 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5352 if (!next_hop_set && !is_drop && !is_local && !is_classify)
5354 errmsg ("next hop / local / drop / classify not set\n");
5358 if (address_set == 0)
5360 errmsg ("missing addresses\n");
5364 if (address_length_set == 0)
5366 errmsg ("missing address length\n");
5370 /* Generate a pile of unique, random routes */
5373 u32 this_random_address;
5374 random_hash = hash_create (count, sizeof (uword));
5376 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5377 for (j = 0; j <= count; j++)
5381 this_random_address = random_u32 (&random_seed);
5382 this_random_address =
5383 clib_host_to_net_u32 (this_random_address);
5385 while (hash_get (random_hash, this_random_address));
5386 vec_add1 (random_vector, this_random_address);
5387 hash_set (random_hash, this_random_address, 1);
5389 hash_free (random_hash);
5390 v4_dst_address.as_u32 = random_vector[0];
5395 /* Turn on async mode */
5396 vam->async_mode = 1;
5397 vam->async_errors = 0;
5398 before = vat_time_now (vam);
5401 for (j = 0; j < count; j++)
5403 /* Construct the API message */
5404 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
5406 mp->next_hop_sw_if_index = ntohl (sw_if_index);
5407 mp->vrf_id = ntohl (vrf_id);
5408 if (resolve_attempts > 0)
5410 mp->resolve_attempts = ntohl (resolve_attempts);
5411 mp->resolve_if_needed = 1;
5413 mp->create_vrf_if_needed = create_vrf_if_needed;
5415 mp->is_add = is_add;
5416 mp->is_drop = is_drop;
5417 mp->is_ipv6 = is_ipv6;
5418 mp->is_local = is_local;
5419 mp->is_classify = is_classify;
5420 mp->is_multipath = is_multipath;
5421 mp->not_last = not_last;
5422 mp->next_hop_weight = next_hop_weight;
5423 mp->dst_address_length = dst_address_length;
5424 mp->lookup_in_vrf = ntohl (lookup_in_vrf);
5425 mp->classify_table_index = ntohl (classify_table_index);
5429 clib_memcpy (mp->dst_address, &v6_dst_address,
5430 sizeof (v6_dst_address));
5432 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5433 sizeof (v6_next_hop_address));
5434 increment_v6_address (&v6_dst_address);
5438 clib_memcpy (mp->dst_address, &v4_dst_address,
5439 sizeof (v4_dst_address));
5441 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5442 sizeof (v4_next_hop_address));
5444 v4_dst_address.as_u32 = random_vector[j + 1];
5446 increment_v4_address (&v4_dst_address);
5452 /* When testing multiple add/del ops, use a control-ping to sync */
5455 vl_api_control_ping_t *mp;
5458 /* Shut off async mode */
5459 vam->async_mode = 0;
5461 M (CONTROL_PING, control_ping);
5464 timeout = vat_time_now (vam) + 1.0;
5465 while (vat_time_now (vam) < timeout)
5466 if (vam->result_ready == 1)
5471 if (vam->retval == -99)
5472 errmsg ("timeout\n");
5474 if (vam->async_errors > 0)
5476 errmsg ("%d asynchronous errors\n", vam->async_errors);
5479 vam->async_errors = 0;
5480 after = vat_time_now (vam);
5482 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5483 count, after - before, count / (after - before));
5487 /* Wait for a reply... */
5491 /* Return the good/bad news */
5492 return (vam->retval);
5496 api_proxy_arp_add_del (vat_main_t * vam)
5498 unformat_input_t *i = vam->input;
5499 vl_api_proxy_arp_add_del_t *mp;
5503 ip4_address_t lo, hi;
5506 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5508 if (unformat (i, "vrf %d", &vrf_id))
5510 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
5511 unformat_ip4_address, &hi))
5513 else if (unformat (i, "del"))
5517 clib_warning ("parse error '%U'", format_unformat_error, i);
5524 errmsg ("address range not set\n");
5528 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
5530 mp->vrf_id = ntohl (vrf_id);
5531 mp->is_add = is_add;
5532 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
5533 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
5542 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
5544 unformat_input_t *i = vam->input;
5545 vl_api_proxy_arp_intfc_enable_disable_t *mp;
5549 u8 sw_if_index_set = 0;
5551 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5553 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5554 sw_if_index_set = 1;
5555 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5556 sw_if_index_set = 1;
5557 else if (unformat (i, "enable"))
5559 else if (unformat (i, "disable"))
5563 clib_warning ("parse error '%U'", format_unformat_error, i);
5568 if (sw_if_index_set == 0)
5570 errmsg ("missing interface name or sw_if_index\n");
5574 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
5576 mp->sw_if_index = ntohl (sw_if_index);
5577 mp->enable_disable = enable;
5586 api_mpls_add_del_decap (vat_main_t * vam)
5588 unformat_input_t *i = vam->input;
5589 vl_api_mpls_add_del_decap_t *mp;
5598 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5600 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
5602 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
5604 else if (unformat (i, "label %d", &label))
5606 else if (unformat (i, "next-index %d", &next_index))
5608 else if (unformat (i, "del"))
5610 else if (unformat (i, "s-bit-clear"))
5614 clib_warning ("parse error '%U'", format_unformat_error, i);
5619 M (MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
5621 mp->rx_vrf_id = ntohl (rx_vrf_id);
5622 mp->tx_vrf_id = ntohl (tx_vrf_id);
5623 mp->label = ntohl (label);
5624 mp->next_index = ntohl (next_index);
5626 mp->is_add = is_add;
5635 api_mpls_add_del_encap (vat_main_t * vam)
5637 unformat_input_t *i = vam->input;
5638 vl_api_mpls_add_del_encap_t *mp;
5643 ip4_address_t dst_address;
5646 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5648 if (unformat (i, "vrf %d", &vrf_id))
5650 else if (unformat (i, "label %d", &label))
5651 vec_add1 (labels, ntohl (label));
5652 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5654 else if (unformat (i, "del"))
5658 clib_warning ("parse error '%U'", format_unformat_error, i);
5663 if (vec_len (labels) == 0)
5665 errmsg ("missing encap label stack\n");
5669 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
5670 sizeof (u32) * vec_len (labels));
5672 mp->vrf_id = ntohl (vrf_id);
5673 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5674 mp->is_add = is_add;
5675 mp->nlabels = vec_len (labels);
5676 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
5687 api_mpls_gre_add_del_tunnel (vat_main_t * vam)
5689 unformat_input_t *i = vam->input;
5690 vl_api_mpls_gre_add_del_tunnel_t *mp;
5692 u32 inner_vrf_id = 0;
5693 u32 outer_vrf_id = 0;
5694 ip4_address_t src_address;
5695 ip4_address_t dst_address;
5696 ip4_address_t intfc_address;
5698 u8 intfc_address_length = 0;
5702 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5704 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5706 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5708 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
5710 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5712 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5713 &intfc_address, &tmp))
5714 intfc_address_length = tmp;
5715 else if (unformat (i, "l2-only"))
5717 else if (unformat (i, "del"))
5721 clib_warning ("parse error '%U'", format_unformat_error, i);
5726 M (MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
5728 mp->inner_vrf_id = ntohl (inner_vrf_id);
5729 mp->outer_vrf_id = ntohl (outer_vrf_id);
5730 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
5731 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5732 clib_memcpy (mp->intfc_address, &intfc_address, sizeof (intfc_address));
5733 mp->intfc_address_length = intfc_address_length;
5734 mp->l2_only = l2_only;
5735 mp->is_add = is_add;
5744 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
5746 unformat_input_t *i = vam->input;
5747 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
5749 u32 inner_vrf_id = 0;
5750 ip4_address_t intfc_address;
5751 u8 dst_mac_address[6];
5754 u8 intfc_address_length = 0;
5758 int tx_sw_if_index_set = 0;
5760 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5762 if (unformat (i, "vrf %d", &inner_vrf_id))
5764 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5765 &intfc_address, &tmp))
5766 intfc_address_length = tmp;
5767 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
5768 tx_sw_if_index_set = 1;
5769 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5770 tx_sw_if_index_set = 1;
5771 else if (unformat (i, "dst %U", unformat_ethernet_address,
5774 else if (unformat (i, "l2-only"))
5776 else if (unformat (i, "del"))
5780 clib_warning ("parse error '%U'", format_unformat_error, i);
5787 errmsg ("dst (mac address) not set\n");
5790 if (!tx_sw_if_index_set)
5792 errmsg ("tx-intfc not set\n");
5796 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
5798 mp->vrf_id = ntohl (inner_vrf_id);
5799 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
5800 mp->adj_address_length = intfc_address_length;
5801 clib_memcpy (mp->dst_mac_address, dst_mac_address,
5802 sizeof (dst_mac_address));
5803 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5804 mp->l2_only = l2_only;
5805 mp->is_add = is_add;
5814 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
5816 unformat_input_t *i = vam->input;
5817 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
5819 u32 inner_vrf_id = 0;
5820 u32 outer_vrf_id = 0;
5821 ip4_address_t adj_address;
5822 int adj_address_set = 0;
5823 ip4_address_t next_hop_address;
5824 int next_hop_address_set = 0;
5826 u8 adj_address_length = 0;
5829 u32 resolve_attempts = 5;
5830 u8 resolve_if_needed = 1;
5832 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5834 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5836 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5838 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5839 &adj_address, &tmp))
5841 adj_address_length = tmp;
5842 adj_address_set = 1;
5844 else if (unformat (i, "next-hop %U", unformat_ip4_address,
5846 next_hop_address_set = 1;
5847 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5849 else if (unformat (i, "resolve-if-needed %d", &tmp))
5850 resolve_if_needed = tmp;
5851 else if (unformat (i, "l2-only"))
5853 else if (unformat (i, "del"))
5857 clib_warning ("parse error '%U'", format_unformat_error, i);
5862 if (!adj_address_set)
5864 errmsg ("adjacency address/mask not set\n");
5867 if (!next_hop_address_set)
5869 errmsg ("ip4 next hop address (in outer fib) not set\n");
5873 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
5875 mp->inner_vrf_id = ntohl (inner_vrf_id);
5876 mp->outer_vrf_id = ntohl (outer_vrf_id);
5877 mp->resolve_attempts = ntohl (resolve_attempts);
5878 mp->resolve_if_needed = resolve_if_needed;
5879 mp->is_add = is_add;
5880 mp->l2_only = l2_only;
5881 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
5882 mp->adj_address_length = adj_address_length;
5883 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
5884 sizeof (next_hop_address));
5893 api_sw_interface_set_unnumbered (vat_main_t * vam)
5895 unformat_input_t *i = vam->input;
5896 vl_api_sw_interface_set_unnumbered_t *mp;
5899 u32 unnum_sw_index = ~0;
5901 u8 sw_if_index_set = 0;
5903 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5905 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5906 sw_if_index_set = 1;
5907 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5908 sw_if_index_set = 1;
5909 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
5911 else if (unformat (i, "del"))
5915 clib_warning ("parse error '%U'", format_unformat_error, i);
5920 if (sw_if_index_set == 0)
5922 errmsg ("missing interface name or sw_if_index\n");
5926 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
5928 mp->sw_if_index = ntohl (sw_if_index);
5929 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
5930 mp->is_add = is_add;
5939 api_ip_neighbor_add_del (vat_main_t * vam)
5941 unformat_input_t *i = vam->input;
5942 vl_api_ip_neighbor_add_del_t *mp;
5945 u8 sw_if_index_set = 0;
5951 u8 v4_address_set = 0;
5952 u8 v6_address_set = 0;
5953 ip4_address_t v4address;
5954 ip6_address_t v6address;
5956 memset (mac_address, 0, sizeof (mac_address));
5958 /* Parse args required to build the message */
5959 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5961 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5965 else if (unformat (i, "del"))
5967 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5968 sw_if_index_set = 1;
5969 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5970 sw_if_index_set = 1;
5971 else if (unformat (i, "is_static"))
5973 else if (unformat (i, "vrf %d", &vrf_id))
5975 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
5977 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
5981 clib_warning ("parse error '%U'", format_unformat_error, i);
5986 if (sw_if_index_set == 0)
5988 errmsg ("missing interface name or sw_if_index\n");
5991 if (v4_address_set && v6_address_set)
5993 errmsg ("both v4 and v6 addresses set\n");
5996 if (!v4_address_set && !v6_address_set)
5998 errmsg ("no address set\n");
6002 /* Construct the API message */
6003 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6005 mp->sw_if_index = ntohl (sw_if_index);
6006 mp->is_add = is_add;
6007 mp->vrf_id = ntohl (vrf_id);
6008 mp->is_static = is_static;
6010 clib_memcpy (mp->mac_address, mac_address, 6);
6014 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6018 /* mp->is_ipv6 = 0; via memset in M macro above */
6019 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6025 /* Wait for a reply, return good/bad news */
6033 api_reset_vrf (vat_main_t * vam)
6035 unformat_input_t *i = vam->input;
6036 vl_api_reset_vrf_t *mp;
6042 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6044 if (unformat (i, "vrf %d", &vrf_id))
6046 else if (unformat (i, "ipv6"))
6050 clib_warning ("parse error '%U'", format_unformat_error, i);
6055 if (vrf_id_set == 0)
6057 errmsg ("missing vrf id\n");
6061 M (RESET_VRF, reset_vrf);
6063 mp->vrf_id = ntohl (vrf_id);
6064 mp->is_ipv6 = is_ipv6;
6073 api_create_vlan_subif (vat_main_t * vam)
6075 unformat_input_t *i = vam->input;
6076 vl_api_create_vlan_subif_t *mp;
6079 u8 sw_if_index_set = 0;
6083 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6085 if (unformat (i, "sw_if_index %d", &sw_if_index))
6086 sw_if_index_set = 1;
6087 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6088 sw_if_index_set = 1;
6089 else if (unformat (i, "vlan %d", &vlan_id))
6093 clib_warning ("parse error '%U'", format_unformat_error, i);
6098 if (sw_if_index_set == 0)
6100 errmsg ("missing interface name or sw_if_index\n");
6104 if (vlan_id_set == 0)
6106 errmsg ("missing vlan_id\n");
6109 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6111 mp->sw_if_index = ntohl (sw_if_index);
6112 mp->vlan_id = ntohl (vlan_id);
6120 #define foreach_create_subif_bit \
6127 _(outer_vlan_id_any) \
6128 _(inner_vlan_id_any)
6131 api_create_subif (vat_main_t * vam)
6133 unformat_input_t *i = vam->input;
6134 vl_api_create_subif_t *mp;
6137 u8 sw_if_index_set = 0;
6144 u32 exact_match = 0;
6145 u32 default_sub = 0;
6146 u32 outer_vlan_id_any = 0;
6147 u32 inner_vlan_id_any = 0;
6149 u16 outer_vlan_id = 0;
6150 u16 inner_vlan_id = 0;
6152 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6154 if (unformat (i, "sw_if_index %d", &sw_if_index))
6155 sw_if_index_set = 1;
6156 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6157 sw_if_index_set = 1;
6158 else if (unformat (i, "sub_id %d", &sub_id))
6160 else if (unformat (i, "outer_vlan_id %d", &tmp))
6161 outer_vlan_id = tmp;
6162 else if (unformat (i, "inner_vlan_id %d", &tmp))
6163 inner_vlan_id = tmp;
6165 #define _(a) else if (unformat (i, #a)) a = 1 ;
6166 foreach_create_subif_bit
6170 clib_warning ("parse error '%U'", format_unformat_error, i);
6175 if (sw_if_index_set == 0)
6177 errmsg ("missing interface name or sw_if_index\n");
6181 if (sub_id_set == 0)
6183 errmsg ("missing sub_id\n");
6186 M (CREATE_SUBIF, create_subif);
6188 mp->sw_if_index = ntohl (sw_if_index);
6189 mp->sub_id = ntohl (sub_id);
6191 #define _(a) mp->a = a;
6192 foreach_create_subif_bit;
6195 mp->outer_vlan_id = ntohs (outer_vlan_id);
6196 mp->inner_vlan_id = ntohs (inner_vlan_id);
6205 api_oam_add_del (vat_main_t * vam)
6207 unformat_input_t *i = vam->input;
6208 vl_api_oam_add_del_t *mp;
6212 ip4_address_t src, dst;
6216 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6218 if (unformat (i, "vrf %d", &vrf_id))
6220 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6222 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6224 else if (unformat (i, "del"))
6228 clib_warning ("parse error '%U'", format_unformat_error, i);
6235 errmsg ("missing src addr\n");
6241 errmsg ("missing dst addr\n");
6245 M (OAM_ADD_DEL, oam_add_del);
6247 mp->vrf_id = ntohl (vrf_id);
6248 mp->is_add = is_add;
6249 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6250 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6259 api_reset_fib (vat_main_t * vam)
6261 unformat_input_t *i = vam->input;
6262 vl_api_reset_fib_t *mp;
6268 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6270 if (unformat (i, "vrf %d", &vrf_id))
6272 else if (unformat (i, "ipv6"))
6276 clib_warning ("parse error '%U'", format_unformat_error, i);
6281 if (vrf_id_set == 0)
6283 errmsg ("missing vrf id\n");
6287 M (RESET_FIB, reset_fib);
6289 mp->vrf_id = ntohl (vrf_id);
6290 mp->is_ipv6 = is_ipv6;
6299 api_dhcp_proxy_config (vat_main_t * vam)
6301 unformat_input_t *i = vam->input;
6302 vl_api_dhcp_proxy_config_t *mp;
6307 u8 v4_address_set = 0;
6308 u8 v6_address_set = 0;
6309 ip4_address_t v4address;
6310 ip6_address_t v6address;
6311 u8 v4_src_address_set = 0;
6312 u8 v6_src_address_set = 0;
6313 ip4_address_t v4srcaddress;
6314 ip6_address_t v6srcaddress;
6316 /* Parse args required to build the message */
6317 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6319 if (unformat (i, "del"))
6321 else if (unformat (i, "vrf %d", &vrf_id))
6323 else if (unformat (i, "insert-cid %d", &insert_cid))
6325 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6327 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6329 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6330 v4_src_address_set = 1;
6331 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6332 v6_src_address_set = 1;
6337 if (v4_address_set && v6_address_set)
6339 errmsg ("both v4 and v6 server addresses set\n");
6342 if (!v4_address_set && !v6_address_set)
6344 errmsg ("no server addresses set\n");
6348 if (v4_src_address_set && v6_src_address_set)
6350 errmsg ("both v4 and v6 src addresses set\n");
6353 if (!v4_src_address_set && !v6_src_address_set)
6355 errmsg ("no src addresses set\n");
6359 if (!(v4_src_address_set && v4_address_set) &&
6360 !(v6_src_address_set && v6_address_set))
6362 errmsg ("no matching server and src addresses set\n");
6366 /* Construct the API message */
6367 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
6369 mp->insert_circuit_id = insert_cid;
6370 mp->is_add = is_add;
6371 mp->vrf_id = ntohl (vrf_id);
6375 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6376 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6380 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6381 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6387 /* Wait for a reply, return good/bad news */
6394 api_dhcp_proxy_config_2 (vat_main_t * vam)
6396 unformat_input_t *i = vam->input;
6397 vl_api_dhcp_proxy_config_2_t *mp;
6400 u32 server_vrf_id = 0;
6403 u8 v4_address_set = 0;
6404 u8 v6_address_set = 0;
6405 ip4_address_t v4address;
6406 ip6_address_t v6address;
6407 u8 v4_src_address_set = 0;
6408 u8 v6_src_address_set = 0;
6409 ip4_address_t v4srcaddress;
6410 ip6_address_t v6srcaddress;
6412 /* Parse args required to build the message */
6413 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6415 if (unformat (i, "del"))
6417 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
6419 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
6421 else if (unformat (i, "insert-cid %d", &insert_cid))
6423 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6425 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6427 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6428 v4_src_address_set = 1;
6429 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6430 v6_src_address_set = 1;
6435 if (v4_address_set && v6_address_set)
6437 errmsg ("both v4 and v6 server addresses set\n");
6440 if (!v4_address_set && !v6_address_set)
6442 errmsg ("no server addresses set\n");
6446 if (v4_src_address_set && v6_src_address_set)
6448 errmsg ("both v4 and v6 src addresses set\n");
6451 if (!v4_src_address_set && !v6_src_address_set)
6453 errmsg ("no src addresses set\n");
6457 if (!(v4_src_address_set && v4_address_set) &&
6458 !(v6_src_address_set && v6_address_set))
6460 errmsg ("no matching server and src addresses set\n");
6464 /* Construct the API message */
6465 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
6467 mp->insert_circuit_id = insert_cid;
6468 mp->is_add = is_add;
6469 mp->rx_vrf_id = ntohl (rx_vrf_id);
6470 mp->server_vrf_id = ntohl (server_vrf_id);
6474 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6475 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6479 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6480 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6486 /* Wait for a reply, return good/bad news */
6493 api_dhcp_proxy_set_vss (vat_main_t * vam)
6495 unformat_input_t *i = vam->input;
6496 vl_api_dhcp_proxy_set_vss_t *mp;
6507 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6509 if (unformat (i, "tbl_id %d", &tbl_id))
6511 if (unformat (i, "fib_id %d", &fib_id))
6513 if (unformat (i, "oui %d", &oui))
6515 else if (unformat (i, "ipv6"))
6517 else if (unformat (i, "del"))
6521 clib_warning ("parse error '%U'", format_unformat_error, i);
6526 if (tbl_id_set == 0)
6528 errmsg ("missing tbl id\n");
6532 if (fib_id_set == 0)
6534 errmsg ("missing fib id\n");
6539 errmsg ("missing oui\n");
6543 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
6544 mp->tbl_id = ntohl (tbl_id);
6545 mp->fib_id = ntohl (fib_id);
6546 mp->oui = ntohl (oui);
6547 mp->is_ipv6 = is_ipv6;
6548 mp->is_add = is_add;
6557 api_dhcp_client_config (vat_main_t * vam)
6559 unformat_input_t *i = vam->input;
6560 vl_api_dhcp_client_config_t *mp;
6563 u8 sw_if_index_set = 0;
6566 u8 disable_event = 0;
6568 /* Parse args required to build the message */
6569 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6571 if (unformat (i, "del"))
6573 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6574 sw_if_index_set = 1;
6575 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6576 sw_if_index_set = 1;
6577 else if (unformat (i, "hostname %s", &hostname))
6579 else if (unformat (i, "disable_event"))
6585 if (sw_if_index_set == 0)
6587 errmsg ("missing interface name or sw_if_index\n");
6591 if (vec_len (hostname) > 63)
6593 errmsg ("hostname too long\n");
6595 vec_add1 (hostname, 0);
6597 /* Construct the API message */
6598 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
6600 mp->sw_if_index = ntohl (sw_if_index);
6601 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
6602 vec_free (hostname);
6603 mp->is_add = is_add;
6604 mp->want_dhcp_event = disable_event ? 0 : 1;
6605 mp->pid = getpid ();
6610 /* Wait for a reply, return good/bad news */
6617 api_set_ip_flow_hash (vat_main_t * vam)
6619 unformat_input_t *i = vam->input;
6620 vl_api_set_ip_flow_hash_t *mp;
6632 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6634 if (unformat (i, "vrf %d", &vrf_id))
6636 else if (unformat (i, "ipv6"))
6638 else if (unformat (i, "src"))
6640 else if (unformat (i, "dst"))
6642 else if (unformat (i, "sport"))
6644 else if (unformat (i, "dport"))
6646 else if (unformat (i, "proto"))
6648 else if (unformat (i, "reverse"))
6653 clib_warning ("parse error '%U'", format_unformat_error, i);
6658 if (vrf_id_set == 0)
6660 errmsg ("missing vrf id\n");
6664 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
6670 mp->reverse = reverse;
6671 mp->vrf_id = ntohl (vrf_id);
6672 mp->is_ipv6 = is_ipv6;
6681 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
6683 unformat_input_t *i = vam->input;
6684 vl_api_sw_interface_ip6_enable_disable_t *mp;
6687 u8 sw_if_index_set = 0;
6690 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6692 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6693 sw_if_index_set = 1;
6694 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6695 sw_if_index_set = 1;
6696 else if (unformat (i, "enable"))
6698 else if (unformat (i, "disable"))
6702 clib_warning ("parse error '%U'", format_unformat_error, i);
6707 if (sw_if_index_set == 0)
6709 errmsg ("missing interface name or sw_if_index\n");
6713 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
6715 mp->sw_if_index = ntohl (sw_if_index);
6716 mp->enable = enable;
6725 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
6727 unformat_input_t *i = vam->input;
6728 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
6731 u8 sw_if_index_set = 0;
6732 u32 address_length = 0;
6733 u8 v6_address_set = 0;
6734 ip6_address_t v6address;
6736 /* Parse args required to build the message */
6737 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6739 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6740 sw_if_index_set = 1;
6741 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6742 sw_if_index_set = 1;
6743 else if (unformat (i, "%U/%d",
6744 unformat_ip6_address, &v6address, &address_length))
6750 if (sw_if_index_set == 0)
6752 errmsg ("missing interface name or sw_if_index\n");
6755 if (!v6_address_set)
6757 errmsg ("no address set\n");
6761 /* Construct the API message */
6762 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
6763 sw_interface_ip6_set_link_local_address);
6765 mp->sw_if_index = ntohl (sw_if_index);
6766 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6767 mp->address_length = address_length;
6772 /* Wait for a reply, return good/bad news */
6781 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
6783 unformat_input_t *i = vam->input;
6784 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
6787 u8 sw_if_index_set = 0;
6788 u32 address_length = 0;
6789 u8 v6_address_set = 0;
6790 ip6_address_t v6address;
6792 u8 no_advertise = 0;
6794 u8 no_autoconfig = 0;
6797 u32 val_lifetime = 0;
6798 u32 pref_lifetime = 0;
6800 /* Parse args required to build the message */
6801 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6803 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6804 sw_if_index_set = 1;
6805 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6806 sw_if_index_set = 1;
6807 else if (unformat (i, "%U/%d",
6808 unformat_ip6_address, &v6address, &address_length))
6810 else if (unformat (i, "val_life %d", &val_lifetime))
6812 else if (unformat (i, "pref_life %d", &pref_lifetime))
6814 else if (unformat (i, "def"))
6816 else if (unformat (i, "noadv"))
6818 else if (unformat (i, "offl"))
6820 else if (unformat (i, "noauto"))
6822 else if (unformat (i, "nolink"))
6824 else if (unformat (i, "isno"))
6828 clib_warning ("parse error '%U'", format_unformat_error, i);
6833 if (sw_if_index_set == 0)
6835 errmsg ("missing interface name or sw_if_index\n");
6838 if (!v6_address_set)
6840 errmsg ("no address set\n");
6844 /* Construct the API message */
6845 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
6847 mp->sw_if_index = ntohl (sw_if_index);
6848 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6849 mp->address_length = address_length;
6850 mp->use_default = use_default;
6851 mp->no_advertise = no_advertise;
6852 mp->off_link = off_link;
6853 mp->no_autoconfig = no_autoconfig;
6854 mp->no_onlink = no_onlink;
6856 mp->val_lifetime = ntohl (val_lifetime);
6857 mp->pref_lifetime = ntohl (pref_lifetime);
6862 /* Wait for a reply, return good/bad news */
6870 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
6872 unformat_input_t *i = vam->input;
6873 vl_api_sw_interface_ip6nd_ra_config_t *mp;
6876 u8 sw_if_index_set = 0;
6881 u8 send_unicast = 0;
6884 u8 default_router = 0;
6885 u32 max_interval = 0;
6886 u32 min_interval = 0;
6888 u32 initial_count = 0;
6889 u32 initial_interval = 0;
6892 /* Parse args required to build the message */
6893 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6895 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6896 sw_if_index_set = 1;
6897 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6898 sw_if_index_set = 1;
6899 else if (unformat (i, "maxint %d", &max_interval))
6901 else if (unformat (i, "minint %d", &min_interval))
6903 else if (unformat (i, "life %d", &lifetime))
6905 else if (unformat (i, "count %d", &initial_count))
6907 else if (unformat (i, "interval %d", &initial_interval))
6909 else if (unformat (i, "suppress") || unformat (i, "surpress"))
6911 else if (unformat (i, "managed"))
6913 else if (unformat (i, "other"))
6915 else if (unformat (i, "ll"))
6917 else if (unformat (i, "send"))
6919 else if (unformat (i, "cease"))
6921 else if (unformat (i, "isno"))
6923 else if (unformat (i, "def"))
6927 clib_warning ("parse error '%U'", format_unformat_error, i);
6932 if (sw_if_index_set == 0)
6934 errmsg ("missing interface name or sw_if_index\n");
6938 /* Construct the API message */
6939 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
6941 mp->sw_if_index = ntohl (sw_if_index);
6942 mp->max_interval = ntohl (max_interval);
6943 mp->min_interval = ntohl (min_interval);
6944 mp->lifetime = ntohl (lifetime);
6945 mp->initial_count = ntohl (initial_count);
6946 mp->initial_interval = ntohl (initial_interval);
6947 mp->suppress = suppress;
6948 mp->managed = managed;
6950 mp->ll_option = ll_option;
6951 mp->send_unicast = send_unicast;
6954 mp->default_router = default_router;
6959 /* Wait for a reply, return good/bad news */
6967 api_set_arp_neighbor_limit (vat_main_t * vam)
6969 unformat_input_t *i = vam->input;
6970 vl_api_set_arp_neighbor_limit_t *mp;
6976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6978 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
6980 else if (unformat (i, "ipv6"))
6984 clib_warning ("parse error '%U'", format_unformat_error, i);
6991 errmsg ("missing limit value\n");
6995 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
6997 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
6998 mp->is_ipv6 = is_ipv6;
7007 api_l2_patch_add_del (vat_main_t * vam)
7009 unformat_input_t *i = vam->input;
7010 vl_api_l2_patch_add_del_t *mp;
7013 u8 rx_sw_if_index_set = 0;
7015 u8 tx_sw_if_index_set = 0;
7018 /* Parse args required to build the message */
7019 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7021 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7022 rx_sw_if_index_set = 1;
7023 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7024 tx_sw_if_index_set = 1;
7025 else if (unformat (i, "rx"))
7027 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7029 if (unformat (i, "%U", unformat_sw_if_index, vam,
7031 rx_sw_if_index_set = 1;
7036 else if (unformat (i, "tx"))
7038 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7040 if (unformat (i, "%U", unformat_sw_if_index, vam,
7042 tx_sw_if_index_set = 1;
7047 else if (unformat (i, "del"))
7053 if (rx_sw_if_index_set == 0)
7055 errmsg ("missing rx interface name or rx_sw_if_index\n");
7059 if (tx_sw_if_index_set == 0)
7061 errmsg ("missing tx interface name or tx_sw_if_index\n");
7065 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7067 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7068 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7069 mp->is_add = is_add;
7078 api_trace_profile_add (vat_main_t * vam)
7080 unformat_input_t *input = vam->input;
7081 vl_api_trace_profile_add_t *mp;
7084 u32 trace_option_elts = 0;
7085 u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
7086 int has_pow_option = 0;
7087 int has_ppc_option = 0;
7089 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7091 if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
7092 "trace-tsp %d node-id 0x%x app-data 0x%x",
7093 &id, &trace_type, &trace_option_elts, &trace_tsp,
7094 &node_id, &app_data))
7096 else if (unformat (input, "pow"))
7098 else if (unformat (input, "ppc encap"))
7099 has_ppc_option = PPC_ENCAP;
7100 else if (unformat (input, "ppc decap"))
7101 has_ppc_option = PPC_DECAP;
7102 else if (unformat (input, "ppc none"))
7103 has_ppc_option = PPC_NONE;
7107 M (TRACE_PROFILE_ADD, trace_profile_add);
7108 mp->id = htons (id);
7109 mp->trace_type = trace_type;
7110 mp->trace_num_elt = trace_option_elts;
7111 mp->trace_ppc = has_ppc_option;
7112 mp->trace_app_data = htonl (app_data);
7113 mp->pow_enable = has_pow_option;
7114 mp->trace_tsp = trace_tsp;
7115 mp->node_id = htonl (node_id);
7125 api_trace_profile_apply (vat_main_t * vam)
7127 unformat_input_t *input = vam->input;
7128 vl_api_trace_profile_apply_t *mp;
7131 u32 mask_width = ~0;
7138 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7140 if (unformat (input, "%U/%d", unformat_ip6_address, &addr, &mask_width))
7142 else if (unformat (input, "id %d", &id))
7144 else if (unformat (input, "vrf-id %d", &vrf_id))
7146 else if (unformat (input, "add"))
7148 else if (unformat (input, "pop"))
7150 else if (unformat (input, "none"))
7156 if ((is_add + is_pop + is_none) != 1)
7158 errmsg ("One of (add, pop, none) required");
7161 if (mask_width == ~0)
7163 errmsg ("<address>/<mask-width> required");
7166 M (TRACE_PROFILE_APPLY, trace_profile_apply);
7167 clib_memcpy (mp->dest_ipv6, &addr, sizeof (mp->dest_ipv6));
7168 mp->id = htons (id);
7169 mp->prefix_length = htonl (mask_width);
7170 mp->vrf_id = htonl (vrf_id);
7172 mp->trace_op = IOAM_HBYH_ADD;
7174 mp->trace_op = IOAM_HBYH_POP;
7176 mp->trace_op = IOAM_HBYH_MOD;
7190 api_trace_profile_del (vat_main_t * vam)
7192 vl_api_trace_profile_del_t *mp;
7195 M (TRACE_PROFILE_DEL, trace_profile_del);
7202 api_sr_tunnel_add_del (vat_main_t * vam)
7204 unformat_input_t *i = vam->input;
7205 vl_api_sr_tunnel_add_del_t *mp;
7209 ip6_address_t src_address;
7210 int src_address_set = 0;
7211 ip6_address_t dst_address;
7213 int dst_address_set = 0;
7215 u32 rx_table_id = 0;
7216 u32 tx_table_id = 0;
7217 ip6_address_t *segments = 0;
7218 ip6_address_t *this_seg;
7219 ip6_address_t *tags = 0;
7220 ip6_address_t *this_tag;
7221 ip6_address_t next_address, tag;
7223 u8 *policy_name = 0;
7225 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7227 if (unformat (i, "del"))
7229 else if (unformat (i, "name %s", &name))
7231 else if (unformat (i, "policy %s", &policy_name))
7233 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7235 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7237 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7238 src_address_set = 1;
7239 else if (unformat (i, "dst %U/%d",
7240 unformat_ip6_address, &dst_address, &dst_mask_width))
7241 dst_address_set = 1;
7242 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7244 vec_add2 (segments, this_seg, 1);
7245 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7246 sizeof (*this_seg));
7248 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7250 vec_add2 (tags, this_tag, 1);
7251 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7253 else if (unformat (i, "clean"))
7254 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7255 else if (unformat (i, "protected"))
7256 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7257 else if (unformat (i, "InPE %d", &pl_index))
7259 if (pl_index <= 0 || pl_index > 4)
7261 pl_index_range_error:
7262 errmsg ("pl index %d out of range\n", pl_index);
7266 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7268 else if (unformat (i, "EgPE %d", &pl_index))
7270 if (pl_index <= 0 || pl_index > 4)
7271 goto pl_index_range_error;
7273 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7275 else if (unformat (i, "OrgSrc %d", &pl_index))
7277 if (pl_index <= 0 || pl_index > 4)
7278 goto pl_index_range_error;
7280 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7286 if (!src_address_set)
7288 errmsg ("src address required\n");
7292 if (!dst_address_set)
7294 errmsg ("dst address required\n");
7300 errmsg ("at least one sr segment required\n");
7304 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7305 vec_len (segments) * sizeof (ip6_address_t)
7306 + vec_len (tags) * sizeof (ip6_address_t));
7308 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7309 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7310 mp->dst_mask_width = dst_mask_width;
7311 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7312 mp->n_segments = vec_len (segments);
7313 mp->n_tags = vec_len (tags);
7314 mp->is_add = is_del == 0;
7315 clib_memcpy (mp->segs_and_tags, segments,
7316 vec_len (segments) * sizeof (ip6_address_t));
7317 clib_memcpy (mp->segs_and_tags +
7318 vec_len (segments) * sizeof (ip6_address_t), tags,
7319 vec_len (tags) * sizeof (ip6_address_t));
7321 mp->outer_vrf_id = ntohl (rx_table_id);
7322 mp->inner_vrf_id = ntohl (tx_table_id);
7323 memcpy (mp->name, name, vec_len (name));
7324 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7326 vec_free (segments);
7335 api_sr_policy_add_del (vat_main_t * vam)
7337 unformat_input_t *input = vam->input;
7338 vl_api_sr_policy_add_del_t *mp;
7342 u8 *tunnel_name = 0;
7343 u8 **tunnel_names = 0;
7348 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
7349 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
7351 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7353 if (unformat (input, "del"))
7355 else if (unformat (input, "name %s", &name))
7357 else if (unformat (input, "tunnel %s", &tunnel_name))
7361 vec_add1 (tunnel_names, tunnel_name);
7363 - length = #bytes to store in serial vector
7364 - +1 = byte to store that length
7366 tunnel_names_length += (vec_len (tunnel_name) + 1);
7377 errmsg ("policy name required\n");
7381 if ((!tunnel_set) && (!is_del))
7383 errmsg ("tunnel name required\n");
7387 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
7391 mp->is_add = !is_del;
7393 memcpy (mp->name, name, vec_len (name));
7394 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
7395 u8 *serial_orig = 0;
7396 vec_validate (serial_orig, tunnel_names_length);
7397 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
7398 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
7400 for (j = 0; j < vec_len (tunnel_names); j++)
7402 tun_name_len = vec_len (tunnel_names[j]);
7403 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
7404 serial_orig += 1; // Move along one byte to store the actual tunnel name
7405 memcpy (serial_orig, tunnel_names[j], tun_name_len);
7406 serial_orig += tun_name_len; // Advance past the copy
7408 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
7410 vec_free (tunnel_names);
7411 vec_free (tunnel_name);
7419 api_sr_multicast_map_add_del (vat_main_t * vam)
7421 unformat_input_t *input = vam->input;
7422 vl_api_sr_multicast_map_add_del_t *mp;
7425 ip6_address_t multicast_address;
7426 u8 *policy_name = 0;
7427 int multicast_address_set = 0;
7429 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7431 if (unformat (input, "del"))
7435 (input, "address %U", unformat_ip6_address, &multicast_address))
7436 multicast_address_set = 1;
7437 else if (unformat (input, "sr-policy %s", &policy_name))
7443 if (!is_del && !policy_name)
7445 errmsg ("sr-policy name required\n");
7450 if (!multicast_address_set)
7452 errmsg ("address required\n");
7456 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
7458 mp->is_add = !is_del;
7459 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7460 clib_memcpy (mp->multicast_address, &multicast_address,
7461 sizeof (mp->multicast_address));
7464 vec_free (policy_name);
7472 #define foreach_ip4_proto_field \
7483 unformat_ip4_mask (unformat_input_t * input, va_list * args)
7485 u8 **maskp = va_arg (*args, u8 **);
7487 u8 found_something = 0;
7490 #define _(a) u8 a=0;
7491 foreach_ip4_proto_field;
7497 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7499 if (unformat (input, "version"))
7501 else if (unformat (input, "hdr_length"))
7503 else if (unformat (input, "src"))
7505 else if (unformat (input, "dst"))
7507 else if (unformat (input, "proto"))
7510 #define _(a) else if (unformat (input, #a)) a=1;
7511 foreach_ip4_proto_field
7517 #define _(a) found_something += a;
7518 foreach_ip4_proto_field;
7521 if (found_something == 0)
7524 vec_validate (mask, sizeof (*ip) - 1);
7526 ip = (ip4_header_t *) mask;
7528 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7529 foreach_ip4_proto_field;
7532 ip->ip_version_and_header_length = 0;
7535 ip->ip_version_and_header_length |= 0xF0;
7538 ip->ip_version_and_header_length |= 0x0F;
7544 #define foreach_ip6_proto_field \
7552 unformat_ip6_mask (unformat_input_t * input, va_list * args)
7554 u8 **maskp = va_arg (*args, u8 **);
7556 u8 found_something = 0;
7558 u32 ip_version_traffic_class_and_flow_label;
7560 #define _(a) u8 a=0;
7561 foreach_ip6_proto_field;
7564 u8 traffic_class = 0;
7567 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7569 if (unformat (input, "version"))
7571 else if (unformat (input, "traffic-class"))
7573 else if (unformat (input, "flow-label"))
7575 else if (unformat (input, "src"))
7577 else if (unformat (input, "dst"))
7579 else if (unformat (input, "proto"))
7582 #define _(a) else if (unformat (input, #a)) a=1;
7583 foreach_ip6_proto_field
7589 #define _(a) found_something += a;
7590 foreach_ip6_proto_field;
7593 if (found_something == 0)
7596 vec_validate (mask, sizeof (*ip) - 1);
7598 ip = (ip6_header_t *) mask;
7600 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7601 foreach_ip6_proto_field;
7604 ip_version_traffic_class_and_flow_label = 0;
7607 ip_version_traffic_class_and_flow_label |= 0xF0000000;
7610 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
7613 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
7615 ip->ip_version_traffic_class_and_flow_label =
7616 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
7623 unformat_l3_mask (unformat_input_t * input, va_list * args)
7625 u8 **maskp = va_arg (*args, u8 **);
7627 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7629 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
7631 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
7640 unformat_l2_mask (unformat_input_t * input, va_list * args)
7642 u8 **maskp = va_arg (*args, u8 **);
7657 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7659 if (unformat (input, "src"))
7661 else if (unformat (input, "dst"))
7663 else if (unformat (input, "proto"))
7665 else if (unformat (input, "tag1"))
7667 else if (unformat (input, "tag2"))
7669 else if (unformat (input, "ignore-tag1"))
7671 else if (unformat (input, "ignore-tag2"))
7673 else if (unformat (input, "cos1"))
7675 else if (unformat (input, "cos2"))
7677 else if (unformat (input, "dot1q"))
7679 else if (unformat (input, "dot1ad"))
7684 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
7685 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
7688 if (tag1 || ignore_tag1 || cos1 || dot1q)
7690 if (tag2 || ignore_tag2 || cos2 || dot1ad)
7693 vec_validate (mask, len - 1);
7696 memset (mask, 0xff, 6);
7699 memset (mask + 6, 0xff, 6);
7703 /* inner vlan tag */
7712 mask[21] = mask[20] = 0xff;
7733 mask[16] = mask[17] = 0xff;
7743 mask[12] = mask[13] = 0xff;
7750 unformat_classify_mask (unformat_input_t * input, va_list * args)
7752 u8 **maskp = va_arg (*args, u8 **);
7753 u32 *skipp = va_arg (*args, u32 *);
7754 u32 *matchp = va_arg (*args, u32 *);
7761 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7763 if (unformat (input, "hex %U", unformat_hex_string, &mask))
7765 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
7767 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
7773 if (mask || l2 || l3)
7777 /* "With a free Ethernet header in every package" */
7779 vec_validate (l2, 13);
7783 vec_append (mask, l3);
7788 /* Scan forward looking for the first significant mask octet */
7789 for (i = 0; i < vec_len (mask); i++)
7793 /* compute (skip, match) params */
7794 *skipp = i / sizeof (u32x4);
7795 vec_delete (mask, *skipp * sizeof (u32x4), 0);
7797 /* Pad mask to an even multiple of the vector size */
7798 while (vec_len (mask) % sizeof (u32x4))
7801 match = vec_len (mask) / sizeof (u32x4);
7803 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
7805 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
7806 if (*tmp || *(tmp + 1))
7811 clib_warning ("BUG: match 0");
7813 _vec_len (mask) = match * sizeof (u32x4);
7824 #define foreach_l2_next \
7826 _(ethernet, ETHERNET_INPUT) \
7831 unformat_l2_next_index (unformat_input_t * input, va_list * args)
7833 u32 *miss_next_indexp = va_arg (*args, u32 *);
7838 if (unformat (input, #n)) { next_index = L2_CLASSIFY_NEXT_##N; goto out;}
7842 if (unformat (input, "%d", &tmp))
7851 *miss_next_indexp = next_index;
7855 #define foreach_ip_next \
7862 unformat_ip_next_index (unformat_input_t * input, va_list * args)
7864 u32 *miss_next_indexp = va_arg (*args, u32 *);
7869 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
7873 if (unformat (input, "%d", &tmp))
7882 *miss_next_indexp = next_index;
7886 #define foreach_acl_next \
7890 unformat_acl_next_index (unformat_input_t * input, va_list * args)
7892 u32 *miss_next_indexp = va_arg (*args, u32 *);
7897 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
7901 if (unformat (input, "permit"))
7906 else if (unformat (input, "%d", &tmp))
7915 *miss_next_indexp = next_index;
7920 unformat_policer_precolor (unformat_input_t * input, va_list * args)
7922 u32 *r = va_arg (*args, u32 *);
7924 if (unformat (input, "conform-color"))
7925 *r = POLICE_CONFORM;
7926 else if (unformat (input, "exceed-color"))
7935 api_classify_add_del_table (vat_main_t * vam)
7937 unformat_input_t *i = vam->input;
7938 vl_api_classify_add_del_table_t *mp;
7944 u32 table_index = ~0;
7945 u32 next_table_index = ~0;
7946 u32 miss_next_index = ~0;
7947 u32 memory_size = 32 << 20;
7951 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7953 if (unformat (i, "del"))
7955 else if (unformat (i, "buckets %d", &nbuckets))
7957 else if (unformat (i, "memory_size %d", &memory_size))
7959 else if (unformat (i, "skip %d", &skip))
7961 else if (unformat (i, "match %d", &match))
7963 else if (unformat (i, "table %d", &table_index))
7965 else if (unformat (i, "mask %U", unformat_classify_mask,
7966 &mask, &skip, &match))
7968 else if (unformat (i, "next-table %d", &next_table_index))
7970 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
7973 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
7976 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
7983 if (is_add && mask == 0)
7985 errmsg ("Mask required\n");
7989 if (is_add && skip == ~0)
7991 errmsg ("skip count required\n");
7995 if (is_add && match == ~0)
7997 errmsg ("match count required\n");
8001 if (!is_add && table_index == ~0)
8003 errmsg ("table index required for delete\n");
8007 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8009 mp->is_add = is_add;
8010 mp->table_index = ntohl (table_index);
8011 mp->nbuckets = ntohl (nbuckets);
8012 mp->memory_size = ntohl (memory_size);
8013 mp->skip_n_vectors = ntohl (skip);
8014 mp->match_n_vectors = ntohl (match);
8015 mp->next_table_index = ntohl (next_table_index);
8016 mp->miss_next_index = ntohl (miss_next_index);
8017 clib_memcpy (mp->mask, mask, vec_len (mask));
8027 unformat_ip4_match (unformat_input_t * input, va_list * args)
8029 u8 **matchp = va_arg (*args, u8 **);
8036 int src = 0, dst = 0;
8037 ip4_address_t src_val, dst_val;
8044 int fragment_id = 0;
8045 u32 fragment_id_val;
8051 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8053 if (unformat (input, "version %d", &version_val))
8055 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8057 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8059 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8061 else if (unformat (input, "proto %d", &proto_val))
8063 else if (unformat (input, "tos %d", &tos_val))
8065 else if (unformat (input, "length %d", &length_val))
8067 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8069 else if (unformat (input, "ttl %d", &ttl_val))
8071 else if (unformat (input, "checksum %d", &checksum_val))
8077 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8078 + ttl + checksum == 0)
8082 * Aligned because we use the real comparison functions
8084 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8086 ip = (ip4_header_t *) match;
8088 /* These are realistically matched in practice */
8090 ip->src_address.as_u32 = src_val.as_u32;
8093 ip->dst_address.as_u32 = dst_val.as_u32;
8096 ip->protocol = proto_val;
8099 /* These are not, but they're included for completeness */
8101 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8104 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8110 ip->length = length_val;
8116 ip->checksum = checksum_val;
8123 unformat_ip6_match (unformat_input_t * input, va_list * args)
8125 u8 **matchp = va_arg (*args, u8 **);
8130 u8 traffic_class = 0;
8131 u32 traffic_class_val = 0;
8134 int src = 0, dst = 0;
8135 ip6_address_t src_val, dst_val;
8138 int payload_length = 0;
8139 u32 payload_length_val;
8142 u32 ip_version_traffic_class_and_flow_label;
8144 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8146 if (unformat (input, "version %d", &version_val))
8148 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8150 else if (unformat (input, "flow_label %d", &flow_label_val))
8152 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8154 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8156 else if (unformat (input, "proto %d", &proto_val))
8158 else if (unformat (input, "payload_length %d", &payload_length_val))
8160 else if (unformat (input, "hop_limit %d", &hop_limit_val))
8166 if (version + traffic_class + flow_label + src + dst + proto +
8167 payload_length + hop_limit == 0)
8171 * Aligned because we use the real comparison functions
8173 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8175 ip = (ip6_header_t *) match;
8178 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
8181 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
8184 ip->protocol = proto_val;
8186 ip_version_traffic_class_and_flow_label = 0;
8189 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
8192 ip_version_traffic_class_and_flow_label |=
8193 (traffic_class_val & 0xFF) << 20;
8196 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
8198 ip->ip_version_traffic_class_and_flow_label =
8199 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8202 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
8205 ip->hop_limit = hop_limit_val;
8212 unformat_l3_match (unformat_input_t * input, va_list * args)
8214 u8 **matchp = va_arg (*args, u8 **);
8216 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8218 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
8220 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
8229 unformat_vlan_tag (unformat_input_t * input, va_list * args)
8231 u8 *tagp = va_arg (*args, u8 *);
8234 if (unformat (input, "%d", &tag))
8236 tagp[0] = (tag >> 8) & 0x0F;
8237 tagp[1] = tag & 0xFF;
8245 unformat_l2_match (unformat_input_t * input, va_list * args)
8247 u8 **matchp = va_arg (*args, u8 **);
8267 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8269 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
8272 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
8274 else if (unformat (input, "proto %U",
8275 unformat_ethernet_type_host_byte_order, &proto_val))
8277 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
8279 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
8281 else if (unformat (input, "ignore-tag1"))
8283 else if (unformat (input, "ignore-tag2"))
8285 else if (unformat (input, "cos1 %d", &cos1_val))
8287 else if (unformat (input, "cos2 %d", &cos2_val))
8292 if ((src + dst + proto + tag1 + tag2 +
8293 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8296 if (tag1 || ignore_tag1 || cos1)
8298 if (tag2 || ignore_tag2 || cos2)
8301 vec_validate_aligned (match, len - 1, sizeof (u32x4));
8304 clib_memcpy (match, dst_val, 6);
8307 clib_memcpy (match + 6, src_val, 6);
8311 /* inner vlan tag */
8312 match[19] = tag2_val[1];
8313 match[18] = tag2_val[0];
8315 match[18] |= (cos2_val & 0x7) << 5;
8318 match[21] = proto_val & 0xff;
8319 match[20] = proto_val >> 8;
8323 match[15] = tag1_val[1];
8324 match[14] = tag1_val[0];
8327 match[14] |= (cos1_val & 0x7) << 5;
8333 match[15] = tag1_val[1];
8334 match[14] = tag1_val[0];
8337 match[17] = proto_val & 0xff;
8338 match[16] = proto_val >> 8;
8341 match[14] |= (cos1_val & 0x7) << 5;
8347 match[18] |= (cos2_val & 0x7) << 5;
8349 match[14] |= (cos1_val & 0x7) << 5;
8352 match[13] = proto_val & 0xff;
8353 match[12] = proto_val >> 8;
8362 unformat_classify_match (unformat_input_t * input, va_list * args)
8364 u8 **matchp = va_arg (*args, u8 **);
8365 u32 skip_n_vectors = va_arg (*args, u32);
8366 u32 match_n_vectors = va_arg (*args, u32);
8372 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8374 if (unformat (input, "hex %U", unformat_hex_string, &match))
8376 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
8378 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
8384 if (match || l2 || l3)
8388 /* "Win a free Ethernet header in every packet" */
8390 vec_validate_aligned (l2, 13, sizeof (u32x4));
8394 vec_append_aligned (match, l3, sizeof (u32x4));
8399 /* Make sure the vector is big enough even if key is all 0's */
8400 vec_validate_aligned
8401 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
8404 /* Set size, include skipped vectors */
8405 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
8416 api_classify_add_del_session (vat_main_t * vam)
8418 unformat_input_t *i = vam->input;
8419 vl_api_classify_add_del_session_t *mp;
8421 u32 table_index = ~0;
8422 u32 hit_next_index = ~0;
8423 u32 opaque_index = ~0;
8427 u32 skip_n_vectors = 0;
8428 u32 match_n_vectors = 0;
8431 * Warning: you have to supply skip_n and match_n
8432 * because the API client cant simply look at the classify
8436 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8438 if (unformat (i, "del"))
8440 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
8443 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
8446 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
8449 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
8451 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
8453 else if (unformat (i, "opaque-index %d", &opaque_index))
8455 else if (unformat (i, "skip_n %d", &skip_n_vectors))
8457 else if (unformat (i, "match_n %d", &match_n_vectors))
8459 else if (unformat (i, "match %U", unformat_classify_match,
8460 &match, skip_n_vectors, match_n_vectors))
8462 else if (unformat (i, "advance %d", &advance))
8464 else if (unformat (i, "table-index %d", &table_index))
8470 if (table_index == ~0)
8472 errmsg ("Table index required\n");
8476 if (is_add && match == 0)
8478 errmsg ("Match value required\n");
8482 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
8484 mp->is_add = is_add;
8485 mp->table_index = ntohl (table_index);
8486 mp->hit_next_index = ntohl (hit_next_index);
8487 mp->opaque_index = ntohl (opaque_index);
8488 mp->advance = ntohl (advance);
8489 clib_memcpy (mp->match, match, vec_len (match));
8498 api_classify_set_interface_ip_table (vat_main_t * vam)
8500 unformat_input_t *i = vam->input;
8501 vl_api_classify_set_interface_ip_table_t *mp;
8504 int sw_if_index_set;
8505 u32 table_index = ~0;
8508 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8510 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8511 sw_if_index_set = 1;
8512 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8513 sw_if_index_set = 1;
8514 else if (unformat (i, "table %d", &table_index))
8518 clib_warning ("parse error '%U'", format_unformat_error, i);
8523 if (sw_if_index_set == 0)
8525 errmsg ("missing interface name or sw_if_index\n");
8530 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
8532 mp->sw_if_index = ntohl (sw_if_index);
8533 mp->table_index = ntohl (table_index);
8534 mp->is_ipv6 = is_ipv6;
8543 api_classify_set_interface_l2_tables (vat_main_t * vam)
8545 unformat_input_t *i = vam->input;
8546 vl_api_classify_set_interface_l2_tables_t *mp;
8549 int sw_if_index_set;
8550 u32 ip4_table_index = ~0;
8551 u32 ip6_table_index = ~0;
8552 u32 other_table_index = ~0;
8554 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8556 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8557 sw_if_index_set = 1;
8558 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8559 sw_if_index_set = 1;
8560 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8562 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8564 else if (unformat (i, "other-table %d", &other_table_index))
8568 clib_warning ("parse error '%U'", format_unformat_error, i);
8573 if (sw_if_index_set == 0)
8575 errmsg ("missing interface name or sw_if_index\n");
8580 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
8582 mp->sw_if_index = ntohl (sw_if_index);
8583 mp->ip4_table_index = ntohl (ip4_table_index);
8584 mp->ip6_table_index = ntohl (ip6_table_index);
8585 mp->other_table_index = ntohl (other_table_index);
8595 api_ipfix_enable (vat_main_t * vam)
8597 unformat_input_t *i = vam->input;
8598 vl_api_ipfix_enable_t *mp;
8599 ip4_address_t collector_address;
8600 u8 collector_address_set = 0;
8601 u32 collector_port = ~0;
8602 ip4_address_t src_address;
8603 u8 src_address_set = 0;
8606 u32 template_interval = ~0;
8609 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8611 if (unformat (i, "collector_address %U", unformat_ip4_address,
8612 &collector_address))
8613 collector_address_set = 1;
8614 else if (unformat (i, "collector_port %d", &collector_port))
8616 else if (unformat (i, "src_address %U", unformat_ip4_address,
8618 src_address_set = 1;
8619 else if (unformat (i, "vrf_id %d", &vrf_id))
8621 else if (unformat (i, "path_mtu %d", &path_mtu))
8623 else if (unformat (i, "template_interval %d", &template_interval))
8629 if (collector_address_set == 0)
8631 errmsg ("collector_address required\n");
8635 if (src_address_set == 0)
8637 errmsg ("src_address required\n");
8641 M (IPFIX_ENABLE, ipfix_enable);
8643 memcpy (mp->collector_address, collector_address.data,
8644 sizeof (collector_address.data));
8645 mp->collector_port = htons ((u16) collector_port);
8646 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
8647 mp->vrf_id = htonl (vrf_id);
8648 mp->path_mtu = htonl (path_mtu);
8649 mp->template_interval = htonl (template_interval);
8657 api_get_node_index (vat_main_t * vam)
8659 unformat_input_t *i = vam->input;
8660 vl_api_get_node_index_t *mp;
8664 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8666 if (unformat (i, "node %s", &name))
8673 errmsg ("node name required\n");
8676 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8678 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8682 M (GET_NODE_INDEX, get_node_index);
8683 clib_memcpy (mp->node_name, name, vec_len (name));
8693 api_get_next_index (vat_main_t * vam)
8695 unformat_input_t *i = vam->input;
8696 vl_api_get_next_index_t *mp;
8698 u8 *node_name = 0, *next_node_name = 0;
8700 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8702 if (unformat (i, "node-name %s", &node_name))
8704 else if (unformat (i, "next-node-name %s", &next_node_name))
8710 errmsg ("node name required\n");
8713 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
8715 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8719 if (next_node_name == 0)
8721 errmsg ("next node name required\n");
8724 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
8726 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
8730 M (GET_NEXT_INDEX, get_next_index);
8731 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
8732 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
8733 vec_free (node_name);
8734 vec_free (next_node_name);
8743 api_add_node_next (vat_main_t * vam)
8745 unformat_input_t *i = vam->input;
8746 vl_api_add_node_next_t *mp;
8751 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8753 if (unformat (i, "node %s", &name))
8755 else if (unformat (i, "next %s", &next))
8762 errmsg ("node name required\n");
8765 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8767 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8772 errmsg ("next node required\n");
8775 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
8777 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
8781 M (ADD_NODE_NEXT, add_node_next);
8782 clib_memcpy (mp->node_name, name, vec_len (name));
8783 clib_memcpy (mp->next_name, next, vec_len (next));
8794 api_l2tpv3_create_tunnel (vat_main_t * vam)
8796 unformat_input_t *i = vam->input;
8797 ip6_address_t client_address, our_address;
8798 int client_address_set = 0;
8799 int our_address_set = 0;
8800 u32 local_session_id = 0;
8801 u32 remote_session_id = 0;
8802 u64 local_cookie = 0;
8803 u64 remote_cookie = 0;
8804 u8 l2_sublayer_present = 0;
8805 vl_api_l2tpv3_create_tunnel_t *mp;
8808 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8810 if (unformat (i, "client_address %U", unformat_ip6_address,
8812 client_address_set = 1;
8813 else if (unformat (i, "our_address %U", unformat_ip6_address,
8815 our_address_set = 1;
8816 else if (unformat (i, "local_session_id %d", &local_session_id))
8818 else if (unformat (i, "remote_session_id %d", &remote_session_id))
8820 else if (unformat (i, "local_cookie %lld", &local_cookie))
8822 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
8824 else if (unformat (i, "l2-sublayer-present"))
8825 l2_sublayer_present = 1;
8830 if (client_address_set == 0)
8832 errmsg ("client_address required\n");
8836 if (our_address_set == 0)
8838 errmsg ("our_address required\n");
8842 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
8844 clib_memcpy (mp->client_address, client_address.as_u8,
8845 sizeof (mp->client_address));
8847 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
8849 mp->local_session_id = ntohl (local_session_id);
8850 mp->remote_session_id = ntohl (remote_session_id);
8851 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
8852 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
8853 mp->l2_sublayer_present = l2_sublayer_present;
8863 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
8865 unformat_input_t *i = vam->input;
8867 u8 sw_if_index_set = 0;
8868 u64 new_local_cookie = 0;
8869 u64 new_remote_cookie = 0;
8870 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
8873 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8875 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8876 sw_if_index_set = 1;
8877 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8878 sw_if_index_set = 1;
8879 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
8881 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
8887 if (sw_if_index_set == 0)
8889 errmsg ("missing interface name or sw_if_index\n");
8893 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
8895 mp->sw_if_index = ntohl (sw_if_index);
8896 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
8897 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
8906 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
8908 unformat_input_t *i = vam->input;
8909 vl_api_l2tpv3_interface_enable_disable_t *mp;
8912 u8 sw_if_index_set = 0;
8913 u8 enable_disable = 1;
8915 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8917 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8918 sw_if_index_set = 1;
8919 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8920 sw_if_index_set = 1;
8921 else if (unformat (i, "enable"))
8923 else if (unformat (i, "disable"))
8929 if (sw_if_index_set == 0)
8931 errmsg ("missing interface name or sw_if_index\n");
8935 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
8937 mp->sw_if_index = ntohl (sw_if_index);
8938 mp->enable_disable = enable_disable;
8947 api_l2tpv3_set_lookup_key (vat_main_t * vam)
8949 unformat_input_t *i = vam->input;
8950 vl_api_l2tpv3_set_lookup_key_t *mp;
8954 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8956 if (unformat (i, "lookup_v6_src"))
8957 key = L2T_LOOKUP_SRC_ADDRESS;
8958 else if (unformat (i, "lookup_v6_dst"))
8959 key = L2T_LOOKUP_DST_ADDRESS;
8960 else if (unformat (i, "lookup_session_id"))
8961 key = L2T_LOOKUP_SESSION_ID;
8966 if (key == (u8) ~ 0)
8968 errmsg ("l2tp session lookup key unset\n");
8972 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
8982 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
8983 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
8985 vat_main_t *vam = &vat_main;
8987 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
8988 format_ip6_address, mp->our_address,
8989 format_ip6_address, mp->client_address,
8990 clib_net_to_host_u32 (mp->sw_if_index));
8993 " local cookies %016llx %016llx remote cookie %016llx\n",
8994 clib_net_to_host_u64 (mp->local_cookie[0]),
8995 clib_net_to_host_u64 (mp->local_cookie[1]),
8996 clib_net_to_host_u64 (mp->remote_cookie));
8998 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
8999 clib_net_to_host_u32 (mp->local_session_id),
9000 clib_net_to_host_u32 (mp->remote_session_id));
9002 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9003 mp->l2_sublayer_present ? "preset" : "absent");
9007 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9008 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9010 vat_main_t *vam = &vat_main;
9011 vat_json_node_t *node = NULL;
9012 struct in6_addr addr;
9014 if (VAT_JSON_ARRAY != vam->json_tree.type)
9016 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9017 vat_json_init_array (&vam->json_tree);
9019 node = vat_json_array_add (&vam->json_tree);
9021 vat_json_init_object (node);
9023 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9024 vat_json_object_add_ip6 (node, "our_address", addr);
9025 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9026 vat_json_object_add_ip6 (node, "client_address", addr);
9028 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9029 vat_json_init_array (lc);
9030 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9031 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9032 vat_json_object_add_uint (node, "remote_cookie",
9033 clib_net_to_host_u64 (mp->remote_cookie));
9035 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9036 vat_json_object_add_uint (node, "local_session_id",
9037 clib_net_to_host_u32 (mp->local_session_id));
9038 vat_json_object_add_uint (node, "remote_session_id",
9039 clib_net_to_host_u32 (mp->remote_session_id));
9040 vat_json_object_add_string_copy (node, "l2_sublayer",
9041 mp->l2_sublayer_present ? (u8 *) "present"
9046 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
9048 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
9051 /* Get list of l2tpv3-tunnel interfaces */
9052 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
9055 /* Use a control ping for synchronization */
9057 vl_api_control_ping_t *mp;
9058 M (CONTROL_PING, control_ping);
9065 static void vl_api_sw_interface_tap_details_t_handler
9066 (vl_api_sw_interface_tap_details_t * mp)
9068 vat_main_t *vam = &vat_main;
9070 fformat (vam->ofp, "%-16s %d\n",
9071 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
9074 static void vl_api_sw_interface_tap_details_t_handler_json
9075 (vl_api_sw_interface_tap_details_t * mp)
9077 vat_main_t *vam = &vat_main;
9078 vat_json_node_t *node = NULL;
9080 if (VAT_JSON_ARRAY != vam->json_tree.type)
9082 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9083 vat_json_init_array (&vam->json_tree);
9085 node = vat_json_array_add (&vam->json_tree);
9087 vat_json_init_object (node);
9088 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9089 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
9093 api_sw_interface_tap_dump (vat_main_t * vam)
9095 vl_api_sw_interface_tap_dump_t *mp;
9098 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
9099 /* Get list of tap interfaces */
9100 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
9103 /* Use a control ping for synchronization */
9105 vl_api_control_ping_t *mp;
9106 M (CONTROL_PING, control_ping);
9112 static uword unformat_vxlan_decap_next
9113 (unformat_input_t * input, va_list * args)
9115 u32 *result = va_arg (*args, u32 *);
9118 if (unformat (input, "drop"))
9119 *result = VXLAN_INPUT_NEXT_DROP;
9120 else if (unformat (input, "ip4"))
9121 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
9122 else if (unformat (input, "ip6"))
9123 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
9124 else if (unformat (input, "l2"))
9125 *result = VXLAN_INPUT_NEXT_L2_INPUT;
9126 else if (unformat (input, "%d", &tmp))
9134 api_vxlan_add_del_tunnel (vat_main_t * vam)
9136 unformat_input_t *line_input = vam->input;
9137 vl_api_vxlan_add_del_tunnel_t *mp;
9139 ip4_address_t src4, dst4;
9140 ip6_address_t src6, dst6;
9142 u8 ipv4_set = 0, ipv6_set = 0;
9145 u32 encap_vrf_id = 0;
9146 u32 decap_next_index = ~0;
9149 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9151 if (unformat (line_input, "del"))
9153 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9158 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9163 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
9168 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
9173 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9175 else if (unformat (line_input, "decap-next %U",
9176 unformat_vxlan_decap_next, &decap_next_index))
9178 else if (unformat (line_input, "vni %d", &vni))
9182 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9189 errmsg ("tunnel src address not specified\n");
9194 errmsg ("tunnel dst address not specified\n");
9198 if (ipv4_set && ipv6_set)
9200 errmsg ("both IPv4 and IPv6 addresses specified");
9204 if ((vni == 0) || (vni >> 24))
9206 errmsg ("vni not specified or out of range\n");
9210 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
9214 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
9215 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
9219 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9220 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9222 mp->encap_vrf_id = ntohl (encap_vrf_id);
9223 mp->decap_next_index = ntohl (decap_next_index);
9224 mp->vni = ntohl (vni);
9225 mp->is_add = is_add;
9226 mp->is_ipv6 = ipv6_set;
9234 static void vl_api_vxlan_tunnel_details_t_handler
9235 (vl_api_vxlan_tunnel_details_t * mp)
9237 vat_main_t *vam = &vat_main;
9239 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
9240 ntohl (mp->sw_if_index),
9241 format_ip46_address, &(mp->src_address[0]),
9243 format_ip46_address, &(mp->dst_address[0]),
9245 ntohl (mp->encap_vrf_id),
9246 ntohl (mp->decap_next_index), ntohl (mp->vni));
9249 static void vl_api_vxlan_tunnel_details_t_handler_json
9250 (vl_api_vxlan_tunnel_details_t * mp)
9252 vat_main_t *vam = &vat_main;
9253 vat_json_node_t *node = NULL;
9255 struct in6_addr ip6;
9257 if (VAT_JSON_ARRAY != vam->json_tree.type)
9259 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9260 vat_json_init_array (&vam->json_tree);
9262 node = vat_json_array_add (&vam->json_tree);
9264 vat_json_init_object (node);
9265 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9268 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
9269 vat_json_object_add_ip6 (node, "src_address", ip6);
9270 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
9271 vat_json_object_add_ip6 (node, "dst_address", ip6);
9275 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
9276 vat_json_object_add_ip4 (node, "src_address", ip4);
9277 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
9278 vat_json_object_add_ip4 (node, "dst_address", ip4);
9280 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
9281 vat_json_object_add_uint (node, "decap_next_index",
9282 ntohl (mp->decap_next_index));
9283 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
9284 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
9288 api_vxlan_tunnel_dump (vat_main_t * vam)
9290 unformat_input_t *i = vam->input;
9291 vl_api_vxlan_tunnel_dump_t *mp;
9294 u8 sw_if_index_set = 0;
9296 /* Parse args required to build the message */
9297 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9299 if (unformat (i, "sw_if_index %d", &sw_if_index))
9300 sw_if_index_set = 1;
9305 if (sw_if_index_set == 0)
9310 if (!vam->json_output)
9312 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
9313 "sw_if_index", "src_address", "dst_address",
9314 "encap_vrf_id", "decap_next_index", "vni");
9317 /* Get list of vxlan-tunnel interfaces */
9318 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
9320 mp->sw_if_index = htonl (sw_if_index);
9324 /* Use a control ping for synchronization */
9326 vl_api_control_ping_t *mp;
9327 M (CONTROL_PING, control_ping);
9334 api_gre_add_del_tunnel (vat_main_t * vam)
9336 unformat_input_t *line_input = vam->input;
9337 vl_api_gre_add_del_tunnel_t *mp;
9339 ip4_address_t src4, dst4;
9343 u32 outer_fib_id = 0;
9345 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9347 if (unformat (line_input, "del"))
9349 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9351 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9353 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
9357 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9364 errmsg ("tunnel src address not specified\n");
9369 errmsg ("tunnel dst address not specified\n");
9374 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
9376 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9377 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9378 mp->outer_fib_id = ntohl (outer_fib_id);
9379 mp->is_add = is_add;
9387 static void vl_api_gre_tunnel_details_t_handler
9388 (vl_api_gre_tunnel_details_t * mp)
9390 vat_main_t *vam = &vat_main;
9392 fformat (vam->ofp, "%11d%15U%15U%14d\n",
9393 ntohl (mp->sw_if_index),
9394 format_ip4_address, &mp->src_address,
9395 format_ip4_address, &mp->dst_address, ntohl (mp->outer_fib_id));
9398 static void vl_api_gre_tunnel_details_t_handler_json
9399 (vl_api_gre_tunnel_details_t * mp)
9401 vat_main_t *vam = &vat_main;
9402 vat_json_node_t *node = NULL;
9405 if (VAT_JSON_ARRAY != vam->json_tree.type)
9407 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9408 vat_json_init_array (&vam->json_tree);
9410 node = vat_json_array_add (&vam->json_tree);
9412 vat_json_init_object (node);
9413 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9414 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
9415 vat_json_object_add_ip4 (node, "src_address", ip4);
9416 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
9417 vat_json_object_add_ip4 (node, "dst_address", ip4);
9418 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
9422 api_gre_tunnel_dump (vat_main_t * vam)
9424 unformat_input_t *i = vam->input;
9425 vl_api_gre_tunnel_dump_t *mp;
9428 u8 sw_if_index_set = 0;
9430 /* Parse args required to build the message */
9431 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9433 if (unformat (i, "sw_if_index %d", &sw_if_index))
9434 sw_if_index_set = 1;
9439 if (sw_if_index_set == 0)
9444 if (!vam->json_output)
9446 fformat (vam->ofp, "%11s%15s%15s%14s\n",
9447 "sw_if_index", "src_address", "dst_address", "outer_fib_id");
9450 /* Get list of gre-tunnel interfaces */
9451 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
9453 mp->sw_if_index = htonl (sw_if_index);
9457 /* Use a control ping for synchronization */
9459 vl_api_control_ping_t *mp;
9460 M (CONTROL_PING, control_ping);
9467 api_l2_fib_clear_table (vat_main_t * vam)
9469 // unformat_input_t * i = vam->input;
9470 vl_api_l2_fib_clear_table_t *mp;
9473 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
9482 api_l2_interface_efp_filter (vat_main_t * vam)
9484 unformat_input_t *i = vam->input;
9485 vl_api_l2_interface_efp_filter_t *mp;
9489 u8 sw_if_index_set = 0;
9491 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9493 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9494 sw_if_index_set = 1;
9495 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9496 sw_if_index_set = 1;
9497 else if (unformat (i, "enable"))
9499 else if (unformat (i, "disable"))
9503 clib_warning ("parse error '%U'", format_unformat_error, i);
9508 if (sw_if_index_set == 0)
9510 errmsg ("missing sw_if_index\n");
9514 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
9516 mp->sw_if_index = ntohl (sw_if_index);
9517 mp->enable_disable = enable;
9525 #define foreach_vtr_op \
9526 _("disable", L2_VTR_DISABLED) \
9527 _("push-1", L2_VTR_PUSH_1) \
9528 _("push-2", L2_VTR_PUSH_2) \
9529 _("pop-1", L2_VTR_POP_1) \
9530 _("pop-2", L2_VTR_POP_2) \
9531 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
9532 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
9533 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
9534 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
9537 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
9539 unformat_input_t *i = vam->input;
9540 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
9543 u8 sw_if_index_set = 0;
9550 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9552 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9553 sw_if_index_set = 1;
9554 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9555 sw_if_index_set = 1;
9556 else if (unformat (i, "vtr_op %d", &vtr_op))
9558 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
9561 else if (unformat (i, "push_dot1q %d", &push_dot1q))
9563 else if (unformat (i, "tag1 %d", &tag1))
9565 else if (unformat (i, "tag2 %d", &tag2))
9569 clib_warning ("parse error '%U'", format_unformat_error, i);
9574 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
9576 errmsg ("missing vtr operation or sw_if_index\n");
9580 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
9581 mp->sw_if_index = ntohl (sw_if_index);
9582 mp->vtr_op = ntohl (vtr_op);
9583 mp->push_dot1q = ntohl (push_dot1q);
9584 mp->tag1 = ntohl (tag1);
9585 mp->tag2 = ntohl (tag2);
9594 api_create_vhost_user_if (vat_main_t * vam)
9596 unformat_input_t *i = vam->input;
9597 vl_api_create_vhost_user_if_t *mp;
9601 u8 file_name_set = 0;
9602 u32 custom_dev_instance = ~0;
9604 u8 use_custom_mac = 0;
9606 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9608 if (unformat (i, "socket %s", &file_name))
9612 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9614 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
9616 else if (unformat (i, "server"))
9622 if (file_name_set == 0)
9624 errmsg ("missing socket file name\n");
9628 if (vec_len (file_name) > 255)
9630 errmsg ("socket file name too long\n");
9633 vec_add1 (file_name, 0);
9635 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
9637 mp->is_server = is_server;
9638 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9639 vec_free (file_name);
9640 if (custom_dev_instance != ~0)
9643 mp->custom_dev_instance = ntohl (custom_dev_instance);
9645 mp->use_custom_mac = use_custom_mac;
9646 clib_memcpy (mp->mac_address, hwaddr, 6);
9655 api_modify_vhost_user_if (vat_main_t * vam)
9657 unformat_input_t *i = vam->input;
9658 vl_api_modify_vhost_user_if_t *mp;
9662 u8 file_name_set = 0;
9663 u32 custom_dev_instance = ~0;
9664 u8 sw_if_index_set = 0;
9665 u32 sw_if_index = (u32) ~ 0;
9667 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9669 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9670 sw_if_index_set = 1;
9671 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9672 sw_if_index_set = 1;
9673 else if (unformat (i, "socket %s", &file_name))
9677 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9679 else if (unformat (i, "server"))
9685 if (sw_if_index_set == 0)
9687 errmsg ("missing sw_if_index or interface name\n");
9691 if (file_name_set == 0)
9693 errmsg ("missing socket file name\n");
9697 if (vec_len (file_name) > 255)
9699 errmsg ("socket file name too long\n");
9702 vec_add1 (file_name, 0);
9704 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
9706 mp->sw_if_index = ntohl (sw_if_index);
9707 mp->is_server = is_server;
9708 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9709 vec_free (file_name);
9710 if (custom_dev_instance != ~0)
9713 mp->custom_dev_instance = ntohl (custom_dev_instance);
9723 api_delete_vhost_user_if (vat_main_t * vam)
9725 unformat_input_t *i = vam->input;
9726 vl_api_delete_vhost_user_if_t *mp;
9728 u32 sw_if_index = ~0;
9729 u8 sw_if_index_set = 0;
9731 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9733 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9734 sw_if_index_set = 1;
9735 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9736 sw_if_index_set = 1;
9741 if (sw_if_index_set == 0)
9743 errmsg ("missing sw_if_index or interface name\n");
9748 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
9750 mp->sw_if_index = ntohl (sw_if_index);
9758 static void vl_api_sw_interface_vhost_user_details_t_handler
9759 (vl_api_sw_interface_vhost_user_details_t * mp)
9761 vat_main_t *vam = &vat_main;
9763 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
9764 (char *) mp->interface_name,
9765 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
9766 clib_net_to_host_u64 (mp->features), mp->is_server,
9767 ntohl (mp->num_regions), (char *) mp->sock_filename);
9768 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
9771 static void vl_api_sw_interface_vhost_user_details_t_handler_json
9772 (vl_api_sw_interface_vhost_user_details_t * mp)
9774 vat_main_t *vam = &vat_main;
9775 vat_json_node_t *node = NULL;
9777 if (VAT_JSON_ARRAY != vam->json_tree.type)
9779 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9780 vat_json_init_array (&vam->json_tree);
9782 node = vat_json_array_add (&vam->json_tree);
9784 vat_json_init_object (node);
9785 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9786 vat_json_object_add_string_copy (node, "interface_name",
9787 mp->interface_name);
9788 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
9789 ntohl (mp->virtio_net_hdr_sz));
9790 vat_json_object_add_uint (node, "features",
9791 clib_net_to_host_u64 (mp->features));
9792 vat_json_object_add_uint (node, "is_server", mp->is_server);
9793 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
9794 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
9795 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
9799 api_sw_interface_vhost_user_dump (vat_main_t * vam)
9801 vl_api_sw_interface_vhost_user_dump_t *mp;
9804 "Interface name idx hdr_sz features server regions filename\n");
9806 /* Get list of vhost-user interfaces */
9807 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
9810 /* Use a control ping for synchronization */
9812 vl_api_control_ping_t *mp;
9813 M (CONTROL_PING, control_ping);
9820 api_show_version (vat_main_t * vam)
9822 vl_api_show_version_t *mp;
9825 M (SHOW_VERSION, show_version);
9835 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
9837 unformat_input_t *line_input = vam->input;
9838 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
9840 ip4_address_t local4, remote4;
9841 ip6_address_t local6, remote6;
9843 u8 ipv4_set = 0, ipv6_set = 0;
9846 u32 encap_vrf_id = 0;
9847 u32 decap_vrf_id = 0;
9852 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9854 if (unformat (line_input, "del"))
9856 else if (unformat (line_input, "local %U",
9857 unformat_ip4_address, &local4))
9862 else if (unformat (line_input, "remote %U",
9863 unformat_ip4_address, &remote4))
9868 else if (unformat (line_input, "local %U",
9869 unformat_ip6_address, &local6))
9874 else if (unformat (line_input, "remote %U",
9875 unformat_ip6_address, &remote6))
9880 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9882 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
9884 else if (unformat (line_input, "vni %d", &vni))
9886 else if (unformat (line_input, "next-ip4"))
9888 else if (unformat (line_input, "next-ip6"))
9890 else if (unformat (line_input, "next-ethernet"))
9892 else if (unformat (line_input, "next-nsh"))
9896 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9903 errmsg ("tunnel local address not specified\n");
9906 if (remote_set == 0)
9908 errmsg ("tunnel remote address not specified\n");
9911 if (ipv4_set && ipv6_set)
9913 errmsg ("both IPv4 and IPv6 addresses specified");
9919 errmsg ("vni not specified\n");
9923 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
9928 clib_memcpy (&mp->local, &local6, sizeof (local6));
9929 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
9933 clib_memcpy (&mp->local, &local4, sizeof (local4));
9934 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
9937 mp->encap_vrf_id = ntohl (encap_vrf_id);
9938 mp->decap_vrf_id = ntohl (decap_vrf_id);
9939 mp->protocol = ntohl (protocol);
9940 mp->vni = ntohl (vni);
9941 mp->is_add = is_add;
9942 mp->is_ipv6 = ipv6_set;
9950 static void vl_api_vxlan_gpe_tunnel_details_t_handler
9951 (vl_api_vxlan_gpe_tunnel_details_t * mp)
9953 vat_main_t *vam = &vat_main;
9955 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
9956 ntohl (mp->sw_if_index),
9957 format_ip46_address, &(mp->local[0]),
9958 format_ip46_address, &(mp->remote[0]),
9960 ntohl (mp->protocol),
9961 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
9964 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
9965 (vl_api_vxlan_gpe_tunnel_details_t * mp)
9967 vat_main_t *vam = &vat_main;
9968 vat_json_node_t *node = NULL;
9970 struct in6_addr ip6;
9972 if (VAT_JSON_ARRAY != vam->json_tree.type)
9974 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9975 vat_json_init_array (&vam->json_tree);
9977 node = vat_json_array_add (&vam->json_tree);
9979 vat_json_init_object (node);
9980 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9983 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
9984 vat_json_object_add_ip6 (node, "local", ip6);
9985 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
9986 vat_json_object_add_ip6 (node, "remote", ip6);
9990 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
9991 vat_json_object_add_ip4 (node, "local", ip4);
9992 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
9993 vat_json_object_add_ip4 (node, "remote", ip4);
9995 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
9996 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
9997 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
9998 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
9999 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10003 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10005 unformat_input_t *i = vam->input;
10006 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10009 u8 sw_if_index_set = 0;
10011 /* Parse args required to build the message */
10012 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10014 if (unformat (i, "sw_if_index %d", &sw_if_index))
10015 sw_if_index_set = 1;
10020 if (sw_if_index_set == 0)
10025 if (!vam->json_output)
10027 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10028 "sw_if_index", "local", "remote", "vni",
10029 "protocol", "encap_vrf_id", "decap_vrf_id");
10032 /* Get list of vxlan-tunnel interfaces */
10033 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10035 mp->sw_if_index = htonl (sw_if_index);
10039 /* Use a control ping for synchronization */
10041 vl_api_control_ping_t *mp;
10042 M (CONTROL_PING, control_ping);
10049 format_l2_fib_mac_address (u8 * s, va_list * args)
10051 u8 *a = va_arg (*args, u8 *);
10053 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
10054 a[2], a[3], a[4], a[5], a[6], a[7]);
10057 static void vl_api_l2_fib_table_entry_t_handler
10058 (vl_api_l2_fib_table_entry_t * mp)
10060 vat_main_t *vam = &vat_main;
10062 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
10064 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
10065 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
10069 static void vl_api_l2_fib_table_entry_t_handler_json
10070 (vl_api_l2_fib_table_entry_t * mp)
10072 vat_main_t *vam = &vat_main;
10073 vat_json_node_t *node = NULL;
10075 if (VAT_JSON_ARRAY != vam->json_tree.type)
10077 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10078 vat_json_init_array (&vam->json_tree);
10080 node = vat_json_array_add (&vam->json_tree);
10082 vat_json_init_object (node);
10083 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
10084 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
10085 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10086 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
10087 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
10088 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
10092 api_l2_fib_table_dump (vat_main_t * vam)
10094 unformat_input_t *i = vam->input;
10095 vl_api_l2_fib_table_dump_t *mp;
10100 /* Parse args required to build the message */
10101 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10103 if (unformat (i, "bd_id %d", &bd_id))
10109 if (bd_id_set == 0)
10111 errmsg ("missing bridge domain\n");
10116 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
10118 /* Get list of l2 fib entries */
10119 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
10121 mp->bd_id = ntohl (bd_id);
10124 /* Use a control ping for synchronization */
10126 vl_api_control_ping_t *mp;
10127 M (CONTROL_PING, control_ping);
10135 api_interface_name_renumber (vat_main_t * vam)
10137 unformat_input_t *line_input = vam->input;
10138 vl_api_interface_name_renumber_t *mp;
10139 u32 sw_if_index = ~0;
10141 u32 new_show_dev_instance = ~0;
10143 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10145 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
10148 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
10150 else if (unformat (line_input, "new_show_dev_instance %d",
10151 &new_show_dev_instance))
10157 if (sw_if_index == ~0)
10159 errmsg ("missing interface name or sw_if_index\n");
10163 if (new_show_dev_instance == ~0)
10165 errmsg ("missing new_show_dev_instance\n");
10169 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
10171 mp->sw_if_index = ntohl (sw_if_index);
10172 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
10179 api_want_ip4_arp_events (vat_main_t * vam)
10181 unformat_input_t *line_input = vam->input;
10182 vl_api_want_ip4_arp_events_t *mp;
10184 ip4_address_t address;
10185 int address_set = 0;
10186 u32 enable_disable = 1;
10188 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10190 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
10192 else if (unformat (line_input, "del"))
10193 enable_disable = 0;
10198 if (address_set == 0)
10200 errmsg ("missing addresses\n");
10204 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
10205 mp->enable_disable = enable_disable;
10206 mp->pid = getpid ();
10207 mp->address = address.as_u32;
10214 api_input_acl_set_interface (vat_main_t * vam)
10216 unformat_input_t *i = vam->input;
10217 vl_api_input_acl_set_interface_t *mp;
10220 int sw_if_index_set;
10221 u32 ip4_table_index = ~0;
10222 u32 ip6_table_index = ~0;
10223 u32 l2_table_index = ~0;
10226 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10228 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10229 sw_if_index_set = 1;
10230 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10231 sw_if_index_set = 1;
10232 else if (unformat (i, "del"))
10234 else if (unformat (i, "ip4-table %d", &ip4_table_index))
10236 else if (unformat (i, "ip6-table %d", &ip6_table_index))
10238 else if (unformat (i, "l2-table %d", &l2_table_index))
10242 clib_warning ("parse error '%U'", format_unformat_error, i);
10247 if (sw_if_index_set == 0)
10249 errmsg ("missing interface name or sw_if_index\n");
10253 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
10255 mp->sw_if_index = ntohl (sw_if_index);
10256 mp->ip4_table_index = ntohl (ip4_table_index);
10257 mp->ip6_table_index = ntohl (ip6_table_index);
10258 mp->l2_table_index = ntohl (l2_table_index);
10259 mp->is_add = is_add;
10268 api_ip_address_dump (vat_main_t * vam)
10270 unformat_input_t *i = vam->input;
10271 vl_api_ip_address_dump_t *mp;
10272 u32 sw_if_index = ~0;
10273 u8 sw_if_index_set = 0;
10278 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10280 if (unformat (i, "sw_if_index %d", &sw_if_index))
10281 sw_if_index_set = 1;
10282 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10283 sw_if_index_set = 1;
10284 else if (unformat (i, "ipv4"))
10286 else if (unformat (i, "ipv6"))
10292 if (ipv4_set && ipv6_set)
10294 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10298 if ((!ipv4_set) && (!ipv6_set))
10300 errmsg ("no ipv4 nor ipv6 flag set\n");
10304 if (sw_if_index_set == 0)
10306 errmsg ("missing interface name or sw_if_index\n");
10310 vam->current_sw_if_index = sw_if_index;
10311 vam->is_ipv6 = ipv6_set;
10313 M (IP_ADDRESS_DUMP, ip_address_dump);
10314 mp->sw_if_index = ntohl (sw_if_index);
10315 mp->is_ipv6 = ipv6_set;
10318 /* Use a control ping for synchronization */
10320 vl_api_control_ping_t *mp;
10321 M (CONTROL_PING, control_ping);
10328 api_ip_dump (vat_main_t * vam)
10330 vl_api_ip_dump_t *mp;
10331 unformat_input_t *in = vam->input;
10338 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
10340 if (unformat (in, "ipv4"))
10342 else if (unformat (in, "ipv6"))
10348 if (ipv4_set && ipv6_set)
10350 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10354 if ((!ipv4_set) && (!ipv6_set))
10356 errmsg ("no ipv4 nor ipv6 flag set\n");
10360 is_ipv6 = ipv6_set;
10361 vam->is_ipv6 = is_ipv6;
10363 /* free old data */
10364 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
10366 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
10368 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
10370 M (IP_DUMP, ip_dump);
10371 mp->is_ipv6 = ipv6_set;
10374 /* Use a control ping for synchronization */
10376 vl_api_control_ping_t *mp;
10377 M (CONTROL_PING, control_ping);
10384 api_ipsec_spd_add_del (vat_main_t * vam)
10387 unformat_input_t *i = vam->input;
10388 vl_api_ipsec_spd_add_del_t *mp;
10393 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10395 if (unformat (i, "spd_id %d", &spd_id))
10397 else if (unformat (i, "del"))
10401 clib_warning ("parse error '%U'", format_unformat_error, i);
10407 errmsg ("spd_id must be set\n");
10411 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
10413 mp->spd_id = ntohl (spd_id);
10414 mp->is_add = is_add;
10421 clib_warning ("unsupported (no dpdk)");
10427 api_ipsec_interface_add_del_spd (vat_main_t * vam)
10430 unformat_input_t *i = vam->input;
10431 vl_api_ipsec_interface_add_del_spd_t *mp;
10434 u8 sw_if_index_set = 0;
10435 u32 spd_id = (u32) ~ 0;
10438 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10440 if (unformat (i, "del"))
10442 else if (unformat (i, "spd_id %d", &spd_id))
10444 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10445 sw_if_index_set = 1;
10446 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10447 sw_if_index_set = 1;
10450 clib_warning ("parse error '%U'", format_unformat_error, i);
10456 if (spd_id == (u32) ~ 0)
10458 errmsg ("spd_id must be set\n");
10462 if (sw_if_index_set == 0)
10464 errmsg ("missing interface name or sw_if_index\n");
10468 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
10470 mp->spd_id = ntohl (spd_id);
10471 mp->sw_if_index = ntohl (sw_if_index);
10472 mp->is_add = is_add;
10479 clib_warning ("unsupported (no dpdk)");
10485 api_ipsec_spd_add_del_entry (vat_main_t * vam)
10488 unformat_input_t *i = vam->input;
10489 vl_api_ipsec_spd_add_del_entry_t *mp;
10491 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
10492 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
10494 u32 rport_start = 0, rport_stop = (u32) ~ 0;
10495 u32 lport_start = 0, lport_stop = (u32) ~ 0;
10496 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
10497 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
10499 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
10500 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
10501 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
10502 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
10503 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
10504 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
10506 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10508 if (unformat (i, "del"))
10510 if (unformat (i, "outbound"))
10512 if (unformat (i, "inbound"))
10514 else if (unformat (i, "spd_id %d", &spd_id))
10516 else if (unformat (i, "sa_id %d", &sa_id))
10518 else if (unformat (i, "priority %d", &priority))
10520 else if (unformat (i, "protocol %d", &protocol))
10522 else if (unformat (i, "lport_start %d", &lport_start))
10524 else if (unformat (i, "lport_stop %d", &lport_stop))
10526 else if (unformat (i, "rport_start %d", &rport_start))
10528 else if (unformat (i, "rport_stop %d", &rport_stop))
10532 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
10538 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
10545 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
10551 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
10558 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
10564 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
10571 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
10577 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
10583 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
10585 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
10587 clib_warning ("unsupported action: 'resolve'");
10593 clib_warning ("parse error '%U'", format_unformat_error, i);
10599 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
10601 mp->spd_id = ntohl (spd_id);
10602 mp->priority = ntohl (priority);
10603 mp->is_outbound = is_outbound;
10605 mp->is_ipv6 = is_ipv6;
10606 if (is_ipv6 || is_ip_any)
10608 clib_memcpy (mp->remote_address_start, &raddr6_start,
10609 sizeof (ip6_address_t));
10610 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
10611 sizeof (ip6_address_t));
10612 clib_memcpy (mp->local_address_start, &laddr6_start,
10613 sizeof (ip6_address_t));
10614 clib_memcpy (mp->local_address_stop, &laddr6_stop,
10615 sizeof (ip6_address_t));
10619 clib_memcpy (mp->remote_address_start, &raddr4_start,
10620 sizeof (ip4_address_t));
10621 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
10622 sizeof (ip4_address_t));
10623 clib_memcpy (mp->local_address_start, &laddr4_start,
10624 sizeof (ip4_address_t));
10625 clib_memcpy (mp->local_address_stop, &laddr4_stop,
10626 sizeof (ip4_address_t));
10628 mp->protocol = (u8) protocol;
10629 mp->local_port_start = ntohs ((u16) lport_start);
10630 mp->local_port_stop = ntohs ((u16) lport_stop);
10631 mp->remote_port_start = ntohs ((u16) rport_start);
10632 mp->remote_port_stop = ntohs ((u16) rport_stop);
10633 mp->policy = (u8) policy;
10634 mp->sa_id = ntohl (sa_id);
10635 mp->is_add = is_add;
10636 mp->is_ip_any = is_ip_any;
10642 clib_warning ("unsupported (no dpdk)");
10648 api_ipsec_sad_add_del_entry (vat_main_t * vam)
10651 unformat_input_t *i = vam->input;
10652 vl_api_ipsec_sad_add_del_entry_t *mp;
10654 u32 sad_id = 0, spi = 0;
10655 u8 *ck = 0, *ik = 0;
10658 u8 protocol = IPSEC_PROTOCOL_AH;
10659 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
10660 u32 crypto_alg = 0, integ_alg = 0;
10661 ip4_address_t tun_src4;
10662 ip4_address_t tun_dst4;
10663 ip6_address_t tun_src6;
10664 ip6_address_t tun_dst6;
10666 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10668 if (unformat (i, "del"))
10670 else if (unformat (i, "sad_id %d", &sad_id))
10672 else if (unformat (i, "spi %d", &spi))
10674 else if (unformat (i, "esp"))
10675 protocol = IPSEC_PROTOCOL_ESP;
10676 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
10679 is_tunnel_ipv6 = 0;
10681 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
10684 is_tunnel_ipv6 = 0;
10686 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
10689 is_tunnel_ipv6 = 1;
10691 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
10694 is_tunnel_ipv6 = 1;
10698 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
10700 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
10701 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
10703 clib_warning ("unsupported crypto-alg: '%U'",
10704 format_ipsec_crypto_alg, crypto_alg);
10708 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10712 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
10714 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
10715 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
10717 clib_warning ("unsupported integ-alg: '%U'",
10718 format_ipsec_integ_alg, integ_alg);
10722 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10726 clib_warning ("parse error '%U'", format_unformat_error, i);
10732 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
10734 mp->sad_id = ntohl (sad_id);
10735 mp->is_add = is_add;
10736 mp->protocol = protocol;
10737 mp->spi = ntohl (spi);
10738 mp->is_tunnel = is_tunnel;
10739 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
10740 mp->crypto_algorithm = crypto_alg;
10741 mp->integrity_algorithm = integ_alg;
10742 mp->crypto_key_length = vec_len (ck);
10743 mp->integrity_key_length = vec_len (ik);
10745 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10746 mp->crypto_key_length = sizeof (mp->crypto_key);
10748 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10749 mp->integrity_key_length = sizeof (mp->integrity_key);
10752 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10754 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10758 if (is_tunnel_ipv6)
10760 clib_memcpy (mp->tunnel_src_address, &tun_src6,
10761 sizeof (ip6_address_t));
10762 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
10763 sizeof (ip6_address_t));
10767 clib_memcpy (mp->tunnel_src_address, &tun_src4,
10768 sizeof (ip4_address_t));
10769 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
10770 sizeof (ip4_address_t));
10779 clib_warning ("unsupported (no dpdk)");
10785 api_ipsec_sa_set_key (vat_main_t * vam)
10788 unformat_input_t *i = vam->input;
10789 vl_api_ipsec_sa_set_key_t *mp;
10792 u8 *ck = 0, *ik = 0;
10794 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10796 if (unformat (i, "sa_id %d", &sa_id))
10798 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10800 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10804 clib_warning ("parse error '%U'", format_unformat_error, i);
10809 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
10811 mp->sa_id = ntohl (sa_id);
10812 mp->crypto_key_length = vec_len (ck);
10813 mp->integrity_key_length = vec_len (ik);
10815 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10816 mp->crypto_key_length = sizeof (mp->crypto_key);
10818 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10819 mp->integrity_key_length = sizeof (mp->integrity_key);
10822 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10824 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10831 clib_warning ("unsupported (no dpdk)");
10837 api_ikev2_profile_add_del (vat_main_t * vam)
10840 unformat_input_t *i = vam->input;
10841 vl_api_ikev2_profile_add_del_t *mp;
10846 const char *valid_chars = "a-zA-Z0-9_";
10848 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10850 if (unformat (i, "del"))
10852 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
10853 vec_add1 (name, 0);
10856 errmsg ("parse error '%U'", format_unformat_error, i);
10861 if (!vec_len (name))
10863 errmsg ("profile name must be specified");
10867 if (vec_len (name) > 64)
10869 errmsg ("profile name too long");
10873 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
10875 clib_memcpy (mp->name, name, vec_len (name));
10876 mp->is_add = is_add;
10884 clib_warning ("unsupported (no dpdk)");
10890 api_ikev2_profile_set_auth (vat_main_t * vam)
10893 unformat_input_t *i = vam->input;
10894 vl_api_ikev2_profile_set_auth_t *mp;
10898 u32 auth_method = 0;
10901 const char *valid_chars = "a-zA-Z0-9_";
10903 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10905 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
10906 vec_add1 (name, 0);
10907 else if (unformat (i, "auth_method %U",
10908 unformat_ikev2_auth_method, &auth_method))
10910 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
10912 else if (unformat (i, "auth_data %v", &data))
10916 errmsg ("parse error '%U'", format_unformat_error, i);
10921 if (!vec_len (name))
10923 errmsg ("profile name must be specified");
10927 if (vec_len (name) > 64)
10929 errmsg ("profile name too long");
10933 if (!vec_len (data))
10935 errmsg ("auth_data must be specified");
10941 errmsg ("auth_method must be specified");
10945 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
10947 mp->is_hex = is_hex;
10948 mp->auth_method = (u8) auth_method;
10949 mp->data_len = vec_len (data);
10950 clib_memcpy (mp->name, name, vec_len (name));
10951 clib_memcpy (mp->data, data, vec_len (data));
10960 clib_warning ("unsupported (no dpdk)");
10966 api_ikev2_profile_set_id (vat_main_t * vam)
10969 unformat_input_t *i = vam->input;
10970 vl_api_ikev2_profile_set_id_t *mp;
10978 const char *valid_chars = "a-zA-Z0-9_";
10980 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10982 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
10983 vec_add1 (name, 0);
10984 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
10986 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
10988 data = vec_new (u8, 4);
10989 clib_memcpy (data, ip4.as_u8, 4);
10991 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
10993 else if (unformat (i, "id_data %v", &data))
10995 else if (unformat (i, "local"))
10997 else if (unformat (i, "remote"))
11001 errmsg ("parse error '%U'", format_unformat_error, i);
11006 if (!vec_len (name))
11008 errmsg ("profile name must be specified");
11012 if (vec_len (name) > 64)
11014 errmsg ("profile name too long");
11018 if (!vec_len (data))
11020 errmsg ("id_data must be specified");
11026 errmsg ("id_type must be specified");
11030 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
11032 mp->is_local = is_local;
11033 mp->id_type = (u8) id_type;
11034 mp->data_len = vec_len (data);
11035 clib_memcpy (mp->name, name, vec_len (name));
11036 clib_memcpy (mp->data, data, vec_len (data));
11045 clib_warning ("unsupported (no dpdk)");
11051 api_ikev2_profile_set_ts (vat_main_t * vam)
11054 unformat_input_t *i = vam->input;
11055 vl_api_ikev2_profile_set_ts_t *mp;
11059 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
11060 ip4_address_t start_addr, end_addr;
11062 const char *valid_chars = "a-zA-Z0-9_";
11064 start_addr.as_u32 = 0;
11065 end_addr.as_u32 = (u32) ~ 0;
11067 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11069 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11070 vec_add1 (name, 0);
11071 else if (unformat (i, "protocol %d", &proto))
11073 else if (unformat (i, "start_port %d", &start_port))
11075 else if (unformat (i, "end_port %d", &end_port))
11078 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
11080 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
11082 else if (unformat (i, "local"))
11084 else if (unformat (i, "remote"))
11088 errmsg ("parse error '%U'", format_unformat_error, i);
11093 if (!vec_len (name))
11095 errmsg ("profile name must be specified");
11099 if (vec_len (name) > 64)
11101 errmsg ("profile name too long");
11105 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
11107 mp->is_local = is_local;
11108 mp->proto = (u8) proto;
11109 mp->start_port = (u16) start_port;
11110 mp->end_port = (u16) end_port;
11111 mp->start_addr = start_addr.as_u32;
11112 mp->end_addr = end_addr.as_u32;
11113 clib_memcpy (mp->name, name, vec_len (name));
11121 clib_warning ("unsupported (no dpdk)");
11127 api_ikev2_set_local_key (vat_main_t * vam)
11130 unformat_input_t *i = vam->input;
11131 vl_api_ikev2_set_local_key_t *mp;
11135 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11137 if (unformat (i, "file %v", &file))
11138 vec_add1 (file, 0);
11141 errmsg ("parse error '%U'", format_unformat_error, i);
11146 if (!vec_len (file))
11148 errmsg ("RSA key file must be specified");
11152 if (vec_len (file) > 256)
11154 errmsg ("file name too long");
11158 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
11160 clib_memcpy (mp->key_file, file, vec_len (file));
11168 clib_warning ("unsupported (no dpdk)");
11177 api_map_add_domain (vat_main_t * vam)
11179 unformat_input_t *i = vam->input;
11180 vl_api_map_add_domain_t *mp;
11183 ip4_address_t ip4_prefix;
11184 ip6_address_t ip6_prefix;
11185 ip6_address_t ip6_src;
11186 u32 num_m_args = 0;
11187 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
11188 0, psid_length = 0;
11189 u8 is_translation = 0;
11191 u32 ip6_src_len = 128;
11193 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11195 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
11196 &ip4_prefix, &ip4_prefix_len))
11198 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
11199 &ip6_prefix, &ip6_prefix_len))
11203 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
11206 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
11208 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
11210 else if (unformat (i, "psid-offset %d", &psid_offset))
11212 else if (unformat (i, "psid-len %d", &psid_length))
11214 else if (unformat (i, "mtu %d", &mtu))
11216 else if (unformat (i, "map-t"))
11217 is_translation = 1;
11220 clib_warning ("parse error '%U'", format_unformat_error, i);
11225 if (num_m_args < 3)
11227 errmsg ("mandatory argument(s) missing\n");
11231 /* Construct the API message */
11232 M (MAP_ADD_DOMAIN, map_add_domain);
11234 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
11235 mp->ip4_prefix_len = ip4_prefix_len;
11237 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
11238 mp->ip6_prefix_len = ip6_prefix_len;
11240 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
11241 mp->ip6_src_prefix_len = ip6_src_len;
11243 mp->ea_bits_len = ea_bits_len;
11244 mp->psid_offset = psid_offset;
11245 mp->psid_length = psid_length;
11246 mp->is_translation = is_translation;
11247 mp->mtu = htons (mtu);
11252 /* Wait for a reply, return good/bad news */
11257 api_map_del_domain (vat_main_t * vam)
11259 unformat_input_t *i = vam->input;
11260 vl_api_map_del_domain_t *mp;
11263 u32 num_m_args = 0;
11266 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11268 if (unformat (i, "index %d", &index))
11272 clib_warning ("parse error '%U'", format_unformat_error, i);
11277 if (num_m_args != 1)
11279 errmsg ("mandatory argument(s) missing\n");
11283 /* Construct the API message */
11284 M (MAP_DEL_DOMAIN, map_del_domain);
11286 mp->index = ntohl (index);
11291 /* Wait for a reply, return good/bad news */
11296 api_map_add_del_rule (vat_main_t * vam)
11298 unformat_input_t *i = vam->input;
11299 vl_api_map_add_del_rule_t *mp;
11302 ip6_address_t ip6_dst;
11303 u32 num_m_args = 0, index, psid = 0;
11305 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11307 if (unformat (i, "index %d", &index))
11309 else if (unformat (i, "psid %d", &psid))
11311 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
11313 else if (unformat (i, "del"))
11319 clib_warning ("parse error '%U'", format_unformat_error, i);
11324 /* Construct the API message */
11325 M (MAP_ADD_DEL_RULE, map_add_del_rule);
11327 mp->index = ntohl (index);
11328 mp->is_add = is_add;
11329 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
11330 mp->psid = ntohs (psid);
11335 /* Wait for a reply, return good/bad news */
11340 api_map_domain_dump (vat_main_t * vam)
11342 vl_api_map_domain_dump_t *mp;
11345 /* Construct the API message */
11346 M (MAP_DOMAIN_DUMP, map_domain_dump);
11351 /* Use a control ping for synchronization */
11353 vl_api_control_ping_t *mp;
11354 M (CONTROL_PING, control_ping);
11361 api_map_rule_dump (vat_main_t * vam)
11363 unformat_input_t *i = vam->input;
11364 vl_api_map_rule_dump_t *mp;
11366 u32 domain_index = ~0;
11368 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11370 if (unformat (i, "index %u", &domain_index))
11376 if (domain_index == ~0)
11378 clib_warning ("parse error: domain index expected");
11382 /* Construct the API message */
11383 M (MAP_RULE_DUMP, map_rule_dump);
11385 mp->domain_index = htonl (domain_index);
11390 /* Use a control ping for synchronization */
11392 vl_api_control_ping_t *mp;
11393 M (CONTROL_PING, control_ping);
11399 static void vl_api_map_add_domain_reply_t_handler
11400 (vl_api_map_add_domain_reply_t * mp)
11402 vat_main_t *vam = &vat_main;
11403 i32 retval = ntohl (mp->retval);
11405 if (vam->async_mode)
11407 vam->async_errors += (retval < 0);
11411 vam->retval = retval;
11412 vam->result_ready = 1;
11416 static void vl_api_map_add_domain_reply_t_handler_json
11417 (vl_api_map_add_domain_reply_t * mp)
11419 vat_main_t *vam = &vat_main;
11420 vat_json_node_t node;
11422 vat_json_init_object (&node);
11423 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
11424 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
11426 vat_json_print (vam->ofp, &node);
11427 vat_json_free (&node);
11429 vam->retval = ntohl (mp->retval);
11430 vam->result_ready = 1;
11434 api_get_first_msg_id (vat_main_t * vam)
11436 vl_api_get_first_msg_id_t *mp;
11438 unformat_input_t *i = vam->input;
11442 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11444 if (unformat (i, "client %s", &name))
11452 errmsg ("missing client name\n");
11455 vec_add1 (name, 0);
11457 if (vec_len (name) > 63)
11459 errmsg ("client name too long\n");
11463 M (GET_FIRST_MSG_ID, get_first_msg_id);
11464 clib_memcpy (mp->name, name, vec_len (name));
11472 api_cop_interface_enable_disable (vat_main_t * vam)
11474 unformat_input_t *line_input = vam->input;
11475 vl_api_cop_interface_enable_disable_t *mp;
11477 u32 sw_if_index = ~0;
11478 u8 enable_disable = 1;
11480 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11482 if (unformat (line_input, "disable"))
11483 enable_disable = 0;
11484 if (unformat (line_input, "enable"))
11485 enable_disable = 1;
11486 else if (unformat (line_input, "%U", unformat_sw_if_index,
11487 vam, &sw_if_index))
11489 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11495 if (sw_if_index == ~0)
11497 errmsg ("missing interface name or sw_if_index\n");
11501 /* Construct the API message */
11502 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
11503 mp->sw_if_index = ntohl (sw_if_index);
11504 mp->enable_disable = enable_disable;
11508 /* Wait for the reply */
11513 api_cop_whitelist_enable_disable (vat_main_t * vam)
11515 unformat_input_t *line_input = vam->input;
11516 vl_api_cop_whitelist_enable_disable_t *mp;
11518 u32 sw_if_index = ~0;
11519 u8 ip4 = 0, ip6 = 0, default_cop = 0;
11522 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11524 if (unformat (line_input, "ip4"))
11526 else if (unformat (line_input, "ip6"))
11528 else if (unformat (line_input, "default"))
11530 else if (unformat (line_input, "%U", unformat_sw_if_index,
11531 vam, &sw_if_index))
11533 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11535 else if (unformat (line_input, "fib-id %d", &fib_id))
11541 if (sw_if_index == ~0)
11543 errmsg ("missing interface name or sw_if_index\n");
11547 /* Construct the API message */
11548 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
11549 mp->sw_if_index = ntohl (sw_if_index);
11550 mp->fib_id = ntohl (fib_id);
11553 mp->default_cop = default_cop;
11557 /* Wait for the reply */
11562 api_get_node_graph (vat_main_t * vam)
11564 vl_api_get_node_graph_t *mp;
11567 M (GET_NODE_GRAPH, get_node_graph);
11571 /* Wait for the reply */
11576 /** Used for parsing LISP eids */
11577 typedef CLIB_PACKED(struct{
11578 u8 addr[16]; /**< eid address */
11579 u32 len; /**< prefix length if IP */
11580 u8 type; /**< type of eid */
11585 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
11587 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
11589 memset (a, 0, sizeof (a[0]));
11591 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
11593 a->type = 0; /* ipv4 type */
11595 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
11597 a->type = 1; /* ipv6 type */
11599 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
11601 a->type = 2; /* mac type */
11608 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
11617 lisp_eid_size_vat (u8 type)
11632 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
11634 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
11638 /** Used for transferring locators via VPP API */
11639 typedef CLIB_PACKED(struct
11641 u32 sw_if_index; /**< locator sw_if_index */
11642 u8 priority; /**< locator priority */
11643 u8 weight; /**< locator weight */
11648 api_lisp_add_del_locator_set (vat_main_t * vam)
11650 unformat_input_t *input = vam->input;
11651 vl_api_lisp_add_del_locator_set_t *mp;
11654 u8 *locator_set_name = NULL;
11655 u8 locator_set_name_set = 0;
11656 ls_locator_t locator, *locators = 0;
11657 u32 sw_if_index, priority, weight;
11659 /* Parse args required to build the message */
11660 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11662 if (unformat (input, "del"))
11666 else if (unformat (input, "locator-set %s", &locator_set_name))
11668 locator_set_name_set = 1;
11670 else if (unformat (input, "sw_if_index %u p %u w %u",
11671 &sw_if_index, &priority, &weight))
11673 locator.sw_if_index = htonl (sw_if_index);
11674 locator.priority = priority;
11675 locator.weight = weight;
11676 vec_add1 (locators, locator);
11678 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
11679 vam, &sw_if_index, &priority, &weight))
11681 locator.sw_if_index = htonl (sw_if_index);
11682 locator.priority = priority;
11683 locator.weight = weight;
11684 vec_add1 (locators, locator);
11690 if (locator_set_name_set == 0)
11692 errmsg ("missing locator-set name");
11693 vec_free (locators);
11697 if (vec_len (locator_set_name) > 64)
11699 errmsg ("locator-set name too long\n");
11700 vec_free (locator_set_name);
11701 vec_free (locators);
11704 vec_add1 (locator_set_name, 0);
11706 /* Construct the API message */
11707 M (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
11709 mp->is_add = is_add;
11710 clib_memcpy (mp->locator_set_name, locator_set_name,
11711 vec_len (locator_set_name));
11712 vec_free (locator_set_name);
11714 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
11716 clib_memcpy (mp->locators, locators,
11717 (sizeof (ls_locator_t) * vec_len (locators)));
11718 vec_free (locators);
11723 /* Wait for a reply... */
11731 api_lisp_add_del_locator (vat_main_t * vam)
11733 unformat_input_t *input = vam->input;
11734 vl_api_lisp_add_del_locator_t *mp;
11736 u32 tmp_if_index = ~0;
11737 u32 sw_if_index = ~0;
11738 u8 sw_if_index_set = 0;
11739 u8 sw_if_index_if_name_set = 0;
11741 u8 priority_set = 0;
11745 u8 *locator_set_name = NULL;
11746 u8 locator_set_name_set = 0;
11748 /* Parse args required to build the message */
11749 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11751 if (unformat (input, "del"))
11755 else if (unformat (input, "locator-set %s", &locator_set_name))
11757 locator_set_name_set = 1;
11759 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
11762 sw_if_index_if_name_set = 1;
11763 sw_if_index = tmp_if_index;
11765 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
11767 sw_if_index_set = 1;
11768 sw_if_index = tmp_if_index;
11770 else if (unformat (input, "p %d", &priority))
11774 else if (unformat (input, "w %d", &weight))
11782 if (locator_set_name_set == 0)
11784 errmsg ("missing locator-set name");
11788 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
11790 errmsg ("missing sw_if_index");
11791 vec_free (locator_set_name);
11795 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
11797 errmsg ("cannot use both params interface name and sw_if_index");
11798 vec_free (locator_set_name);
11802 if (priority_set == 0)
11804 errmsg ("missing locator-set priority\n");
11805 vec_free (locator_set_name);
11809 if (weight_set == 0)
11811 errmsg ("missing locator-set weight\n");
11812 vec_free (locator_set_name);
11816 if (vec_len (locator_set_name) > 64)
11818 errmsg ("locator-set name too long\n");
11819 vec_free (locator_set_name);
11822 vec_add1 (locator_set_name, 0);
11824 /* Construct the API message */
11825 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
11827 mp->is_add = is_add;
11828 mp->sw_if_index = ntohl (sw_if_index);
11829 mp->priority = priority;
11830 mp->weight = weight;
11831 clib_memcpy (mp->locator_set_name, locator_set_name,
11832 vec_len (locator_set_name));
11833 vec_free (locator_set_name);
11838 /* Wait for a reply... */
11846 api_lisp_add_del_local_eid (vat_main_t * vam)
11848 unformat_input_t *input = vam->input;
11849 vl_api_lisp_add_del_local_eid_t *mp;
11853 lisp_eid_vat_t _eid, *eid = &_eid;
11854 u8 *locator_set_name = 0;
11855 u8 locator_set_name_set = 0;
11858 /* Parse args required to build the message */
11859 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11861 if (unformat (input, "del"))
11865 else if (unformat (input, "vni %d", &vni))
11869 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
11873 else if (unformat (input, "locator-set %s", &locator_set_name))
11875 locator_set_name_set = 1;
11881 if (locator_set_name_set == 0)
11883 errmsg ("missing locator-set name\n");
11889 errmsg ("EID address not set!");
11890 vec_free (locator_set_name);
11894 if (vec_len (locator_set_name) > 64)
11896 errmsg ("locator-set name too long\n");
11897 vec_free (locator_set_name);
11900 vec_add1 (locator_set_name, 0);
11902 /* Construct the API message */
11903 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
11905 mp->is_add = is_add;
11906 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
11907 mp->eid_type = eid->type;
11908 mp->prefix_len = eid->len;
11909 mp->vni = clib_host_to_net_u32 (vni);
11910 clib_memcpy (mp->locator_set_name, locator_set_name,
11911 vec_len (locator_set_name));
11913 vec_free (locator_set_name);
11918 /* Wait for a reply... */
11926 /** Used for transferring locators via VPP API */
11927 typedef CLIB_PACKED(struct
11929 u8 is_ip4; /**< is locator an IPv4 address? */
11930 u8 priority; /**< locator priority */
11931 u8 weight; /**< locator weight */
11932 u8 addr[16]; /**< IPv4/IPv6 address */
11937 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
11939 unformat_input_t *input = vam->input;
11940 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
11943 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
11944 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
11945 u8 rmt_eid_set = 0, lcl_eid_set = 0;
11946 u32 action = ~0, p, w;
11947 ip4_address_t rmt_rloc4, lcl_rloc4;
11948 ip6_address_t rmt_rloc6, lcl_rloc6;
11949 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
11951 memset (&rloc, 0, sizeof (rloc));
11953 /* Parse args required to build the message */
11954 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11956 if (unformat (input, "del"))
11960 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
11964 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
11968 else if (unformat (input, "p %d w %d", &p, &w))
11972 errmsg ("No RLOC configured for setting priority/weight!");
11975 curr_rloc->priority = p;
11976 curr_rloc->weight = w;
11978 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
11979 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
11983 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
11984 rloc.priority = rloc.weight = 0;
11985 vec_add1 (lcl_locs, rloc);
11987 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
11988 vec_add1 (rmt_locs, rloc);
11989 /* priority and weight saved in rmt loc */
11990 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
11992 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
11993 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
11996 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
11997 rloc.priority = rloc.weight = 0;
11998 vec_add1 (lcl_locs, rloc);
12000 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12001 vec_add1 (rmt_locs, rloc);
12002 /* priority and weight saved in rmt loc */
12003 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12005 else if (unformat (input, "action %d", &action))
12011 clib_warning ("parse error '%U'", format_unformat_error, input);
12018 errmsg ("remote eid addresses not set\n");
12022 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
12024 errmsg ("eid types don't match\n");
12028 if (0 == rmt_locs && (u32) ~ 0 == action)
12030 errmsg ("action not set for negative mapping\n");
12034 /* Construct the API message */
12035 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
12037 mp->is_add = is_add;
12038 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
12039 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
12040 mp->eid_type = rmt_eid->type;
12041 mp->rmt_len = rmt_eid->len;
12042 mp->lcl_len = lcl_eid->len;
12043 mp->action = action;
12045 if (0 != rmt_locs && 0 != lcl_locs)
12047 mp->loc_num = vec_len (rmt_locs);
12048 clib_memcpy (mp->lcl_locs, lcl_locs,
12049 (sizeof (rloc_t) * vec_len (lcl_locs)));
12050 clib_memcpy (mp->rmt_locs, rmt_locs,
12051 (sizeof (rloc_t) * vec_len (rmt_locs)));
12053 vec_free (lcl_locs);
12054 vec_free (rmt_locs);
12059 /* Wait for a reply... */
12067 api_lisp_add_del_map_resolver (vat_main_t * vam)
12069 unformat_input_t *input = vam->input;
12070 vl_api_lisp_add_del_map_resolver_t *mp;
12075 ip4_address_t ipv4;
12076 ip6_address_t ipv6;
12078 /* Parse args required to build the message */
12079 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12081 if (unformat (input, "del"))
12085 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
12089 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
12097 if (ipv4_set && ipv6_set)
12099 errmsg ("both eid v4 and v6 addresses set\n");
12103 if (!ipv4_set && !ipv6_set)
12105 errmsg ("eid addresses not set\n");
12109 /* Construct the API message */
12110 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
12112 mp->is_add = is_add;
12116 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
12121 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
12127 /* Wait for a reply... */
12135 api_lisp_gpe_enable_disable (vat_main_t * vam)
12137 unformat_input_t *input = vam->input;
12138 vl_api_lisp_gpe_enable_disable_t *mp;
12143 /* Parse args required to build the message */
12144 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12146 if (unformat (input, "enable"))
12151 else if (unformat (input, "disable"))
12162 errmsg ("Value not set\n");
12166 /* Construct the API message */
12167 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
12174 /* Wait for a reply... */
12182 api_lisp_enable_disable (vat_main_t * vam)
12184 unformat_input_t *input = vam->input;
12185 vl_api_lisp_enable_disable_t *mp;
12190 /* Parse args required to build the message */
12191 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12193 if (unformat (input, "enable"))
12198 else if (unformat (input, "disable"))
12208 errmsg ("Value not set\n");
12212 /* Construct the API message */
12213 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
12220 /* Wait for a reply... */
12228 * Enable/disable LISP proxy ITR.
12230 * @param vam vpp API test context
12231 * @return return code
12234 api_lisp_pitr_set_locator_set (vat_main_t * vam)
12237 u8 ls_name_set = 0;
12238 unformat_input_t *input = vam->input;
12239 vl_api_lisp_pitr_set_locator_set_t *mp;
12243 /* Parse args required to build the message */
12244 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12246 if (unformat (input, "del"))
12248 else if (unformat (input, "locator-set %s", &ls_name))
12252 errmsg ("parse error '%U'", format_unformat_error, input);
12259 errmsg ("locator-set name not set!");
12263 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
12265 mp->is_add = is_add;
12266 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
12267 vec_free (ls_name);
12272 /* wait for reply */
12280 api_show_lisp_pitr (vat_main_t * vam)
12282 vl_api_show_lisp_pitr_t *mp;
12285 if (!vam->json_output)
12287 fformat (vam->ofp, "%=20s\n", "lisp status:");
12290 M (SHOW_LISP_PITR, show_lisp_pitr);
12294 /* Wait for a reply... */
12302 * Add/delete mapping between vni and vrf
12305 api_lisp_eid_table_add_del_map (vat_main_t * vam)
12308 unformat_input_t *input = vam->input;
12309 vl_api_lisp_eid_table_add_del_map_t *mp;
12310 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
12311 u32 vni, vrf, bd_index;
12313 /* Parse args required to build the message */
12314 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12316 if (unformat (input, "del"))
12318 else if (unformat (input, "vrf %d", &vrf))
12320 else if (unformat (input, "bd_index %d", &bd_index))
12322 else if (unformat (input, "vni %d", &vni))
12328 if (!vni_set || (!vrf_set && !bd_index_set))
12330 errmsg ("missing arguments!");
12334 if (vrf_set && bd_index_set)
12336 errmsg ("error: both vrf and bd entered!");
12340 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
12342 mp->is_add = is_add;
12343 mp->vni = htonl (vni);
12344 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
12345 mp->is_l2 = bd_index_set;
12350 /* wait for reply */
12358 * Add/del remote mapping to/from LISP control plane
12360 * @param vam vpp API test context
12361 * @return return code
12364 api_lisp_add_del_remote_mapping (vat_main_t * vam)
12366 unformat_input_t *input = vam->input;
12367 vl_api_lisp_add_del_remote_mapping_t *mp;
12370 //TODO: seid need remove
12371 lisp_eid_vat_t _eid, *eid = &_eid;
12372 lisp_eid_vat_t _seid, *seid = &_seid;
12373 u8 is_add = 1, del_all = 0, eid_set = 0;
12374 u32 action = ~0, p, w;
12375 ip4_address_t rloc4;
12376 ip6_address_t rloc6;
12377 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
12379 memset (&rloc, 0, sizeof (rloc));
12381 /* Parse args required to build the message */
12382 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12384 if (unformat (input, "del-all"))
12388 else if (unformat (input, "del"))
12392 else if (unformat (input, "add"))
12396 else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid))
12400 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, &seid))
12402 //TODO: Need remove, but first must be remove from CSIT test
12404 else if (unformat (input, "vni %d", &vni))
12408 else if (unformat (input, "p %d w %d", &p, &w))
12412 errmsg ("No RLOC configured for setting priority/weight!");
12415 curr_rloc->priority = p;
12416 curr_rloc->weight = w;
12418 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
12421 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
12422 vec_add1 (rlocs, rloc);
12423 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12425 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
12428 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
12429 vec_add1 (rlocs, rloc);
12430 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12432 else if (unformat (input, "action %d", &action))
12438 clib_warning ("parse error '%U'", format_unformat_error, input);
12445 errmsg ("missing params!");
12449 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
12451 errmsg ("no action set for negative map-reply!");
12455 M (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
12456 mp->is_add = is_add;
12457 mp->vni = htonl (vni);
12458 mp->action = (u8) action;
12459 mp->eid_len = eid->len;
12460 mp->del_all = del_all;
12461 mp->eid_type = eid->type;
12462 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12464 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
12465 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
12471 /* Wait for a reply... */
12479 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
12480 * forwarding entries in data-plane accordingly.
12482 * @param vam vpp API test context
12483 * @return return code
12486 api_lisp_add_del_adjacency (vat_main_t * vam)
12488 unformat_input_t *input = vam->input;
12489 vl_api_lisp_add_del_adjacency_t *mp;
12492 ip4_address_t seid4, deid4;
12493 ip6_address_t seid6, deid6;
12494 u8 deid_mac[6] = { 0 };
12495 u8 seid_mac[6] = { 0 };
12496 u8 deid_type, seid_type;
12497 u32 seid_len = 0, deid_len = 0, len;
12500 seid_type = deid_type = (u8) ~ 0;
12502 /* Parse args required to build the message */
12503 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12505 if (unformat (input, "del"))
12509 else if (unformat (input, "add"))
12513 else if (unformat (input, "deid %U/%d", unformat_ip4_address,
12516 deid_type = 0; /* ipv4 */
12519 else if (unformat (input, "deid %U/%d", unformat_ip6_address,
12522 deid_type = 1; /* ipv6 */
12525 else if (unformat (input, "deid %U", unformat_ethernet_address,
12528 deid_type = 2; /* mac */
12530 else if (unformat (input, "seid %U/%d", unformat_ip4_address,
12533 seid_type = 0; /* ipv4 */
12536 else if (unformat (input, "seid %U/%d", unformat_ip6_address,
12539 seid_type = 1; /* ipv6 */
12542 else if (unformat (input, "seid %U", unformat_ethernet_address,
12545 seid_type = 2; /* mac */
12547 else if (unformat (input, "vni %d", &vni))
12553 errmsg ("parse error '%U'", format_unformat_error, input);
12558 if ((u8) ~ 0 == deid_type)
12560 errmsg ("missing params!");
12564 if (seid_type != deid_type)
12566 errmsg ("source and destination EIDs are of different types!");
12570 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
12571 mp->is_add = is_add;
12572 mp->vni = htonl (vni);
12573 mp->seid_len = seid_len;
12574 mp->deid_len = deid_len;
12575 mp->eid_type = deid_type;
12577 switch (mp->eid_type)
12580 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
12581 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
12584 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
12585 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
12588 clib_memcpy (mp->seid, seid_mac, 6);
12589 clib_memcpy (mp->deid, deid_mac, 6);
12592 errmsg ("unknown EID type %d!", mp->eid_type);
12599 /* Wait for a reply... */
12607 api_lisp_gpe_add_del_iface (vat_main_t * vam)
12609 unformat_input_t *input = vam->input;
12610 vl_api_lisp_gpe_add_del_iface_t *mp;
12612 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
12613 u32 dp_table = 0, vni = 0;
12615 /* Parse args required to build the message */
12616 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12618 if (unformat (input, "up"))
12623 else if (unformat (input, "down"))
12628 else if (unformat (input, "table_id %d", &dp_table))
12632 else if (unformat (input, "bd_id %d", &dp_table))
12637 else if (unformat (input, "vni %d", &vni))
12645 if (action_set == 0)
12647 errmsg ("Action not set\n");
12650 if (dp_table_set == 0 || vni_set == 0)
12652 errmsg ("vni and dp_table must be set\n");
12656 /* Construct the API message */
12657 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
12659 mp->is_add = is_add;
12660 mp->dp_table = dp_table;
12667 /* Wait for a reply... */
12675 * Add/del map request itr rlocs from LISP control plane and updates
12677 * @param vam vpp API test context
12678 * @return return code
12681 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
12683 unformat_input_t *input = vam->input;
12684 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
12686 u8 *locator_set_name = 0;
12687 u8 locator_set_name_set = 0;
12690 /* Parse args required to build the message */
12691 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12693 if (unformat (input, "del"))
12697 else if (unformat (input, "%_%v%_", &locator_set_name))
12699 locator_set_name_set = 1;
12703 clib_warning ("parse error '%U'", format_unformat_error, input);
12708 if (is_add && !locator_set_name_set)
12710 errmsg ("itr-rloc is not set!");
12714 if (is_add && vec_len (locator_set_name) > 64)
12716 errmsg ("itr-rloc locator-set name too long\n");
12717 vec_free (locator_set_name);
12721 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
12722 mp->is_add = is_add;
12725 clib_memcpy (mp->locator_set_name, locator_set_name,
12726 vec_len (locator_set_name));
12730 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
12732 vec_free (locator_set_name);
12737 /* Wait for a reply... */
12745 lisp_locator_dump_send_msg (vat_main_t * vam, u32 locator_set_index,
12748 vl_api_lisp_locator_dump_t *mp;
12751 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
12753 mp->locator_set_index = htonl (locator_set_index);
12754 mp->filter = filter;
12759 /* Use a control ping for synchronization */
12761 vl_api_noprint_control_ping_t *mp;
12762 M (NOPRINT_CONTROL_PING, noprint_control_ping);
12765 /* Wait for a reply... */
12770 clean_locator_set_message (vat_main_t * vam)
12772 locator_set_msg_t *ls = 0;
12774 vec_foreach (ls, vam->locator_set_msg)
12776 vec_free (ls->locator_set_name);
12779 vec_free (vam->locator_set_msg);
12783 print_locator_in_locator_set (vat_main_t * vam, u8 filter)
12785 locator_set_msg_t *ls;
12786 locator_msg_t *loc;
12788 int i = 0, ret = 0;
12790 vec_foreach (ls, vam->locator_set_msg)
12792 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12795 vec_free (vam->locator_msg);
12796 clean_locator_set_message (vam);
12800 tmp_str = format (0, "%=20s%=16d%s", ls->locator_set_name,
12801 ls->locator_set_index,
12802 vec_len (vam->locator_msg) ? "" : "\n");
12804 vec_foreach (loc, vam->locator_msg)
12808 tmp_str = format (tmp_str, "%=37s", " ");
12812 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
12813 loc->sw_if_index, loc->priority, loc->weight);
12817 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
12818 loc->is_ipv6 ? format_ip6_address :
12819 format_ip4_address,
12820 loc->ip_address, loc->priority, loc->weight);
12825 fformat (vam->ofp, "%s", tmp_str);
12826 vec_free (tmp_str);
12827 vec_free (vam->locator_msg);
12830 clean_locator_set_message (vam);
12836 json_locator_in_locator_set (vat_main_t * vam, u8 filter)
12838 locator_set_msg_t *ls;
12839 locator_msg_t *loc;
12840 vat_json_node_t *node = NULL;
12841 vat_json_node_t *locator_array;
12842 vat_json_node_t *locator;
12843 struct in6_addr ip6;
12844 struct in_addr ip4;
12847 if (!vec_len (vam->locator_set_msg))
12849 /* just print [] */
12850 vat_json_init_array (&vam->json_tree);
12851 vat_json_print (vam->ofp, &vam->json_tree);
12852 vam->json_tree.type = VAT_JSON_NONE;
12856 if (VAT_JSON_ARRAY != vam->json_tree.type)
12858 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12859 vat_json_init_array (&vam->json_tree);
12862 vec_foreach (ls, vam->locator_set_msg)
12864 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12867 vec_free (ls->locator_set_name);
12868 vec_free (vam->locator_msg);
12869 vec_free (vam->locator_set_msg);
12870 vat_json_free (&vam->json_tree);
12871 vam->json_tree.type = VAT_JSON_NONE;
12875 node = vat_json_array_add (&vam->json_tree);
12876 vat_json_init_object (node);
12878 vat_json_object_add_uint (node, "locator-set-index",
12879 ls->locator_set_index);
12880 vat_json_object_add_string_copy (node, "locator-set",
12881 ls->locator_set_name);
12882 locator_array = vat_json_object_add_list (node, "locator");
12883 vec_foreach (loc, vam->locator_msg)
12885 locator = vat_json_array_add (locator_array);
12886 vat_json_init_object (locator);
12889 vat_json_object_add_uint (locator, "locator-index",
12896 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
12897 vat_json_object_add_ip6 (locator, "locator", ip6);
12901 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
12902 vat_json_object_add_ip4 (locator, "locator", ip4);
12905 vat_json_object_add_uint (locator, "priority", loc->priority);
12906 vat_json_object_add_uint (locator, "weight", loc->weight);
12909 vec_free (ls->locator_set_name);
12910 vec_free (vam->locator_msg);
12913 vat_json_print (vam->ofp, &vam->json_tree);
12914 vat_json_free (&vam->json_tree);
12915 vam->json_tree.type = VAT_JSON_NONE;
12917 vec_free (vam->locator_set_msg);
12923 get_locator_set_index_from_msg (vat_main_t * vam, u8 * locator_set,
12924 u32 * locator_set_index)
12926 locator_set_msg_t *ls;
12929 *locator_set_index = ~0;
12931 if (!vec_len (vam->locator_set_msg))
12936 vec_foreach (ls, vam->locator_set_msg)
12938 if (!strcmp ((char *) locator_set, (char *) ls->locator_set_name))
12940 *locator_set_index = ls->locator_set_index;
12941 vec_free (vam->locator_set_msg);
12946 vec_free (vam->locator_set_msg);
12952 get_locator_set_index (vat_main_t * vam, u8 * locator_set,
12953 u32 * locator_set_index)
12955 vl_api_lisp_locator_set_dump_t *mp;
12958 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
12962 /* Use a control ping for synchronization */
12964 vl_api_noprint_control_ping_t *mp;
12965 M (NOPRINT_CONTROL_PING, noprint_control_ping);
12969 vam->noprint_msg = 1;
12970 /* Wait for a reply... */
12974 get_locator_set_index_from_msg (vam, locator_set, locator_set_index);
12975 vam->noprint_msg = 0;
12984 lisp_locator_dump (vat_main_t * vam, u32 locator_set_index, u8 * locator_set,
12991 if (!vam->json_output)
12993 fformat (vam->ofp, "%=20s%=16s%=16s\n",
12994 "locator", "priority", "weight");
12999 ret = get_locator_set_index (vam, locator_set, &locator_set_index);
13002 if (!ret && ~0 == locator_set_index)
13007 ret = lisp_locator_dump_send_msg (vam, locator_set_index, filter);
13013 lisp_locator_set_dump (vat_main_t * vam, u8 filter)
13015 vl_api_lisp_locator_set_dump_t *mp;
13018 if (!vam->json_output)
13020 fformat (vam->ofp, "%=20s%=16s%=16s%=16s%=16s\n",
13021 "locator-set", "locator-set-index", "locator", "priority",
13025 vam->noprint_msg = 1;
13027 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13029 mp->filter = filter;
13034 /* Use a control ping for synchronization */
13036 vl_api_noprint_control_ping_t *mp;
13037 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13041 /* Wait for a reply... */
13045 if (vam->noprint_msg)
13047 if (!vam->json_output)
13049 print_locator_in_locator_set(vam, filter);
13053 json_locator_in_locator_set(vam, filter);
13056 vam->noprint_msg = 0;
13065 api_lisp_locator_set_dump (vat_main_t * vam)
13067 unformat_input_t *input = vam->input;
13068 vam->noprint_msg = 0;
13069 u32 locator_set_index = ~0;
13070 u8 locator_set_index_set = 0;
13071 u8 *locator_set = 0;
13072 u8 locator_set_set = 0;
13076 /* Parse args required to build the message */
13077 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13079 if (unformat (input, "locator-set-index %u", &locator_set_index))
13081 locator_set_index_set = 1;
13083 else if (unformat (input, "locator-set %s", &locator_set))
13085 locator_set_set = 1;
13087 else if (unformat (input, "local"))
13091 else if (unformat (input, "remote"))
13101 if (locator_set_index_set && locator_set_set)
13103 errmsg ("use only input parameter!\n");
13107 if (locator_set_index_set || locator_set_set)
13109 ret = lisp_locator_dump (vam, locator_set_index, locator_set, filter);
13113 ret = lisp_locator_set_dump (vam, filter);
13116 vec_free (locator_set);
13122 api_lisp_eid_table_map_dump (vat_main_t * vam)
13126 unformat_input_t *input = vam->input;
13127 vl_api_lisp_eid_table_map_dump_t *mp;
13130 /* Parse args required to build the message */
13131 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13133 if (unformat (input, "l2"))
13138 else if (unformat (input, "l3"))
13145 errmsg ("parse error '%U'", format_unformat_error, input);
13152 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13156 if (!vam->json_output)
13158 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
13161 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
13167 /* Use a control ping for synchronization */
13169 vl_api_control_ping_t *mp;
13170 M (CONTROL_PING, control_ping);
13173 /* Wait for a reply... */
13181 api_lisp_eid_table_vni_dump (vat_main_t * vam)
13183 vl_api_lisp_eid_table_vni_dump_t *mp;
13186 if (!vam->json_output)
13188 fformat (vam->ofp, "VNI\n");
13191 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
13196 /* Use a control ping for synchronization */
13198 vl_api_control_ping_t *mp;
13199 M (CONTROL_PING, control_ping);
13202 /* Wait for a reply... */
13210 get_locator_set (vat_main_t * vam)
13212 vl_api_lisp_locator_set_dump_t *mp;
13215 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13219 /* Use a control ping for synchronization */
13221 vl_api_noprint_control_ping_t *mp;
13222 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13226 /* Wait for a reply... */
13234 format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table,
13237 u8 *(*format_eid) (u8 *, va_list *) = 0;
13239 ASSERT (vam != NULL);
13240 ASSERT (eid_table != NULL);
13247 switch (eid_table->eid_type)
13251 format_eid = (eid_table->eid_type ? format_ip6_address :
13252 format_ip4_address);
13253 str = format (0, "[%d] %U/%d", eid_table->vni,
13254 format_eid, eid_table->eid, eid_table->eid_prefix_len);
13257 str = format (0, "[%d] %U", eid_table->vni,
13258 format_ethernet_address, eid_table->eid);
13261 errmsg ("unknown EID type %d!", eid_table->eid_type);
13273 format_locator_set_for_eid_table (vat_main_t * vam, u8 * str,
13274 eid_table_t * eid_table)
13276 locator_set_msg_t *ls = 0;
13278 ASSERT (vam != NULL);
13279 ASSERT (eid_table != NULL);
13281 if (eid_table->is_local)
13283 vec_foreach (ls, vam->locator_set_msg)
13285 if (ls->locator_set_index == eid_table->locator_set_index)
13287 str = format (0, "local(%s)", ls->locator_set_name);
13292 str = format (0, "local(N/A)");
13296 str = format (0, "remote");
13303 format_locator_for_eid_table (vat_main_t * vam, u8 * str,
13304 eid_table_t * eid_table)
13306 locator_msg_t *loc = 0;
13307 int first_line = 1;
13309 ASSERT (vam != NULL);
13310 ASSERT (eid_table != NULL);
13312 if (~0 == eid_table->locator_set_index)
13314 return format (0, "action: %d\n", eid_table->action);
13317 vec_foreach (loc, vam->locator_msg)
13323 str = format (str, "%-55s%-d\n", " ", loc->sw_if_index);
13327 str = format (str, "%=55s%-U\n", " ",
13328 loc->is_ipv6 ? format_ip6_address :
13329 format_ip4_address, loc->ip_address);
13337 str = format (str, "%-30d%-20u%-u\n", loc->sw_if_index,
13338 eid_table->ttl, eid_table->authoritative);
13342 str = format (str, "%-30U%-20u%-u\n",
13343 loc->is_ipv6 ? format_ip6_address :
13344 format_ip4_address,
13345 loc->ip_address, eid_table->ttl,
13346 eid_table->authoritative);
13355 print_lisp_eid_table_dump (vat_main_t * vam)
13357 eid_table_t *eid_table = 0;
13358 u8 *tmp_str = 0, *tmp_str2 = 0;
13361 ASSERT (vam != NULL);
13363 ret = get_locator_set (vam);
13366 vec_free (vam->eid_tables);
13370 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", "locators",
13371 "ttl", "authoritative");
13373 vec_foreach (eid_table, vam->eid_tables)
13375 if (~0 != eid_table->locator_set_index)
13377 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index,
13381 vec_free (vam->locator_msg);
13382 clean_locator_set_message (vam);
13383 vec_free (vam->eid_tables);
13388 tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret);
13391 vec_free (vam->locator_msg);
13392 clean_locator_set_message (vam);
13393 vec_free (vam->eid_tables);
13397 tmp_str = format (0, "%-35s", tmp_str2);
13398 vec_free (tmp_str2);
13400 tmp_str2 = format_locator_set_for_eid_table (vam, tmp_str2, eid_table);
13401 tmp_str = format (tmp_str, "%-20s", tmp_str2);
13402 vec_free (tmp_str2);
13404 tmp_str2 = format_locator_for_eid_table (vam, tmp_str2, eid_table);
13405 tmp_str = format (tmp_str, "%-s", tmp_str2);
13406 vec_free (tmp_str2);
13408 fformat (vam->ofp, "%s", tmp_str);
13409 vec_free (tmp_str);
13410 vec_free (vam->locator_msg);
13413 clean_locator_set_message (vam);
13414 vec_free (vam->eid_tables);
13420 json_locator_set_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13421 eid_table_t * eid_table)
13423 locator_set_msg_t *ls = 0;
13426 ASSERT (vam != NULL);
13427 ASSERT (node != NULL);
13428 ASSERT (eid_table != NULL);
13430 if (eid_table->is_local)
13432 vec_foreach (ls, vam->locator_set_msg)
13434 if (ls->locator_set_index == eid_table->locator_set_index)
13436 vat_json_object_add_string_copy (node, "locator-set",
13437 ls->locator_set_name);
13442 s = format (0, "N/A");
13444 vat_json_object_add_string_copy (node, "locator-set", s);
13449 s = format (0, "remote");
13451 vat_json_object_add_string_copy (node, "locator-set", s);
13457 json_eid_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13458 eid_table_t * eid_table)
13461 struct in6_addr ip6;
13462 struct in_addr ip4;
13464 ASSERT (vam != NULL);
13465 ASSERT (node != NULL);
13466 ASSERT (eid_table != NULL);
13468 switch (eid_table->eid_type)
13471 clib_memcpy (&ip4, eid_table->eid, sizeof (ip4));
13472 vat_json_object_add_ip4 (node, "eid", ip4);
13473 vat_json_object_add_uint (node, "eid-prefix-len",
13474 eid_table->eid_prefix_len);
13477 clib_memcpy (&ip6, eid_table->eid, sizeof (ip6));
13478 vat_json_object_add_ip6 (node, "eid", ip6);
13479 vat_json_object_add_uint (node, "eid-prefix-len",
13480 eid_table->eid_prefix_len);
13483 s = format (0, "%U", format_ethernet_address, eid_table->eid);
13485 vat_json_object_add_string_copy (node, "eid", s);
13489 errmsg ("unknown EID type %d!", eid_table->eid_type);
13497 json_locator_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13498 eid_table_t * eid_table)
13500 locator_msg_t *loc = 0;
13501 vat_json_node_t *locator_array = 0;
13502 vat_json_node_t *locator = 0;
13503 struct in6_addr ip6;
13504 struct in_addr ip4;
13506 ASSERT (vam != NULL);
13507 ASSERT (node != NULL);
13508 ASSERT (eid_table != NULL);
13510 locator_array = vat_json_object_add_list (node, "locator");
13511 vec_foreach (loc, vam->locator_msg)
13513 locator = vat_json_array_add (locator_array);
13514 vat_json_init_object (locator);
13517 vat_json_object_add_uint (locator, "locator-index", loc->sw_if_index);
13523 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13524 vat_json_object_add_ip6 (locator, "locator", ip6);
13528 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13529 vat_json_object_add_ip4 (locator, "locator", ip4);
13536 json_lisp_eid_table_dump (vat_main_t * vam)
13538 eid_table_t *eid_table;
13539 vat_json_node_t *node = 0;
13542 ASSERT (vam != NULL);
13544 ret = get_locator_set (vam);
13547 vec_free (vam->eid_tables);
13551 if (!vec_len (vam->eid_tables))
13553 /* just print [] */
13554 vat_json_init_array (&vam->json_tree);
13555 vat_json_print (vam->ofp, &vam->json_tree);
13556 vam->json_tree.type = VAT_JSON_NONE;
13560 if (VAT_JSON_ARRAY != vam->json_tree.type)
13562 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13563 vat_json_init_array (&vam->json_tree);
13566 vec_foreach (eid_table, vam->eid_tables)
13568 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0);
13571 vec_free (vam->locator_msg);
13572 vec_free (vam->eid_tables);
13573 clean_locator_set_message (vam);
13574 vat_json_free (&vam->json_tree);
13575 vam->json_tree.type = VAT_JSON_NONE;
13579 node = vat_json_array_add (&vam->json_tree);
13580 vat_json_init_object (node);
13582 vat_json_object_add_uint (node, "vni", eid_table->vni);
13584 json_locator_set_for_eid_table (vam, node, eid_table);
13585 ret = json_eid_for_eid_table (vam, node, eid_table);
13588 vec_free (vam->locator_msg);
13589 vec_free (vam->eid_tables);
13590 clean_locator_set_message (vam);
13591 vat_json_free (&vam->json_tree);
13592 vam->json_tree.type = VAT_JSON_NONE;
13596 json_locator_for_eid_table (vam, node, eid_table);
13598 vat_json_object_add_uint (node, "ttl", eid_table->ttl);
13599 vat_json_object_add_uint (node, "authoritative",
13600 eid_table->authoritative);
13602 vec_free (vam->locator_msg);
13605 vat_json_print (vam->ofp, &vam->json_tree);
13606 vat_json_free (&vam->json_tree);
13607 vam->json_tree.type = VAT_JSON_NONE;
13609 clean_locator_set_message (vam);
13610 vec_free (vam->eid_tables);
13616 api_lisp_eid_table_dump (vat_main_t * vam)
13618 unformat_input_t *i = vam->input;
13619 vl_api_lisp_eid_table_dump_t *mp;
13621 struct in_addr ip4;
13622 struct in6_addr ip6;
13624 u8 eid_type = ~0, eid_set = 0;
13625 u32 prefix_length = ~0, t, vni = 0;
13628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13630 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
13636 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
13642 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
13647 else if (unformat (i, "vni %d", &t))
13651 else if (unformat (i, "local"))
13655 else if (unformat (i, "remote"))
13661 errmsg ("parse error '%U'", format_unformat_error, i);
13666 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
13668 mp->filter = filter;
13672 mp->vni = htonl (vni);
13673 mp->eid_type = eid_type;
13677 mp->prefix_length = prefix_length;
13678 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
13681 mp->prefix_length = prefix_length;
13682 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
13685 clib_memcpy (mp->eid, mac, sizeof (mac));
13688 errmsg ("unknown EID type %d!", eid_type);
13693 vam->noprint_msg = 1;
13698 /* Use a control ping for synchronization */
13700 vl_api_noprint_control_ping_t *mp;
13701 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13705 /* Wait for a reply... */
13709 if (vam->noprint_msg)
13711 if (!vam->json_output)
13713 vam->retval = print_lisp_eid_table_dump(vam);
13717 vam->retval = json_lisp_eid_table_dump(vam);
13720 vam->noprint_msg = 0;
13729 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
13731 vl_api_lisp_gpe_tunnel_dump_t *mp;
13734 if (!vam->json_output)
13736 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
13737 "%=16s%=16s%=16s%=16s%=16s\n",
13738 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
13739 "Decap next", "Lisp version", "Flags", "Next protocol",
13740 "ver_res", "res", "iid");
13743 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
13747 /* Use a control ping for synchronization */
13749 vl_api_control_ping_t *mp;
13750 M (CONTROL_PING, control_ping);
13753 /* Wait for a reply... */
13761 api_lisp_map_resolver_dump (vat_main_t * vam)
13763 vl_api_lisp_map_resolver_dump_t *mp;
13766 if (!vam->json_output)
13768 fformat (vam->ofp, "%=20s\n", "Map resolver");
13771 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
13775 /* Use a control ping for synchronization */
13777 vl_api_control_ping_t *mp;
13778 M (CONTROL_PING, control_ping);
13781 /* Wait for a reply... */
13789 api_show_lisp_status (vat_main_t * vam)
13791 vl_api_show_lisp_status_t *mp;
13794 if (!vam->json_output)
13796 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
13799 M (SHOW_LISP_STATUS, show_lisp_status);
13802 /* Wait for a reply... */
13810 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
13812 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
13815 if (!vam->json_output)
13817 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
13820 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
13823 /* Wait for a reply... */
13831 api_af_packet_create (vat_main_t * vam)
13833 unformat_input_t *i = vam->input;
13834 vl_api_af_packet_create_t *mp;
13836 u8 *host_if_name = 0;
13838 u8 random_hw_addr = 1;
13840 memset (hw_addr, 0, sizeof (hw_addr));
13842 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13844 if (unformat (i, "name %s", &host_if_name))
13845 vec_add1 (host_if_name, 0);
13846 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
13847 random_hw_addr = 0;
13852 if (!vec_len (host_if_name))
13854 errmsg ("host-interface name must be specified");
13858 if (vec_len (host_if_name) > 64)
13860 errmsg ("host-interface name too long");
13864 M (AF_PACKET_CREATE, af_packet_create);
13866 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
13867 clib_memcpy (mp->hw_addr, hw_addr, 6);
13868 mp->use_random_hw_addr = random_hw_addr;
13869 vec_free (host_if_name);
13872 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
13878 api_af_packet_delete (vat_main_t * vam)
13880 unformat_input_t *i = vam->input;
13881 vl_api_af_packet_delete_t *mp;
13883 u8 *host_if_name = 0;
13885 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13887 if (unformat (i, "name %s", &host_if_name))
13888 vec_add1 (host_if_name, 0);
13893 if (!vec_len (host_if_name))
13895 errmsg ("host-interface name must be specified");
13899 if (vec_len (host_if_name) > 64)
13901 errmsg ("host-interface name too long");
13905 M (AF_PACKET_DELETE, af_packet_delete);
13907 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
13908 vec_free (host_if_name);
13917 api_policer_add_del (vat_main_t * vam)
13919 unformat_input_t *i = vam->input;
13920 vl_api_policer_add_del_t *mp;
13931 u8 color_aware = 0;
13932 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
13934 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
13935 conform_action.dscp = 0;
13936 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
13937 exceed_action.dscp = 0;
13938 violate_action.action_type = SSE2_QOS_ACTION_DROP;
13939 violate_action.dscp = 0;
13941 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13943 if (unformat (i, "del"))
13945 else if (unformat (i, "name %s", &name))
13946 vec_add1 (name, 0);
13947 else if (unformat (i, "cir %u", &cir))
13949 else if (unformat (i, "eir %u", &eir))
13951 else if (unformat (i, "cb %u", &cb))
13953 else if (unformat (i, "eb %u", &eb))
13955 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
13958 else if (unformat (i, "round_type %U", unformat_policer_round_type,
13961 else if (unformat (i, "type %U", unformat_policer_type, &type))
13963 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
13966 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
13969 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
13972 else if (unformat (i, "color-aware"))
13978 if (!vec_len (name))
13980 errmsg ("policer name must be specified");
13984 if (vec_len (name) > 64)
13986 errmsg ("policer name too long");
13990 M (POLICER_ADD_DEL, policer_add_del);
13992 clib_memcpy (mp->name, name, vec_len (name));
13994 mp->is_add = is_add;
13999 mp->rate_type = rate_type;
14000 mp->round_type = round_type;
14002 mp->conform_action_type = conform_action.action_type;
14003 mp->conform_dscp = conform_action.dscp;
14004 mp->exceed_action_type = exceed_action.action_type;
14005 mp->exceed_dscp = exceed_action.dscp;
14006 mp->violate_action_type = violate_action.action_type;
14007 mp->violate_dscp = violate_action.dscp;
14008 mp->color_aware = color_aware;
14017 api_policer_dump (vat_main_t * vam)
14019 unformat_input_t *i = vam->input;
14020 vl_api_policer_dump_t *mp;
14022 u8 *match_name = 0;
14023 u8 match_name_valid = 0;
14025 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14027 if (unformat (i, "name %s", &match_name))
14029 vec_add1 (match_name, 0);
14030 match_name_valid = 1;
14036 M (POLICER_DUMP, policer_dump);
14037 mp->match_name_valid = match_name_valid;
14038 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14039 vec_free (match_name);
14043 /* Use a control ping for synchronization */
14045 vl_api_control_ping_t *mp;
14046 M (CONTROL_PING, control_ping);
14049 /* Wait for a reply... */
14057 api_policer_classify_set_interface (vat_main_t * vam)
14059 unformat_input_t *i = vam->input;
14060 vl_api_policer_classify_set_interface_t *mp;
14063 int sw_if_index_set;
14064 u32 ip4_table_index = ~0;
14065 u32 ip6_table_index = ~0;
14066 u32 l2_table_index = ~0;
14069 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14071 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14072 sw_if_index_set = 1;
14073 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14074 sw_if_index_set = 1;
14075 else if (unformat (i, "del"))
14077 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14079 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14081 else if (unformat (i, "l2-table %d", &l2_table_index))
14085 clib_warning ("parse error '%U'", format_unformat_error, i);
14090 if (sw_if_index_set == 0)
14092 errmsg ("missing interface name or sw_if_index\n");
14096 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14098 mp->sw_if_index = ntohl (sw_if_index);
14099 mp->ip4_table_index = ntohl (ip4_table_index);
14100 mp->ip6_table_index = ntohl (ip6_table_index);
14101 mp->l2_table_index = ntohl (l2_table_index);
14102 mp->is_add = is_add;
14111 api_policer_classify_dump (vat_main_t * vam)
14113 unformat_input_t *i = vam->input;
14114 vl_api_policer_classify_dump_t *mp;
14116 u8 type = POLICER_CLASSIFY_N_TABLES;
14118 if (unformat (i, "type %U", unformat_classify_table_type, &type))
14122 errmsg ("classify table type must be specified\n");
14126 if (!vam->json_output)
14128 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14131 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14136 /* Use a control ping for synchronization */
14138 vl_api_control_ping_t *mp;
14139 M (CONTROL_PING, control_ping);
14142 /* Wait for a reply... */
14150 api_netmap_create (vat_main_t * vam)
14152 unformat_input_t *i = vam->input;
14153 vl_api_netmap_create_t *mp;
14157 u8 random_hw_addr = 1;
14161 memset (hw_addr, 0, sizeof (hw_addr));
14163 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14165 if (unformat (i, "name %s", &if_name))
14166 vec_add1 (if_name, 0);
14167 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14168 random_hw_addr = 0;
14169 else if (unformat (i, "pipe"))
14171 else if (unformat (i, "master"))
14173 else if (unformat (i, "slave"))
14179 if (!vec_len (if_name))
14181 errmsg ("interface name must be specified");
14185 if (vec_len (if_name) > 64)
14187 errmsg ("interface name too long");
14191 M (NETMAP_CREATE, netmap_create);
14193 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14194 clib_memcpy (mp->hw_addr, hw_addr, 6);
14195 mp->use_random_hw_addr = random_hw_addr;
14196 mp->is_pipe = is_pipe;
14197 mp->is_master = is_master;
14198 vec_free (if_name);
14207 api_netmap_delete (vat_main_t * vam)
14209 unformat_input_t *i = vam->input;
14210 vl_api_netmap_delete_t *mp;
14214 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14216 if (unformat (i, "name %s", &if_name))
14217 vec_add1 (if_name, 0);
14222 if (!vec_len (if_name))
14224 errmsg ("interface name must be specified");
14228 if (vec_len (if_name) > 64)
14230 errmsg ("interface name too long");
14234 M (NETMAP_DELETE, netmap_delete);
14236 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14237 vec_free (if_name);
14245 static void vl_api_mpls_gre_tunnel_details_t_handler
14246 (vl_api_mpls_gre_tunnel_details_t * mp)
14248 vat_main_t *vam = &vat_main;
14250 i32 len = ntohl (mp->nlabels);
14252 if (mp->l2_only == 0)
14254 fformat (vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
14255 ntohl (mp->tunnel_index),
14256 format_ip4_address, &mp->tunnel_src,
14257 format_ip4_address, &mp->tunnel_dst,
14258 format_ip4_address, &mp->intfc_address,
14259 ntohl (mp->mask_width));
14260 for (i = 0; i < len; i++)
14262 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14264 fformat (vam->ofp, "\n");
14265 fformat (vam->ofp, " inner fib index %d, outer fib index %d\n",
14266 ntohl (mp->inner_fib_index), ntohl (mp->outer_fib_index));
14270 fformat (vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
14271 ntohl (mp->tunnel_index),
14272 format_ip4_address, &mp->tunnel_src,
14273 format_ip4_address, &mp->tunnel_dst,
14274 format_ip4_address, &mp->intfc_address);
14275 for (i = 0; i < len; i++)
14277 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14279 fformat (vam->ofp, "\n");
14280 fformat (vam->ofp, " l2 interface %d, outer fib index %d\n",
14281 ntohl (mp->hw_if_index), ntohl (mp->outer_fib_index));
14285 static void vl_api_mpls_gre_tunnel_details_t_handler_json
14286 (vl_api_mpls_gre_tunnel_details_t * mp)
14288 vat_main_t *vam = &vat_main;
14289 vat_json_node_t *node = NULL;
14290 struct in_addr ip4;
14292 i32 len = ntohl (mp->nlabels);
14294 if (VAT_JSON_ARRAY != vam->json_tree.type)
14296 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14297 vat_json_init_array (&vam->json_tree);
14299 node = vat_json_array_add (&vam->json_tree);
14301 vat_json_init_object (node);
14302 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14303 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14304 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14305 vat_json_object_add_uint (node, "inner_fib_index",
14306 ntohl (mp->inner_fib_index));
14307 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14308 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14309 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14310 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14311 clib_memcpy (&ip4, &(mp->tunnel_src), sizeof (ip4));
14312 vat_json_object_add_ip4 (node, "tunnel_src", ip4);
14313 clib_memcpy (&ip4, &(mp->tunnel_dst), sizeof (ip4));
14314 vat_json_object_add_ip4 (node, "tunnel_dst", ip4);
14315 vat_json_object_add_uint (node, "outer_fib_index",
14316 ntohl (mp->outer_fib_index));
14317 vat_json_object_add_uint (node, "label_count", len);
14318 for (i = 0; i < len; i++)
14320 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14325 api_mpls_gre_tunnel_dump (vat_main_t * vam)
14327 vl_api_mpls_gre_tunnel_dump_t *mp;
14331 /* Parse args required to build the message */
14332 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14334 if (!unformat (vam->input, "tunnel_index %d", &index))
14341 fformat (vam->ofp, " tunnel_index %d\n", index);
14343 M (MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
14344 mp->tunnel_index = htonl (index);
14347 /* Use a control ping for synchronization */
14349 vl_api_control_ping_t *mp;
14350 M (CONTROL_PING, control_ping);
14356 static void vl_api_mpls_eth_tunnel_details_t_handler
14357 (vl_api_mpls_eth_tunnel_details_t * mp)
14359 vat_main_t *vam = &vat_main;
14361 i32 len = ntohl (mp->nlabels);
14363 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14364 ntohl (mp->tunnel_index),
14365 format_ethernet_address, &mp->tunnel_dst_mac,
14366 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14367 for (i = 0; i < len; i++)
14369 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14371 fformat (vam->ofp, "\n");
14372 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14373 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14376 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14377 (vl_api_mpls_eth_tunnel_details_t * mp)
14379 vat_main_t *vam = &vat_main;
14380 vat_json_node_t *node = NULL;
14381 struct in_addr ip4;
14383 i32 len = ntohl (mp->nlabels);
14385 if (VAT_JSON_ARRAY != vam->json_tree.type)
14387 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14388 vat_json_init_array (&vam->json_tree);
14390 node = vat_json_array_add (&vam->json_tree);
14392 vat_json_init_object (node);
14393 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14394 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14395 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14396 vat_json_object_add_uint (node, "inner_fib_index",
14397 ntohl (mp->inner_fib_index));
14398 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14399 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14400 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14401 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14402 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14403 format (0, "%U", format_ethernet_address,
14404 &mp->tunnel_dst_mac));
14405 vat_json_object_add_uint (node, "tx_sw_if_index",
14406 ntohl (mp->tx_sw_if_index));
14407 vat_json_object_add_uint (node, "label_count", len);
14408 for (i = 0; i < len; i++)
14410 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14415 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14417 vl_api_mpls_eth_tunnel_dump_t *mp;
14421 /* Parse args required to build the message */
14422 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14424 if (!unformat (vam->input, "tunnel_index %d", &index))
14431 fformat (vam->ofp, " tunnel_index %d\n", index);
14433 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14434 mp->tunnel_index = htonl (index);
14437 /* Use a control ping for synchronization */
14439 vl_api_control_ping_t *mp;
14440 M (CONTROL_PING, control_ping);
14446 static void vl_api_mpls_fib_encap_details_t_handler
14447 (vl_api_mpls_fib_encap_details_t * mp)
14449 vat_main_t *vam = &vat_main;
14451 i32 len = ntohl (mp->nlabels);
14453 fformat (vam->ofp, "table %d, dest %U, label ",
14454 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14455 for (i = 0; i < len; i++)
14457 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14459 fformat (vam->ofp, "\n");
14462 static void vl_api_mpls_fib_encap_details_t_handler_json
14463 (vl_api_mpls_fib_encap_details_t * mp)
14465 vat_main_t *vam = &vat_main;
14466 vat_json_node_t *node = NULL;
14468 i32 len = ntohl (mp->nlabels);
14469 struct in_addr ip4;
14471 if (VAT_JSON_ARRAY != vam->json_tree.type)
14473 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14474 vat_json_init_array (&vam->json_tree);
14476 node = vat_json_array_add (&vam->json_tree);
14478 vat_json_init_object (node);
14479 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14480 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14481 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14482 vat_json_object_add_ip4 (node, "dest", ip4);
14483 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14484 vat_json_object_add_uint (node, "label_count", len);
14485 for (i = 0; i < len; i++)
14487 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14492 api_mpls_fib_encap_dump (vat_main_t * vam)
14494 vl_api_mpls_fib_encap_dump_t *mp;
14497 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14500 /* Use a control ping for synchronization */
14502 vl_api_control_ping_t *mp;
14503 M (CONTROL_PING, control_ping);
14509 static void vl_api_mpls_fib_decap_details_t_handler
14510 (vl_api_mpls_fib_decap_details_t * mp)
14512 vat_main_t *vam = &vat_main;
14515 "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
14516 ntohl (mp->rx_table_id), ntohl (mp->tx_table_id), mp->swif_tag,
14517 ntohl (mp->label), ntohl (mp->s_bit));
14520 static void vl_api_mpls_fib_decap_details_t_handler_json
14521 (vl_api_mpls_fib_decap_details_t * mp)
14523 vat_main_t *vam = &vat_main;
14524 vat_json_node_t *node = NULL;
14525 struct in_addr ip4;
14527 if (VAT_JSON_ARRAY != vam->json_tree.type)
14529 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14530 vat_json_init_array (&vam->json_tree);
14532 node = vat_json_array_add (&vam->json_tree);
14534 vat_json_init_object (node);
14535 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14536 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14537 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14538 vat_json_object_add_ip4 (node, "dest", ip4);
14539 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14540 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14541 vat_json_object_add_uint (node, "rx_table_id", ntohl (mp->rx_table_id));
14542 vat_json_object_add_uint (node, "tx_table_id", ntohl (mp->tx_table_id));
14543 vat_json_object_add_string_copy (node, "swif_tag", mp->swif_tag);
14547 api_mpls_fib_decap_dump (vat_main_t * vam)
14549 vl_api_mpls_fib_decap_dump_t *mp;
14552 M (MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
14555 /* Use a control ping for synchronization */
14557 vl_api_control_ping_t *mp;
14558 M (CONTROL_PING, control_ping);
14565 api_classify_table_ids (vat_main_t * vam)
14567 vl_api_classify_table_ids_t *mp;
14570 /* Construct the API message */
14571 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14581 api_classify_table_by_interface (vat_main_t * vam)
14583 unformat_input_t *input = vam->input;
14584 vl_api_classify_table_by_interface_t *mp;
14587 u32 sw_if_index = ~0;
14588 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14590 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14592 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14597 if (sw_if_index == ~0)
14599 errmsg ("missing interface name or sw_if_index\n");
14603 /* Construct the API message */
14604 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14606 mp->sw_if_index = ntohl (sw_if_index);
14615 api_classify_table_info (vat_main_t * vam)
14617 unformat_input_t *input = vam->input;
14618 vl_api_classify_table_info_t *mp;
14622 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14624 if (unformat (input, "table_id %d", &table_id))
14629 if (table_id == ~0)
14631 errmsg ("missing table id\n");
14635 /* Construct the API message */
14636 M (CLASSIFY_TABLE_INFO, classify_table_info);
14638 mp->table_id = ntohl (table_id);
14647 api_classify_session_dump (vat_main_t * vam)
14649 unformat_input_t *input = vam->input;
14650 vl_api_classify_session_dump_t *mp;
14654 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14656 if (unformat (input, "table_id %d", &table_id))
14661 if (table_id == ~0)
14663 errmsg ("missing table id\n");
14667 /* Construct the API message */
14668 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
14670 mp->table_id = ntohl (table_id);
14673 /* Use a control ping for synchronization */
14675 vl_api_control_ping_t *mp;
14676 M (CONTROL_PING, control_ping);
14685 vl_api_ipfix_details_t_handler (vl_api_ipfix_details_t * mp)
14687 vat_main_t *vam = &vat_main;
14689 fformat (vam->ofp, "collector_address %U, collector_port %d, "
14690 "src_address %U, fib_index %u, path_mtu %u, "
14691 "template_interval %u\n",
14692 format_ip4_address, mp->collector_address,
14693 ntohs (mp->collector_port),
14694 format_ip4_address, mp->src_address,
14695 ntohl (mp->fib_index),
14696 ntohl (mp->path_mtu), ntohl (mp->template_interval));
14699 vam->result_ready = 1;
14703 vl_api_ipfix_details_t_handler_json (vl_api_ipfix_details_t * mp)
14705 vat_main_t *vam = &vat_main;
14706 vat_json_node_t node;
14707 struct in_addr collector_address;
14708 struct in_addr src_address;
14710 vat_json_init_object (&node);
14711 clib_memcpy (&collector_address, &mp->collector_address,
14712 sizeof (collector_address));
14713 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
14714 vat_json_object_add_uint (&node, "collector_port",
14715 ntohs (mp->collector_port));
14716 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
14717 vat_json_object_add_ip4 (&node, "src_address", src_address);
14718 vat_json_object_add_uint (&node, "fib_index", ntohl (mp->fib_index));
14719 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
14720 vat_json_object_add_uint (&node, "template_interval",
14721 ntohl (mp->template_interval));
14723 vat_json_print (vam->ofp, &node);
14724 vat_json_free (&node);
14726 vam->result_ready = 1;
14730 api_ipfix_dump (vat_main_t * vam)
14732 vl_api_ipfix_dump_t *mp;
14735 /* Construct the API message */
14736 M (IPFIX_DUMP, ipfix_dump);
14746 api_pg_create_interface (vat_main_t * vam)
14748 unformat_input_t *input = vam->input;
14749 vl_api_pg_create_interface_t *mp;
14753 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14755 if (unformat (input, "if_id %d", &if_id))
14762 errmsg ("missing pg interface index\n");
14766 /* Construct the API message */
14767 M (PG_CREATE_INTERFACE, pg_create_interface);
14769 mp->interface_id = ntohl (if_id);
14778 api_pg_capture (vat_main_t * vam)
14780 unformat_input_t *input = vam->input;
14781 vl_api_pg_capture_t *mp;
14787 u8 pcap_file_set = 0;
14789 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14791 if (unformat (input, "if_id %d", &if_id))
14793 else if (unformat (input, "pcap %s", &pcap_file))
14795 else if (unformat (input, "count %d", &count))
14797 else if (unformat (input, "disable"))
14804 errmsg ("missing pg interface index\n");
14807 if (pcap_file_set > 0)
14809 if (vec_len (pcap_file) > 255)
14811 errmsg ("pcap file name is too long\n");
14816 u32 name_len = vec_len (pcap_file);
14817 /* Construct the API message */
14818 M (PG_CAPTURE, pg_capture);
14820 mp->interface_id = ntohl (if_id);
14821 mp->is_enabled = enable;
14822 mp->count = ntohl (count);
14823 mp->pcap_name_length = ntohl (name_len);
14824 if (pcap_file_set != 0)
14826 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
14828 vec_free (pcap_file);
14837 api_pg_enable_disable (vat_main_t * vam)
14839 unformat_input_t *input = vam->input;
14840 vl_api_pg_enable_disable_t *mp;
14844 u8 stream_name_set = 0;
14845 u8 *stream_name = 0;
14846 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14848 if (unformat (input, "stream %s", &stream_name))
14849 stream_name_set = 1;
14850 else if (unformat (input, "disable"))
14856 if (stream_name_set > 0)
14858 if (vec_len (stream_name) > 255)
14860 errmsg ("stream name too long\n");
14865 u32 name_len = vec_len (stream_name);
14866 /* Construct the API message */
14867 M (PG_ENABLE_DISABLE, pg_enable_disable);
14869 mp->is_enabled = enable;
14870 if (stream_name_set != 0)
14872 mp->stream_name_length = ntohl (name_len);
14873 clib_memcpy (mp->stream_name, stream_name, name_len);
14875 vec_free (stream_name);
14884 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
14886 unformat_input_t *input = vam->input;
14887 vl_api_ip_source_and_port_range_check_add_del_t *mp;
14890 u16 *low_ports = 0;
14891 u16 *high_ports = 0;
14894 ip4_address_t ip4_addr;
14895 ip6_address_t ip6_addr;
14903 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14905 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
14911 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
14916 else if (unformat (input, "vrf %d", &vrf_id))
14918 else if (unformat (input, "del"))
14920 else if (unformat (input, "port %d", &tmp))
14922 if (tmp == 0 || tmp > 65535)
14924 errmsg ("port %d out of range", tmp);
14928 this_hi = this_low + 1;
14929 vec_add1 (low_ports, this_low);
14930 vec_add1 (high_ports, this_hi);
14932 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
14934 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
14936 errmsg ("incorrect range parameters\n");
14940 /* Note: in debug CLI +1 is added to high before
14941 passing to real fn that does "the work"
14942 (ip_source_and_port_range_check_add_del).
14943 This fn is a wrapper around the binary API fn a
14944 control plane will call, which expects this increment
14945 to have occurred. Hence letting the binary API control
14946 plane fn do the increment for consistency between VAT
14947 and other control planes.
14950 vec_add1 (low_ports, this_low);
14951 vec_add1 (high_ports, this_hi);
14957 if (prefix_set == 0)
14959 errmsg ("<address>/<mask> not specified\n");
14965 errmsg ("VRF ID required, not specified\n");
14972 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
14976 if (vec_len (low_ports) == 0)
14978 errmsg ("At least one port or port range required\n");
14982 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
14983 ip_source_and_port_range_check_add_del);
14985 mp->is_add = is_add;
14990 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
14995 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
14998 mp->mask_length = length;
14999 mp->number_of_ranges = vec_len (low_ports);
15001 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15002 vec_free (low_ports);
15004 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15005 vec_free (high_ports);
15007 mp->vrf_id = ntohl (vrf_id);
15016 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15018 unformat_input_t *input = vam->input;
15019 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15021 u32 sw_if_index = ~0;
15023 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15024 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15027 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15029 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15031 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15033 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15035 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15037 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15039 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15041 else if (unformat (input, "del"))
15047 if (sw_if_index == ~0)
15049 errmsg ("Interface required but not specified\n");
15055 errmsg ("VRF ID required but not specified\n");
15059 if (tcp_out_vrf_id == 0
15060 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15063 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15067 /* Construct the API message */
15068 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15069 ip_source_and_port_range_check_interface_add_del);
15071 mp->sw_if_index = ntohl (sw_if_index);
15072 mp->is_add = is_add;
15073 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15074 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15075 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15076 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15081 /* Wait for a reply... */
15086 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15088 unformat_input_t *i = vam->input;
15089 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15091 u32 local_sa_id = 0;
15092 u32 remote_sa_id = 0;
15093 ip4_address_t src_address;
15094 ip4_address_t dst_address;
15097 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15099 if (unformat (i, "local_sa %d", &local_sa_id))
15101 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15103 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15105 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15107 else if (unformat (i, "del"))
15111 clib_warning ("parse error '%U'", format_unformat_error, i);
15116 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15118 mp->local_sa_id = ntohl (local_sa_id);
15119 mp->remote_sa_id = ntohl (remote_sa_id);
15120 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15121 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15122 mp->is_add = is_add;
15130 static void vl_api_ipsec_gre_tunnel_details_t_handler
15131 (vl_api_ipsec_gre_tunnel_details_t * mp)
15133 vat_main_t *vam = &vat_main;
15135 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15136 ntohl (mp->sw_if_index),
15137 format_ip4_address, &mp->src_address,
15138 format_ip4_address, &mp->dst_address,
15139 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15142 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15143 (vl_api_ipsec_gre_tunnel_details_t * mp)
15145 vat_main_t *vam = &vat_main;
15146 vat_json_node_t *node = NULL;
15147 struct in_addr ip4;
15149 if (VAT_JSON_ARRAY != vam->json_tree.type)
15151 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15152 vat_json_init_array (&vam->json_tree);
15154 node = vat_json_array_add (&vam->json_tree);
15156 vat_json_init_object (node);
15157 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15158 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15159 vat_json_object_add_ip4 (node, "src_address", ip4);
15160 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15161 vat_json_object_add_ip4 (node, "dst_address", ip4);
15162 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15163 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15167 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15169 unformat_input_t *i = vam->input;
15170 vl_api_ipsec_gre_tunnel_dump_t *mp;
15173 u8 sw_if_index_set = 0;
15175 /* Parse args required to build the message */
15176 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15178 if (unformat (i, "sw_if_index %d", &sw_if_index))
15179 sw_if_index_set = 1;
15184 if (sw_if_index_set == 0)
15189 if (!vam->json_output)
15191 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15192 "sw_if_index", "src_address", "dst_address",
15193 "local_sa_id", "remote_sa_id");
15196 /* Get list of gre-tunnel interfaces */
15197 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15199 mp->sw_if_index = htonl (sw_if_index);
15203 /* Use a control ping for synchronization */
15205 vl_api_control_ping_t *mp;
15206 M (CONTROL_PING, control_ping);
15213 q_or_quit (vat_main_t * vam)
15215 longjmp (vam->jump_buf, 1);
15216 return 0; /* not so much */
15220 q (vat_main_t * vam)
15222 return q_or_quit (vam);
15226 quit (vat_main_t * vam)
15228 return q_or_quit (vam);
15232 comment (vat_main_t * vam)
15238 cmd_cmp (void *a1, void *a2)
15243 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15247 help (vat_main_t * vam)
15252 unformat_input_t *i = vam->input;
15255 if (unformat (i, "%s", &name))
15259 vec_add1 (name, 0);
15261 hs = hash_get_mem (vam->help_by_name, name);
15263 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15265 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15270 fformat (vam->ofp, "Help is available for the following:\n");
15273 hash_foreach_pair (p, vam->function_by_name,
15275 vec_add1 (cmds, (u8 *)(p->key));
15279 vec_sort_with_function (cmds, cmd_cmp);
15281 for (j = 0; j < vec_len (cmds); j++)
15282 fformat (vam->ofp, "%s\n", cmds[j]);
15289 set (vat_main_t * vam)
15291 u8 *name = 0, *value = 0;
15292 unformat_input_t *i = vam->input;
15294 if (unformat (i, "%s", &name))
15296 /* The input buffer is a vector, not a string. */
15297 value = vec_dup (i->buffer);
15298 vec_delete (value, i->index, 0);
15299 /* Almost certainly has a trailing newline */
15300 if (value[vec_len (value) - 1] == '\n')
15301 value[vec_len (value) - 1] = 0;
15302 /* Make sure it's a proper string, one way or the other */
15303 vec_add1 (value, 0);
15304 (void) clib_macro_set_value (&vam->macro_main,
15305 (char *) name, (char *) value);
15308 errmsg ("usage: set <name> <value>\n");
15316 unset (vat_main_t * vam)
15320 if (unformat (vam->input, "%s", &name))
15321 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
15322 errmsg ("unset: %s wasn't set\n", name);
15335 macro_sort_cmp (void *a1, void *a2)
15337 macro_sort_t *s1 = a1;
15338 macro_sort_t *s2 = a2;
15340 return strcmp ((char *) (s1->name), (char *) (s2->name));
15344 dump_macro_table (vat_main_t * vam)
15346 macro_sort_t *sort_me = 0, *sm;
15351 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
15353 vec_add2 (sort_me, sm, 1);
15354 sm->name = (u8 *)(p->key);
15355 sm->value = (u8 *) (p->value[0]);
15359 vec_sort_with_function (sort_me, macro_sort_cmp);
15361 if (vec_len (sort_me))
15362 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
15364 fformat (vam->ofp, "The macro table is empty...\n");
15366 for (i = 0; i < vec_len (sort_me); i++)
15367 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
15372 dump_node_table (vat_main_t * vam)
15375 vlib_node_t *node, *next_node;
15377 if (vec_len (vam->graph_nodes) == 0)
15379 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15383 for (i = 0; i < vec_len (vam->graph_nodes); i++)
15385 node = vam->graph_nodes[i];
15386 fformat (vam->ofp, "[%d] %s\n", i, node->name);
15387 for (j = 0; j < vec_len (node->next_nodes); j++)
15389 if (node->next_nodes[j] != ~0)
15391 next_node = vam->graph_nodes[node->next_nodes[j]];
15392 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15400 search_node_table (vat_main_t * vam)
15402 unformat_input_t *line_input = vam->input;
15405 vlib_node_t *node, *next_node;
15408 if (vam->graph_node_index_by_name == 0)
15410 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15414 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15416 if (unformat (line_input, "%s", &node_to_find))
15418 vec_add1 (node_to_find, 0);
15419 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
15422 fformat (vam->ofp, "%s not found...\n", node_to_find);
15425 node = vam->graph_nodes[p[0]];
15426 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
15427 for (j = 0; j < vec_len (node->next_nodes); j++)
15429 if (node->next_nodes[j] != ~0)
15431 next_node = vam->graph_nodes[node->next_nodes[j]];
15432 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15439 clib_warning ("parse error '%U'", format_unformat_error,
15445 vec_free (node_to_find);
15454 script (vat_main_t * vam)
15457 char *save_current_file;
15458 unformat_input_t save_input;
15459 jmp_buf save_jump_buf;
15460 u32 save_line_number;
15462 FILE *new_fp, *save_ifp;
15464 if (unformat (vam->input, "%s", &s))
15466 new_fp = fopen ((char *) s, "r");
15469 errmsg ("Couldn't open script file %s\n", s);
15476 errmsg ("Missing script name\n");
15480 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
15481 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
15482 save_ifp = vam->ifp;
15483 save_line_number = vam->input_line_number;
15484 save_current_file = (char *) vam->current_file;
15486 vam->input_line_number = 0;
15488 vam->current_file = s;
15491 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
15492 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
15493 vam->ifp = save_ifp;
15494 vam->input_line_number = save_line_number;
15495 vam->current_file = (u8 *) save_current_file;
15502 echo (vat_main_t * vam)
15504 fformat (vam->ofp, "%v", vam->input->buffer);
15508 /* List of API message constructors, CLI names map to api_xxx */
15509 #define foreach_vpe_api_msg \
15510 _(create_loopback,"[mac <mac-addr>]") \
15511 _(sw_interface_dump,"") \
15512 _(sw_interface_set_flags, \
15513 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
15514 _(sw_interface_add_del_address, \
15515 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
15516 _(sw_interface_set_table, \
15517 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
15518 _(sw_interface_set_vpath, \
15519 "<intfc> | sw_if_index <id> enable | disable") \
15520 _(sw_interface_set_l2_xconnect, \
15521 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15522 "enable | disable") \
15523 _(sw_interface_set_l2_bridge, \
15524 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
15525 "[shg <split-horizon-group>] [bvi]\n" \
15526 "enable | disable") \
15527 _(bridge_domain_add_del, \
15528 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
15529 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
15531 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
15533 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
15535 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
15537 "tapname <name> mac <mac-addr> | random-mac") \
15539 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
15541 "<vpp-if-name> | sw_if_index <id>") \
15542 _(sw_interface_tap_dump, "") \
15543 _(ip_add_del_route, \
15544 "<addr>/<mask> via <addr> [vrf <n>]\n" \
15545 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
15546 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
15547 "[multipath] [count <n>]") \
15548 _(proxy_arp_add_del, \
15549 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
15550 _(proxy_arp_intfc_enable_disable, \
15551 "<intfc> | sw_if_index <id> enable | disable") \
15552 _(mpls_add_del_encap, \
15553 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
15554 _(mpls_add_del_decap, \
15555 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
15556 _(mpls_gre_add_del_tunnel, \
15557 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
15558 "adj <ip4-address>/<mask-width> [del]") \
15559 _(sw_interface_set_unnumbered, \
15560 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
15561 _(ip_neighbor_add_del, \
15562 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
15563 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
15564 _(reset_vrf, "vrf <id> [ipv6]") \
15565 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
15566 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
15567 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
15568 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
15569 "[outer_vlan_id_any][inner_vlan_id_any]") \
15570 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
15571 _(reset_fib, "vrf <n> [ipv6]") \
15572 _(dhcp_proxy_config, \
15573 "svr <v46-address> src <v46-address>\n" \
15574 "insert-cid <n> [del]") \
15575 _(dhcp_proxy_config_2, \
15576 "svr <v46-address> src <v46-address>\n" \
15577 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
15578 _(dhcp_proxy_set_vss, \
15579 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
15580 _(dhcp_client_config, \
15581 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
15582 _(set_ip_flow_hash, \
15583 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
15584 _(sw_interface_ip6_enable_disable, \
15585 "<intfc> | sw_if_index <id> enable | disable") \
15586 _(sw_interface_ip6_set_link_local_address, \
15587 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
15588 _(sw_interface_ip6nd_ra_prefix, \
15589 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
15590 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
15591 "[nolink] [isno]") \
15592 _(sw_interface_ip6nd_ra_config, \
15593 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
15594 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
15595 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
15596 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
15597 _(l2_patch_add_del, \
15598 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15599 "enable | disable") \
15600 _(mpls_ethernet_add_del_tunnel, \
15601 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
15602 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
15603 _(mpls_ethernet_add_del_tunnel_2, \
15604 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
15605 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
15606 _(sr_tunnel_add_del, \
15607 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
15608 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
15609 "[policy <policy_name>]") \
15610 _(sr_policy_add_del, \
15611 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
15612 _(sr_multicast_map_add_del, \
15613 "address [ip6 multicast address] sr-policy [policy name] [del]") \
15614 _(classify_add_del_table, \
15615 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
15616 "[del] mask <mask-value>\n" \
15617 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
15618 _(classify_add_del_session, \
15619 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
15620 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
15621 " [l3 [ip4|ip6]]") \
15622 _(classify_set_interface_ip_table, \
15623 "<intfc> | sw_if_index <nn> table <nn>") \
15624 _(classify_set_interface_l2_tables, \
15625 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15626 " [other-table <nn>]") \
15627 _(get_node_index, "node <node-name") \
15628 _(add_node_next, "node <node-name> next <next-node-name>") \
15629 _(l2tpv3_create_tunnel, \
15630 "client_address <ip6-addr> our_address <ip6-addr>\n" \
15631 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
15632 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
15633 _(l2tpv3_set_tunnel_cookies, \
15634 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
15635 "[new_remote_cookie <nn>]\n") \
15636 _(l2tpv3_interface_enable_disable, \
15637 "<intfc> | sw_if_index <nn> enable | disable") \
15638 _(l2tpv3_set_lookup_key, \
15639 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
15640 _(sw_if_l2tpv3_tunnel_dump, "") \
15641 _(vxlan_add_del_tunnel, \
15642 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
15643 " [decap-next l2|ip4|ip6] [del]") \
15644 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15645 _(gre_add_del_tunnel, \
15646 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
15647 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15648 _(l2_fib_clear_table, "") \
15649 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
15650 _(l2_interface_vlan_tag_rewrite, \
15651 "<intfc> | sw_if_index <nn> \n" \
15652 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
15653 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
15654 _(create_vhost_user_if, \
15655 "socket <filename> [server] [renumber <dev_instance>] " \
15656 "[mac <mac_address>]") \
15657 _(modify_vhost_user_if, \
15658 "<intfc> | sw_if_index <nn> socket <filename>\n" \
15659 "[server] [renumber <dev_instance>]") \
15660 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
15661 _(sw_interface_vhost_user_dump, "") \
15662 _(show_version, "") \
15663 _(vxlan_gpe_add_del_tunnel, \
15664 "local <addr> remote <addr> vni <nn>\n" \
15665 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
15666 "[next-ethernet] [next-nsh]\n") \
15667 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15668 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
15669 _(interface_name_renumber, \
15670 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
15671 _(input_acl_set_interface, \
15672 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15673 " [l2-table <nn>] [del]") \
15674 _(want_ip4_arp_events, "address <ip4-address> [del]") \
15675 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
15676 _(ip_dump, "ipv4 | ipv6") \
15677 _(ipsec_spd_add_del, "spd_id <n> [del]") \
15678 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
15680 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
15681 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
15682 " integ_alg <alg> integ_key <hex>") \
15683 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
15684 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
15685 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
15686 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
15687 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
15688 _(ikev2_profile_add_del, "name <profile_name> [del]") \
15689 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
15690 "(auth_data 0x<data> | auth_data <data>)") \
15691 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
15692 "(id_data 0x<data> | id_data <data>) (local|remote)") \
15693 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
15694 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
15695 "(local|remote)") \
15696 _(ikev2_set_local_key, "file <absolute_file_path>") \
15697 _(delete_loopback,"sw_if_index <nn>") \
15698 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
15699 _(map_add_domain, \
15700 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
15701 "ip6-src <ip6addr> " \
15702 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
15703 _(map_del_domain, "index <n>") \
15704 _(map_add_del_rule, \
15705 "index <n> psid <n> dst <ip6addr> [del]") \
15706 _(map_domain_dump, "") \
15707 _(map_rule_dump, "index <map-domain>") \
15708 _(want_interface_events, "enable|disable") \
15709 _(want_stats,"enable|disable") \
15710 _(get_first_msg_id, "client <name>") \
15711 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
15712 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
15713 "fib-id <nn> [ip4][ip6][default]") \
15714 _(get_node_graph, " ") \
15715 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
15716 _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> " \
15717 "trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> " \
15718 "app-data <app_data in hex> [pow] [ppc <encap|decap>]") \
15719 _(trace_profile_apply, "id <nn> <ip6-address>/<width>" \
15720 " vrf_id <nn> add | pop | none") \
15721 _(trace_profile_del, "") \
15722 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
15723 " sw_if_index <sw_if_index> p <priority> " \
15724 "w <weight>] [del]") \
15725 _(lisp_add_del_locator, "locator-set <locator_name> " \
15726 "iface <intf> | sw_if_index <sw_if_index> " \
15727 "p <priority> w <weight> [del]") \
15728 _(lisp_add_del_local_eid,"vni <vni> eid " \
15729 "<ipv4|ipv6>/<prefix> | <L2 address> " \
15730 "locator-set <locator_name> [del]") \
15731 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
15732 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
15733 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
15734 _(lisp_gpe_enable_disable, "enable|disable") \
15735 _(lisp_enable_disable, "enable|disable") \
15736 _(lisp_gpe_add_del_iface, "up|down") \
15737 _(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> " \
15738 "rloc <locator> p <prio> " \
15739 "w <weight> [rloc <loc> ... ] " \
15740 "action <action> [del-all]") \
15741 _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
15742 "<src-eid> rloc <locator> p <prio> w <weight>"\
15743 "[rloc <loc> ... ] action <action>") \
15744 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
15745 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
15746 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
15747 _(lisp_locator_set_dump, "[locator-set-index <ls-index> | " \
15748 "locator-set <loc-set-name>] [local | remote]")\
15749 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
15750 "[local] | [remote]") \
15751 _(lisp_eid_table_vni_dump, "") \
15752 _(lisp_eid_table_map_dump, "l2|l3") \
15753 _(lisp_gpe_tunnel_dump, "") \
15754 _(lisp_map_resolver_dump, "") \
15755 _(show_lisp_status, "") \
15756 _(lisp_get_map_request_itr_rlocs, "") \
15757 _(show_lisp_pitr, "") \
15758 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
15759 _(af_packet_delete, "name <host interface name>") \
15760 _(policer_add_del, "name <policer name> <params> [del]") \
15761 _(policer_dump, "[name <policer name>]") \
15762 _(policer_classify_set_interface, \
15763 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15764 " [l2-table <nn>] [del]") \
15765 _(policer_classify_dump, "type [ip4|ip6|l2]") \
15766 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
15767 "[master|slave]") \
15768 _(netmap_delete, "name <interface name>") \
15769 _(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
15770 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
15771 _(mpls_fib_encap_dump, "") \
15772 _(mpls_fib_decap_dump, "") \
15773 _(classify_table_ids, "") \
15774 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
15775 _(classify_table_info, "table_id <nn>") \
15776 _(classify_session_dump, "table_id <nn>") \
15777 _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \
15778 "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \
15779 "[template_interval <nn>]") \
15780 _(ipfix_dump, "") \
15781 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
15782 _(pg_create_interface, "if_id <nn>") \
15783 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
15784 _(pg_enable_disable, "[stream <id>] disable") \
15785 _(ip_source_and_port_range_check_add_del, \
15786 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
15787 _(ip_source_and_port_range_check_interface_add_del, \
15788 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
15789 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
15790 _(ipsec_gre_add_del_tunnel, \
15791 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
15792 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]")
15794 /* List of command functions, CLI names map directly to functions */
15795 #define foreach_cli_function \
15796 _(comment, "usage: comment <ignore-rest-of-line>") \
15797 _(dump_interface_table, "usage: dump_interface_table") \
15798 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
15799 _(dump_ipv4_table, "usage: dump_ipv4_table") \
15800 _(dump_ipv6_table, "usage: dump_ipv6_table") \
15801 _(dump_stats_table, "usage: dump_stats_table") \
15802 _(dump_macro_table, "usage: dump_macro_table ") \
15803 _(dump_node_table, "usage: dump_node_table") \
15804 _(echo, "usage: echo <message>") \
15805 _(exec, "usage: exec <vpe-debug-CLI-command>") \
15806 _(help, "usage: help") \
15807 _(q, "usage: quit") \
15808 _(quit, "usage: quit") \
15809 _(search_node_table, "usage: search_node_table <name>...") \
15810 _(set, "usage: set <variable-name> <value>") \
15811 _(script, "usage: script <file-name>") \
15812 _(unset, "usage: unset <variable-name>")
15815 static void vl_api_##n##_t_handler_uni \
15816 (vl_api_##n##_t * mp) \
15818 vat_main_t * vam = &vat_main; \
15819 if (vam->json_output) { \
15820 vl_api_##n##_t_handler_json(mp); \
15822 vl_api_##n##_t_handler(mp); \
15825 foreach_vpe_api_reply_msg;
15829 vat_api_hookup (vat_main_t * vam)
15832 vl_msg_api_set_handlers(VL_API_##N, #n, \
15833 vl_api_##n##_t_handler_uni, \
15835 vl_api_##n##_t_endian, \
15836 vl_api_##n##_t_print, \
15837 sizeof(vl_api_##n##_t), 1);
15838 foreach_vpe_api_reply_msg;
15841 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
15843 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
15845 vam->function_by_name = hash_create_string (0, sizeof (uword));
15847 vam->help_by_name = hash_create_string (0, sizeof (uword));
15849 /* API messages we can send */
15850 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
15851 foreach_vpe_api_msg;
15855 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
15856 foreach_vpe_api_msg;
15859 /* CLI functions */
15860 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
15861 foreach_cli_function;
15865 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
15866 foreach_cli_function;
15870 #undef vl_api_version
15871 #define vl_api_version(n,v) static u32 vpe_api_version = v;
15872 #include <vpp-api/vpe.api.h>
15873 #undef vl_api_version
15876 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
15879 * Send the main API signature in slot 0. This bit of code must
15880 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
15882 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
15886 * fd.io coding-style-patch-verification: ON
15889 * eval: (c-set-style "gnu")