2 *------------------------------------------------------------------
5 * Copyright (c) 2014 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
21 #include <vlibapi/api.h>
22 #include <vlibmemory/api.h>
23 #include <vlibsocket/api.h>
24 #include <vnet/ip/ip.h>
25 #include <vnet/sr/sr_packet.h>
26 #include <vnet/l2/l2_input.h>
27 #include <vnet/l2tp/l2tp.h>
28 #include <vnet/vxlan/vxlan.h>
29 #include <vnet/gre/gre.h>
30 #include <vnet/vxlan-gpe/vxlan_gpe.h>
31 #include <vnet/lisp-gpe/lisp_gpe.h>
33 #include <vpp-api/vpe_msg_enum.h>
34 #include <vnet/l2/l2_classify.h>
35 #include <vnet/l2/l2_vtr.h>
36 #include <vnet/classify/input_acl.h>
37 #include <vnet/classify/policer_classify.h>
38 #include <vnet/mpls-gre/mpls.h>
40 #include <vnet/ipsec/ipsec.h>
41 #include <vnet/ipsec/ikev2.h>
45 #include <vnet/map/map.h>
46 #include <vnet/cop/cop.h>
47 #include <vnet/ip/ip6_hop_by_hop.h>
48 #include <vnet/ip/ip_source_and_port_range_check.h>
49 #include <vnet/policer/xlate.h>
50 #include <vnet/policer/policer.h>
51 #include <vnet/policer/police.h>
53 #include "vat/json_format.h"
57 #define vl_typedefs /* define message structures */
58 #include <vpp-api/vpe_all_api_h.h>
61 /* declare message handlers for each api */
63 #define vl_endianfun /* define message structures */
64 #include <vpp-api/vpe_all_api_h.h>
67 /* instantiate all the print functions we know about */
68 #define vl_print(handle, ...)
70 #include <vpp-api/vpe_all_api_h.h>
74 unformat_sw_if_index (unformat_input_t * input, va_list * args)
76 vat_main_t *vam = va_arg (*args, vat_main_t *);
77 u32 *result = va_arg (*args, u32 *);
81 if (!unformat (input, "%s", &if_name))
84 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
91 /* Parse an IP4 address %d.%d.%d.%d. */
93 unformat_ip4_address (unformat_input_t * input, va_list * args)
95 u8 *result = va_arg (*args, u8 *);
98 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
101 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
114 unformat_ethernet_address (unformat_input_t * input, va_list * args)
116 u8 *result = va_arg (*args, u8 *);
119 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
120 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
124 for (i = 0; i < 6; i++)
125 if (a[i] >= (1 << 8))
128 for (i = 0; i < 6; i++)
134 /* Returns ethernet type as an int in host byte order. */
136 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
139 u16 *result = va_arg (*args, u16 *);
143 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
145 if (type >= (1 << 16))
153 /* Parse an IP6 address. */
155 unformat_ip6_address (unformat_input_t * input, va_list * args)
157 ip6_address_t *result = va_arg (*args, ip6_address_t *);
159 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
160 uword c, n_colon, double_colon_index;
162 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
163 double_colon_index = ARRAY_LEN (hex_quads);
164 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
167 if (c >= '0' && c <= '9')
169 else if (c >= 'a' && c <= 'f')
170 hex_digit = c + 10 - 'a';
171 else if (c >= 'A' && c <= 'F')
172 hex_digit = c + 10 - 'A';
173 else if (c == ':' && n_colon < 2)
177 unformat_put_input (input);
181 /* Too many hex quads. */
182 if (n_hex_quads >= ARRAY_LEN (hex_quads))
187 hex_quad = (hex_quad << 4) | hex_digit;
189 /* Hex quad must fit in 16 bits. */
190 if (n_hex_digits >= 4)
197 /* Save position of :: */
200 /* More than one :: ? */
201 if (double_colon_index < ARRAY_LEN (hex_quads))
203 double_colon_index = n_hex_quads;
206 if (n_colon > 0 && n_hex_digits > 0)
208 hex_quads[n_hex_quads++] = hex_quad;
214 if (n_hex_digits > 0)
215 hex_quads[n_hex_quads++] = hex_quad;
220 /* Expand :: to appropriate number of zero hex quads. */
221 if (double_colon_index < ARRAY_LEN (hex_quads))
223 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
225 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
226 hex_quads[n_zero + i] = hex_quads[i];
228 for (i = 0; i < n_zero; i++)
229 hex_quads[double_colon_index + i] = 0;
231 n_hex_quads = ARRAY_LEN (hex_quads);
234 /* Too few hex quads given. */
235 if (n_hex_quads < ARRAY_LEN (hex_quads))
238 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
239 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
246 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
249 u32 *r = va_arg (*args, u32 *);
252 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
253 foreach_ipsec_policy_action
264 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
267 u32 *r = va_arg (*args, u32 *);
270 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
271 foreach_ipsec_crypto_alg
282 format_ipsec_crypto_alg (u8 * s, va_list * args)
285 u32 i = va_arg (*args, u32);
290 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
291 foreach_ipsec_crypto_alg
294 return format (s, "unknown");
296 return format (s, "%s", t);
298 return format (s, "Unimplemented");
303 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
306 u32 *r = va_arg (*args, u32 *);
309 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
310 foreach_ipsec_integ_alg
321 format_ipsec_integ_alg (u8 * s, va_list * args)
324 u32 i = va_arg (*args, u32);
329 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
330 foreach_ipsec_integ_alg
333 return format (s, "unknown");
335 return format (s, "%s", t);
337 return format (s, "Unsupported");
342 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
345 u32 *r = va_arg (*args, u32 *);
348 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
349 foreach_ikev2_auth_method
360 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
363 u32 *r = va_arg (*args, u32 *);
366 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
367 foreach_ikev2_id_type
378 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
380 u8 *r = va_arg (*args, u8 *);
382 if (unformat (input, "kbps"))
383 *r = SSE2_QOS_RATE_KBPS;
384 else if (unformat (input, "pps"))
385 *r = SSE2_QOS_RATE_PPS;
392 unformat_policer_round_type (unformat_input_t * input, va_list * args)
394 u8 *r = va_arg (*args, u8 *);
396 if (unformat (input, "closest"))
397 *r = SSE2_QOS_ROUND_TO_CLOSEST;
398 else if (unformat (input, "up"))
399 *r = SSE2_QOS_ROUND_TO_UP;
400 else if (unformat (input, "down"))
401 *r = SSE2_QOS_ROUND_TO_DOWN;
408 unformat_policer_type (unformat_input_t * input, va_list * args)
410 u8 *r = va_arg (*args, u8 *);
412 if (unformat (input, "1r2c"))
413 *r = SSE2_QOS_POLICER_TYPE_1R2C;
414 else if (unformat (input, "1r3c"))
415 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
416 else if (unformat (input, "2r3c-2698"))
417 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
418 else if (unformat (input, "2r3c-4115"))
419 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
420 else if (unformat (input, "2r3c-mef5cf1"))
421 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
428 unformat_dscp (unformat_input_t * input, va_list * va)
430 u8 *r = va_arg (*va, u8 *);
433 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
442 unformat_policer_action_type (unformat_input_t * input, va_list * va)
444 sse2_qos_pol_action_params_st *a
445 = va_arg (*va, sse2_qos_pol_action_params_st *);
447 if (unformat (input, "drop"))
448 a->action_type = SSE2_QOS_ACTION_DROP;
449 else if (unformat (input, "transmit"))
450 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
451 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
452 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
459 unformat_classify_table_type (unformat_input_t * input, va_list * va)
461 u32 *r = va_arg (*va, u32 *);
464 if (unformat (input, "ip4"))
465 tid = POLICER_CLASSIFY_TABLE_IP4;
466 else if (unformat (input, "ip6"))
467 tid = POLICER_CLASSIFY_TABLE_IP6;
468 else if (unformat (input, "l2"))
469 tid = POLICER_CLASSIFY_TABLE_L2;
478 format_ip4_address (u8 * s, va_list * args)
480 u8 *a = va_arg (*args, u8 *);
481 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
485 format_ip6_address (u8 * s, va_list * args)
487 ip6_address_t *a = va_arg (*args, ip6_address_t *);
488 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
490 i_max_n_zero = ARRAY_LEN (a->as_u16);
492 i_first_zero = i_max_n_zero;
494 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
496 u32 is_zero = a->as_u16[i] == 0;
497 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
503 if ((!is_zero && n_zeros > max_n_zeros)
504 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
506 i_max_n_zero = i_first_zero;
507 max_n_zeros = n_zeros;
508 i_first_zero = ARRAY_LEN (a->as_u16);
513 last_double_colon = 0;
514 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
516 if (i == i_max_n_zero && max_n_zeros > 1)
518 s = format (s, "::");
519 i += max_n_zeros - 1;
520 last_double_colon = 1;
524 s = format (s, "%s%x",
525 (last_double_colon || i == 0) ? "" : ":",
526 clib_net_to_host_u16 (a->as_u16[i]));
527 last_double_colon = 0;
534 /* Format an IP46 address. */
536 format_ip46_address (u8 * s, va_list * args)
538 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
539 ip46_type_t type = va_arg (*args, ip46_type_t);
545 is_ip4 = ip46_address_is_ip4 (ip46);
556 format (s, "%U", format_ip4_address, &ip46->ip4) :
557 format (s, "%U", format_ip6_address, &ip46->ip6);
561 format_ethernet_address (u8 * s, va_list * args)
563 u8 *a = va_arg (*args, u8 *);
565 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
566 a[0], a[1], a[2], a[3], a[4], a[5]);
570 increment_v4_address (ip4_address_t * a)
574 v = ntohl (a->as_u32) + 1;
575 a->as_u32 = ntohl (v);
579 increment_v6_address (ip6_address_t * a)
583 v0 = clib_net_to_host_u64 (a->as_u64[0]);
584 v1 = clib_net_to_host_u64 (a->as_u64[1]);
589 a->as_u64[0] = clib_net_to_host_u64 (v0);
590 a->as_u64[1] = clib_net_to_host_u64 (v1);
594 increment_mac_address (u64 * mac)
598 tmp = clib_net_to_host_u64 (tmp);
599 tmp += 1 << 16; /* skip unused (least significant) octets */
600 tmp = clib_host_to_net_u64 (tmp);
604 static void vl_api_create_loopback_reply_t_handler
605 (vl_api_create_loopback_reply_t * mp)
607 vat_main_t *vam = &vat_main;
608 i32 retval = ntohl (mp->retval);
610 vam->retval = retval;
611 vam->regenerate_interface_table = 1;
612 vam->sw_if_index = ntohl (mp->sw_if_index);
613 vam->result_ready = 1;
616 static void vl_api_create_loopback_reply_t_handler_json
617 (vl_api_create_loopback_reply_t * mp)
619 vat_main_t *vam = &vat_main;
620 vat_json_node_t node;
622 vat_json_init_object (&node);
623 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
624 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
626 vat_json_print (vam->ofp, &node);
627 vat_json_free (&node);
628 vam->retval = ntohl (mp->retval);
629 vam->result_ready = 1;
632 static void vl_api_af_packet_create_reply_t_handler
633 (vl_api_af_packet_create_reply_t * mp)
635 vat_main_t *vam = &vat_main;
636 i32 retval = ntohl (mp->retval);
638 vam->retval = retval;
639 vam->regenerate_interface_table = 1;
640 vam->sw_if_index = ntohl (mp->sw_if_index);
641 vam->result_ready = 1;
644 static void vl_api_af_packet_create_reply_t_handler_json
645 (vl_api_af_packet_create_reply_t * mp)
647 vat_main_t *vam = &vat_main;
648 vat_json_node_t node;
650 vat_json_init_object (&node);
651 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
652 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
654 vat_json_print (vam->ofp, &node);
655 vat_json_free (&node);
657 vam->retval = ntohl (mp->retval);
658 vam->result_ready = 1;
661 static void vl_api_create_vlan_subif_reply_t_handler
662 (vl_api_create_vlan_subif_reply_t * mp)
664 vat_main_t *vam = &vat_main;
665 i32 retval = ntohl (mp->retval);
667 vam->retval = retval;
668 vam->regenerate_interface_table = 1;
669 vam->sw_if_index = ntohl (mp->sw_if_index);
670 vam->result_ready = 1;
673 static void vl_api_create_vlan_subif_reply_t_handler_json
674 (vl_api_create_vlan_subif_reply_t * mp)
676 vat_main_t *vam = &vat_main;
677 vat_json_node_t node;
679 vat_json_init_object (&node);
680 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
681 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
683 vat_json_print (vam->ofp, &node);
684 vat_json_free (&node);
686 vam->retval = ntohl (mp->retval);
687 vam->result_ready = 1;
690 static void vl_api_create_subif_reply_t_handler
691 (vl_api_create_subif_reply_t * mp)
693 vat_main_t *vam = &vat_main;
694 i32 retval = ntohl (mp->retval);
696 vam->retval = retval;
697 vam->regenerate_interface_table = 1;
698 vam->sw_if_index = ntohl (mp->sw_if_index);
699 vam->result_ready = 1;
702 static void vl_api_create_subif_reply_t_handler_json
703 (vl_api_create_subif_reply_t * mp)
705 vat_main_t *vam = &vat_main;
706 vat_json_node_t node;
708 vat_json_init_object (&node);
709 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
710 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
712 vat_json_print (vam->ofp, &node);
713 vat_json_free (&node);
715 vam->retval = ntohl (mp->retval);
716 vam->result_ready = 1;
719 static void vl_api_interface_name_renumber_reply_t_handler
720 (vl_api_interface_name_renumber_reply_t * mp)
722 vat_main_t *vam = &vat_main;
723 i32 retval = ntohl (mp->retval);
725 vam->retval = retval;
726 vam->regenerate_interface_table = 1;
727 vam->result_ready = 1;
730 static void vl_api_interface_name_renumber_reply_t_handler_json
731 (vl_api_interface_name_renumber_reply_t * mp)
733 vat_main_t *vam = &vat_main;
734 vat_json_node_t node;
736 vat_json_init_object (&node);
737 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
739 vat_json_print (vam->ofp, &node);
740 vat_json_free (&node);
742 vam->retval = ntohl (mp->retval);
743 vam->result_ready = 1;
747 * Special-case: build the interface table, maintain
748 * the next loopback sw_if_index vbl.
750 static void vl_api_sw_interface_details_t_handler
751 (vl_api_sw_interface_details_t * mp)
753 vat_main_t *vam = &vat_main;
754 u8 *s = format (0, "%s%c", mp->interface_name, 0);
756 hash_set_mem (vam->sw_if_index_by_interface_name, s,
757 ntohl (mp->sw_if_index));
759 /* In sub interface case, fill the sub interface table entry */
760 if (mp->sw_if_index != mp->sup_sw_if_index)
762 sw_interface_subif_t *sub = NULL;
764 vec_add2 (vam->sw_if_subif_table, sub, 1);
766 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
767 strncpy ((char *) sub->interface_name, (char *) s,
768 vec_len (sub->interface_name));
769 sub->sw_if_index = ntohl (mp->sw_if_index);
770 sub->sub_id = ntohl (mp->sub_id);
772 sub->sub_dot1ad = mp->sub_dot1ad;
773 sub->sub_number_of_tags = mp->sub_number_of_tags;
774 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
775 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
776 sub->sub_exact_match = mp->sub_exact_match;
777 sub->sub_default = mp->sub_default;
778 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
779 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
781 /* vlan tag rewrite */
782 sub->vtr_op = ntohl (mp->vtr_op);
783 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
784 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
785 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
789 static void vl_api_sw_interface_details_t_handler_json
790 (vl_api_sw_interface_details_t * mp)
792 vat_main_t *vam = &vat_main;
793 vat_json_node_t *node = NULL;
795 if (VAT_JSON_ARRAY != vam->json_tree.type)
797 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
798 vat_json_init_array (&vam->json_tree);
800 node = vat_json_array_add (&vam->json_tree);
802 vat_json_init_object (node);
803 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
804 vat_json_object_add_uint (node, "sup_sw_if_index",
805 ntohl (mp->sup_sw_if_index));
806 vat_json_object_add_uint (node, "l2_address_length",
807 ntohl (mp->l2_address_length));
808 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
809 sizeof (mp->l2_address));
810 vat_json_object_add_string_copy (node, "interface_name",
812 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
813 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
814 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
815 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
816 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
817 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
818 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
819 vat_json_object_add_uint (node, "sub_number_of_tags",
820 mp->sub_number_of_tags);
821 vat_json_object_add_uint (node, "sub_outer_vlan_id",
822 ntohs (mp->sub_outer_vlan_id));
823 vat_json_object_add_uint (node, "sub_inner_vlan_id",
824 ntohs (mp->sub_inner_vlan_id));
825 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
826 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
827 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
828 mp->sub_outer_vlan_id_any);
829 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
830 mp->sub_inner_vlan_id_any);
831 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
832 vat_json_object_add_uint (node, "vtr_push_dot1q",
833 ntohl (mp->vtr_push_dot1q));
834 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
835 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
838 static void vl_api_sw_interface_set_flags_t_handler
839 (vl_api_sw_interface_set_flags_t * mp)
841 vat_main_t *vam = &vat_main;
842 if (vam->interface_event_display)
843 errmsg ("interface flags: sw_if_index %d %s %s\n",
844 ntohl (mp->sw_if_index),
845 mp->admin_up_down ? "admin-up" : "admin-down",
846 mp->link_up_down ? "link-up" : "link-down");
849 static void vl_api_sw_interface_set_flags_t_handler_json
850 (vl_api_sw_interface_set_flags_t * mp)
852 /* JSON output not supported */
856 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
858 vat_main_t *vam = &vat_main;
859 i32 retval = ntohl (mp->retval);
861 vam->retval = retval;
862 vam->shmem_result = (u8 *) mp->reply_in_shmem;
863 vam->result_ready = 1;
867 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
869 vat_main_t *vam = &vat_main;
870 vat_json_node_t node;
871 api_main_t *am = &api_main;
875 vat_json_init_object (&node);
876 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
877 vat_json_object_add_uint (&node, "reply_in_shmem",
878 ntohl (mp->reply_in_shmem));
879 /* Toss the shared-memory original... */
880 pthread_mutex_lock (&am->vlib_rp->mutex);
881 oldheap = svm_push_data_heap (am->vlib_rp);
883 reply = (u8 *) (mp->reply_in_shmem);
886 svm_pop_heap (oldheap);
887 pthread_mutex_unlock (&am->vlib_rp->mutex);
889 vat_json_print (vam->ofp, &node);
890 vat_json_free (&node);
892 vam->retval = ntohl (mp->retval);
893 vam->result_ready = 1;
897 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
899 vat_main_t *vam = &vat_main;
900 i32 retval = ntohl (mp->retval);
902 vam->retval = retval;
903 vam->cmd_reply = mp->reply;
904 vam->result_ready = 1;
908 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
910 vat_main_t *vam = &vat_main;
911 vat_json_node_t node;
913 vat_json_init_object (&node);
914 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
915 vat_json_object_add_string_copy (&node, "reply", mp->reply);
917 vat_json_print (vam->ofp, &node);
918 vat_json_free (&node);
920 vam->retval = ntohl (mp->retval);
921 vam->result_ready = 1;
924 static void vl_api_classify_add_del_table_reply_t_handler
925 (vl_api_classify_add_del_table_reply_t * mp)
927 vat_main_t *vam = &vat_main;
928 i32 retval = ntohl (mp->retval);
931 vam->async_errors += (retval < 0);
935 vam->retval = retval;
937 ((mp->new_table_index != 0xFFFFFFFF) ||
938 (mp->skip_n_vectors != 0xFFFFFFFF) ||
939 (mp->match_n_vectors != 0xFFFFFFFF)))
941 * Note: this is just barely thread-safe, depends on
942 * the main thread spinning waiting for an answer...
944 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
945 ntohl (mp->new_table_index),
946 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
947 vam->result_ready = 1;
951 static void vl_api_classify_add_del_table_reply_t_handler_json
952 (vl_api_classify_add_del_table_reply_t * mp)
954 vat_main_t *vam = &vat_main;
955 vat_json_node_t node;
957 vat_json_init_object (&node);
958 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
959 vat_json_object_add_uint (&node, "new_table_index",
960 ntohl (mp->new_table_index));
961 vat_json_object_add_uint (&node, "skip_n_vectors",
962 ntohl (mp->skip_n_vectors));
963 vat_json_object_add_uint (&node, "match_n_vectors",
964 ntohl (mp->match_n_vectors));
966 vat_json_print (vam->ofp, &node);
967 vat_json_free (&node);
969 vam->retval = ntohl (mp->retval);
970 vam->result_ready = 1;
973 static void vl_api_get_node_index_reply_t_handler
974 (vl_api_get_node_index_reply_t * mp)
976 vat_main_t *vam = &vat_main;
977 i32 retval = ntohl (mp->retval);
980 vam->async_errors += (retval < 0);
984 vam->retval = retval;
986 errmsg ("node index %d\n", ntohl (mp->node_index));
987 vam->result_ready = 1;
991 static void vl_api_get_node_index_reply_t_handler_json
992 (vl_api_get_node_index_reply_t * mp)
994 vat_main_t *vam = &vat_main;
995 vat_json_node_t node;
997 vat_json_init_object (&node);
998 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
999 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1001 vat_json_print (vam->ofp, &node);
1002 vat_json_free (&node);
1004 vam->retval = ntohl (mp->retval);
1005 vam->result_ready = 1;
1008 static void vl_api_get_next_index_reply_t_handler
1009 (vl_api_get_next_index_reply_t * mp)
1011 vat_main_t *vam = &vat_main;
1012 i32 retval = ntohl (mp->retval);
1013 if (vam->async_mode)
1015 vam->async_errors += (retval < 0);
1019 vam->retval = retval;
1021 errmsg ("next node index %d\n", ntohl (mp->next_index));
1022 vam->result_ready = 1;
1026 static void vl_api_get_next_index_reply_t_handler_json
1027 (vl_api_get_next_index_reply_t * mp)
1029 vat_main_t *vam = &vat_main;
1030 vat_json_node_t node;
1032 vat_json_init_object (&node);
1033 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1034 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1036 vat_json_print (vam->ofp, &node);
1037 vat_json_free (&node);
1039 vam->retval = ntohl (mp->retval);
1040 vam->result_ready = 1;
1043 static void vl_api_add_node_next_reply_t_handler
1044 (vl_api_add_node_next_reply_t * mp)
1046 vat_main_t *vam = &vat_main;
1047 i32 retval = ntohl (mp->retval);
1048 if (vam->async_mode)
1050 vam->async_errors += (retval < 0);
1054 vam->retval = retval;
1056 errmsg ("next index %d\n", ntohl (mp->next_index));
1057 vam->result_ready = 1;
1061 static void vl_api_add_node_next_reply_t_handler_json
1062 (vl_api_add_node_next_reply_t * mp)
1064 vat_main_t *vam = &vat_main;
1065 vat_json_node_t node;
1067 vat_json_init_object (&node);
1068 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1069 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1071 vat_json_print (vam->ofp, &node);
1072 vat_json_free (&node);
1074 vam->retval = ntohl (mp->retval);
1075 vam->result_ready = 1;
1078 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
1079 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1081 vat_main_t *vam = &vat_main;
1082 i32 retval = ntohl (mp->retval);
1083 u32 sw_if_index = ntohl (mp->tunnel_sw_if_index);
1085 if (retval >= 0 && sw_if_index != (u32) ~ 0)
1087 errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
1089 vam->retval = retval;
1090 vam->result_ready = 1;
1093 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
1094 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
1096 vat_main_t *vam = &vat_main;
1097 vat_json_node_t node;
1099 vat_json_init_object (&node);
1100 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1101 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1102 ntohl (mp->tunnel_sw_if_index));
1104 vat_json_print (vam->ofp, &node);
1105 vat_json_free (&node);
1107 vam->retval = ntohl (mp->retval);
1108 vam->result_ready = 1;
1112 static void vl_api_show_version_reply_t_handler
1113 (vl_api_show_version_reply_t * mp)
1115 vat_main_t *vam = &vat_main;
1116 i32 retval = ntohl (mp->retval);
1120 errmsg (" program: %s\n", mp->program);
1121 errmsg (" version: %s\n", mp->version);
1122 errmsg (" build date: %s\n", mp->build_date);
1123 errmsg ("build directory: %s\n", mp->build_directory);
1125 vam->retval = retval;
1126 vam->result_ready = 1;
1129 static void vl_api_show_version_reply_t_handler_json
1130 (vl_api_show_version_reply_t * mp)
1132 vat_main_t *vam = &vat_main;
1133 vat_json_node_t node;
1135 vat_json_init_object (&node);
1136 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1137 vat_json_object_add_string_copy (&node, "program", mp->program);
1138 vat_json_object_add_string_copy (&node, "version", mp->version);
1139 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1140 vat_json_object_add_string_copy (&node, "build_directory",
1141 mp->build_directory);
1143 vat_json_print (vam->ofp, &node);
1144 vat_json_free (&node);
1146 vam->retval = ntohl (mp->retval);
1147 vam->result_ready = 1;
1151 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1153 vat_main_t *vam = &vat_main;
1154 errmsg ("arp %s event: address %U new mac %U sw_if_index %d\n",
1155 mp->mac_ip ? "mac/ip binding" : "address resolution",
1156 format_ip4_address, &mp->address,
1157 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1161 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1163 /* JSON output not supported */
1167 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1169 vat_main_t *vam = &vat_main;
1170 errmsg ("ip6 nd %s event: address %U new mac %U sw_if_index %d\n",
1171 mp->mac_ip ? "mac/ip binding" : "address resolution",
1172 format_ip6_address, mp->address,
1173 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1177 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1179 /* JSON output not supported */
1183 * Special-case: build the bridge domain table, maintain
1184 * the next bd id vbl.
1186 static void vl_api_bridge_domain_details_t_handler
1187 (vl_api_bridge_domain_details_t * mp)
1189 vat_main_t *vam = &vat_main;
1190 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1192 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1193 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1195 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1196 ntohl (mp->bd_id), mp->learn, mp->forward,
1197 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1200 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1204 static void vl_api_bridge_domain_details_t_handler_json
1205 (vl_api_bridge_domain_details_t * mp)
1207 vat_main_t *vam = &vat_main;
1208 vat_json_node_t *node, *array = NULL;
1210 if (VAT_JSON_ARRAY != vam->json_tree.type)
1212 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1213 vat_json_init_array (&vam->json_tree);
1215 node = vat_json_array_add (&vam->json_tree);
1217 vat_json_init_object (node);
1218 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1219 vat_json_object_add_uint (node, "flood", mp->flood);
1220 vat_json_object_add_uint (node, "forward", mp->forward);
1221 vat_json_object_add_uint (node, "learn", mp->learn);
1222 vat_json_object_add_uint (node, "bvi_sw_if_index",
1223 ntohl (mp->bvi_sw_if_index));
1224 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1225 array = vat_json_object_add (node, "sw_if");
1226 vat_json_init_array (array);
1230 * Special-case: build the bridge domain sw if table.
1232 static void vl_api_bridge_domain_sw_if_details_t_handler
1233 (vl_api_bridge_domain_sw_if_details_t * mp)
1235 vat_main_t *vam = &vat_main;
1240 sw_if_index = ntohl (mp->sw_if_index);
1242 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1244 if ((u32) p->value[0] == sw_if_index)
1246 sw_if_name = (u8 *)(p->key);
1252 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1253 mp->shg, sw_if_name ? (char *) sw_if_name :
1254 "sw_if_index not found!");
1257 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1258 (vl_api_bridge_domain_sw_if_details_t * mp)
1260 vat_main_t *vam = &vat_main;
1261 vat_json_node_t *node = NULL;
1262 uword last_index = 0;
1264 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1265 ASSERT (vec_len (vam->json_tree.array) >= 1);
1266 last_index = vec_len (vam->json_tree.array) - 1;
1267 node = &vam->json_tree.array[last_index];
1268 node = vat_json_object_get_element (node, "sw_if");
1269 ASSERT (NULL != node);
1270 node = vat_json_array_add (node);
1272 vat_json_init_object (node);
1273 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1274 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1275 vat_json_object_add_uint (node, "shg", mp->shg);
1278 static void vl_api_control_ping_reply_t_handler
1279 (vl_api_control_ping_reply_t * mp)
1281 vat_main_t *vam = &vat_main;
1282 i32 retval = ntohl (mp->retval);
1283 if (vam->async_mode)
1285 vam->async_errors += (retval < 0);
1289 vam->retval = retval;
1290 vam->result_ready = 1;
1294 static void vl_api_control_ping_reply_t_handler_json
1295 (vl_api_control_ping_reply_t * mp)
1297 vat_main_t *vam = &vat_main;
1298 i32 retval = ntohl (mp->retval);
1300 if (VAT_JSON_NONE != vam->json_tree.type)
1302 vat_json_print (vam->ofp, &vam->json_tree);
1303 vat_json_free (&vam->json_tree);
1304 vam->json_tree.type = VAT_JSON_NONE;
1309 vat_json_init_array (&vam->json_tree);
1310 vat_json_print (vam->ofp, &vam->json_tree);
1311 vam->json_tree.type = VAT_JSON_NONE;
1314 vam->retval = retval;
1315 vam->result_ready = 1;
1318 static void vl_api_noprint_control_ping_reply_t_handler
1319 (vl_api_noprint_control_ping_reply_t * mp)
1321 vat_main_t *vam = &vat_main;
1322 i32 retval = ntohl (mp->retval);
1323 if (vam->async_mode)
1325 vam->async_errors += (retval < 0);
1329 vam->retval = retval;
1330 vam->result_ready = 1;
1334 static void vl_api_noprint_control_ping_reply_t_handler_json
1335 (vl_api_noprint_control_ping_reply_t * mp)
1337 vat_main_t *vam = &vat_main;
1338 i32 retval = ntohl (mp->retval);
1340 if (vam->noprint_msg)
1342 vam->retval = retval;
1343 vam->result_ready = 1;
1347 if (VAT_JSON_NONE != vam->json_tree.type)
1349 vat_json_print (vam->ofp, &vam->json_tree);
1350 vat_json_free (&vam->json_tree);
1351 vam->json_tree.type = VAT_JSON_NONE;
1356 vat_json_init_array (&vam->json_tree);
1357 vat_json_print (vam->ofp, &vam->json_tree);
1358 vam->json_tree.type = VAT_JSON_NONE;
1361 vam->retval = retval;
1362 vam->result_ready = 1;
1366 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1368 vat_main_t *vam = &vat_main;
1369 i32 retval = ntohl (mp->retval);
1370 if (vam->async_mode)
1372 vam->async_errors += (retval < 0);
1376 vam->retval = retval;
1377 vam->result_ready = 1;
1381 static void vl_api_l2_flags_reply_t_handler_json
1382 (vl_api_l2_flags_reply_t * mp)
1384 vat_main_t *vam = &vat_main;
1385 vat_json_node_t node;
1387 vat_json_init_object (&node);
1388 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1389 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1390 ntohl (mp->resulting_feature_bitmap));
1392 vat_json_print (vam->ofp, &node);
1393 vat_json_free (&node);
1395 vam->retval = ntohl (mp->retval);
1396 vam->result_ready = 1;
1399 static void vl_api_bridge_flags_reply_t_handler
1400 (vl_api_bridge_flags_reply_t * mp)
1402 vat_main_t *vam = &vat_main;
1403 i32 retval = ntohl (mp->retval);
1404 if (vam->async_mode)
1406 vam->async_errors += (retval < 0);
1410 vam->retval = retval;
1411 vam->result_ready = 1;
1415 static void vl_api_bridge_flags_reply_t_handler_json
1416 (vl_api_bridge_flags_reply_t * mp)
1418 vat_main_t *vam = &vat_main;
1419 vat_json_node_t node;
1421 vat_json_init_object (&node);
1422 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1423 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1424 ntohl (mp->resulting_feature_bitmap));
1426 vat_json_print (vam->ofp, &node);
1427 vat_json_free (&node);
1429 vam->retval = ntohl (mp->retval);
1430 vam->result_ready = 1;
1433 static void vl_api_tap_connect_reply_t_handler
1434 (vl_api_tap_connect_reply_t * mp)
1436 vat_main_t *vam = &vat_main;
1437 i32 retval = ntohl (mp->retval);
1438 if (vam->async_mode)
1440 vam->async_errors += (retval < 0);
1444 vam->retval = retval;
1445 vam->sw_if_index = ntohl (mp->sw_if_index);
1446 vam->result_ready = 1;
1451 static void vl_api_tap_connect_reply_t_handler_json
1452 (vl_api_tap_connect_reply_t * mp)
1454 vat_main_t *vam = &vat_main;
1455 vat_json_node_t node;
1457 vat_json_init_object (&node);
1458 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1459 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1461 vat_json_print (vam->ofp, &node);
1462 vat_json_free (&node);
1464 vam->retval = ntohl (mp->retval);
1465 vam->result_ready = 1;
1470 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1472 vat_main_t *vam = &vat_main;
1473 i32 retval = ntohl (mp->retval);
1474 if (vam->async_mode)
1476 vam->async_errors += (retval < 0);
1480 vam->retval = retval;
1481 vam->sw_if_index = ntohl (mp->sw_if_index);
1482 vam->result_ready = 1;
1486 static void vl_api_tap_modify_reply_t_handler_json
1487 (vl_api_tap_modify_reply_t * mp)
1489 vat_main_t *vam = &vat_main;
1490 vat_json_node_t node;
1492 vat_json_init_object (&node);
1493 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1494 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1496 vat_json_print (vam->ofp, &node);
1497 vat_json_free (&node);
1499 vam->retval = ntohl (mp->retval);
1500 vam->result_ready = 1;
1504 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1506 vat_main_t *vam = &vat_main;
1507 i32 retval = ntohl (mp->retval);
1508 if (vam->async_mode)
1510 vam->async_errors += (retval < 0);
1514 vam->retval = retval;
1515 vam->result_ready = 1;
1519 static void vl_api_tap_delete_reply_t_handler_json
1520 (vl_api_tap_delete_reply_t * mp)
1522 vat_main_t *vam = &vat_main;
1523 vat_json_node_t node;
1525 vat_json_init_object (&node);
1526 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1528 vat_json_print (vam->ofp, &node);
1529 vat_json_free (&node);
1531 vam->retval = ntohl (mp->retval);
1532 vam->result_ready = 1;
1535 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1536 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1538 vat_main_t *vam = &vat_main;
1539 i32 retval = ntohl (mp->retval);
1540 if (vam->async_mode)
1542 vam->async_errors += (retval < 0);
1546 vam->retval = retval;
1547 vam->result_ready = 1;
1551 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1552 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1554 vat_main_t *vam = &vat_main;
1555 vat_json_node_t node;
1557 vat_json_init_object (&node);
1558 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1559 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1560 ntohl (mp->tunnel_sw_if_index));
1562 vat_json_print (vam->ofp, &node);
1563 vat_json_free (&node);
1565 vam->retval = ntohl (mp->retval);
1566 vam->result_ready = 1;
1569 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1570 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1572 vat_main_t *vam = &vat_main;
1573 i32 retval = ntohl (mp->retval);
1574 if (vam->async_mode)
1576 vam->async_errors += (retval < 0);
1580 vam->retval = retval;
1581 vam->sw_if_index = ntohl (mp->sw_if_index);
1582 vam->result_ready = 1;
1586 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1587 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1589 vat_main_t *vam = &vat_main;
1590 vat_json_node_t node;
1592 vat_json_init_object (&node);
1593 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1594 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1596 vat_json_print (vam->ofp, &node);
1597 vat_json_free (&node);
1599 vam->retval = ntohl (mp->retval);
1600 vam->result_ready = 1;
1604 static void vl_api_lisp_add_del_locator_set_reply_t_handler
1605 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1607 vat_main_t *vam = &vat_main;
1608 i32 retval = ntohl (mp->retval);
1609 if (vam->async_mode)
1611 vam->async_errors += (retval < 0);
1615 vam->retval = retval;
1616 vam->result_ready = 1;
1620 static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1621 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1623 vat_main_t *vam = &vat_main;
1624 vat_json_node_t node;
1626 vat_json_init_object (&node);
1627 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1628 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1630 vat_json_print (vam->ofp, &node);
1631 vat_json_free (&node);
1633 vam->retval = ntohl (mp->retval);
1634 vam->result_ready = 1;
1637 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1638 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1640 vat_main_t *vam = &vat_main;
1641 i32 retval = ntohl (mp->retval);
1642 if (vam->async_mode)
1644 vam->async_errors += (retval < 0);
1648 vam->retval = retval;
1649 vam->sw_if_index = ntohl (mp->sw_if_index);
1650 vam->result_ready = 1;
1654 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1655 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1657 vat_main_t *vam = &vat_main;
1658 vat_json_node_t node;
1660 vat_json_init_object (&node);
1661 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1662 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1664 vat_json_print (vam->ofp, &node);
1665 vat_json_free (&node);
1667 vam->retval = ntohl (mp->retval);
1668 vam->result_ready = 1;
1671 static void vl_api_gre_add_del_tunnel_reply_t_handler
1672 (vl_api_gre_add_del_tunnel_reply_t * mp)
1674 vat_main_t *vam = &vat_main;
1675 i32 retval = ntohl (mp->retval);
1676 if (vam->async_mode)
1678 vam->async_errors += (retval < 0);
1682 vam->retval = retval;
1683 vam->sw_if_index = ntohl (mp->sw_if_index);
1684 vam->result_ready = 1;
1688 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1689 (vl_api_gre_add_del_tunnel_reply_t * mp)
1691 vat_main_t *vam = &vat_main;
1692 vat_json_node_t node;
1694 vat_json_init_object (&node);
1695 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1696 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1698 vat_json_print (vam->ofp, &node);
1699 vat_json_free (&node);
1701 vam->retval = ntohl (mp->retval);
1702 vam->result_ready = 1;
1705 static void vl_api_create_vhost_user_if_reply_t_handler
1706 (vl_api_create_vhost_user_if_reply_t * mp)
1708 vat_main_t *vam = &vat_main;
1709 i32 retval = ntohl (mp->retval);
1710 if (vam->async_mode)
1712 vam->async_errors += (retval < 0);
1716 vam->retval = retval;
1717 vam->sw_if_index = ntohl (mp->sw_if_index);
1718 vam->result_ready = 1;
1722 static void vl_api_create_vhost_user_if_reply_t_handler_json
1723 (vl_api_create_vhost_user_if_reply_t * mp)
1725 vat_main_t *vam = &vat_main;
1726 vat_json_node_t node;
1728 vat_json_init_object (&node);
1729 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1730 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1732 vat_json_print (vam->ofp, &node);
1733 vat_json_free (&node);
1735 vam->retval = ntohl (mp->retval);
1736 vam->result_ready = 1;
1739 static void vl_api_ip_address_details_t_handler
1740 (vl_api_ip_address_details_t * mp)
1742 vat_main_t *vam = &vat_main;
1743 static ip_address_details_t empty_ip_address_details = { {0} };
1744 ip_address_details_t *address = NULL;
1745 ip_details_t *current_ip_details = NULL;
1746 ip_details_t *details = NULL;
1748 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1750 if (!details || vam->current_sw_if_index >= vec_len (details)
1751 || !details[vam->current_sw_if_index].present)
1753 errmsg ("ip address details arrived but not stored\n");
1754 errmsg ("ip_dump should be called first\n");
1758 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1760 #define addresses (current_ip_details->addr)
1762 vec_validate_init_empty (addresses, vec_len (addresses),
1763 empty_ip_address_details);
1765 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1767 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1768 address->prefix_length = mp->prefix_length;
1772 static void vl_api_ip_address_details_t_handler_json
1773 (vl_api_ip_address_details_t * mp)
1775 vat_main_t *vam = &vat_main;
1776 vat_json_node_t *node = NULL;
1777 struct in6_addr ip6;
1780 if (VAT_JSON_ARRAY != vam->json_tree.type)
1782 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1783 vat_json_init_array (&vam->json_tree);
1785 node = vat_json_array_add (&vam->json_tree);
1787 vat_json_init_object (node);
1790 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1791 vat_json_object_add_ip6 (node, "ip", ip6);
1795 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1796 vat_json_object_add_ip4 (node, "ip", ip4);
1798 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1802 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1804 vat_main_t *vam = &vat_main;
1805 static ip_details_t empty_ip_details = { 0 };
1806 ip_details_t *ip = NULL;
1807 u32 sw_if_index = ~0;
1809 sw_if_index = ntohl (mp->sw_if_index);
1811 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1812 sw_if_index, empty_ip_details);
1814 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1821 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1823 vat_main_t *vam = &vat_main;
1825 if (VAT_JSON_ARRAY != vam->json_tree.type)
1827 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1828 vat_json_init_array (&vam->json_tree);
1830 vat_json_array_add_uint (&vam->json_tree,
1831 clib_net_to_host_u32 (mp->sw_if_index));
1834 static void vl_api_map_domain_details_t_handler_json
1835 (vl_api_map_domain_details_t * mp)
1837 vat_json_node_t *node = NULL;
1838 vat_main_t *vam = &vat_main;
1839 struct in6_addr ip6;
1842 if (VAT_JSON_ARRAY != vam->json_tree.type)
1844 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1845 vat_json_init_array (&vam->json_tree);
1848 node = vat_json_array_add (&vam->json_tree);
1849 vat_json_init_object (node);
1851 vat_json_object_add_uint (node, "domain_index",
1852 clib_net_to_host_u32 (mp->domain_index));
1853 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1854 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1855 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1856 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1857 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1858 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1859 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1860 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1861 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1862 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1863 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1864 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1865 vat_json_object_add_uint (node, "flags", mp->flags);
1866 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1867 vat_json_object_add_int (node, "is_translation", mp->is_translation);
1870 static void vl_api_map_domain_details_t_handler
1871 (vl_api_map_domain_details_t * mp)
1873 vat_main_t *vam = &vat_main;
1875 if (mp->is_translation)
1878 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1879 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1880 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1881 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1882 clib_net_to_host_u32 (mp->domain_index));
1887 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1888 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1889 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1890 format_ip6_address, mp->ip6_src,
1891 clib_net_to_host_u32 (mp->domain_index));
1893 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1894 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1895 mp->is_translation ? "map-t" : "");
1898 static void vl_api_map_rule_details_t_handler_json
1899 (vl_api_map_rule_details_t * mp)
1901 struct in6_addr ip6;
1902 vat_json_node_t *node = NULL;
1903 vat_main_t *vam = &vat_main;
1905 if (VAT_JSON_ARRAY != vam->json_tree.type)
1907 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1908 vat_json_init_array (&vam->json_tree);
1911 node = vat_json_array_add (&vam->json_tree);
1912 vat_json_init_object (node);
1914 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
1915 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1916 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
1920 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
1922 vat_main_t *vam = &vat_main;
1923 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1924 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
1928 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
1930 vat_main_t *vam = &vat_main;
1931 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1932 "router_addr %U host_mac %U\n",
1933 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1934 format_ip4_address, &mp->host_address,
1935 format_ip4_address, &mp->router_address,
1936 format_ethernet_address, mp->host_mac);
1939 static void vl_api_dhcp_compl_event_t_handler_json
1940 (vl_api_dhcp_compl_event_t * mp)
1942 /* JSON output not supported */
1946 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1949 vat_main_t *vam = &vat_main;
1950 static u64 default_counter = 0;
1952 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1954 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1955 sw_if_index, default_counter);
1956 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1960 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1961 interface_counter_t counter)
1963 vat_main_t *vam = &vat_main;
1964 static interface_counter_t default_counter = { 0, };
1966 vec_validate_init_empty (vam->combined_interface_counters,
1967 vnet_counter_type, NULL);
1968 vec_validate_init_empty (vam->combined_interface_counters
1969 [vnet_counter_type], sw_if_index, default_counter);
1970 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1973 static void vl_api_vnet_interface_counters_t_handler
1974 (vl_api_vnet_interface_counters_t * mp)
1979 static void vl_api_vnet_interface_counters_t_handler_json
1980 (vl_api_vnet_interface_counters_t * mp)
1982 interface_counter_t counter;
1987 u32 first_sw_if_index;
1990 count = ntohl (mp->count);
1991 first_sw_if_index = ntohl (mp->first_sw_if_index);
1993 if (!mp->is_combined)
1995 v_packets = (u64 *) & mp->data;
1996 for (i = 0; i < count; i++)
1999 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
2000 set_simple_interface_counter (mp->vnet_counter_type,
2001 first_sw_if_index + i, packets);
2007 v = (vlib_counter_t *) & mp->data;
2008 for (i = 0; i < count; i++)
2011 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
2013 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
2014 set_combined_interface_counter (mp->vnet_counter_type,
2015 first_sw_if_index + i, counter);
2022 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2024 vat_main_t *vam = &vat_main;
2027 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
2029 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
2038 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
2040 vat_main_t *vam = &vat_main;
2043 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
2045 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
2053 static void vl_api_vnet_ip4_fib_counters_t_handler
2054 (vl_api_vnet_ip4_fib_counters_t * mp)
2059 static void vl_api_vnet_ip4_fib_counters_t_handler_json
2060 (vl_api_vnet_ip4_fib_counters_t * mp)
2062 vat_main_t *vam = &vat_main;
2063 vl_api_ip4_fib_counter_t *v;
2064 ip4_fib_counter_t *counter;
2071 vrf_id = ntohl (mp->vrf_id);
2072 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2073 if (~0 == vrf_index)
2075 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2076 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2077 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2078 vec_validate (vam->ip4_fib_counters, vrf_index);
2079 vam->ip4_fib_counters[vrf_index] = NULL;
2082 vec_free (vam->ip4_fib_counters[vrf_index]);
2083 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2084 count = ntohl (mp->count);
2085 for (i = 0; i < count; i++)
2087 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2088 counter = &vam->ip4_fib_counters[vrf_index][i];
2089 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2090 counter->address = ip4;
2091 counter->address_length = v->address_length;
2092 counter->packets = clib_net_to_host_u64 (v->packets);
2093 counter->bytes = clib_net_to_host_u64 (v->bytes);
2098 static void vl_api_vnet_ip6_fib_counters_t_handler
2099 (vl_api_vnet_ip6_fib_counters_t * mp)
2104 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2105 (vl_api_vnet_ip6_fib_counters_t * mp)
2107 vat_main_t *vam = &vat_main;
2108 vl_api_ip6_fib_counter_t *v;
2109 ip6_fib_counter_t *counter;
2110 struct in6_addr ip6;
2116 vrf_id = ntohl (mp->vrf_id);
2117 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2118 if (~0 == vrf_index)
2120 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2121 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2122 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2123 vec_validate (vam->ip6_fib_counters, vrf_index);
2124 vam->ip6_fib_counters[vrf_index] = NULL;
2127 vec_free (vam->ip6_fib_counters[vrf_index]);
2128 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2129 count = ntohl (mp->count);
2130 for (i = 0; i < count; i++)
2132 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2133 counter = &vam->ip6_fib_counters[vrf_index][i];
2134 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2135 counter->address = ip6;
2136 counter->address_length = v->address_length;
2137 counter->packets = clib_net_to_host_u64 (v->packets);
2138 counter->bytes = clib_net_to_host_u64 (v->bytes);
2143 static void vl_api_get_first_msg_id_reply_t_handler
2144 (vl_api_get_first_msg_id_reply_t * mp)
2146 vat_main_t *vam = &vat_main;
2147 i32 retval = ntohl (mp->retval);
2149 if (vam->async_mode)
2151 vam->async_errors += (retval < 0);
2155 vam->retval = retval;
2156 vam->result_ready = 1;
2160 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
2164 static void vl_api_get_first_msg_id_reply_t_handler_json
2165 (vl_api_get_first_msg_id_reply_t * mp)
2167 vat_main_t *vam = &vat_main;
2168 vat_json_node_t node;
2170 vat_json_init_object (&node);
2171 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2172 vat_json_object_add_uint (&node, "first_msg_id",
2173 (uint) ntohs (mp->first_msg_id));
2175 vat_json_print (vam->ofp, &node);
2176 vat_json_free (&node);
2178 vam->retval = ntohl (mp->retval);
2179 vam->result_ready = 1;
2182 static void vl_api_get_node_graph_reply_t_handler
2183 (vl_api_get_node_graph_reply_t * mp)
2185 vat_main_t *vam = &vat_main;
2186 api_main_t *am = &api_main;
2187 i32 retval = ntohl (mp->retval);
2188 u8 *pvt_copy, *reply;
2193 if (vam->async_mode)
2195 vam->async_errors += (retval < 0);
2199 vam->retval = retval;
2200 vam->result_ready = 1;
2203 /* "Should never happen..." */
2207 reply = (u8 *) (mp->reply_in_shmem);
2208 pvt_copy = vec_dup (reply);
2210 /* Toss the shared-memory original... */
2211 pthread_mutex_lock (&am->vlib_rp->mutex);
2212 oldheap = svm_push_data_heap (am->vlib_rp);
2216 svm_pop_heap (oldheap);
2217 pthread_mutex_unlock (&am->vlib_rp->mutex);
2219 if (vam->graph_nodes)
2221 hash_free (vam->graph_node_index_by_name);
2223 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2225 node = vam->graph_nodes[i];
2226 vec_free (node->name);
2227 vec_free (node->next_nodes);
2230 vec_free (vam->graph_nodes);
2233 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2234 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2235 vec_free (pvt_copy);
2237 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2239 node = vam->graph_nodes[i];
2240 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2244 static void vl_api_get_node_graph_reply_t_handler_json
2245 (vl_api_get_node_graph_reply_t * mp)
2247 vat_main_t *vam = &vat_main;
2248 api_main_t *am = &api_main;
2250 vat_json_node_t node;
2253 /* $$$$ make this real? */
2254 vat_json_init_object (&node);
2255 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2256 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2258 reply = (u8 *) (mp->reply_in_shmem);
2260 /* Toss the shared-memory original... */
2261 pthread_mutex_lock (&am->vlib_rp->mutex);
2262 oldheap = svm_push_data_heap (am->vlib_rp);
2266 svm_pop_heap (oldheap);
2267 pthread_mutex_unlock (&am->vlib_rp->mutex);
2269 vat_json_print (vam->ofp, &node);
2270 vat_json_free (&node);
2272 vam->retval = ntohl (mp->retval);
2273 vam->result_ready = 1;
2277 vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
2279 vat_main_t *vam = &vat_main;
2283 memset (&loc, 0, sizeof (loc));
2284 if (vam->noprint_msg)
2286 loc.local = mp->local;
2287 loc.priority = mp->priority;
2288 loc.weight = mp->weight;
2291 loc.sw_if_index = ntohl (mp->sw_if_index);
2295 loc.is_ipv6 = mp->is_ipv6;
2296 clib_memcpy (loc.ip_address, mp->ip_address,
2297 sizeof (loc.ip_address));
2299 vec_add1 (vam->locator_msg, loc);
2305 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
2306 ntohl (mp->sw_if_index),
2307 mp->priority, mp->weight);
2311 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
2312 mp->is_ipv6 ? format_ip6_address :
2314 mp->ip_address, mp->priority, mp->weight);
2317 fformat (vam->ofp, "%s", tmp_str);
2324 vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2327 vat_main_t *vam = &vat_main;
2328 vat_json_node_t *node = NULL;
2330 struct in6_addr ip6;
2333 memset (&loc, 0, sizeof (loc));
2334 if (vam->noprint_msg)
2336 loc.local = mp->local;
2337 loc.priority = mp->priority;
2338 loc.weight = mp->weight;
2341 loc.sw_if_index = ntohl (mp->sw_if_index);
2345 loc.is_ipv6 = mp->is_ipv6;
2346 clib_memcpy (loc.ip_address, mp->ip_address,
2347 sizeof (loc.ip_address));
2349 vec_add1 (vam->locator_msg, loc);
2353 if (VAT_JSON_ARRAY != vam->json_tree.type)
2355 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2356 vat_json_init_array (&vam->json_tree);
2358 node = vat_json_array_add (&vam->json_tree);
2360 vat_json_init_object (node);
2364 vat_json_object_add_uint (node, "locator_index",
2365 ntohl (mp->sw_if_index));
2371 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2372 vat_json_object_add_ip6 (node, "locator", ip6);
2376 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2377 vat_json_object_add_ip4 (node, "locator", ip4);
2380 vat_json_object_add_uint (node, "priority", mp->priority);
2381 vat_json_object_add_uint (node, "weight", mp->weight);
2385 vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2388 vat_main_t *vam = &vat_main;
2389 locator_set_msg_t ls;
2391 ls.locator_set_index = ntohl (mp->locator_set_index);
2392 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2393 vec_add1 (vam->locator_set_msg, ls);
2397 vl_api_lisp_locator_set_details_t_handler_json
2398 (vl_api_lisp_locator_set_details_t * mp)
2400 vat_main_t *vam = &vat_main;
2401 locator_set_msg_t ls;
2403 ls.locator_set_index = ntohl (mp->locator_set_index);
2404 ls.locator_set_name = format (0, "%s", mp->locator_set_name);
2405 vec_add1 (vam->locator_set_msg, ls);
2409 add_lisp_eid_table_entry (vat_main_t * vam,
2410 vl_api_lisp_eid_table_details_t * mp)
2412 eid_table_t eid_table;
2414 memset (&eid_table, 0, sizeof (eid_table));
2415 eid_table.is_local = mp->is_local;
2416 eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index);
2417 eid_table.eid_type = mp->eid_type;
2418 eid_table.vni = clib_net_to_host_u32 (mp->vni);
2419 eid_table.eid_prefix_len = mp->eid_prefix_len;
2420 eid_table.ttl = clib_net_to_host_u32 (mp->ttl);
2421 eid_table.action = mp->action;
2422 eid_table.authoritative = mp->authoritative;
2423 clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid));
2424 vec_add1 (vam->eid_tables, eid_table);
2428 vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2430 vat_main_t *vam = &vat_main;
2431 add_lisp_eid_table_entry (vam, mp);
2435 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2438 vat_main_t *vam = &vat_main;
2439 add_lisp_eid_table_entry (vam, mp);
2443 vl_api_lisp_eid_table_map_details_t_handler
2444 (vl_api_lisp_eid_table_map_details_t * mp)
2446 vat_main_t *vam = &vat_main;
2448 u8 *line = format (0, "%=10d%=10d",
2449 clib_net_to_host_u32 (mp->vni),
2450 clib_net_to_host_u32 (mp->dp_table));
2451 fformat (vam->ofp, "%v\n", line);
2456 vl_api_lisp_eid_table_map_details_t_handler_json
2457 (vl_api_lisp_eid_table_map_details_t * mp)
2459 vat_main_t *vam = &vat_main;
2460 vat_json_node_t *node = NULL;
2462 if (VAT_JSON_ARRAY != vam->json_tree.type)
2464 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2465 vat_json_init_array (&vam->json_tree);
2467 node = vat_json_array_add (&vam->json_tree);
2468 vat_json_init_object (node);
2469 vat_json_object_add_uint (node, "dp_table",
2470 clib_net_to_host_u32 (mp->dp_table));
2471 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2475 vl_api_lisp_eid_table_vni_details_t_handler
2476 (vl_api_lisp_eid_table_vni_details_t * mp)
2478 vat_main_t *vam = &vat_main;
2480 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2481 fformat (vam->ofp, "%v\n", line);
2486 vl_api_lisp_eid_table_vni_details_t_handler_json
2487 (vl_api_lisp_eid_table_vni_details_t * mp)
2489 vat_main_t *vam = &vat_main;
2490 vat_json_node_t *node = NULL;
2492 if (VAT_JSON_ARRAY != vam->json_tree.type)
2494 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2495 vat_json_init_array (&vam->json_tree);
2497 node = vat_json_array_add (&vam->json_tree);
2498 vat_json_init_object (node);
2499 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2503 format_decap_next (u8 * s, va_list * args)
2505 u32 next_index = va_arg (*args, u32);
2509 case LISP_GPE_INPUT_NEXT_DROP:
2510 return format (s, "drop");
2511 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2512 return format (s, "ip4");
2513 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2514 return format (s, "ip6");
2516 return format (s, "unknown %d", next_index);
2522 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2525 vat_main_t *vam = &vat_main;
2527 u8 *flag_str = NULL;
2529 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
2531 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2532 foreach_lisp_gpe_flag_bit;
2535 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2536 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2538 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2540 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2542 ntohl (mp->encap_fib_id),
2543 ntohl (mp->decap_fib_id),
2544 format_decap_next, ntohl (mp->dcap_next),
2546 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
2552 vl_api_lisp_gpe_tunnel_details_t_handler_json
2553 (vl_api_lisp_gpe_tunnel_details_t * mp)
2555 vat_main_t *vam = &vat_main;
2556 vat_json_node_t *node = NULL;
2557 struct in6_addr ip6;
2561 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
2563 if (VAT_JSON_ARRAY != vam->json_tree.type)
2565 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2566 vat_json_init_array (&vam->json_tree);
2568 node = vat_json_array_add (&vam->json_tree);
2570 vat_json_init_object (node);
2571 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2574 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2575 vat_json_object_add_ip6 (node, "source address", ip6);
2576 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2577 vat_json_object_add_ip6 (node, "destination address", ip6);
2581 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2582 vat_json_object_add_ip4 (node, "source address", ip4);
2583 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2584 vat_json_object_add_ip4 (node, "destination address", ip4);
2586 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2587 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2588 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2589 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2590 vat_json_object_add_uint (node, "flags", mp->flags);
2591 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2592 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2593 vat_json_object_add_uint (node, "res", mp->res);
2594 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
2596 vec_free (next_decap_str);
2600 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2603 vat_main_t *vam = &vat_main;
2605 fformat (vam->ofp, "%=20U\n",
2606 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2611 vl_api_lisp_map_resolver_details_t_handler_json
2612 (vl_api_lisp_map_resolver_details_t * mp)
2614 vat_main_t *vam = &vat_main;
2615 vat_json_node_t *node = NULL;
2616 struct in6_addr ip6;
2619 if (VAT_JSON_ARRAY != vam->json_tree.type)
2621 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2622 vat_json_init_array (&vam->json_tree);
2624 node = vat_json_array_add (&vam->json_tree);
2626 vat_json_init_object (node);
2629 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2630 vat_json_object_add_ip6 (node, "map resolver", ip6);
2634 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2635 vat_json_object_add_ip4 (node, "map resolver", ip4);
2640 vl_api_show_lisp_status_reply_t_handler
2641 (vl_api_show_lisp_status_reply_t * mp)
2643 vat_main_t *vam = &vat_main;
2644 i32 retval = ntohl (mp->retval);
2648 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2649 mp->feature_status ? "enabled" : "disabled",
2650 mp->gpe_status ? "enabled" : "disabled");
2653 vam->retval = retval;
2654 vam->result_ready = 1;
2658 vl_api_show_lisp_status_reply_t_handler_json
2659 (vl_api_show_lisp_status_reply_t * mp)
2661 vat_main_t *vam = &vat_main;
2662 vat_json_node_t node;
2663 u8 *gpe_status = NULL;
2664 u8 *feature_status = NULL;
2666 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2667 feature_status = format (0, "%s",
2668 mp->feature_status ? "enabled" : "disabled");
2669 vec_add1 (gpe_status, 0);
2670 vec_add1 (feature_status, 0);
2672 vat_json_init_object (&node);
2673 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2674 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
2676 vec_free (gpe_status);
2677 vec_free (feature_status);
2679 vat_json_print (vam->ofp, &node);
2680 vat_json_free (&node);
2682 vam->retval = ntohl (mp->retval);
2683 vam->result_ready = 1;
2687 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2688 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2690 vat_main_t *vam = &vat_main;
2691 i32 retval = ntohl (mp->retval);
2695 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
2698 vam->retval = retval;
2699 vam->result_ready = 1;
2703 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2704 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2706 vat_main_t *vam = &vat_main;
2707 vat_json_node_t *node = NULL;
2709 if (VAT_JSON_ARRAY != vam->json_tree.type)
2711 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2712 vat_json_init_array (&vam->json_tree);
2714 node = vat_json_array_add (&vam->json_tree);
2716 vat_json_init_object (node);
2717 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
2719 vat_json_print (vam->ofp, node);
2720 vat_json_free (node);
2722 vam->retval = ntohl (mp->retval);
2723 vam->result_ready = 1;
2727 vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2729 vat_main_t *vam = &vat_main;
2730 i32 retval = ntohl (mp->retval);
2734 fformat (vam->ofp, "%-20s%-16s\n",
2735 mp->status ? "enabled" : "disabled",
2736 mp->status ? (char *) mp->locator_set_name : "");
2739 vam->retval = retval;
2740 vam->result_ready = 1;
2744 vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2747 vat_main_t *vam = &vat_main;
2748 vat_json_node_t node;
2751 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2752 vec_add1 (status, 0);
2754 vat_json_init_object (&node);
2755 vat_json_object_add_string_copy (&node, "status", status);
2758 vat_json_object_add_string_copy (&node, "locator_set",
2759 mp->locator_set_name);
2764 vat_json_print (vam->ofp, &node);
2765 vat_json_free (&node);
2767 vam->retval = ntohl (mp->retval);
2768 vam->result_ready = 1;
2772 format_policer_type (u8 * s, va_list * va)
2774 u32 i = va_arg (*va, u32);
2776 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2777 s = format (s, "1r2c");
2778 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2779 s = format (s, "1r3c");
2780 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2781 s = format (s, "2r3c-2698");
2782 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2783 s = format (s, "2r3c-4115");
2784 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2785 s = format (s, "2r3c-mef5cf1");
2787 s = format (s, "ILLEGAL");
2792 format_policer_rate_type (u8 * s, va_list * va)
2794 u32 i = va_arg (*va, u32);
2796 if (i == SSE2_QOS_RATE_KBPS)
2797 s = format (s, "kbps");
2798 else if (i == SSE2_QOS_RATE_PPS)
2799 s = format (s, "pps");
2801 s = format (s, "ILLEGAL");
2806 format_policer_round_type (u8 * s, va_list * va)
2808 u32 i = va_arg (*va, u32);
2810 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2811 s = format (s, "closest");
2812 else if (i == SSE2_QOS_ROUND_TO_UP)
2813 s = format (s, "up");
2814 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2815 s = format (s, "down");
2817 s = format (s, "ILLEGAL");
2822 format_policer_action_type (u8 * s, va_list * va)
2824 u32 i = va_arg (*va, u32);
2826 if (i == SSE2_QOS_ACTION_DROP)
2827 s = format (s, "drop");
2828 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2829 s = format (s, "transmit");
2830 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2831 s = format (s, "mark-and-transmit");
2833 s = format (s, "ILLEGAL");
2838 format_dscp (u8 * s, va_list * va)
2840 u32 i = va_arg (*va, u32);
2845 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2849 return format (s, "ILLEGAL");
2851 s = format (s, "%s", t);
2856 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
2858 vat_main_t *vam = &vat_main;
2859 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
2861 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2862 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2864 conform_dscp_str = format (0, "");
2866 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2867 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2869 exceed_dscp_str = format (0, "");
2871 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2872 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2874 violate_dscp_str = format (0, "");
2876 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2877 "rate type %U, round type %U, %s rate, %s color-aware, "
2878 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2879 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2880 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2882 format_policer_type, mp->type,
2885 clib_net_to_host_u64 (mp->cb),
2886 clib_net_to_host_u64 (mp->eb),
2887 format_policer_rate_type, mp->rate_type,
2888 format_policer_round_type, mp->round_type,
2889 mp->single_rate ? "single" : "dual",
2890 mp->color_aware ? "is" : "not",
2891 ntohl (mp->cir_tokens_per_period),
2892 ntohl (mp->pir_tokens_per_period),
2894 ntohl (mp->current_limit),
2895 ntohl (mp->current_bucket),
2896 ntohl (mp->extended_limit),
2897 ntohl (mp->extended_bucket),
2898 clib_net_to_host_u64 (mp->last_update_time),
2899 format_policer_action_type, mp->conform_action_type,
2901 format_policer_action_type, mp->exceed_action_type,
2903 format_policer_action_type, mp->violate_action_type,
2906 vec_free (conform_dscp_str);
2907 vec_free (exceed_dscp_str);
2908 vec_free (violate_dscp_str);
2911 static void vl_api_policer_details_t_handler_json
2912 (vl_api_policer_details_t * mp)
2914 vat_main_t *vam = &vat_main;
2915 vat_json_node_t *node;
2916 u8 *rate_type_str, *round_type_str, *type_str;
2917 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
2919 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
2921 format (0, "%U", format_policer_round_type, mp->round_type);
2922 type_str = format (0, "%U", format_policer_type, mp->type);
2923 conform_action_str = format (0, "%U", format_policer_action_type,
2924 mp->conform_action_type);
2925 exceed_action_str = format (0, "%U", format_policer_action_type,
2926 mp->exceed_action_type);
2927 violate_action_str = format (0, "%U", format_policer_action_type,
2928 mp->violate_action_type);
2930 if (VAT_JSON_ARRAY != vam->json_tree.type)
2932 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2933 vat_json_init_array (&vam->json_tree);
2935 node = vat_json_array_add (&vam->json_tree);
2937 vat_json_init_object (node);
2938 vat_json_object_add_string_copy (node, "name", mp->name);
2939 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
2940 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
2941 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
2942 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
2943 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
2944 vat_json_object_add_string_copy (node, "round_type", round_type_str);
2945 vat_json_object_add_string_copy (node, "type", type_str);
2946 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
2947 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
2948 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
2949 vat_json_object_add_uint (node, "cir_tokens_per_period",
2950 ntohl (mp->cir_tokens_per_period));
2951 vat_json_object_add_uint (node, "eir_tokens_per_period",
2952 ntohl (mp->pir_tokens_per_period));
2953 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
2954 vat_json_object_add_uint (node, "current_bucket",
2955 ntohl (mp->current_bucket));
2956 vat_json_object_add_uint (node, "extended_limit",
2957 ntohl (mp->extended_limit));
2958 vat_json_object_add_uint (node, "extended_bucket",
2959 ntohl (mp->extended_bucket));
2960 vat_json_object_add_uint (node, "last_update_time",
2961 ntohl (mp->last_update_time));
2962 vat_json_object_add_string_copy (node, "conform_action",
2963 conform_action_str);
2964 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2966 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2967 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
2968 vec_free (dscp_str);
2970 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
2971 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2973 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2974 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
2975 vec_free (dscp_str);
2977 vat_json_object_add_string_copy (node, "violate_action",
2978 violate_action_str);
2979 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2981 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2982 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
2983 vec_free (dscp_str);
2986 vec_free (rate_type_str);
2987 vec_free (round_type_str);
2988 vec_free (type_str);
2989 vec_free (conform_action_str);
2990 vec_free (exceed_action_str);
2991 vec_free (violate_action_str);
2995 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
2998 vat_main_t *vam = &vat_main;
2999 int i, count = ntohl (mp->count);
3002 fformat (vam->ofp, "classify table ids (%d) : ", count);
3003 for (i = 0; i < count; i++)
3005 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
3006 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
3008 vam->retval = ntohl (mp->retval);
3009 vam->result_ready = 1;
3013 vl_api_classify_table_ids_reply_t_handler_json
3014 (vl_api_classify_table_ids_reply_t * mp)
3016 vat_main_t *vam = &vat_main;
3017 int i, count = ntohl (mp->count);
3021 vat_json_node_t node;
3023 vat_json_init_object (&node);
3024 for (i = 0; i < count; i++)
3026 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
3028 vat_json_print (vam->ofp, &node);
3029 vat_json_free (&node);
3031 vam->retval = ntohl (mp->retval);
3032 vam->result_ready = 1;
3036 vl_api_classify_table_by_interface_reply_t_handler
3037 (vl_api_classify_table_by_interface_reply_t * mp)
3039 vat_main_t *vam = &vat_main;
3042 table_id = ntohl (mp->l2_table_id);
3044 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3046 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3047 table_id = ntohl (mp->ip4_table_id);
3049 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3051 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3052 table_id = ntohl (mp->ip6_table_id);
3054 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3056 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3057 vam->retval = ntohl (mp->retval);
3058 vam->result_ready = 1;
3062 vl_api_classify_table_by_interface_reply_t_handler_json
3063 (vl_api_classify_table_by_interface_reply_t * mp)
3065 vat_main_t *vam = &vat_main;
3066 vat_json_node_t node;
3068 vat_json_init_object (&node);
3070 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3071 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3072 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3074 vat_json_print (vam->ofp, &node);
3075 vat_json_free (&node);
3077 vam->retval = ntohl (mp->retval);
3078 vam->result_ready = 1;
3081 static void vl_api_policer_add_del_reply_t_handler
3082 (vl_api_policer_add_del_reply_t * mp)
3084 vat_main_t *vam = &vat_main;
3085 i32 retval = ntohl (mp->retval);
3086 if (vam->async_mode)
3088 vam->async_errors += (retval < 0);
3092 vam->retval = retval;
3093 vam->result_ready = 1;
3094 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3096 * Note: this is just barely thread-safe, depends on
3097 * the main thread spinning waiting for an answer...
3099 errmsg ("policer index %d\n", ntohl (mp->policer_index));
3103 static void vl_api_policer_add_del_reply_t_handler_json
3104 (vl_api_policer_add_del_reply_t * mp)
3106 vat_main_t *vam = &vat_main;
3107 vat_json_node_t node;
3109 vat_json_init_object (&node);
3110 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3111 vat_json_object_add_uint (&node, "policer_index",
3112 ntohl (mp->policer_index));
3114 vat_json_print (vam->ofp, &node);
3115 vat_json_free (&node);
3117 vam->retval = ntohl (mp->retval);
3118 vam->result_ready = 1;
3121 /* Format hex dump. */
3123 format_hex_bytes (u8 * s, va_list * va)
3125 u8 *bytes = va_arg (*va, u8 *);
3126 int n_bytes = va_arg (*va, int);
3129 /* Print short or long form depending on byte count. */
3130 uword short_form = n_bytes <= 32;
3131 uword indent = format_get_indent (s);
3136 for (i = 0; i < n_bytes; i++)
3138 if (!short_form && (i % 32) == 0)
3139 s = format (s, "%08x: ", i);
3140 s = format (s, "%02x", bytes[i]);
3141 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3142 s = format (s, "\n%U", format_white_space, indent);
3149 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3152 vat_main_t *vam = &vat_main;
3153 i32 retval = ntohl (mp->retval);
3156 fformat (vam->ofp, "classify table info :\n");
3157 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3158 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3159 ntohl (mp->miss_next_index));
3160 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3161 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3162 ntohl (mp->match_n_vectors));
3163 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3164 ntohl (mp->mask_length));
3166 vam->retval = retval;
3167 vam->result_ready = 1;
3171 vl_api_classify_table_info_reply_t_handler_json
3172 (vl_api_classify_table_info_reply_t * mp)
3174 vat_main_t *vam = &vat_main;
3175 vat_json_node_t node;
3177 i32 retval = ntohl (mp->retval);
3180 vat_json_init_object (&node);
3182 vat_json_object_add_int (&node, "sessions",
3183 ntohl (mp->active_sessions));
3184 vat_json_object_add_int (&node, "nexttbl",
3185 ntohl (mp->next_table_index));
3186 vat_json_object_add_int (&node, "nextnode",
3187 ntohl (mp->miss_next_index));
3188 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3189 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3190 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3191 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3192 ntohl (mp->mask_length), 0);
3193 vat_json_object_add_string_copy (&node, "mask", s);
3195 vat_json_print (vam->ofp, &node);
3196 vat_json_free (&node);
3198 vam->retval = ntohl (mp->retval);
3199 vam->result_ready = 1;
3203 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3206 vat_main_t *vam = &vat_main;
3208 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3209 ntohl (mp->hit_next_index), ntohl (mp->advance),
3210 ntohl (mp->opaque_index));
3211 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3212 ntohl (mp->match_length));
3216 vl_api_classify_session_details_t_handler_json
3217 (vl_api_classify_session_details_t * mp)
3219 vat_main_t *vam = &vat_main;
3220 vat_json_node_t *node = NULL;
3222 if (VAT_JSON_ARRAY != vam->json_tree.type)
3224 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3225 vat_json_init_array (&vam->json_tree);
3227 node = vat_json_array_add (&vam->json_tree);
3229 vat_json_init_object (node);
3230 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3231 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3232 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3234 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3236 vat_json_object_add_string_copy (node, "match", s);
3239 static void vl_api_pg_create_interface_reply_t_handler
3240 (vl_api_pg_create_interface_reply_t * mp)
3242 vat_main_t *vam = &vat_main;
3244 vam->retval = ntohl (mp->retval);
3245 vam->result_ready = 1;
3248 static void vl_api_pg_create_interface_reply_t_handler_json
3249 (vl_api_pg_create_interface_reply_t * mp)
3251 vat_main_t *vam = &vat_main;
3252 vat_json_node_t node;
3254 i32 retval = ntohl (mp->retval);
3257 vat_json_init_object (&node);
3259 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
3261 vat_json_print (vam->ofp, &node);
3262 vat_json_free (&node);
3264 vam->retval = ntohl (mp->retval);
3265 vam->result_ready = 1;
3268 static void vl_api_policer_classify_details_t_handler
3269 (vl_api_policer_classify_details_t * mp)
3271 vat_main_t *vam = &vat_main;
3273 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3274 ntohl (mp->table_index));
3277 static void vl_api_policer_classify_details_t_handler_json
3278 (vl_api_policer_classify_details_t * mp)
3280 vat_main_t *vam = &vat_main;
3281 vat_json_node_t *node;
3283 if (VAT_JSON_ARRAY != vam->json_tree.type)
3285 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3286 vat_json_init_array (&vam->json_tree);
3288 node = vat_json_array_add (&vam->json_tree);
3290 vat_json_init_object (node);
3291 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3292 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3295 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3296 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3298 vat_main_t *vam = &vat_main;
3299 i32 retval = ntohl (mp->retval);
3300 if (vam->async_mode)
3302 vam->async_errors += (retval < 0);
3306 vam->retval = retval;
3307 vam->sw_if_index = ntohl (mp->sw_if_index);
3308 vam->result_ready = 1;
3312 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3313 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3315 vat_main_t *vam = &vat_main;
3316 vat_json_node_t node;
3318 vat_json_init_object (&node);
3319 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3320 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3322 vat_json_print (vam->ofp, &node);
3323 vat_json_free (&node);
3325 vam->retval = ntohl (mp->retval);
3326 vam->result_ready = 1;
3329 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3330 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3331 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3332 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
3335 * Generate boilerplate reply handlers, which
3336 * dig the return value out of the xxx_reply_t API message,
3337 * stick it into vam->retval, and set vam->result_ready
3339 * Could also do this by pointing N message decode slots at
3340 * a single function, but that could break in subtle ways.
3343 #define foreach_standard_reply_retval_handler \
3344 _(sw_interface_set_flags_reply) \
3345 _(sw_interface_add_del_address_reply) \
3346 _(sw_interface_set_table_reply) \
3347 _(sw_interface_set_vpath_reply) \
3348 _(sw_interface_set_l2_bridge_reply) \
3349 _(bridge_domain_add_del_reply) \
3350 _(sw_interface_set_l2_xconnect_reply) \
3351 _(l2fib_add_del_reply) \
3352 _(ip_add_del_route_reply) \
3353 _(proxy_arp_add_del_reply) \
3354 _(proxy_arp_intfc_enable_disable_reply) \
3355 _(mpls_add_del_encap_reply) \
3356 _(mpls_add_del_decap_reply) \
3357 _(mpls_ethernet_add_del_tunnel_2_reply) \
3358 _(sw_interface_set_unnumbered_reply) \
3359 _(ip_neighbor_add_del_reply) \
3360 _(reset_vrf_reply) \
3361 _(oam_add_del_reply) \
3362 _(reset_fib_reply) \
3363 _(dhcp_proxy_config_reply) \
3364 _(dhcp_proxy_config_2_reply) \
3365 _(dhcp_proxy_set_vss_reply) \
3366 _(dhcp_client_config_reply) \
3367 _(set_ip_flow_hash_reply) \
3368 _(sw_interface_ip6_enable_disable_reply) \
3369 _(sw_interface_ip6_set_link_local_address_reply) \
3370 _(sw_interface_ip6nd_ra_prefix_reply) \
3371 _(sw_interface_ip6nd_ra_config_reply) \
3372 _(set_arp_neighbor_limit_reply) \
3373 _(l2_patch_add_del_reply) \
3374 _(sr_tunnel_add_del_reply) \
3375 _(sr_policy_add_del_reply) \
3376 _(sr_multicast_map_add_del_reply) \
3377 _(classify_add_del_session_reply) \
3378 _(classify_set_interface_ip_table_reply) \
3379 _(classify_set_interface_l2_tables_reply) \
3380 _(l2tpv3_set_tunnel_cookies_reply) \
3381 _(l2tpv3_interface_enable_disable_reply) \
3382 _(l2tpv3_set_lookup_key_reply) \
3383 _(l2_fib_clear_table_reply) \
3384 _(l2_interface_efp_filter_reply) \
3385 _(l2_interface_vlan_tag_rewrite_reply) \
3386 _(modify_vhost_user_if_reply) \
3387 _(delete_vhost_user_if_reply) \
3388 _(want_ip4_arp_events_reply) \
3389 _(want_ip6_nd_events_reply) \
3390 _(input_acl_set_interface_reply) \
3391 _(ipsec_spd_add_del_reply) \
3392 _(ipsec_interface_add_del_spd_reply) \
3393 _(ipsec_spd_add_del_entry_reply) \
3394 _(ipsec_sad_add_del_entry_reply) \
3395 _(ipsec_sa_set_key_reply) \
3396 _(ikev2_profile_add_del_reply) \
3397 _(ikev2_profile_set_auth_reply) \
3398 _(ikev2_profile_set_id_reply) \
3399 _(ikev2_profile_set_ts_reply) \
3400 _(ikev2_set_local_key_reply) \
3401 _(delete_loopback_reply) \
3402 _(bd_ip_mac_add_del_reply) \
3403 _(map_del_domain_reply) \
3404 _(map_add_del_rule_reply) \
3405 _(want_interface_events_reply) \
3406 _(want_stats_reply) \
3407 _(cop_interface_enable_disable_reply) \
3408 _(cop_whitelist_enable_disable_reply) \
3409 _(sw_interface_clear_stats_reply) \
3410 _(trace_profile_add_reply) \
3411 _(trace_profile_apply_reply) \
3412 _(trace_profile_del_reply) \
3413 _(lisp_add_del_locator_reply) \
3414 _(lisp_add_del_local_eid_reply) \
3415 _(lisp_add_del_remote_mapping_reply) \
3416 _(lisp_add_del_adjacency_reply) \
3417 _(lisp_gpe_add_del_fwd_entry_reply) \
3418 _(lisp_add_del_map_resolver_reply) \
3419 _(lisp_gpe_enable_disable_reply) \
3420 _(lisp_gpe_add_del_iface_reply) \
3421 _(lisp_enable_disable_reply) \
3422 _(lisp_pitr_set_locator_set_reply) \
3423 _(lisp_add_del_map_request_itr_rlocs_reply) \
3424 _(lisp_eid_table_add_del_map_reply) \
3425 _(vxlan_gpe_add_del_tunnel_reply) \
3426 _(af_packet_delete_reply) \
3427 _(policer_classify_set_interface_reply) \
3428 _(netmap_create_reply) \
3429 _(netmap_delete_reply) \
3430 _(ipfix_enable_reply) \
3431 _(pg_capture_reply) \
3432 _(pg_enable_disable_reply) \
3433 _(ip_source_and_port_range_check_add_del_reply) \
3434 _(ip_source_and_port_range_check_interface_add_del_reply)\
3435 _(delete_subif_reply)
3438 static void vl_api_##n##_t_handler \
3439 (vl_api_##n##_t * mp) \
3441 vat_main_t * vam = &vat_main; \
3442 i32 retval = ntohl(mp->retval); \
3443 if (vam->async_mode) { \
3444 vam->async_errors += (retval < 0); \
3446 vam->retval = retval; \
3447 vam->result_ready = 1; \
3450 foreach_standard_reply_retval_handler;
3454 static void vl_api_##n##_t_handler_json \
3455 (vl_api_##n##_t * mp) \
3457 vat_main_t * vam = &vat_main; \
3458 vat_json_node_t node; \
3459 vat_json_init_object(&node); \
3460 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3461 vat_json_print(vam->ofp, &node); \
3462 vam->retval = ntohl(mp->retval); \
3463 vam->result_ready = 1; \
3465 foreach_standard_reply_retval_handler;
3469 * Table of message reply handlers, must include boilerplate handlers
3473 #define foreach_vpe_api_reply_msg \
3474 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3475 _(SW_INTERFACE_DETAILS, sw_interface_details) \
3476 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3477 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3478 _(CONTROL_PING_REPLY, control_ping_reply) \
3479 _(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply) \
3480 _(CLI_REPLY, cli_reply) \
3481 _(CLI_INBAND_REPLY, cli_inband_reply) \
3482 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3483 sw_interface_add_del_address_reply) \
3484 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
3485 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3486 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3487 sw_interface_set_l2_xconnect_reply) \
3488 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3489 sw_interface_set_l2_bridge_reply) \
3490 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3491 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3492 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3493 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3494 _(L2_FLAGS_REPLY, l2_flags_reply) \
3495 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3496 _(TAP_CONNECT_REPLY, tap_connect_reply) \
3497 _(TAP_MODIFY_REPLY, tap_modify_reply) \
3498 _(TAP_DELETE_REPLY, tap_delete_reply) \
3499 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3500 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
3501 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3502 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3503 proxy_arp_intfc_enable_disable_reply) \
3504 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
3505 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
3506 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
3507 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3508 mpls_ethernet_add_del_tunnel_reply) \
3509 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3510 mpls_ethernet_add_del_tunnel_2_reply) \
3511 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3512 sw_interface_set_unnumbered_reply) \
3513 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3514 _(RESET_VRF_REPLY, reset_vrf_reply) \
3515 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3516 _(CREATE_SUBIF_REPLY, create_subif_reply) \
3517 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3518 _(RESET_FIB_REPLY, reset_fib_reply) \
3519 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3520 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3521 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3522 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3523 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3524 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3525 sw_interface_ip6_enable_disable_reply) \
3526 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3527 sw_interface_ip6_set_link_local_address_reply) \
3528 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3529 sw_interface_ip6nd_ra_prefix_reply) \
3530 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3531 sw_interface_ip6nd_ra_config_reply) \
3532 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3533 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3534 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
3535 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3536 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
3537 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3538 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3539 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3540 classify_set_interface_ip_table_reply) \
3541 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3542 classify_set_interface_l2_tables_reply) \
3543 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3544 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3545 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3546 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3547 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3548 l2tpv3_interface_enable_disable_reply) \
3549 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3550 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3551 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
3552 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
3553 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3554 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
3555 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3556 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3557 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3558 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3559 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3560 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3561 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3562 _(SHOW_VERSION_REPLY, show_version_reply) \
3563 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
3564 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3565 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
3566 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3567 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3568 _(IP4_ARP_EVENT, ip4_arp_event) \
3569 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
3570 _(IP6_ND_EVENT, ip6_nd_event) \
3571 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3572 _(IP_ADDRESS_DETAILS, ip_address_details) \
3573 _(IP_DETAILS, ip_details) \
3574 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3575 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3576 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3577 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3578 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
3579 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3580 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3581 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3582 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3583 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
3584 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3585 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3586 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
3587 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3588 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3589 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3590 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3591 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
3592 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
3593 _(MAP_DOMAIN_DETAILS, map_domain_details) \
3594 _(MAP_RULE_DETAILS, map_rule_details) \
3595 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3596 _(WANT_STATS_REPLY, want_stats_reply) \
3597 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3598 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
3599 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
3600 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
3601 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
3602 _(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
3603 _(TRACE_PROFILE_APPLY_REPLY, trace_profile_apply_reply) \
3604 _(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
3605 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3606 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3607 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
3608 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3609 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
3610 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3611 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
3612 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
3613 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
3614 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
3615 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
3616 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3617 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
3618 _(LISP_LOCATOR_DETAILS, lisp_locator_details) \
3619 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
3620 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
3621 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
3622 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
3623 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
3624 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
3625 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3626 lisp_add_del_map_request_itr_rlocs_reply) \
3627 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3628 lisp_get_map_request_itr_rlocs_reply) \
3629 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
3630 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
3631 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
3632 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
3633 _(POLICER_DETAILS, policer_details) \
3634 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3635 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
3636 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
3637 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
3638 _(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
3639 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3640 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
3641 _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
3642 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3643 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3644 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
3645 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
3646 _(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \
3647 _(IPFIX_DETAILS, ipfix_details) \
3648 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3649 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3650 _(PG_CAPTURE_REPLY, pg_capture_reply) \
3651 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3652 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3653 ip_source_and_port_range_check_add_del_reply) \
3654 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
3655 ip_source_and_port_range_check_interface_add_del_reply) \
3656 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
3657 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
3658 _(DELETE_SUBIF_REPLY, delete_subif_reply)
3660 /* M: construct, but don't yet send a message */
3664 vam->result_ready = 0; \
3665 mp = vl_msg_api_alloc(sizeof(*mp)); \
3666 memset (mp, 0, sizeof (*mp)); \
3667 mp->_vl_msg_id = ntohs (VL_API_##T); \
3668 mp->client_index = vam->my_client_index; \
3673 vam->result_ready = 0; \
3674 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3675 memset (mp, 0, sizeof (*mp)); \
3676 mp->_vl_msg_id = ntohs (VL_API_##T); \
3677 mp->client_index = vam->my_client_index; \
3681 /* S: send a message */
3682 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3684 /* W: wait for results, with timeout */
3687 timeout = vat_time_now (vam) + 1.0; \
3689 while (vat_time_now (vam) < timeout) { \
3690 if (vam->result_ready == 1) { \
3691 return (vam->retval); \
3697 /* W2: wait for results, with timeout */
3700 timeout = vat_time_now (vam) + 1.0; \
3702 while (vat_time_now (vam) < timeout) { \
3703 if (vam->result_ready == 1) { \
3705 return (vam->retval); \
3711 /* W_L: wait for results, with timeout */
3714 timeout = vat_time_now (vam) + 1.0; \
3716 while (vat_time_now (vam) < timeout) { \
3717 if (vam->result_ready == 1) { \
3719 return (vam->retval); \
3722 vam->noprint_msg = 0; \
3733 #define STR_VTR_OP_CASE(op) \
3734 case L2_VTR_ ## op: \
3738 str_vtr_op (u32 vtr_op)
3742 STR_VTR_OP_CASE (DISABLED);
3743 STR_VTR_OP_CASE (PUSH_1);
3744 STR_VTR_OP_CASE (PUSH_2);
3745 STR_VTR_OP_CASE (POP_1);
3746 STR_VTR_OP_CASE (POP_2);
3747 STR_VTR_OP_CASE (TRANSLATE_1_1);
3748 STR_VTR_OP_CASE (TRANSLATE_1_2);
3749 STR_VTR_OP_CASE (TRANSLATE_2_1);
3750 STR_VTR_OP_CASE (TRANSLATE_2_2);
3757 dump_sub_interface_table (vat_main_t * vam)
3759 const sw_interface_subif_t *sub = NULL;
3761 if (vam->json_output)
3764 ("JSON output supported only for VPE API calls and dump_stats_table");
3769 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3770 "Interface", "sw_if_index",
3771 "sub id", "dot1ad", "tags", "outer id",
3772 "inner id", "exact", "default", "outer any", "inner any");
3774 vec_foreach (sub, vam->sw_if_subif_table)
3777 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3778 sub->interface_name,
3780 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3781 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3782 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3783 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3784 if (sub->vtr_op != L2_VTR_DISABLED)
3787 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3788 "tag1: %d tag2: %d ]\n",
3789 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3790 sub->vtr_tag1, sub->vtr_tag2);
3798 name_sort_cmp (void *a1, void *a2)
3800 name_sort_t *n1 = a1;
3801 name_sort_t *n2 = a2;
3803 return strcmp ((char *) n1->name, (char *) n2->name);
3807 dump_interface_table (vat_main_t * vam)
3810 name_sort_t *nses = 0, *ns;
3812 if (vam->json_output)
3815 ("JSON output supported only for VPE API calls and dump_stats_table");
3820 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3822 vec_add2 (nses, ns, 1);
3823 ns->name = (u8 *)(p->key);
3824 ns->value = (u32) p->value[0];
3828 vec_sort_with_function (nses, name_sort_cmp);
3830 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3831 vec_foreach (ns, nses)
3833 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3840 dump_ip_table (vat_main_t * vam, int is_ipv6)
3842 const ip_details_t *det = NULL;
3843 const ip_address_details_t *address = NULL;
3846 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3848 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3855 fformat (vam->ofp, "%-12d\n", i);
3857 " %-30s%-13s\n", "Address", "Prefix length");
3862 vec_foreach (address, det->addr)
3866 is_ipv6 ? format_ip6_address : format_ip4_address,
3867 address->ip, address->prefix_length);
3875 dump_ipv4_table (vat_main_t * vam)
3877 if (vam->json_output)
3880 ("JSON output supported only for VPE API calls and dump_stats_table");
3884 return dump_ip_table (vam, 0);
3888 dump_ipv6_table (vat_main_t * vam)
3890 if (vam->json_output)
3893 ("JSON output supported only for VPE API calls and dump_stats_table");
3897 return dump_ip_table (vam, 1);
3901 counter_type_to_str (u8 counter_type, u8 is_combined)
3905 switch (counter_type)
3907 case VNET_INTERFACE_COUNTER_DROP:
3909 case VNET_INTERFACE_COUNTER_PUNT:
3911 case VNET_INTERFACE_COUNTER_IP4:
3913 case VNET_INTERFACE_COUNTER_IP6:
3915 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
3917 case VNET_INTERFACE_COUNTER_RX_MISS:
3919 case VNET_INTERFACE_COUNTER_RX_ERROR:
3921 case VNET_INTERFACE_COUNTER_TX_ERROR:
3924 return "INVALID-COUNTER-TYPE";
3929 switch (counter_type)
3931 case VNET_INTERFACE_COUNTER_RX:
3933 case VNET_INTERFACE_COUNTER_TX:
3936 return "INVALID-COUNTER-TYPE";
3942 dump_stats_table (vat_main_t * vam)
3944 vat_json_node_t node;
3945 vat_json_node_t *msg_array;
3946 vat_json_node_t *msg;
3947 vat_json_node_t *counter_array;
3948 vat_json_node_t *counter;
3949 interface_counter_t c;
3951 ip4_fib_counter_t *c4;
3952 ip6_fib_counter_t *c6;
3955 if (!vam->json_output)
3957 clib_warning ("dump_stats_table supported only in JSON format");
3961 vat_json_init_object (&node);
3963 /* interface counters */
3964 msg_array = vat_json_object_add (&node, "interface_counters");
3965 vat_json_init_array (msg_array);
3966 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
3968 msg = vat_json_array_add (msg_array);
3969 vat_json_init_object (msg);
3970 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3971 (u8 *) counter_type_to_str (i, 0));
3972 vat_json_object_add_int (msg, "is_combined", 0);
3973 counter_array = vat_json_object_add (msg, "data");
3974 vat_json_init_array (counter_array);
3975 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
3977 packets = vam->simple_interface_counters[i][j];
3978 vat_json_array_add_uint (counter_array, packets);
3981 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
3983 msg = vat_json_array_add (msg_array);
3984 vat_json_init_object (msg);
3985 vat_json_object_add_string_copy (msg, "vnet_counter_type",
3986 (u8 *) counter_type_to_str (i, 1));
3987 vat_json_object_add_int (msg, "is_combined", 1);
3988 counter_array = vat_json_object_add (msg, "data");
3989 vat_json_init_array (counter_array);
3990 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
3992 c = vam->combined_interface_counters[i][j];
3993 counter = vat_json_array_add (counter_array);
3994 vat_json_init_object (counter);
3995 vat_json_object_add_uint (counter, "packets", c.packets);
3996 vat_json_object_add_uint (counter, "bytes", c.bytes);
4000 /* ip4 fib counters */
4001 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
4002 vat_json_init_array (msg_array);
4003 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
4005 msg = vat_json_array_add (msg_array);
4006 vat_json_init_object (msg);
4007 vat_json_object_add_uint (msg, "vrf_id",
4008 vam->ip4_fib_counters_vrf_id_by_index[i]);
4009 counter_array = vat_json_object_add (msg, "c");
4010 vat_json_init_array (counter_array);
4011 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
4013 counter = vat_json_array_add (counter_array);
4014 vat_json_init_object (counter);
4015 c4 = &vam->ip4_fib_counters[i][j];
4016 vat_json_object_add_ip4 (counter, "address", c4->address);
4017 vat_json_object_add_uint (counter, "address_length",
4018 c4->address_length);
4019 vat_json_object_add_uint (counter, "packets", c4->packets);
4020 vat_json_object_add_uint (counter, "bytes", c4->bytes);
4024 /* ip6 fib counters */
4025 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
4026 vat_json_init_array (msg_array);
4027 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
4029 msg = vat_json_array_add (msg_array);
4030 vat_json_init_object (msg);
4031 vat_json_object_add_uint (msg, "vrf_id",
4032 vam->ip6_fib_counters_vrf_id_by_index[i]);
4033 counter_array = vat_json_object_add (msg, "c");
4034 vat_json_init_array (counter_array);
4035 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
4037 counter = vat_json_array_add (counter_array);
4038 vat_json_init_object (counter);
4039 c6 = &vam->ip6_fib_counters[i][j];
4040 vat_json_object_add_ip6 (counter, "address", c6->address);
4041 vat_json_object_add_uint (counter, "address_length",
4042 c6->address_length);
4043 vat_json_object_add_uint (counter, "packets", c6->packets);
4044 vat_json_object_add_uint (counter, "bytes", c6->bytes);
4048 vat_json_print (vam->ofp, &node);
4049 vat_json_free (&node);
4055 exec (vat_main_t * vam)
4057 api_main_t *am = &api_main;
4058 vl_api_cli_request_t *mp;
4062 unformat_input_t *i = vam->input;
4064 if (vec_len (i->buffer) == 0)
4067 if (vam->exec_mode == 0 && unformat (i, "mode"))
4072 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4079 M (CLI_REQUEST, cli_request);
4082 * Copy cmd into shared memory.
4083 * In order for the CLI command to work, it
4084 * must be a vector ending in \n, not a C-string ending
4087 pthread_mutex_lock (&am->vlib_rp->mutex);
4088 oldheap = svm_push_data_heap (am->vlib_rp);
4090 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4091 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4093 svm_pop_heap (oldheap);
4094 pthread_mutex_unlock (&am->vlib_rp->mutex);
4096 mp->cmd_in_shmem = (u64) cmd;
4098 timeout = vat_time_now (vam) + 10.0;
4100 while (vat_time_now (vam) < timeout)
4102 if (vam->result_ready == 1)
4105 if (vam->shmem_result != NULL)
4106 fformat (vam->ofp, "%s", vam->shmem_result);
4107 pthread_mutex_lock (&am->vlib_rp->mutex);
4108 oldheap = svm_push_data_heap (am->vlib_rp);
4110 free_me = (u8 *) vam->shmem_result;
4113 svm_pop_heap (oldheap);
4114 pthread_mutex_unlock (&am->vlib_rp->mutex);
4122 * Future replacement of exec() that passes CLI buffers directly in
4123 * the API messages instead of an additional shared memory area.
4126 exec_inband (vat_main_t * vam)
4128 vl_api_cli_inband_t *mp;
4130 unformat_input_t *i = vam->input;
4132 if (vec_len (i->buffer) == 0)
4135 if (vam->exec_mode == 0 && unformat (i, "mode"))
4140 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4147 * In order for the CLI command to work, it
4148 * must be a vector ending in \n, not a C-string ending
4151 u32 len = vec_len (vam->input->buffer);
4152 M2 (CLI_INBAND, cli_inband, len);
4153 clib_memcpy (mp->cmd, vam->input->buffer, len);
4154 mp->length = htonl (len);
4157 W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
4161 api_create_loopback (vat_main_t * vam)
4163 unformat_input_t *i = vam->input;
4164 vl_api_create_loopback_t *mp;
4169 memset (mac_address, 0, sizeof (mac_address));
4171 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4173 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4179 /* Construct the API message */
4180 M (CREATE_LOOPBACK, create_loopback);
4182 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4189 api_delete_loopback (vat_main_t * vam)
4191 unformat_input_t *i = vam->input;
4192 vl_api_delete_loopback_t *mp;
4194 u32 sw_if_index = ~0;
4196 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4198 if (unformat (i, "sw_if_index %d", &sw_if_index))
4204 if (sw_if_index == ~0)
4206 errmsg ("missing sw_if_index\n");
4210 /* Construct the API message */
4211 M (DELETE_LOOPBACK, delete_loopback);
4212 mp->sw_if_index = ntohl (sw_if_index);
4219 api_want_stats (vat_main_t * vam)
4221 unformat_input_t *i = vam->input;
4222 vl_api_want_stats_t *mp;
4226 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4228 if (unformat (i, "enable"))
4230 else if (unformat (i, "disable"))
4238 errmsg ("missing enable|disable\n");
4242 M (WANT_STATS, want_stats);
4243 mp->enable_disable = enable;
4250 api_want_interface_events (vat_main_t * vam)
4252 unformat_input_t *i = vam->input;
4253 vl_api_want_interface_events_t *mp;
4257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4259 if (unformat (i, "enable"))
4261 else if (unformat (i, "disable"))
4269 errmsg ("missing enable|disable\n");
4273 M (WANT_INTERFACE_EVENTS, want_interface_events);
4274 mp->enable_disable = enable;
4276 vam->interface_event_display = enable;
4283 /* Note: non-static, called once to set up the initial intfc table */
4285 api_sw_interface_dump (vat_main_t * vam)
4287 vl_api_sw_interface_dump_t *mp;
4290 name_sort_t *nses = 0, *ns;
4291 sw_interface_subif_t *sub = NULL;
4293 /* Toss the old name table */
4295 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4297 vec_add2 (nses, ns, 1);
4298 ns->name = (u8 *)(p->key);
4299 ns->value = (u32) p->value[0];
4303 hash_free (vam->sw_if_index_by_interface_name);
4305 vec_foreach (ns, nses) vec_free (ns->name);
4309 vec_foreach (sub, vam->sw_if_subif_table)
4311 vec_free (sub->interface_name);
4313 vec_free (vam->sw_if_subif_table);
4315 /* recreate the interface name hash table */
4316 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
4318 /* Get list of ethernets */
4319 M (SW_INTERFACE_DUMP, sw_interface_dump);
4320 mp->name_filter_valid = 1;
4321 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4324 /* and local / loopback interfaces */
4325 M (SW_INTERFACE_DUMP, sw_interface_dump);
4326 mp->name_filter_valid = 1;
4327 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4331 /* and vxlan-gpe tunnel interfaces */
4332 M (SW_INTERFACE_DUMP, sw_interface_dump);
4333 mp->name_filter_valid = 1;
4334 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4335 sizeof (mp->name_filter) - 1);
4338 /* and vxlan tunnel interfaces */
4339 M (SW_INTERFACE_DUMP, sw_interface_dump);
4340 mp->name_filter_valid = 1;
4341 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4344 /* and host (af_packet) interfaces */
4345 M (SW_INTERFACE_DUMP, sw_interface_dump);
4346 mp->name_filter_valid = 1;
4347 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4350 /* and l2tpv3 tunnel interfaces */
4351 M (SW_INTERFACE_DUMP, sw_interface_dump);
4352 mp->name_filter_valid = 1;
4353 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4354 sizeof (mp->name_filter) - 1);
4357 /* and GRE tunnel interfaces */
4358 M (SW_INTERFACE_DUMP, sw_interface_dump);
4359 mp->name_filter_valid = 1;
4360 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4363 /* Use a control ping for synchronization */
4365 vl_api_control_ping_t *mp;
4366 M (CONTROL_PING, control_ping);
4373 api_sw_interface_set_flags (vat_main_t * vam)
4375 unformat_input_t *i = vam->input;
4376 vl_api_sw_interface_set_flags_t *mp;
4379 u8 sw_if_index_set = 0;
4380 u8 admin_up = 0, link_up = 0;
4382 /* Parse args required to build the message */
4383 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4385 if (unformat (i, "admin-up"))
4387 else if (unformat (i, "admin-down"))
4389 else if (unformat (i, "link-up"))
4391 else if (unformat (i, "link-down"))
4393 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4394 sw_if_index_set = 1;
4395 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4396 sw_if_index_set = 1;
4401 if (sw_if_index_set == 0)
4403 errmsg ("missing interface name or sw_if_index\n");
4407 /* Construct the API message */
4408 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4409 mp->sw_if_index = ntohl (sw_if_index);
4410 mp->admin_up_down = admin_up;
4411 mp->link_up_down = link_up;
4416 /* Wait for a reply, return the good/bad news... */
4421 api_sw_interface_clear_stats (vat_main_t * vam)
4423 unformat_input_t *i = vam->input;
4424 vl_api_sw_interface_clear_stats_t *mp;
4427 u8 sw_if_index_set = 0;
4429 /* Parse args required to build the message */
4430 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4432 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4433 sw_if_index_set = 1;
4434 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4435 sw_if_index_set = 1;
4440 /* Construct the API message */
4441 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
4443 if (sw_if_index_set == 1)
4444 mp->sw_if_index = ntohl (sw_if_index);
4446 mp->sw_if_index = ~0;
4451 /* Wait for a reply, return the good/bad news... */
4456 api_sw_interface_add_del_address (vat_main_t * vam)
4458 unformat_input_t *i = vam->input;
4459 vl_api_sw_interface_add_del_address_t *mp;
4462 u8 sw_if_index_set = 0;
4463 u8 is_add = 1, del_all = 0;
4464 u32 address_length = 0;
4465 u8 v4_address_set = 0;
4466 u8 v6_address_set = 0;
4467 ip4_address_t v4address;
4468 ip6_address_t v6address;
4470 /* Parse args required to build the message */
4471 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4473 if (unformat (i, "del-all"))
4475 else if (unformat (i, "del"))
4477 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4478 sw_if_index_set = 1;
4479 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4480 sw_if_index_set = 1;
4481 else if (unformat (i, "%U/%d",
4482 unformat_ip4_address, &v4address, &address_length))
4484 else if (unformat (i, "%U/%d",
4485 unformat_ip6_address, &v6address, &address_length))
4491 if (sw_if_index_set == 0)
4493 errmsg ("missing interface name or sw_if_index\n");
4496 if (v4_address_set && v6_address_set)
4498 errmsg ("both v4 and v6 addresses set\n");
4501 if (!v4_address_set && !v6_address_set && !del_all)
4503 errmsg ("no addresses set\n");
4507 /* Construct the API message */
4508 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4510 mp->sw_if_index = ntohl (sw_if_index);
4511 mp->is_add = is_add;
4512 mp->del_all = del_all;
4516 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4520 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4522 mp->address_length = address_length;
4527 /* Wait for a reply, return good/bad news */
4532 api_sw_interface_set_table (vat_main_t * vam)
4534 unformat_input_t *i = vam->input;
4535 vl_api_sw_interface_set_table_t *mp;
4537 u32 sw_if_index, vrf_id = 0;
4538 u8 sw_if_index_set = 0;
4541 /* Parse args required to build the message */
4542 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4544 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4545 sw_if_index_set = 1;
4546 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4547 sw_if_index_set = 1;
4548 else if (unformat (i, "vrf %d", &vrf_id))
4550 else if (unformat (i, "ipv6"))
4556 if (sw_if_index_set == 0)
4558 errmsg ("missing interface name or sw_if_index\n");
4562 /* Construct the API message */
4563 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4565 mp->sw_if_index = ntohl (sw_if_index);
4566 mp->is_ipv6 = is_ipv6;
4567 mp->vrf_id = ntohl (vrf_id);
4572 /* Wait for a reply... */
4577 api_sw_interface_set_vpath (vat_main_t * vam)
4579 unformat_input_t *i = vam->input;
4580 vl_api_sw_interface_set_vpath_t *mp;
4582 u32 sw_if_index = 0;
4583 u8 sw_if_index_set = 0;
4586 /* Parse args required to build the message */
4587 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4589 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4590 sw_if_index_set = 1;
4591 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4592 sw_if_index_set = 1;
4593 else if (unformat (i, "enable"))
4595 else if (unformat (i, "disable"))
4601 if (sw_if_index_set == 0)
4603 errmsg ("missing interface name or sw_if_index\n");
4607 /* Construct the API message */
4608 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
4610 mp->sw_if_index = ntohl (sw_if_index);
4611 mp->enable = is_enable;
4616 /* Wait for a reply... */
4621 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
4623 unformat_input_t *i = vam->input;
4624 vl_api_sw_interface_set_l2_xconnect_t *mp;
4627 u8 rx_sw_if_index_set = 0;
4629 u8 tx_sw_if_index_set = 0;
4632 /* Parse args required to build the message */
4633 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4635 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
4636 rx_sw_if_index_set = 1;
4637 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4638 tx_sw_if_index_set = 1;
4639 else if (unformat (i, "rx"))
4641 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4643 if (unformat (i, "%U", unformat_sw_if_index, vam,
4645 rx_sw_if_index_set = 1;
4650 else if (unformat (i, "tx"))
4652 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4654 if (unformat (i, "%U", unformat_sw_if_index, vam,
4656 tx_sw_if_index_set = 1;
4661 else if (unformat (i, "enable"))
4663 else if (unformat (i, "disable"))
4669 if (rx_sw_if_index_set == 0)
4671 errmsg ("missing rx interface name or rx_sw_if_index\n");
4675 if (enable && (tx_sw_if_index_set == 0))
4677 errmsg ("missing tx interface name or tx_sw_if_index\n");
4681 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
4683 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4684 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
4685 mp->enable = enable;
4694 api_sw_interface_set_l2_bridge (vat_main_t * vam)
4696 unformat_input_t *i = vam->input;
4697 vl_api_sw_interface_set_l2_bridge_t *mp;
4700 u8 rx_sw_if_index_set = 0;
4707 /* Parse args required to build the message */
4708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4710 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
4711 rx_sw_if_index_set = 1;
4712 else if (unformat (i, "bd_id %d", &bd_id))
4714 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
4715 rx_sw_if_index_set = 1;
4716 else if (unformat (i, "shg %d", &shg))
4718 else if (unformat (i, "bvi"))
4720 else if (unformat (i, "enable"))
4722 else if (unformat (i, "disable"))
4728 if (rx_sw_if_index_set == 0)
4730 errmsg ("missing rx interface name or sw_if_index\n");
4734 if (enable && (bd_id_set == 0))
4736 errmsg ("missing bridge domain\n");
4740 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
4742 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
4743 mp->bd_id = ntohl (bd_id);
4746 mp->enable = enable;
4755 api_bridge_domain_dump (vat_main_t * vam)
4757 unformat_input_t *i = vam->input;
4758 vl_api_bridge_domain_dump_t *mp;
4762 /* Parse args required to build the message */
4763 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4765 if (unformat (i, "bd_id %d", &bd_id))
4771 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
4772 mp->bd_id = ntohl (bd_id);
4775 /* Use a control ping for synchronization */
4777 vl_api_control_ping_t *mp;
4778 M (CONTROL_PING, control_ping);
4788 api_bridge_domain_add_del (vat_main_t * vam)
4790 unformat_input_t *i = vam->input;
4791 vl_api_bridge_domain_add_del_t *mp;
4795 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
4797 /* Parse args required to build the message */
4798 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4800 if (unformat (i, "bd_id %d", &bd_id))
4802 else if (unformat (i, "flood %d", &flood))
4804 else if (unformat (i, "uu-flood %d", &uu_flood))
4806 else if (unformat (i, "forward %d", &forward))
4808 else if (unformat (i, "learn %d", &learn))
4810 else if (unformat (i, "arp-term %d", &arp_term))
4812 else if (unformat (i, "del"))
4815 flood = uu_flood = forward = learn = 0;
4823 errmsg ("missing bridge domain\n");
4827 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
4829 mp->bd_id = ntohl (bd_id);
4831 mp->uu_flood = uu_flood;
4832 mp->forward = forward;
4834 mp->arp_term = arp_term;
4835 mp->is_add = is_add;
4844 api_l2fib_add_del (vat_main_t * vam)
4846 unformat_input_t *i = vam->input;
4847 vl_api_l2fib_add_del_t *mp;
4854 u8 sw_if_index_set = 0;
4863 /* Parse args required to build the message */
4864 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4866 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
4868 else if (unformat (i, "bd_id %d", &bd_id))
4870 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4871 sw_if_index_set = 1;
4872 else if (unformat (i, "sw_if"))
4874 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4876 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4877 sw_if_index_set = 1;
4882 else if (unformat (i, "static"))
4884 else if (unformat (i, "filter"))
4889 else if (unformat (i, "bvi"))
4894 else if (unformat (i, "del"))
4896 else if (unformat (i, "count %d", &count))
4904 errmsg ("missing mac address\n");
4910 errmsg ("missing bridge domain\n");
4914 if (is_add && (sw_if_index_set == 0))
4916 errmsg ("missing interface name or sw_if_index\n");
4922 /* Turn on async mode */
4923 vam->async_mode = 1;
4924 vam->async_errors = 0;
4925 before = vat_time_now (vam);
4928 for (j = 0; j < count; j++)
4930 M (L2FIB_ADD_DEL, l2fib_add_del);
4933 mp->bd_id = ntohl (bd_id);
4934 mp->is_add = is_add;
4938 mp->sw_if_index = ntohl (sw_if_index);
4939 mp->static_mac = static_mac;
4940 mp->filter_mac = filter_mac;
4941 mp->bvi_mac = bvi_mac;
4943 increment_mac_address (&mac);
4950 vl_api_control_ping_t *mp;
4953 /* Shut off async mode */
4954 vam->async_mode = 0;
4956 M (CONTROL_PING, control_ping);
4959 timeout = vat_time_now (vam) + 1.0;
4960 while (vat_time_now (vam) < timeout)
4961 if (vam->result_ready == 1)
4966 if (vam->retval == -99)
4967 errmsg ("timeout\n");
4969 if (vam->async_errors > 0)
4971 errmsg ("%d asynchronous errors\n", vam->async_errors);
4974 vam->async_errors = 0;
4975 after = vat_time_now (vam);
4977 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4978 count, after - before, count / (after - before));
4982 /* Wait for a reply... */
4985 /* Return the good/bad news */
4986 return (vam->retval);
4990 api_l2_flags (vat_main_t * vam)
4992 unformat_input_t *i = vam->input;
4993 vl_api_l2_flags_t *mp;
4996 u32 feature_bitmap = 0;
4997 u8 sw_if_index_set = 0;
4999 /* Parse args required to build the message */
5000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5002 if (unformat (i, "sw_if_index %d", &sw_if_index))
5003 sw_if_index_set = 1;
5004 else if (unformat (i, "sw_if"))
5006 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5008 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5009 sw_if_index_set = 1;
5014 else if (unformat (i, "learn"))
5015 feature_bitmap |= L2INPUT_FEAT_LEARN;
5016 else if (unformat (i, "forward"))
5017 feature_bitmap |= L2INPUT_FEAT_FWD;
5018 else if (unformat (i, "flood"))
5019 feature_bitmap |= L2INPUT_FEAT_FLOOD;
5020 else if (unformat (i, "uu-flood"))
5021 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
5026 if (sw_if_index_set == 0)
5028 errmsg ("missing interface name or sw_if_index\n");
5032 M (L2_FLAGS, l2_flags);
5034 mp->sw_if_index = ntohl (sw_if_index);
5035 mp->feature_bitmap = ntohl (feature_bitmap);
5044 api_bridge_flags (vat_main_t * vam)
5046 unformat_input_t *i = vam->input;
5047 vl_api_bridge_flags_t *mp;
5054 /* Parse args required to build the message */
5055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5057 if (unformat (i, "bd_id %d", &bd_id))
5059 else if (unformat (i, "learn"))
5061 else if (unformat (i, "forward"))
5063 else if (unformat (i, "flood"))
5065 else if (unformat (i, "uu-flood"))
5066 flags |= L2_UU_FLOOD;
5067 else if (unformat (i, "arp-term"))
5068 flags |= L2_ARP_TERM;
5069 else if (unformat (i, "off"))
5071 else if (unformat (i, "disable"))
5079 errmsg ("missing bridge domain\n");
5083 M (BRIDGE_FLAGS, bridge_flags);
5085 mp->bd_id = ntohl (bd_id);
5086 mp->feature_bitmap = ntohl (flags);
5087 mp->is_set = is_set;
5096 api_bd_ip_mac_add_del (vat_main_t * vam)
5098 unformat_input_t *i = vam->input;
5099 vl_api_bd_ip_mac_add_del_t *mp;
5107 ip4_address_t v4addr;
5108 ip6_address_t v6addr;
5112 /* Parse args required to build the message */
5113 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5115 if (unformat (i, "bd_id %d", &bd_id))
5119 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5123 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5128 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5132 else if (unformat (i, "del"))
5140 errmsg ("missing bridge domain\n");
5143 else if (ip_set == 0)
5145 errmsg ("missing IP address\n");
5148 else if (mac_set == 0)
5150 errmsg ("missing MAC address\n");
5154 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
5156 mp->bd_id = ntohl (bd_id);
5157 mp->is_ipv6 = is_ipv6;
5158 mp->is_add = is_add;
5160 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5162 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5163 clib_memcpy (mp->mac_address, macaddr, 6);
5171 api_tap_connect (vat_main_t * vam)
5173 unformat_input_t *i = vam->input;
5174 vl_api_tap_connect_t *mp;
5181 memset (mac_address, 0, sizeof (mac_address));
5183 /* Parse args required to build the message */
5184 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5186 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5190 else if (unformat (i, "random-mac"))
5192 else if (unformat (i, "tapname %s", &tap_name))
5200 errmsg ("missing tap name\n");
5203 if (vec_len (tap_name) > 63)
5205 errmsg ("tap name too long\n");
5207 vec_add1 (tap_name, 0);
5209 /* Construct the API message */
5210 M (TAP_CONNECT, tap_connect);
5212 mp->use_random_mac = random_mac;
5213 clib_memcpy (mp->mac_address, mac_address, 6);
5214 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5215 vec_free (tap_name);
5220 /* Wait for a reply... */
5225 api_tap_modify (vat_main_t * vam)
5227 unformat_input_t *i = vam->input;
5228 vl_api_tap_modify_t *mp;
5234 u32 sw_if_index = ~0;
5235 u8 sw_if_index_set = 0;
5237 memset (mac_address, 0, sizeof (mac_address));
5239 /* Parse args required to build the message */
5240 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5242 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5243 sw_if_index_set = 1;
5244 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5245 sw_if_index_set = 1;
5246 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5250 else if (unformat (i, "random-mac"))
5252 else if (unformat (i, "tapname %s", &tap_name))
5258 if (sw_if_index_set == 0)
5260 errmsg ("missing vpp interface name");
5265 errmsg ("missing tap name\n");
5268 if (vec_len (tap_name) > 63)
5270 errmsg ("tap name too long\n");
5272 vec_add1 (tap_name, 0);
5274 /* Construct the API message */
5275 M (TAP_MODIFY, tap_modify);
5277 mp->use_random_mac = random_mac;
5278 mp->sw_if_index = ntohl (sw_if_index);
5279 clib_memcpy (mp->mac_address, mac_address, 6);
5280 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5281 vec_free (tap_name);
5286 /* Wait for a reply... */
5291 api_tap_delete (vat_main_t * vam)
5293 unformat_input_t *i = vam->input;
5294 vl_api_tap_delete_t *mp;
5296 u32 sw_if_index = ~0;
5297 u8 sw_if_index_set = 0;
5299 /* Parse args required to build the message */
5300 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5302 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5303 sw_if_index_set = 1;
5304 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5305 sw_if_index_set = 1;
5310 if (sw_if_index_set == 0)
5312 errmsg ("missing vpp interface name");
5316 /* Construct the API message */
5317 M (TAP_DELETE, tap_delete);
5319 mp->sw_if_index = ntohl (sw_if_index);
5324 /* Wait for a reply... */
5329 api_ip_add_del_route (vat_main_t * vam)
5331 unformat_input_t *i = vam->input;
5332 vl_api_ip_add_del_route_t *mp;
5334 u32 sw_if_index = ~0, vrf_id = 0;
5335 u8 sw_if_index_set = 0;
5337 u8 is_local = 0, is_drop = 0;
5338 u8 create_vrf_if_needed = 0;
5340 u8 next_hop_weight = 1;
5342 u8 is_multipath = 0;
5344 u8 address_length_set = 0;
5345 u32 lookup_in_vrf = 0;
5346 u32 resolve_attempts = 0;
5347 u32 dst_address_length = 0;
5348 u8 next_hop_set = 0;
5349 ip4_address_t v4_dst_address, v4_next_hop_address;
5350 ip6_address_t v6_dst_address, v6_next_hop_address;
5354 u32 random_add_del = 0;
5355 u32 *random_vector = 0;
5357 u32 random_seed = 0xdeaddabe;
5358 u32 classify_table_index = ~0;
5361 /* Parse args required to build the message */
5362 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5364 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5365 sw_if_index_set = 1;
5366 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5367 sw_if_index_set = 1;
5368 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5373 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5378 else if (unformat (i, "/%d", &dst_address_length))
5380 address_length_set = 1;
5383 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5384 &v4_next_hop_address))
5388 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5389 &v6_next_hop_address))
5393 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5395 else if (unformat (i, "weight %d", &next_hop_weight))
5397 else if (unformat (i, "drop"))
5401 else if (unformat (i, "local"))
5405 else if (unformat (i, "classify %d", &classify_table_index))
5409 else if (unformat (i, "del"))
5411 else if (unformat (i, "add"))
5413 else if (unformat (i, "not-last"))
5415 else if (unformat (i, "multipath"))
5417 else if (unformat (i, "vrf %d", &vrf_id))
5419 else if (unformat (i, "create-vrf"))
5420 create_vrf_if_needed = 1;
5421 else if (unformat (i, "count %d", &count))
5423 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
5425 else if (unformat (i, "random"))
5427 else if (unformat (i, "seed %d", &random_seed))
5431 clib_warning ("parse error '%U'", format_unformat_error, i);
5436 if (resolve_attempts > 0 && sw_if_index_set == 0)
5438 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5442 if (!next_hop_set && !is_drop && !is_local && !is_classify)
5444 errmsg ("next hop / local / drop / classify not set\n");
5448 if (address_set == 0)
5450 errmsg ("missing addresses\n");
5454 if (address_length_set == 0)
5456 errmsg ("missing address length\n");
5460 /* Generate a pile of unique, random routes */
5463 u32 this_random_address;
5464 random_hash = hash_create (count, sizeof (uword));
5466 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5467 for (j = 0; j <= count; j++)
5471 this_random_address = random_u32 (&random_seed);
5472 this_random_address =
5473 clib_host_to_net_u32 (this_random_address);
5475 while (hash_get (random_hash, this_random_address));
5476 vec_add1 (random_vector, this_random_address);
5477 hash_set (random_hash, this_random_address, 1);
5479 hash_free (random_hash);
5480 v4_dst_address.as_u32 = random_vector[0];
5485 /* Turn on async mode */
5486 vam->async_mode = 1;
5487 vam->async_errors = 0;
5488 before = vat_time_now (vam);
5491 for (j = 0; j < count; j++)
5493 /* Construct the API message */
5494 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
5496 mp->next_hop_sw_if_index = ntohl (sw_if_index);
5497 mp->vrf_id = ntohl (vrf_id);
5498 if (resolve_attempts > 0)
5500 mp->resolve_attempts = ntohl (resolve_attempts);
5501 mp->resolve_if_needed = 1;
5503 mp->create_vrf_if_needed = create_vrf_if_needed;
5505 mp->is_add = is_add;
5506 mp->is_drop = is_drop;
5507 mp->is_ipv6 = is_ipv6;
5508 mp->is_local = is_local;
5509 mp->is_classify = is_classify;
5510 mp->is_multipath = is_multipath;
5511 mp->not_last = not_last;
5512 mp->next_hop_weight = next_hop_weight;
5513 mp->dst_address_length = dst_address_length;
5514 mp->lookup_in_vrf = ntohl (lookup_in_vrf);
5515 mp->classify_table_index = ntohl (classify_table_index);
5519 clib_memcpy (mp->dst_address, &v6_dst_address,
5520 sizeof (v6_dst_address));
5522 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5523 sizeof (v6_next_hop_address));
5524 increment_v6_address (&v6_dst_address);
5528 clib_memcpy (mp->dst_address, &v4_dst_address,
5529 sizeof (v4_dst_address));
5531 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5532 sizeof (v4_next_hop_address));
5534 v4_dst_address.as_u32 = random_vector[j + 1];
5536 increment_v4_address (&v4_dst_address);
5542 /* When testing multiple add/del ops, use a control-ping to sync */
5545 vl_api_control_ping_t *mp;
5548 /* Shut off async mode */
5549 vam->async_mode = 0;
5551 M (CONTROL_PING, control_ping);
5554 timeout = vat_time_now (vam) + 1.0;
5555 while (vat_time_now (vam) < timeout)
5556 if (vam->result_ready == 1)
5561 if (vam->retval == -99)
5562 errmsg ("timeout\n");
5564 if (vam->async_errors > 0)
5566 errmsg ("%d asynchronous errors\n", vam->async_errors);
5569 vam->async_errors = 0;
5570 after = vat_time_now (vam);
5572 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5573 count, after - before, count / (after - before));
5577 /* Wait for a reply... */
5581 /* Return the good/bad news */
5582 return (vam->retval);
5586 api_proxy_arp_add_del (vat_main_t * vam)
5588 unformat_input_t *i = vam->input;
5589 vl_api_proxy_arp_add_del_t *mp;
5593 ip4_address_t lo, hi;
5596 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5598 if (unformat (i, "vrf %d", &vrf_id))
5600 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
5601 unformat_ip4_address, &hi))
5603 else if (unformat (i, "del"))
5607 clib_warning ("parse error '%U'", format_unformat_error, i);
5614 errmsg ("address range not set\n");
5618 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
5620 mp->vrf_id = ntohl (vrf_id);
5621 mp->is_add = is_add;
5622 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
5623 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
5632 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
5634 unformat_input_t *i = vam->input;
5635 vl_api_proxy_arp_intfc_enable_disable_t *mp;
5639 u8 sw_if_index_set = 0;
5641 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5643 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5644 sw_if_index_set = 1;
5645 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5646 sw_if_index_set = 1;
5647 else if (unformat (i, "enable"))
5649 else if (unformat (i, "disable"))
5653 clib_warning ("parse error '%U'", format_unformat_error, i);
5658 if (sw_if_index_set == 0)
5660 errmsg ("missing interface name or sw_if_index\n");
5664 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
5666 mp->sw_if_index = ntohl (sw_if_index);
5667 mp->enable_disable = enable;
5676 api_mpls_add_del_decap (vat_main_t * vam)
5678 unformat_input_t *i = vam->input;
5679 vl_api_mpls_add_del_decap_t *mp;
5688 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5690 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
5692 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
5694 else if (unformat (i, "label %d", &label))
5696 else if (unformat (i, "next-index %d", &next_index))
5698 else if (unformat (i, "del"))
5700 else if (unformat (i, "s-bit-clear"))
5704 clib_warning ("parse error '%U'", format_unformat_error, i);
5709 M (MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
5711 mp->rx_vrf_id = ntohl (rx_vrf_id);
5712 mp->tx_vrf_id = ntohl (tx_vrf_id);
5713 mp->label = ntohl (label);
5714 mp->next_index = ntohl (next_index);
5716 mp->is_add = is_add;
5725 api_mpls_add_del_encap (vat_main_t * vam)
5727 unformat_input_t *i = vam->input;
5728 vl_api_mpls_add_del_encap_t *mp;
5733 ip4_address_t dst_address;
5736 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5738 if (unformat (i, "vrf %d", &vrf_id))
5740 else if (unformat (i, "label %d", &label))
5741 vec_add1 (labels, ntohl (label));
5742 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5744 else if (unformat (i, "del"))
5748 clib_warning ("parse error '%U'", format_unformat_error, i);
5753 if (vec_len (labels) == 0)
5755 errmsg ("missing encap label stack\n");
5759 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
5760 sizeof (u32) * vec_len (labels));
5762 mp->vrf_id = ntohl (vrf_id);
5763 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5764 mp->is_add = is_add;
5765 mp->nlabels = vec_len (labels);
5766 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
5777 api_mpls_gre_add_del_tunnel (vat_main_t * vam)
5779 unformat_input_t *i = vam->input;
5780 vl_api_mpls_gre_add_del_tunnel_t *mp;
5782 u32 inner_vrf_id = 0;
5783 u32 outer_vrf_id = 0;
5784 ip4_address_t src_address;
5785 ip4_address_t dst_address;
5786 ip4_address_t intfc_address;
5788 u8 intfc_address_length = 0;
5792 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5794 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5796 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5798 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
5800 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
5802 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5803 &intfc_address, &tmp))
5804 intfc_address_length = tmp;
5805 else if (unformat (i, "l2-only"))
5807 else if (unformat (i, "del"))
5811 clib_warning ("parse error '%U'", format_unformat_error, i);
5816 M (MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
5818 mp->inner_vrf_id = ntohl (inner_vrf_id);
5819 mp->outer_vrf_id = ntohl (outer_vrf_id);
5820 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
5821 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
5822 clib_memcpy (mp->intfc_address, &intfc_address, sizeof (intfc_address));
5823 mp->intfc_address_length = intfc_address_length;
5824 mp->l2_only = l2_only;
5825 mp->is_add = is_add;
5834 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
5836 unformat_input_t *i = vam->input;
5837 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
5839 u32 inner_vrf_id = 0;
5840 ip4_address_t intfc_address;
5841 u8 dst_mac_address[6];
5844 u8 intfc_address_length = 0;
5848 int tx_sw_if_index_set = 0;
5850 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5852 if (unformat (i, "vrf %d", &inner_vrf_id))
5854 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5855 &intfc_address, &tmp))
5856 intfc_address_length = tmp;
5857 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
5858 tx_sw_if_index_set = 1;
5859 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5860 tx_sw_if_index_set = 1;
5861 else if (unformat (i, "dst %U", unformat_ethernet_address,
5864 else if (unformat (i, "l2-only"))
5866 else if (unformat (i, "del"))
5870 clib_warning ("parse error '%U'", format_unformat_error, i);
5877 errmsg ("dst (mac address) not set\n");
5880 if (!tx_sw_if_index_set)
5882 errmsg ("tx-intfc not set\n");
5886 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
5888 mp->vrf_id = ntohl (inner_vrf_id);
5889 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
5890 mp->adj_address_length = intfc_address_length;
5891 clib_memcpy (mp->dst_mac_address, dst_mac_address,
5892 sizeof (dst_mac_address));
5893 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5894 mp->l2_only = l2_only;
5895 mp->is_add = is_add;
5904 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
5906 unformat_input_t *i = vam->input;
5907 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
5909 u32 inner_vrf_id = 0;
5910 u32 outer_vrf_id = 0;
5911 ip4_address_t adj_address;
5912 int adj_address_set = 0;
5913 ip4_address_t next_hop_address;
5914 int next_hop_address_set = 0;
5916 u8 adj_address_length = 0;
5919 u32 resolve_attempts = 5;
5920 u8 resolve_if_needed = 1;
5922 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5924 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
5926 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
5928 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
5929 &adj_address, &tmp))
5931 adj_address_length = tmp;
5932 adj_address_set = 1;
5934 else if (unformat (i, "next-hop %U", unformat_ip4_address,
5936 next_hop_address_set = 1;
5937 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5939 else if (unformat (i, "resolve-if-needed %d", &tmp))
5940 resolve_if_needed = tmp;
5941 else if (unformat (i, "l2-only"))
5943 else if (unformat (i, "del"))
5947 clib_warning ("parse error '%U'", format_unformat_error, i);
5952 if (!adj_address_set)
5954 errmsg ("adjacency address/mask not set\n");
5957 if (!next_hop_address_set)
5959 errmsg ("ip4 next hop address (in outer fib) not set\n");
5963 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
5965 mp->inner_vrf_id = ntohl (inner_vrf_id);
5966 mp->outer_vrf_id = ntohl (outer_vrf_id);
5967 mp->resolve_attempts = ntohl (resolve_attempts);
5968 mp->resolve_if_needed = resolve_if_needed;
5969 mp->is_add = is_add;
5970 mp->l2_only = l2_only;
5971 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
5972 mp->adj_address_length = adj_address_length;
5973 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
5974 sizeof (next_hop_address));
5983 api_sw_interface_set_unnumbered (vat_main_t * vam)
5985 unformat_input_t *i = vam->input;
5986 vl_api_sw_interface_set_unnumbered_t *mp;
5989 u32 unnum_sw_index = ~0;
5991 u8 sw_if_index_set = 0;
5993 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5995 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5996 sw_if_index_set = 1;
5997 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5998 sw_if_index_set = 1;
5999 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
6001 else if (unformat (i, "del"))
6005 clib_warning ("parse error '%U'", format_unformat_error, i);
6010 if (sw_if_index_set == 0)
6012 errmsg ("missing interface name or sw_if_index\n");
6016 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
6018 mp->sw_if_index = ntohl (sw_if_index);
6019 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6020 mp->is_add = is_add;
6029 api_ip_neighbor_add_del (vat_main_t * vam)
6031 unformat_input_t *i = vam->input;
6032 vl_api_ip_neighbor_add_del_t *mp;
6035 u8 sw_if_index_set = 0;
6041 u8 v4_address_set = 0;
6042 u8 v6_address_set = 0;
6043 ip4_address_t v4address;
6044 ip6_address_t v6address;
6046 memset (mac_address, 0, sizeof (mac_address));
6048 /* Parse args required to build the message */
6049 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6051 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6055 else if (unformat (i, "del"))
6057 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6058 sw_if_index_set = 1;
6059 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6060 sw_if_index_set = 1;
6061 else if (unformat (i, "is_static"))
6063 else if (unformat (i, "vrf %d", &vrf_id))
6065 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6067 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6071 clib_warning ("parse error '%U'", format_unformat_error, i);
6076 if (sw_if_index_set == 0)
6078 errmsg ("missing interface name or sw_if_index\n");
6081 if (v4_address_set && v6_address_set)
6083 errmsg ("both v4 and v6 addresses set\n");
6086 if (!v4_address_set && !v6_address_set)
6088 errmsg ("no address set\n");
6092 /* Construct the API message */
6093 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6095 mp->sw_if_index = ntohl (sw_if_index);
6096 mp->is_add = is_add;
6097 mp->vrf_id = ntohl (vrf_id);
6098 mp->is_static = is_static;
6100 clib_memcpy (mp->mac_address, mac_address, 6);
6104 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6108 /* mp->is_ipv6 = 0; via memset in M macro above */
6109 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6115 /* Wait for a reply, return good/bad news */
6123 api_reset_vrf (vat_main_t * vam)
6125 unformat_input_t *i = vam->input;
6126 vl_api_reset_vrf_t *mp;
6132 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6134 if (unformat (i, "vrf %d", &vrf_id))
6136 else if (unformat (i, "ipv6"))
6140 clib_warning ("parse error '%U'", format_unformat_error, i);
6145 if (vrf_id_set == 0)
6147 errmsg ("missing vrf id\n");
6151 M (RESET_VRF, reset_vrf);
6153 mp->vrf_id = ntohl (vrf_id);
6154 mp->is_ipv6 = is_ipv6;
6163 api_create_vlan_subif (vat_main_t * vam)
6165 unformat_input_t *i = vam->input;
6166 vl_api_create_vlan_subif_t *mp;
6169 u8 sw_if_index_set = 0;
6173 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6175 if (unformat (i, "sw_if_index %d", &sw_if_index))
6176 sw_if_index_set = 1;
6177 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6178 sw_if_index_set = 1;
6179 else if (unformat (i, "vlan %d", &vlan_id))
6183 clib_warning ("parse error '%U'", format_unformat_error, i);
6188 if (sw_if_index_set == 0)
6190 errmsg ("missing interface name or sw_if_index\n");
6194 if (vlan_id_set == 0)
6196 errmsg ("missing vlan_id\n");
6199 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6201 mp->sw_if_index = ntohl (sw_if_index);
6202 mp->vlan_id = ntohl (vlan_id);
6210 #define foreach_create_subif_bit \
6217 _(outer_vlan_id_any) \
6218 _(inner_vlan_id_any)
6221 api_create_subif (vat_main_t * vam)
6223 unformat_input_t *i = vam->input;
6224 vl_api_create_subif_t *mp;
6227 u8 sw_if_index_set = 0;
6234 u32 exact_match = 0;
6235 u32 default_sub = 0;
6236 u32 outer_vlan_id_any = 0;
6237 u32 inner_vlan_id_any = 0;
6239 u16 outer_vlan_id = 0;
6240 u16 inner_vlan_id = 0;
6242 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6244 if (unformat (i, "sw_if_index %d", &sw_if_index))
6245 sw_if_index_set = 1;
6246 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6247 sw_if_index_set = 1;
6248 else if (unformat (i, "sub_id %d", &sub_id))
6250 else if (unformat (i, "outer_vlan_id %d", &tmp))
6251 outer_vlan_id = tmp;
6252 else if (unformat (i, "inner_vlan_id %d", &tmp))
6253 inner_vlan_id = tmp;
6255 #define _(a) else if (unformat (i, #a)) a = 1 ;
6256 foreach_create_subif_bit
6260 clib_warning ("parse error '%U'", format_unformat_error, i);
6265 if (sw_if_index_set == 0)
6267 errmsg ("missing interface name or sw_if_index\n");
6271 if (sub_id_set == 0)
6273 errmsg ("missing sub_id\n");
6276 M (CREATE_SUBIF, create_subif);
6278 mp->sw_if_index = ntohl (sw_if_index);
6279 mp->sub_id = ntohl (sub_id);
6281 #define _(a) mp->a = a;
6282 foreach_create_subif_bit;
6285 mp->outer_vlan_id = ntohs (outer_vlan_id);
6286 mp->inner_vlan_id = ntohs (inner_vlan_id);
6295 api_oam_add_del (vat_main_t * vam)
6297 unformat_input_t *i = vam->input;
6298 vl_api_oam_add_del_t *mp;
6302 ip4_address_t src, dst;
6306 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6308 if (unformat (i, "vrf %d", &vrf_id))
6310 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6312 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6314 else if (unformat (i, "del"))
6318 clib_warning ("parse error '%U'", format_unformat_error, i);
6325 errmsg ("missing src addr\n");
6331 errmsg ("missing dst addr\n");
6335 M (OAM_ADD_DEL, oam_add_del);
6337 mp->vrf_id = ntohl (vrf_id);
6338 mp->is_add = is_add;
6339 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6340 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6349 api_reset_fib (vat_main_t * vam)
6351 unformat_input_t *i = vam->input;
6352 vl_api_reset_fib_t *mp;
6358 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6360 if (unformat (i, "vrf %d", &vrf_id))
6362 else if (unformat (i, "ipv6"))
6366 clib_warning ("parse error '%U'", format_unformat_error, i);
6371 if (vrf_id_set == 0)
6373 errmsg ("missing vrf id\n");
6377 M (RESET_FIB, reset_fib);
6379 mp->vrf_id = ntohl (vrf_id);
6380 mp->is_ipv6 = is_ipv6;
6389 api_dhcp_proxy_config (vat_main_t * vam)
6391 unformat_input_t *i = vam->input;
6392 vl_api_dhcp_proxy_config_t *mp;
6397 u8 v4_address_set = 0;
6398 u8 v6_address_set = 0;
6399 ip4_address_t v4address;
6400 ip6_address_t v6address;
6401 u8 v4_src_address_set = 0;
6402 u8 v6_src_address_set = 0;
6403 ip4_address_t v4srcaddress;
6404 ip6_address_t v6srcaddress;
6406 /* Parse args required to build the message */
6407 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6409 if (unformat (i, "del"))
6411 else if (unformat (i, "vrf %d", &vrf_id))
6413 else if (unformat (i, "insert-cid %d", &insert_cid))
6415 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6417 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6419 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6420 v4_src_address_set = 1;
6421 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6422 v6_src_address_set = 1;
6427 if (v4_address_set && v6_address_set)
6429 errmsg ("both v4 and v6 server addresses set\n");
6432 if (!v4_address_set && !v6_address_set)
6434 errmsg ("no server addresses set\n");
6438 if (v4_src_address_set && v6_src_address_set)
6440 errmsg ("both v4 and v6 src addresses set\n");
6443 if (!v4_src_address_set && !v6_src_address_set)
6445 errmsg ("no src addresses set\n");
6449 if (!(v4_src_address_set && v4_address_set) &&
6450 !(v6_src_address_set && v6_address_set))
6452 errmsg ("no matching server and src addresses set\n");
6456 /* Construct the API message */
6457 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
6459 mp->insert_circuit_id = insert_cid;
6460 mp->is_add = is_add;
6461 mp->vrf_id = ntohl (vrf_id);
6465 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6466 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6470 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6471 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6477 /* Wait for a reply, return good/bad news */
6484 api_dhcp_proxy_config_2 (vat_main_t * vam)
6486 unformat_input_t *i = vam->input;
6487 vl_api_dhcp_proxy_config_2_t *mp;
6490 u32 server_vrf_id = 0;
6493 u8 v4_address_set = 0;
6494 u8 v6_address_set = 0;
6495 ip4_address_t v4address;
6496 ip6_address_t v6address;
6497 u8 v4_src_address_set = 0;
6498 u8 v6_src_address_set = 0;
6499 ip4_address_t v4srcaddress;
6500 ip6_address_t v6srcaddress;
6502 /* Parse args required to build the message */
6503 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6505 if (unformat (i, "del"))
6507 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
6509 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
6511 else if (unformat (i, "insert-cid %d", &insert_cid))
6513 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
6515 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
6517 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
6518 v4_src_address_set = 1;
6519 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
6520 v6_src_address_set = 1;
6525 if (v4_address_set && v6_address_set)
6527 errmsg ("both v4 and v6 server addresses set\n");
6530 if (!v4_address_set && !v6_address_set)
6532 errmsg ("no server addresses set\n");
6536 if (v4_src_address_set && v6_src_address_set)
6538 errmsg ("both v4 and v6 src addresses set\n");
6541 if (!v4_src_address_set && !v6_src_address_set)
6543 errmsg ("no src addresses set\n");
6547 if (!(v4_src_address_set && v4_address_set) &&
6548 !(v6_src_address_set && v6_address_set))
6550 errmsg ("no matching server and src addresses set\n");
6554 /* Construct the API message */
6555 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
6557 mp->insert_circuit_id = insert_cid;
6558 mp->is_add = is_add;
6559 mp->rx_vrf_id = ntohl (rx_vrf_id);
6560 mp->server_vrf_id = ntohl (server_vrf_id);
6564 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
6565 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
6569 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
6570 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
6576 /* Wait for a reply, return good/bad news */
6583 api_dhcp_proxy_set_vss (vat_main_t * vam)
6585 unformat_input_t *i = vam->input;
6586 vl_api_dhcp_proxy_set_vss_t *mp;
6597 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6599 if (unformat (i, "tbl_id %d", &tbl_id))
6601 if (unformat (i, "fib_id %d", &fib_id))
6603 if (unformat (i, "oui %d", &oui))
6605 else if (unformat (i, "ipv6"))
6607 else if (unformat (i, "del"))
6611 clib_warning ("parse error '%U'", format_unformat_error, i);
6616 if (tbl_id_set == 0)
6618 errmsg ("missing tbl id\n");
6622 if (fib_id_set == 0)
6624 errmsg ("missing fib id\n");
6629 errmsg ("missing oui\n");
6633 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
6634 mp->tbl_id = ntohl (tbl_id);
6635 mp->fib_id = ntohl (fib_id);
6636 mp->oui = ntohl (oui);
6637 mp->is_ipv6 = is_ipv6;
6638 mp->is_add = is_add;
6647 api_dhcp_client_config (vat_main_t * vam)
6649 unformat_input_t *i = vam->input;
6650 vl_api_dhcp_client_config_t *mp;
6653 u8 sw_if_index_set = 0;
6656 u8 disable_event = 0;
6658 /* Parse args required to build the message */
6659 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6661 if (unformat (i, "del"))
6663 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6664 sw_if_index_set = 1;
6665 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6666 sw_if_index_set = 1;
6667 else if (unformat (i, "hostname %s", &hostname))
6669 else if (unformat (i, "disable_event"))
6675 if (sw_if_index_set == 0)
6677 errmsg ("missing interface name or sw_if_index\n");
6681 if (vec_len (hostname) > 63)
6683 errmsg ("hostname too long\n");
6685 vec_add1 (hostname, 0);
6687 /* Construct the API message */
6688 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
6690 mp->sw_if_index = ntohl (sw_if_index);
6691 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
6692 vec_free (hostname);
6693 mp->is_add = is_add;
6694 mp->want_dhcp_event = disable_event ? 0 : 1;
6695 mp->pid = getpid ();
6700 /* Wait for a reply, return good/bad news */
6707 api_set_ip_flow_hash (vat_main_t * vam)
6709 unformat_input_t *i = vam->input;
6710 vl_api_set_ip_flow_hash_t *mp;
6722 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6724 if (unformat (i, "vrf %d", &vrf_id))
6726 else if (unformat (i, "ipv6"))
6728 else if (unformat (i, "src"))
6730 else if (unformat (i, "dst"))
6732 else if (unformat (i, "sport"))
6734 else if (unformat (i, "dport"))
6736 else if (unformat (i, "proto"))
6738 else if (unformat (i, "reverse"))
6743 clib_warning ("parse error '%U'", format_unformat_error, i);
6748 if (vrf_id_set == 0)
6750 errmsg ("missing vrf id\n");
6754 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
6760 mp->reverse = reverse;
6761 mp->vrf_id = ntohl (vrf_id);
6762 mp->is_ipv6 = is_ipv6;
6771 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
6773 unformat_input_t *i = vam->input;
6774 vl_api_sw_interface_ip6_enable_disable_t *mp;
6777 u8 sw_if_index_set = 0;
6780 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6782 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6783 sw_if_index_set = 1;
6784 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6785 sw_if_index_set = 1;
6786 else if (unformat (i, "enable"))
6788 else if (unformat (i, "disable"))
6792 clib_warning ("parse error '%U'", format_unformat_error, i);
6797 if (sw_if_index_set == 0)
6799 errmsg ("missing interface name or sw_if_index\n");
6803 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
6805 mp->sw_if_index = ntohl (sw_if_index);
6806 mp->enable = enable;
6815 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
6817 unformat_input_t *i = vam->input;
6818 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
6821 u8 sw_if_index_set = 0;
6822 u32 address_length = 0;
6823 u8 v6_address_set = 0;
6824 ip6_address_t v6address;
6826 /* Parse args required to build the message */
6827 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6829 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6830 sw_if_index_set = 1;
6831 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6832 sw_if_index_set = 1;
6833 else if (unformat (i, "%U/%d",
6834 unformat_ip6_address, &v6address, &address_length))
6840 if (sw_if_index_set == 0)
6842 errmsg ("missing interface name or sw_if_index\n");
6845 if (!v6_address_set)
6847 errmsg ("no address set\n");
6851 /* Construct the API message */
6852 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
6853 sw_interface_ip6_set_link_local_address);
6855 mp->sw_if_index = ntohl (sw_if_index);
6856 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6857 mp->address_length = address_length;
6862 /* Wait for a reply, return good/bad news */
6871 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
6873 unformat_input_t *i = vam->input;
6874 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
6877 u8 sw_if_index_set = 0;
6878 u32 address_length = 0;
6879 u8 v6_address_set = 0;
6880 ip6_address_t v6address;
6882 u8 no_advertise = 0;
6884 u8 no_autoconfig = 0;
6887 u32 val_lifetime = 0;
6888 u32 pref_lifetime = 0;
6890 /* Parse args required to build the message */
6891 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6893 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6894 sw_if_index_set = 1;
6895 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6896 sw_if_index_set = 1;
6897 else if (unformat (i, "%U/%d",
6898 unformat_ip6_address, &v6address, &address_length))
6900 else if (unformat (i, "val_life %d", &val_lifetime))
6902 else if (unformat (i, "pref_life %d", &pref_lifetime))
6904 else if (unformat (i, "def"))
6906 else if (unformat (i, "noadv"))
6908 else if (unformat (i, "offl"))
6910 else if (unformat (i, "noauto"))
6912 else if (unformat (i, "nolink"))
6914 else if (unformat (i, "isno"))
6918 clib_warning ("parse error '%U'", format_unformat_error, i);
6923 if (sw_if_index_set == 0)
6925 errmsg ("missing interface name or sw_if_index\n");
6928 if (!v6_address_set)
6930 errmsg ("no address set\n");
6934 /* Construct the API message */
6935 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
6937 mp->sw_if_index = ntohl (sw_if_index);
6938 clib_memcpy (mp->address, &v6address, sizeof (v6address));
6939 mp->address_length = address_length;
6940 mp->use_default = use_default;
6941 mp->no_advertise = no_advertise;
6942 mp->off_link = off_link;
6943 mp->no_autoconfig = no_autoconfig;
6944 mp->no_onlink = no_onlink;
6946 mp->val_lifetime = ntohl (val_lifetime);
6947 mp->pref_lifetime = ntohl (pref_lifetime);
6952 /* Wait for a reply, return good/bad news */
6960 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
6962 unformat_input_t *i = vam->input;
6963 vl_api_sw_interface_ip6nd_ra_config_t *mp;
6966 u8 sw_if_index_set = 0;
6971 u8 send_unicast = 0;
6974 u8 default_router = 0;
6975 u32 max_interval = 0;
6976 u32 min_interval = 0;
6978 u32 initial_count = 0;
6979 u32 initial_interval = 0;
6982 /* Parse args required to build the message */
6983 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6985 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6986 sw_if_index_set = 1;
6987 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6988 sw_if_index_set = 1;
6989 else if (unformat (i, "maxint %d", &max_interval))
6991 else if (unformat (i, "minint %d", &min_interval))
6993 else if (unformat (i, "life %d", &lifetime))
6995 else if (unformat (i, "count %d", &initial_count))
6997 else if (unformat (i, "interval %d", &initial_interval))
6999 else if (unformat (i, "suppress") || unformat (i, "surpress"))
7001 else if (unformat (i, "managed"))
7003 else if (unformat (i, "other"))
7005 else if (unformat (i, "ll"))
7007 else if (unformat (i, "send"))
7009 else if (unformat (i, "cease"))
7011 else if (unformat (i, "isno"))
7013 else if (unformat (i, "def"))
7017 clib_warning ("parse error '%U'", format_unformat_error, i);
7022 if (sw_if_index_set == 0)
7024 errmsg ("missing interface name or sw_if_index\n");
7028 /* Construct the API message */
7029 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
7031 mp->sw_if_index = ntohl (sw_if_index);
7032 mp->max_interval = ntohl (max_interval);
7033 mp->min_interval = ntohl (min_interval);
7034 mp->lifetime = ntohl (lifetime);
7035 mp->initial_count = ntohl (initial_count);
7036 mp->initial_interval = ntohl (initial_interval);
7037 mp->suppress = suppress;
7038 mp->managed = managed;
7040 mp->ll_option = ll_option;
7041 mp->send_unicast = send_unicast;
7044 mp->default_router = default_router;
7049 /* Wait for a reply, return good/bad news */
7057 api_set_arp_neighbor_limit (vat_main_t * vam)
7059 unformat_input_t *i = vam->input;
7060 vl_api_set_arp_neighbor_limit_t *mp;
7066 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7068 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7070 else if (unformat (i, "ipv6"))
7074 clib_warning ("parse error '%U'", format_unformat_error, i);
7081 errmsg ("missing limit value\n");
7085 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
7087 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7088 mp->is_ipv6 = is_ipv6;
7097 api_l2_patch_add_del (vat_main_t * vam)
7099 unformat_input_t *i = vam->input;
7100 vl_api_l2_patch_add_del_t *mp;
7103 u8 rx_sw_if_index_set = 0;
7105 u8 tx_sw_if_index_set = 0;
7108 /* Parse args required to build the message */
7109 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7111 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7112 rx_sw_if_index_set = 1;
7113 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7114 tx_sw_if_index_set = 1;
7115 else if (unformat (i, "rx"))
7117 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7119 if (unformat (i, "%U", unformat_sw_if_index, vam,
7121 rx_sw_if_index_set = 1;
7126 else if (unformat (i, "tx"))
7128 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7130 if (unformat (i, "%U", unformat_sw_if_index, vam,
7132 tx_sw_if_index_set = 1;
7137 else if (unformat (i, "del"))
7143 if (rx_sw_if_index_set == 0)
7145 errmsg ("missing rx interface name or rx_sw_if_index\n");
7149 if (tx_sw_if_index_set == 0)
7151 errmsg ("missing tx interface name or tx_sw_if_index\n");
7155 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7157 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7158 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7159 mp->is_add = is_add;
7168 api_trace_profile_add (vat_main_t * vam)
7170 unformat_input_t *input = vam->input;
7171 vl_api_trace_profile_add_t *mp;
7174 u32 trace_option_elts = 0;
7175 u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
7176 int has_pow_option = 0;
7177 int has_ppc_option = 0;
7179 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7181 if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
7182 "trace-tsp %d node-id 0x%x app-data 0x%x",
7183 &id, &trace_type, &trace_option_elts, &trace_tsp,
7184 &node_id, &app_data))
7186 else if (unformat (input, "pow"))
7188 else if (unformat (input, "ppc encap"))
7189 has_ppc_option = PPC_ENCAP;
7190 else if (unformat (input, "ppc decap"))
7191 has_ppc_option = PPC_DECAP;
7192 else if (unformat (input, "ppc none"))
7193 has_ppc_option = PPC_NONE;
7197 M (TRACE_PROFILE_ADD, trace_profile_add);
7198 mp->id = htons (id);
7199 mp->trace_type = trace_type;
7200 mp->trace_num_elt = trace_option_elts;
7201 mp->trace_ppc = has_ppc_option;
7202 mp->trace_app_data = htonl (app_data);
7203 mp->pow_enable = has_pow_option;
7204 mp->trace_tsp = trace_tsp;
7205 mp->node_id = htonl (node_id);
7215 api_trace_profile_apply (vat_main_t * vam)
7217 unformat_input_t *input = vam->input;
7218 vl_api_trace_profile_apply_t *mp;
7221 u32 mask_width = ~0;
7228 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7230 if (unformat (input, "%U/%d", unformat_ip6_address, &addr, &mask_width))
7232 else if (unformat (input, "id %d", &id))
7234 else if (unformat (input, "vrf-id %d", &vrf_id))
7236 else if (unformat (input, "add"))
7238 else if (unformat (input, "pop"))
7240 else if (unformat (input, "none"))
7246 if ((is_add + is_pop + is_none) != 1)
7248 errmsg ("One of (add, pop, none) required");
7251 if (mask_width == ~0)
7253 errmsg ("<address>/<mask-width> required");
7256 M (TRACE_PROFILE_APPLY, trace_profile_apply);
7257 clib_memcpy (mp->dest_ipv6, &addr, sizeof (mp->dest_ipv6));
7258 mp->id = htons (id);
7259 mp->prefix_length = htonl (mask_width);
7260 mp->vrf_id = htonl (vrf_id);
7262 mp->trace_op = IOAM_HBYH_ADD;
7264 mp->trace_op = IOAM_HBYH_POP;
7266 mp->trace_op = IOAM_HBYH_MOD;
7280 api_trace_profile_del (vat_main_t * vam)
7282 vl_api_trace_profile_del_t *mp;
7285 M (TRACE_PROFILE_DEL, trace_profile_del);
7292 api_sr_tunnel_add_del (vat_main_t * vam)
7294 unformat_input_t *i = vam->input;
7295 vl_api_sr_tunnel_add_del_t *mp;
7299 ip6_address_t src_address;
7300 int src_address_set = 0;
7301 ip6_address_t dst_address;
7303 int dst_address_set = 0;
7305 u32 rx_table_id = 0;
7306 u32 tx_table_id = 0;
7307 ip6_address_t *segments = 0;
7308 ip6_address_t *this_seg;
7309 ip6_address_t *tags = 0;
7310 ip6_address_t *this_tag;
7311 ip6_address_t next_address, tag;
7313 u8 *policy_name = 0;
7315 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7317 if (unformat (i, "del"))
7319 else if (unformat (i, "name %s", &name))
7321 else if (unformat (i, "policy %s", &policy_name))
7323 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7325 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7327 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7328 src_address_set = 1;
7329 else if (unformat (i, "dst %U/%d",
7330 unformat_ip6_address, &dst_address, &dst_mask_width))
7331 dst_address_set = 1;
7332 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7334 vec_add2 (segments, this_seg, 1);
7335 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7336 sizeof (*this_seg));
7338 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7340 vec_add2 (tags, this_tag, 1);
7341 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7343 else if (unformat (i, "clean"))
7344 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7345 else if (unformat (i, "protected"))
7346 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7347 else if (unformat (i, "InPE %d", &pl_index))
7349 if (pl_index <= 0 || pl_index > 4)
7351 pl_index_range_error:
7352 errmsg ("pl index %d out of range\n", pl_index);
7356 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7358 else if (unformat (i, "EgPE %d", &pl_index))
7360 if (pl_index <= 0 || pl_index > 4)
7361 goto pl_index_range_error;
7363 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7365 else if (unformat (i, "OrgSrc %d", &pl_index))
7367 if (pl_index <= 0 || pl_index > 4)
7368 goto pl_index_range_error;
7370 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7376 if (!src_address_set)
7378 errmsg ("src address required\n");
7382 if (!dst_address_set)
7384 errmsg ("dst address required\n");
7390 errmsg ("at least one sr segment required\n");
7394 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7395 vec_len (segments) * sizeof (ip6_address_t)
7396 + vec_len (tags) * sizeof (ip6_address_t));
7398 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7399 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7400 mp->dst_mask_width = dst_mask_width;
7401 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7402 mp->n_segments = vec_len (segments);
7403 mp->n_tags = vec_len (tags);
7404 mp->is_add = is_del == 0;
7405 clib_memcpy (mp->segs_and_tags, segments,
7406 vec_len (segments) * sizeof (ip6_address_t));
7407 clib_memcpy (mp->segs_and_tags +
7408 vec_len (segments) * sizeof (ip6_address_t), tags,
7409 vec_len (tags) * sizeof (ip6_address_t));
7411 mp->outer_vrf_id = ntohl (rx_table_id);
7412 mp->inner_vrf_id = ntohl (tx_table_id);
7413 memcpy (mp->name, name, vec_len (name));
7414 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7416 vec_free (segments);
7425 api_sr_policy_add_del (vat_main_t * vam)
7427 unformat_input_t *input = vam->input;
7428 vl_api_sr_policy_add_del_t *mp;
7432 u8 *tunnel_name = 0;
7433 u8 **tunnel_names = 0;
7438 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
7439 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
7441 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7443 if (unformat (input, "del"))
7445 else if (unformat (input, "name %s", &name))
7447 else if (unformat (input, "tunnel %s", &tunnel_name))
7451 vec_add1 (tunnel_names, tunnel_name);
7453 - length = #bytes to store in serial vector
7454 - +1 = byte to store that length
7456 tunnel_names_length += (vec_len (tunnel_name) + 1);
7467 errmsg ("policy name required\n");
7471 if ((!tunnel_set) && (!is_del))
7473 errmsg ("tunnel name required\n");
7477 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
7481 mp->is_add = !is_del;
7483 memcpy (mp->name, name, vec_len (name));
7484 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
7485 u8 *serial_orig = 0;
7486 vec_validate (serial_orig, tunnel_names_length);
7487 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
7488 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
7490 for (j = 0; j < vec_len (tunnel_names); j++)
7492 tun_name_len = vec_len (tunnel_names[j]);
7493 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
7494 serial_orig += 1; // Move along one byte to store the actual tunnel name
7495 memcpy (serial_orig, tunnel_names[j], tun_name_len);
7496 serial_orig += tun_name_len; // Advance past the copy
7498 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
7500 vec_free (tunnel_names);
7501 vec_free (tunnel_name);
7509 api_sr_multicast_map_add_del (vat_main_t * vam)
7511 unformat_input_t *input = vam->input;
7512 vl_api_sr_multicast_map_add_del_t *mp;
7515 ip6_address_t multicast_address;
7516 u8 *policy_name = 0;
7517 int multicast_address_set = 0;
7519 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7521 if (unformat (input, "del"))
7525 (input, "address %U", unformat_ip6_address, &multicast_address))
7526 multicast_address_set = 1;
7527 else if (unformat (input, "sr-policy %s", &policy_name))
7533 if (!is_del && !policy_name)
7535 errmsg ("sr-policy name required\n");
7540 if (!multicast_address_set)
7542 errmsg ("address required\n");
7546 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
7548 mp->is_add = !is_del;
7549 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7550 clib_memcpy (mp->multicast_address, &multicast_address,
7551 sizeof (mp->multicast_address));
7554 vec_free (policy_name);
7562 #define foreach_ip4_proto_field \
7573 unformat_ip4_mask (unformat_input_t * input, va_list * args)
7575 u8 **maskp = va_arg (*args, u8 **);
7577 u8 found_something = 0;
7580 #define _(a) u8 a=0;
7581 foreach_ip4_proto_field;
7587 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7589 if (unformat (input, "version"))
7591 else if (unformat (input, "hdr_length"))
7593 else if (unformat (input, "src"))
7595 else if (unformat (input, "dst"))
7597 else if (unformat (input, "proto"))
7600 #define _(a) else if (unformat (input, #a)) a=1;
7601 foreach_ip4_proto_field
7607 #define _(a) found_something += a;
7608 foreach_ip4_proto_field;
7611 if (found_something == 0)
7614 vec_validate (mask, sizeof (*ip) - 1);
7616 ip = (ip4_header_t *) mask;
7618 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7619 foreach_ip4_proto_field;
7622 ip->ip_version_and_header_length = 0;
7625 ip->ip_version_and_header_length |= 0xF0;
7628 ip->ip_version_and_header_length |= 0x0F;
7634 #define foreach_ip6_proto_field \
7642 unformat_ip6_mask (unformat_input_t * input, va_list * args)
7644 u8 **maskp = va_arg (*args, u8 **);
7646 u8 found_something = 0;
7648 u32 ip_version_traffic_class_and_flow_label;
7650 #define _(a) u8 a=0;
7651 foreach_ip6_proto_field;
7654 u8 traffic_class = 0;
7657 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7659 if (unformat (input, "version"))
7661 else if (unformat (input, "traffic-class"))
7663 else if (unformat (input, "flow-label"))
7665 else if (unformat (input, "src"))
7667 else if (unformat (input, "dst"))
7669 else if (unformat (input, "proto"))
7672 #define _(a) else if (unformat (input, #a)) a=1;
7673 foreach_ip6_proto_field
7679 #define _(a) found_something += a;
7680 foreach_ip6_proto_field;
7683 if (found_something == 0)
7686 vec_validate (mask, sizeof (*ip) - 1);
7688 ip = (ip6_header_t *) mask;
7690 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
7691 foreach_ip6_proto_field;
7694 ip_version_traffic_class_and_flow_label = 0;
7697 ip_version_traffic_class_and_flow_label |= 0xF0000000;
7700 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
7703 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
7705 ip->ip_version_traffic_class_and_flow_label =
7706 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
7713 unformat_l3_mask (unformat_input_t * input, va_list * args)
7715 u8 **maskp = va_arg (*args, u8 **);
7717 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7719 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
7721 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
7730 unformat_l2_mask (unformat_input_t * input, va_list * args)
7732 u8 **maskp = va_arg (*args, u8 **);
7747 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7749 if (unformat (input, "src"))
7751 else if (unformat (input, "dst"))
7753 else if (unformat (input, "proto"))
7755 else if (unformat (input, "tag1"))
7757 else if (unformat (input, "tag2"))
7759 else if (unformat (input, "ignore-tag1"))
7761 else if (unformat (input, "ignore-tag2"))
7763 else if (unformat (input, "cos1"))
7765 else if (unformat (input, "cos2"))
7767 else if (unformat (input, "dot1q"))
7769 else if (unformat (input, "dot1ad"))
7774 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
7775 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
7778 if (tag1 || ignore_tag1 || cos1 || dot1q)
7780 if (tag2 || ignore_tag2 || cos2 || dot1ad)
7783 vec_validate (mask, len - 1);
7786 memset (mask, 0xff, 6);
7789 memset (mask + 6, 0xff, 6);
7793 /* inner vlan tag */
7802 mask[21] = mask[20] = 0xff;
7823 mask[16] = mask[17] = 0xff;
7833 mask[12] = mask[13] = 0xff;
7840 unformat_classify_mask (unformat_input_t * input, va_list * args)
7842 u8 **maskp = va_arg (*args, u8 **);
7843 u32 *skipp = va_arg (*args, u32 *);
7844 u32 *matchp = va_arg (*args, u32 *);
7851 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7853 if (unformat (input, "hex %U", unformat_hex_string, &mask))
7855 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
7857 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
7863 if (mask || l2 || l3)
7867 /* "With a free Ethernet header in every package" */
7869 vec_validate (l2, 13);
7873 vec_append (mask, l3);
7878 /* Scan forward looking for the first significant mask octet */
7879 for (i = 0; i < vec_len (mask); i++)
7883 /* compute (skip, match) params */
7884 *skipp = i / sizeof (u32x4);
7885 vec_delete (mask, *skipp * sizeof (u32x4), 0);
7887 /* Pad mask to an even multiple of the vector size */
7888 while (vec_len (mask) % sizeof (u32x4))
7891 match = vec_len (mask) / sizeof (u32x4);
7893 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
7895 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
7896 if (*tmp || *(tmp + 1))
7901 clib_warning ("BUG: match 0");
7903 _vec_len (mask) = match * sizeof (u32x4);
7914 #define foreach_l2_next \
7916 _(ethernet, ETHERNET_INPUT) \
7921 unformat_l2_next_index (unformat_input_t * input, va_list * args)
7923 u32 *miss_next_indexp = va_arg (*args, u32 *);
7928 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
7932 if (unformat (input, "%d", &tmp))
7941 *miss_next_indexp = next_index;
7945 #define foreach_ip_next \
7952 unformat_ip_next_index (unformat_input_t * input, va_list * args)
7954 u32 *miss_next_indexp = va_arg (*args, u32 *);
7959 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
7963 if (unformat (input, "%d", &tmp))
7972 *miss_next_indexp = next_index;
7976 #define foreach_acl_next \
7980 unformat_acl_next_index (unformat_input_t * input, va_list * args)
7982 u32 *miss_next_indexp = va_arg (*args, u32 *);
7987 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
7991 if (unformat (input, "permit"))
7996 else if (unformat (input, "%d", &tmp))
8005 *miss_next_indexp = next_index;
8010 unformat_policer_precolor (unformat_input_t * input, va_list * args)
8012 u32 *r = va_arg (*args, u32 *);
8014 if (unformat (input, "conform-color"))
8015 *r = POLICE_CONFORM;
8016 else if (unformat (input, "exceed-color"))
8025 api_classify_add_del_table (vat_main_t * vam)
8027 unformat_input_t *i = vam->input;
8028 vl_api_classify_add_del_table_t *mp;
8034 u32 table_index = ~0;
8035 u32 next_table_index = ~0;
8036 u32 miss_next_index = ~0;
8037 u32 memory_size = 32 << 20;
8041 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8043 if (unformat (i, "del"))
8045 else if (unformat (i, "buckets %d", &nbuckets))
8047 else if (unformat (i, "memory_size %d", &memory_size))
8049 else if (unformat (i, "skip %d", &skip))
8051 else if (unformat (i, "match %d", &match))
8053 else if (unformat (i, "table %d", &table_index))
8055 else if (unformat (i, "mask %U", unformat_classify_mask,
8056 &mask, &skip, &match))
8058 else if (unformat (i, "next-table %d", &next_table_index))
8060 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8063 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8066 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8073 if (is_add && mask == 0)
8075 errmsg ("Mask required\n");
8079 if (is_add && skip == ~0)
8081 errmsg ("skip count required\n");
8085 if (is_add && match == ~0)
8087 errmsg ("match count required\n");
8091 if (!is_add && table_index == ~0)
8093 errmsg ("table index required for delete\n");
8097 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8099 mp->is_add = is_add;
8100 mp->table_index = ntohl (table_index);
8101 mp->nbuckets = ntohl (nbuckets);
8102 mp->memory_size = ntohl (memory_size);
8103 mp->skip_n_vectors = ntohl (skip);
8104 mp->match_n_vectors = ntohl (match);
8105 mp->next_table_index = ntohl (next_table_index);
8106 mp->miss_next_index = ntohl (miss_next_index);
8107 clib_memcpy (mp->mask, mask, vec_len (mask));
8117 unformat_ip4_match (unformat_input_t * input, va_list * args)
8119 u8 **matchp = va_arg (*args, u8 **);
8126 int src = 0, dst = 0;
8127 ip4_address_t src_val, dst_val;
8134 int fragment_id = 0;
8135 u32 fragment_id_val;
8141 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8143 if (unformat (input, "version %d", &version_val))
8145 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8147 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8149 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8151 else if (unformat (input, "proto %d", &proto_val))
8153 else if (unformat (input, "tos %d", &tos_val))
8155 else if (unformat (input, "length %d", &length_val))
8157 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8159 else if (unformat (input, "ttl %d", &ttl_val))
8161 else if (unformat (input, "checksum %d", &checksum_val))
8167 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8168 + ttl + checksum == 0)
8172 * Aligned because we use the real comparison functions
8174 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8176 ip = (ip4_header_t *) match;
8178 /* These are realistically matched in practice */
8180 ip->src_address.as_u32 = src_val.as_u32;
8183 ip->dst_address.as_u32 = dst_val.as_u32;
8186 ip->protocol = proto_val;
8189 /* These are not, but they're included for completeness */
8191 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8194 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8200 ip->length = length_val;
8206 ip->checksum = checksum_val;
8213 unformat_ip6_match (unformat_input_t * input, va_list * args)
8215 u8 **matchp = va_arg (*args, u8 **);
8220 u8 traffic_class = 0;
8221 u32 traffic_class_val = 0;
8224 int src = 0, dst = 0;
8225 ip6_address_t src_val, dst_val;
8228 int payload_length = 0;
8229 u32 payload_length_val;
8232 u32 ip_version_traffic_class_and_flow_label;
8234 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8236 if (unformat (input, "version %d", &version_val))
8238 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8240 else if (unformat (input, "flow_label %d", &flow_label_val))
8242 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8244 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8246 else if (unformat (input, "proto %d", &proto_val))
8248 else if (unformat (input, "payload_length %d", &payload_length_val))
8250 else if (unformat (input, "hop_limit %d", &hop_limit_val))
8256 if (version + traffic_class + flow_label + src + dst + proto +
8257 payload_length + hop_limit == 0)
8261 * Aligned because we use the real comparison functions
8263 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8265 ip = (ip6_header_t *) match;
8268 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
8271 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
8274 ip->protocol = proto_val;
8276 ip_version_traffic_class_and_flow_label = 0;
8279 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
8282 ip_version_traffic_class_and_flow_label |=
8283 (traffic_class_val & 0xFF) << 20;
8286 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
8288 ip->ip_version_traffic_class_and_flow_label =
8289 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8292 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
8295 ip->hop_limit = hop_limit_val;
8302 unformat_l3_match (unformat_input_t * input, va_list * args)
8304 u8 **matchp = va_arg (*args, u8 **);
8306 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8308 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
8310 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
8319 unformat_vlan_tag (unformat_input_t * input, va_list * args)
8321 u8 *tagp = va_arg (*args, u8 *);
8324 if (unformat (input, "%d", &tag))
8326 tagp[0] = (tag >> 8) & 0x0F;
8327 tagp[1] = tag & 0xFF;
8335 unformat_l2_match (unformat_input_t * input, va_list * args)
8337 u8 **matchp = va_arg (*args, u8 **);
8357 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8359 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
8362 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
8364 else if (unformat (input, "proto %U",
8365 unformat_ethernet_type_host_byte_order, &proto_val))
8367 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
8369 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
8371 else if (unformat (input, "ignore-tag1"))
8373 else if (unformat (input, "ignore-tag2"))
8375 else if (unformat (input, "cos1 %d", &cos1_val))
8377 else if (unformat (input, "cos2 %d", &cos2_val))
8382 if ((src + dst + proto + tag1 + tag2 +
8383 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8386 if (tag1 || ignore_tag1 || cos1)
8388 if (tag2 || ignore_tag2 || cos2)
8391 vec_validate_aligned (match, len - 1, sizeof (u32x4));
8394 clib_memcpy (match, dst_val, 6);
8397 clib_memcpy (match + 6, src_val, 6);
8401 /* inner vlan tag */
8402 match[19] = tag2_val[1];
8403 match[18] = tag2_val[0];
8405 match[18] |= (cos2_val & 0x7) << 5;
8408 match[21] = proto_val & 0xff;
8409 match[20] = proto_val >> 8;
8413 match[15] = tag1_val[1];
8414 match[14] = tag1_val[0];
8417 match[14] |= (cos1_val & 0x7) << 5;
8423 match[15] = tag1_val[1];
8424 match[14] = tag1_val[0];
8427 match[17] = proto_val & 0xff;
8428 match[16] = proto_val >> 8;
8431 match[14] |= (cos1_val & 0x7) << 5;
8437 match[18] |= (cos2_val & 0x7) << 5;
8439 match[14] |= (cos1_val & 0x7) << 5;
8442 match[13] = proto_val & 0xff;
8443 match[12] = proto_val >> 8;
8452 unformat_classify_match (unformat_input_t * input, va_list * args)
8454 u8 **matchp = va_arg (*args, u8 **);
8455 u32 skip_n_vectors = va_arg (*args, u32);
8456 u32 match_n_vectors = va_arg (*args, u32);
8462 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8464 if (unformat (input, "hex %U", unformat_hex_string, &match))
8466 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
8468 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
8474 if (match || l2 || l3)
8478 /* "Win a free Ethernet header in every packet" */
8480 vec_validate_aligned (l2, 13, sizeof (u32x4));
8484 vec_append_aligned (match, l3, sizeof (u32x4));
8489 /* Make sure the vector is big enough even if key is all 0's */
8490 vec_validate_aligned
8491 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
8494 /* Set size, include skipped vectors */
8495 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
8506 api_classify_add_del_session (vat_main_t * vam)
8508 unformat_input_t *i = vam->input;
8509 vl_api_classify_add_del_session_t *mp;
8511 u32 table_index = ~0;
8512 u32 hit_next_index = ~0;
8513 u32 opaque_index = ~0;
8517 u32 skip_n_vectors = 0;
8518 u32 match_n_vectors = 0;
8521 * Warning: you have to supply skip_n and match_n
8522 * because the API client cant simply look at the classify
8526 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8528 if (unformat (i, "del"))
8530 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
8533 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
8536 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
8539 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
8541 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
8543 else if (unformat (i, "opaque-index %d", &opaque_index))
8545 else if (unformat (i, "skip_n %d", &skip_n_vectors))
8547 else if (unformat (i, "match_n %d", &match_n_vectors))
8549 else if (unformat (i, "match %U", unformat_classify_match,
8550 &match, skip_n_vectors, match_n_vectors))
8552 else if (unformat (i, "advance %d", &advance))
8554 else if (unformat (i, "table-index %d", &table_index))
8560 if (table_index == ~0)
8562 errmsg ("Table index required\n");
8566 if (is_add && match == 0)
8568 errmsg ("Match value required\n");
8572 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
8574 mp->is_add = is_add;
8575 mp->table_index = ntohl (table_index);
8576 mp->hit_next_index = ntohl (hit_next_index);
8577 mp->opaque_index = ntohl (opaque_index);
8578 mp->advance = ntohl (advance);
8579 clib_memcpy (mp->match, match, vec_len (match));
8588 api_classify_set_interface_ip_table (vat_main_t * vam)
8590 unformat_input_t *i = vam->input;
8591 vl_api_classify_set_interface_ip_table_t *mp;
8594 int sw_if_index_set;
8595 u32 table_index = ~0;
8598 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8600 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8601 sw_if_index_set = 1;
8602 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8603 sw_if_index_set = 1;
8604 else if (unformat (i, "table %d", &table_index))
8608 clib_warning ("parse error '%U'", format_unformat_error, i);
8613 if (sw_if_index_set == 0)
8615 errmsg ("missing interface name or sw_if_index\n");
8620 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
8622 mp->sw_if_index = ntohl (sw_if_index);
8623 mp->table_index = ntohl (table_index);
8624 mp->is_ipv6 = is_ipv6;
8633 api_classify_set_interface_l2_tables (vat_main_t * vam)
8635 unformat_input_t *i = vam->input;
8636 vl_api_classify_set_interface_l2_tables_t *mp;
8639 int sw_if_index_set;
8640 u32 ip4_table_index = ~0;
8641 u32 ip6_table_index = ~0;
8642 u32 other_table_index = ~0;
8645 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8647 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8648 sw_if_index_set = 1;
8649 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8650 sw_if_index_set = 1;
8651 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8653 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8655 else if (unformat (i, "other-table %d", &other_table_index))
8657 else if (unformat (i, "is-input %d", &is_input))
8661 clib_warning ("parse error '%U'", format_unformat_error, i);
8666 if (sw_if_index_set == 0)
8668 errmsg ("missing interface name or sw_if_index\n");
8673 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
8675 mp->sw_if_index = ntohl (sw_if_index);
8676 mp->ip4_table_index = ntohl (ip4_table_index);
8677 mp->ip6_table_index = ntohl (ip6_table_index);
8678 mp->other_table_index = ntohl (other_table_index);
8679 mp->is_input = (u8) is_input;
8688 api_ipfix_enable (vat_main_t * vam)
8690 unformat_input_t *i = vam->input;
8691 vl_api_ipfix_enable_t *mp;
8692 ip4_address_t collector_address;
8693 u8 collector_address_set = 0;
8694 u32 collector_port = ~0;
8695 ip4_address_t src_address;
8696 u8 src_address_set = 0;
8699 u32 template_interval = ~0;
8702 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8704 if (unformat (i, "collector_address %U", unformat_ip4_address,
8705 &collector_address))
8706 collector_address_set = 1;
8707 else if (unformat (i, "collector_port %d", &collector_port))
8709 else if (unformat (i, "src_address %U", unformat_ip4_address,
8711 src_address_set = 1;
8712 else if (unformat (i, "vrf_id %d", &vrf_id))
8714 else if (unformat (i, "path_mtu %d", &path_mtu))
8716 else if (unformat (i, "template_interval %d", &template_interval))
8722 if (collector_address_set == 0)
8724 errmsg ("collector_address required\n");
8728 if (src_address_set == 0)
8730 errmsg ("src_address required\n");
8734 M (IPFIX_ENABLE, ipfix_enable);
8736 memcpy (mp->collector_address, collector_address.data,
8737 sizeof (collector_address.data));
8738 mp->collector_port = htons ((u16) collector_port);
8739 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
8740 mp->vrf_id = htonl (vrf_id);
8741 mp->path_mtu = htonl (path_mtu);
8742 mp->template_interval = htonl (template_interval);
8750 api_get_node_index (vat_main_t * vam)
8752 unformat_input_t *i = vam->input;
8753 vl_api_get_node_index_t *mp;
8757 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8759 if (unformat (i, "node %s", &name))
8766 errmsg ("node name required\n");
8769 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8771 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8775 M (GET_NODE_INDEX, get_node_index);
8776 clib_memcpy (mp->node_name, name, vec_len (name));
8786 api_get_next_index (vat_main_t * vam)
8788 unformat_input_t *i = vam->input;
8789 vl_api_get_next_index_t *mp;
8791 u8 *node_name = 0, *next_node_name = 0;
8793 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8795 if (unformat (i, "node-name %s", &node_name))
8797 else if (unformat (i, "next-node-name %s", &next_node_name))
8803 errmsg ("node name required\n");
8806 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
8808 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8812 if (next_node_name == 0)
8814 errmsg ("next node name required\n");
8817 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
8819 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
8823 M (GET_NEXT_INDEX, get_next_index);
8824 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
8825 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
8826 vec_free (node_name);
8827 vec_free (next_node_name);
8836 api_add_node_next (vat_main_t * vam)
8838 unformat_input_t *i = vam->input;
8839 vl_api_add_node_next_t *mp;
8844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8846 if (unformat (i, "node %s", &name))
8848 else if (unformat (i, "next %s", &next))
8855 errmsg ("node name required\n");
8858 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
8860 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
8865 errmsg ("next node required\n");
8868 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
8870 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
8874 M (ADD_NODE_NEXT, add_node_next);
8875 clib_memcpy (mp->node_name, name, vec_len (name));
8876 clib_memcpy (mp->next_name, next, vec_len (next));
8887 api_l2tpv3_create_tunnel (vat_main_t * vam)
8889 unformat_input_t *i = vam->input;
8890 ip6_address_t client_address, our_address;
8891 int client_address_set = 0;
8892 int our_address_set = 0;
8893 u32 local_session_id = 0;
8894 u32 remote_session_id = 0;
8895 u64 local_cookie = 0;
8896 u64 remote_cookie = 0;
8897 u8 l2_sublayer_present = 0;
8898 vl_api_l2tpv3_create_tunnel_t *mp;
8901 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8903 if (unformat (i, "client_address %U", unformat_ip6_address,
8905 client_address_set = 1;
8906 else if (unformat (i, "our_address %U", unformat_ip6_address,
8908 our_address_set = 1;
8909 else if (unformat (i, "local_session_id %d", &local_session_id))
8911 else if (unformat (i, "remote_session_id %d", &remote_session_id))
8913 else if (unformat (i, "local_cookie %lld", &local_cookie))
8915 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
8917 else if (unformat (i, "l2-sublayer-present"))
8918 l2_sublayer_present = 1;
8923 if (client_address_set == 0)
8925 errmsg ("client_address required\n");
8929 if (our_address_set == 0)
8931 errmsg ("our_address required\n");
8935 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
8937 clib_memcpy (mp->client_address, client_address.as_u8,
8938 sizeof (mp->client_address));
8940 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
8942 mp->local_session_id = ntohl (local_session_id);
8943 mp->remote_session_id = ntohl (remote_session_id);
8944 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
8945 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
8946 mp->l2_sublayer_present = l2_sublayer_present;
8956 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
8958 unformat_input_t *i = vam->input;
8960 u8 sw_if_index_set = 0;
8961 u64 new_local_cookie = 0;
8962 u64 new_remote_cookie = 0;
8963 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
8966 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8968 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8969 sw_if_index_set = 1;
8970 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8971 sw_if_index_set = 1;
8972 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
8974 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
8980 if (sw_if_index_set == 0)
8982 errmsg ("missing interface name or sw_if_index\n");
8986 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
8988 mp->sw_if_index = ntohl (sw_if_index);
8989 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
8990 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
8999 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
9001 unformat_input_t *i = vam->input;
9002 vl_api_l2tpv3_interface_enable_disable_t *mp;
9005 u8 sw_if_index_set = 0;
9006 u8 enable_disable = 1;
9008 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9010 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9011 sw_if_index_set = 1;
9012 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9013 sw_if_index_set = 1;
9014 else if (unformat (i, "enable"))
9016 else if (unformat (i, "disable"))
9022 if (sw_if_index_set == 0)
9024 errmsg ("missing interface name or sw_if_index\n");
9028 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
9030 mp->sw_if_index = ntohl (sw_if_index);
9031 mp->enable_disable = enable_disable;
9040 api_l2tpv3_set_lookup_key (vat_main_t * vam)
9042 unformat_input_t *i = vam->input;
9043 vl_api_l2tpv3_set_lookup_key_t *mp;
9047 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9049 if (unformat (i, "lookup_v6_src"))
9050 key = L2T_LOOKUP_SRC_ADDRESS;
9051 else if (unformat (i, "lookup_v6_dst"))
9052 key = L2T_LOOKUP_DST_ADDRESS;
9053 else if (unformat (i, "lookup_session_id"))
9054 key = L2T_LOOKUP_SESSION_ID;
9059 if (key == (u8) ~ 0)
9061 errmsg ("l2tp session lookup key unset\n");
9065 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
9075 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
9076 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9078 vat_main_t *vam = &vat_main;
9080 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9081 format_ip6_address, mp->our_address,
9082 format_ip6_address, mp->client_address,
9083 clib_net_to_host_u32 (mp->sw_if_index));
9086 " local cookies %016llx %016llx remote cookie %016llx\n",
9087 clib_net_to_host_u64 (mp->local_cookie[0]),
9088 clib_net_to_host_u64 (mp->local_cookie[1]),
9089 clib_net_to_host_u64 (mp->remote_cookie));
9091 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9092 clib_net_to_host_u32 (mp->local_session_id),
9093 clib_net_to_host_u32 (mp->remote_session_id));
9095 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9096 mp->l2_sublayer_present ? "preset" : "absent");
9100 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9101 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9103 vat_main_t *vam = &vat_main;
9104 vat_json_node_t *node = NULL;
9105 struct in6_addr addr;
9107 if (VAT_JSON_ARRAY != vam->json_tree.type)
9109 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9110 vat_json_init_array (&vam->json_tree);
9112 node = vat_json_array_add (&vam->json_tree);
9114 vat_json_init_object (node);
9116 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9117 vat_json_object_add_ip6 (node, "our_address", addr);
9118 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9119 vat_json_object_add_ip6 (node, "client_address", addr);
9121 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9122 vat_json_init_array (lc);
9123 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9124 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9125 vat_json_object_add_uint (node, "remote_cookie",
9126 clib_net_to_host_u64 (mp->remote_cookie));
9128 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9129 vat_json_object_add_uint (node, "local_session_id",
9130 clib_net_to_host_u32 (mp->local_session_id));
9131 vat_json_object_add_uint (node, "remote_session_id",
9132 clib_net_to_host_u32 (mp->remote_session_id));
9133 vat_json_object_add_string_copy (node, "l2_sublayer",
9134 mp->l2_sublayer_present ? (u8 *) "present"
9139 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
9141 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
9144 /* Get list of l2tpv3-tunnel interfaces */
9145 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
9148 /* Use a control ping for synchronization */
9150 vl_api_control_ping_t *mp;
9151 M (CONTROL_PING, control_ping);
9158 static void vl_api_sw_interface_tap_details_t_handler
9159 (vl_api_sw_interface_tap_details_t * mp)
9161 vat_main_t *vam = &vat_main;
9163 fformat (vam->ofp, "%-16s %d\n",
9164 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
9167 static void vl_api_sw_interface_tap_details_t_handler_json
9168 (vl_api_sw_interface_tap_details_t * mp)
9170 vat_main_t *vam = &vat_main;
9171 vat_json_node_t *node = NULL;
9173 if (VAT_JSON_ARRAY != vam->json_tree.type)
9175 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9176 vat_json_init_array (&vam->json_tree);
9178 node = vat_json_array_add (&vam->json_tree);
9180 vat_json_init_object (node);
9181 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9182 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
9186 api_sw_interface_tap_dump (vat_main_t * vam)
9188 vl_api_sw_interface_tap_dump_t *mp;
9191 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
9192 /* Get list of tap interfaces */
9193 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
9196 /* Use a control ping for synchronization */
9198 vl_api_control_ping_t *mp;
9199 M (CONTROL_PING, control_ping);
9205 static uword unformat_vxlan_decap_next
9206 (unformat_input_t * input, va_list * args)
9208 u32 *result = va_arg (*args, u32 *);
9211 if (unformat (input, "drop"))
9212 *result = VXLAN_INPUT_NEXT_DROP;
9213 else if (unformat (input, "ip4"))
9214 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
9215 else if (unformat (input, "ip6"))
9216 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
9217 else if (unformat (input, "l2"))
9218 *result = VXLAN_INPUT_NEXT_L2_INPUT;
9219 else if (unformat (input, "%d", &tmp))
9227 api_vxlan_add_del_tunnel (vat_main_t * vam)
9229 unformat_input_t *line_input = vam->input;
9230 vl_api_vxlan_add_del_tunnel_t *mp;
9232 ip4_address_t src4, dst4;
9233 ip6_address_t src6, dst6;
9235 u8 ipv4_set = 0, ipv6_set = 0;
9238 u32 encap_vrf_id = 0;
9239 u32 decap_next_index = ~0;
9242 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9244 if (unformat (line_input, "del"))
9246 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9251 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9256 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
9261 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
9266 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9268 else if (unformat (line_input, "decap-next %U",
9269 unformat_vxlan_decap_next, &decap_next_index))
9271 else if (unformat (line_input, "vni %d", &vni))
9275 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9282 errmsg ("tunnel src address not specified\n");
9287 errmsg ("tunnel dst address not specified\n");
9291 if (ipv4_set && ipv6_set)
9293 errmsg ("both IPv4 and IPv6 addresses specified");
9297 if ((vni == 0) || (vni >> 24))
9299 errmsg ("vni not specified or out of range\n");
9303 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
9307 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
9308 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
9312 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9313 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9315 mp->encap_vrf_id = ntohl (encap_vrf_id);
9316 mp->decap_next_index = ntohl (decap_next_index);
9317 mp->vni = ntohl (vni);
9318 mp->is_add = is_add;
9319 mp->is_ipv6 = ipv6_set;
9327 static void vl_api_vxlan_tunnel_details_t_handler
9328 (vl_api_vxlan_tunnel_details_t * mp)
9330 vat_main_t *vam = &vat_main;
9332 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
9333 ntohl (mp->sw_if_index),
9334 format_ip46_address, &(mp->src_address[0]),
9336 format_ip46_address, &(mp->dst_address[0]),
9338 ntohl (mp->encap_vrf_id),
9339 ntohl (mp->decap_next_index), ntohl (mp->vni));
9342 static void vl_api_vxlan_tunnel_details_t_handler_json
9343 (vl_api_vxlan_tunnel_details_t * mp)
9345 vat_main_t *vam = &vat_main;
9346 vat_json_node_t *node = NULL;
9348 struct in6_addr ip6;
9350 if (VAT_JSON_ARRAY != vam->json_tree.type)
9352 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9353 vat_json_init_array (&vam->json_tree);
9355 node = vat_json_array_add (&vam->json_tree);
9357 vat_json_init_object (node);
9358 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9361 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
9362 vat_json_object_add_ip6 (node, "src_address", ip6);
9363 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
9364 vat_json_object_add_ip6 (node, "dst_address", ip6);
9368 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
9369 vat_json_object_add_ip4 (node, "src_address", ip4);
9370 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
9371 vat_json_object_add_ip4 (node, "dst_address", ip4);
9373 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
9374 vat_json_object_add_uint (node, "decap_next_index",
9375 ntohl (mp->decap_next_index));
9376 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
9377 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
9381 api_vxlan_tunnel_dump (vat_main_t * vam)
9383 unformat_input_t *i = vam->input;
9384 vl_api_vxlan_tunnel_dump_t *mp;
9387 u8 sw_if_index_set = 0;
9389 /* Parse args required to build the message */
9390 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9392 if (unformat (i, "sw_if_index %d", &sw_if_index))
9393 sw_if_index_set = 1;
9398 if (sw_if_index_set == 0)
9403 if (!vam->json_output)
9405 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
9406 "sw_if_index", "src_address", "dst_address",
9407 "encap_vrf_id", "decap_next_index", "vni");
9410 /* Get list of vxlan-tunnel interfaces */
9411 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
9413 mp->sw_if_index = htonl (sw_if_index);
9417 /* Use a control ping for synchronization */
9419 vl_api_control_ping_t *mp;
9420 M (CONTROL_PING, control_ping);
9427 api_gre_add_del_tunnel (vat_main_t * vam)
9429 unformat_input_t *line_input = vam->input;
9430 vl_api_gre_add_del_tunnel_t *mp;
9432 ip4_address_t src4, dst4;
9436 u32 outer_fib_id = 0;
9438 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9440 if (unformat (line_input, "del"))
9442 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
9444 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
9446 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
9450 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9457 errmsg ("tunnel src address not specified\n");
9462 errmsg ("tunnel dst address not specified\n");
9467 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
9469 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
9470 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
9471 mp->outer_fib_id = ntohl (outer_fib_id);
9472 mp->is_add = is_add;
9480 static void vl_api_gre_tunnel_details_t_handler
9481 (vl_api_gre_tunnel_details_t * mp)
9483 vat_main_t *vam = &vat_main;
9485 fformat (vam->ofp, "%11d%15U%15U%14d\n",
9486 ntohl (mp->sw_if_index),
9487 format_ip4_address, &mp->src_address,
9488 format_ip4_address, &mp->dst_address, ntohl (mp->outer_fib_id));
9491 static void vl_api_gre_tunnel_details_t_handler_json
9492 (vl_api_gre_tunnel_details_t * mp)
9494 vat_main_t *vam = &vat_main;
9495 vat_json_node_t *node = NULL;
9498 if (VAT_JSON_ARRAY != vam->json_tree.type)
9500 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9501 vat_json_init_array (&vam->json_tree);
9503 node = vat_json_array_add (&vam->json_tree);
9505 vat_json_init_object (node);
9506 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9507 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
9508 vat_json_object_add_ip4 (node, "src_address", ip4);
9509 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
9510 vat_json_object_add_ip4 (node, "dst_address", ip4);
9511 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
9515 api_gre_tunnel_dump (vat_main_t * vam)
9517 unformat_input_t *i = vam->input;
9518 vl_api_gre_tunnel_dump_t *mp;
9521 u8 sw_if_index_set = 0;
9523 /* Parse args required to build the message */
9524 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9526 if (unformat (i, "sw_if_index %d", &sw_if_index))
9527 sw_if_index_set = 1;
9532 if (sw_if_index_set == 0)
9537 if (!vam->json_output)
9539 fformat (vam->ofp, "%11s%15s%15s%14s\n",
9540 "sw_if_index", "src_address", "dst_address", "outer_fib_id");
9543 /* Get list of gre-tunnel interfaces */
9544 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
9546 mp->sw_if_index = htonl (sw_if_index);
9550 /* Use a control ping for synchronization */
9552 vl_api_control_ping_t *mp;
9553 M (CONTROL_PING, control_ping);
9560 api_l2_fib_clear_table (vat_main_t * vam)
9562 // unformat_input_t * i = vam->input;
9563 vl_api_l2_fib_clear_table_t *mp;
9566 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
9575 api_l2_interface_efp_filter (vat_main_t * vam)
9577 unformat_input_t *i = vam->input;
9578 vl_api_l2_interface_efp_filter_t *mp;
9582 u8 sw_if_index_set = 0;
9584 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9586 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9587 sw_if_index_set = 1;
9588 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9589 sw_if_index_set = 1;
9590 else if (unformat (i, "enable"))
9592 else if (unformat (i, "disable"))
9596 clib_warning ("parse error '%U'", format_unformat_error, i);
9601 if (sw_if_index_set == 0)
9603 errmsg ("missing sw_if_index\n");
9607 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
9609 mp->sw_if_index = ntohl (sw_if_index);
9610 mp->enable_disable = enable;
9618 #define foreach_vtr_op \
9619 _("disable", L2_VTR_DISABLED) \
9620 _("push-1", L2_VTR_PUSH_1) \
9621 _("push-2", L2_VTR_PUSH_2) \
9622 _("pop-1", L2_VTR_POP_1) \
9623 _("pop-2", L2_VTR_POP_2) \
9624 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
9625 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
9626 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
9627 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
9630 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
9632 unformat_input_t *i = vam->input;
9633 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
9636 u8 sw_if_index_set = 0;
9643 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9645 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9646 sw_if_index_set = 1;
9647 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9648 sw_if_index_set = 1;
9649 else if (unformat (i, "vtr_op %d", &vtr_op))
9651 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
9654 else if (unformat (i, "push_dot1q %d", &push_dot1q))
9656 else if (unformat (i, "tag1 %d", &tag1))
9658 else if (unformat (i, "tag2 %d", &tag2))
9662 clib_warning ("parse error '%U'", format_unformat_error, i);
9667 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
9669 errmsg ("missing vtr operation or sw_if_index\n");
9673 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
9674 mp->sw_if_index = ntohl (sw_if_index);
9675 mp->vtr_op = ntohl (vtr_op);
9676 mp->push_dot1q = ntohl (push_dot1q);
9677 mp->tag1 = ntohl (tag1);
9678 mp->tag2 = ntohl (tag2);
9687 api_create_vhost_user_if (vat_main_t * vam)
9689 unformat_input_t *i = vam->input;
9690 vl_api_create_vhost_user_if_t *mp;
9694 u8 file_name_set = 0;
9695 u32 custom_dev_instance = ~0;
9697 u8 use_custom_mac = 0;
9699 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9701 if (unformat (i, "socket %s", &file_name))
9705 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9707 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
9709 else if (unformat (i, "server"))
9715 if (file_name_set == 0)
9717 errmsg ("missing socket file name\n");
9721 if (vec_len (file_name) > 255)
9723 errmsg ("socket file name too long\n");
9726 vec_add1 (file_name, 0);
9728 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
9730 mp->is_server = is_server;
9731 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9732 vec_free (file_name);
9733 if (custom_dev_instance != ~0)
9736 mp->custom_dev_instance = ntohl (custom_dev_instance);
9738 mp->use_custom_mac = use_custom_mac;
9739 clib_memcpy (mp->mac_address, hwaddr, 6);
9748 api_modify_vhost_user_if (vat_main_t * vam)
9750 unformat_input_t *i = vam->input;
9751 vl_api_modify_vhost_user_if_t *mp;
9755 u8 file_name_set = 0;
9756 u32 custom_dev_instance = ~0;
9757 u8 sw_if_index_set = 0;
9758 u32 sw_if_index = (u32) ~ 0;
9760 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9762 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9763 sw_if_index_set = 1;
9764 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9765 sw_if_index_set = 1;
9766 else if (unformat (i, "socket %s", &file_name))
9770 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
9772 else if (unformat (i, "server"))
9778 if (sw_if_index_set == 0)
9780 errmsg ("missing sw_if_index or interface name\n");
9784 if (file_name_set == 0)
9786 errmsg ("missing socket file name\n");
9790 if (vec_len (file_name) > 255)
9792 errmsg ("socket file name too long\n");
9795 vec_add1 (file_name, 0);
9797 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
9799 mp->sw_if_index = ntohl (sw_if_index);
9800 mp->is_server = is_server;
9801 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
9802 vec_free (file_name);
9803 if (custom_dev_instance != ~0)
9806 mp->custom_dev_instance = ntohl (custom_dev_instance);
9816 api_delete_vhost_user_if (vat_main_t * vam)
9818 unformat_input_t *i = vam->input;
9819 vl_api_delete_vhost_user_if_t *mp;
9821 u32 sw_if_index = ~0;
9822 u8 sw_if_index_set = 0;
9824 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9826 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9827 sw_if_index_set = 1;
9828 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9829 sw_if_index_set = 1;
9834 if (sw_if_index_set == 0)
9836 errmsg ("missing sw_if_index or interface name\n");
9841 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
9843 mp->sw_if_index = ntohl (sw_if_index);
9851 static void vl_api_sw_interface_vhost_user_details_t_handler
9852 (vl_api_sw_interface_vhost_user_details_t * mp)
9854 vat_main_t *vam = &vat_main;
9856 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
9857 (char *) mp->interface_name,
9858 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
9859 clib_net_to_host_u64 (mp->features), mp->is_server,
9860 ntohl (mp->num_regions), (char *) mp->sock_filename);
9861 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
9864 static void vl_api_sw_interface_vhost_user_details_t_handler_json
9865 (vl_api_sw_interface_vhost_user_details_t * mp)
9867 vat_main_t *vam = &vat_main;
9868 vat_json_node_t *node = NULL;
9870 if (VAT_JSON_ARRAY != vam->json_tree.type)
9872 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9873 vat_json_init_array (&vam->json_tree);
9875 node = vat_json_array_add (&vam->json_tree);
9877 vat_json_init_object (node);
9878 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
9879 vat_json_object_add_string_copy (node, "interface_name",
9880 mp->interface_name);
9881 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
9882 ntohl (mp->virtio_net_hdr_sz));
9883 vat_json_object_add_uint (node, "features",
9884 clib_net_to_host_u64 (mp->features));
9885 vat_json_object_add_uint (node, "is_server", mp->is_server);
9886 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
9887 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
9888 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
9892 api_sw_interface_vhost_user_dump (vat_main_t * vam)
9894 vl_api_sw_interface_vhost_user_dump_t *mp;
9897 "Interface name idx hdr_sz features server regions filename\n");
9899 /* Get list of vhost-user interfaces */
9900 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
9903 /* Use a control ping for synchronization */
9905 vl_api_control_ping_t *mp;
9906 M (CONTROL_PING, control_ping);
9913 api_show_version (vat_main_t * vam)
9915 vl_api_show_version_t *mp;
9918 M (SHOW_VERSION, show_version);
9928 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
9930 unformat_input_t *line_input = vam->input;
9931 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
9933 ip4_address_t local4, remote4;
9934 ip6_address_t local6, remote6;
9936 u8 ipv4_set = 0, ipv6_set = 0;
9939 u32 encap_vrf_id = 0;
9940 u32 decap_vrf_id = 0;
9945 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
9947 if (unformat (line_input, "del"))
9949 else if (unformat (line_input, "local %U",
9950 unformat_ip4_address, &local4))
9955 else if (unformat (line_input, "remote %U",
9956 unformat_ip4_address, &remote4))
9961 else if (unformat (line_input, "local %U",
9962 unformat_ip6_address, &local6))
9967 else if (unformat (line_input, "remote %U",
9968 unformat_ip6_address, &remote6))
9973 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
9975 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
9977 else if (unformat (line_input, "vni %d", &vni))
9979 else if (unformat (line_input, "next-ip4"))
9981 else if (unformat (line_input, "next-ip6"))
9983 else if (unformat (line_input, "next-ethernet"))
9985 else if (unformat (line_input, "next-nsh"))
9989 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
9996 errmsg ("tunnel local address not specified\n");
9999 if (remote_set == 0)
10001 errmsg ("tunnel remote address not specified\n");
10004 if (ipv4_set && ipv6_set)
10006 errmsg ("both IPv4 and IPv6 addresses specified");
10012 errmsg ("vni not specified\n");
10016 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
10021 clib_memcpy (&mp->local, &local6, sizeof (local6));
10022 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10026 clib_memcpy (&mp->local, &local4, sizeof (local4));
10027 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
10030 mp->encap_vrf_id = ntohl (encap_vrf_id);
10031 mp->decap_vrf_id = ntohl (decap_vrf_id);
10032 mp->protocol = ntohl (protocol);
10033 mp->vni = ntohl (vni);
10034 mp->is_add = is_add;
10035 mp->is_ipv6 = ipv6_set;
10043 static void vl_api_vxlan_gpe_tunnel_details_t_handler
10044 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10046 vat_main_t *vam = &vat_main;
10048 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10049 ntohl (mp->sw_if_index),
10050 format_ip46_address, &(mp->local[0]),
10051 format_ip46_address, &(mp->remote[0]),
10053 ntohl (mp->protocol),
10054 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
10057 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
10058 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10060 vat_main_t *vam = &vat_main;
10061 vat_json_node_t *node = NULL;
10062 struct in_addr ip4;
10063 struct in6_addr ip6;
10065 if (VAT_JSON_ARRAY != vam->json_tree.type)
10067 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10068 vat_json_init_array (&vam->json_tree);
10070 node = vat_json_array_add (&vam->json_tree);
10072 vat_json_init_object (node);
10073 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10076 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10077 vat_json_object_add_ip6 (node, "local", ip6);
10078 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10079 vat_json_object_add_ip6 (node, "remote", ip6);
10083 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10084 vat_json_object_add_ip4 (node, "local", ip4);
10085 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10086 vat_json_object_add_ip4 (node, "remote", ip4);
10088 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10089 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10090 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10091 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10092 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10096 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10098 unformat_input_t *i = vam->input;
10099 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10102 u8 sw_if_index_set = 0;
10104 /* Parse args required to build the message */
10105 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10107 if (unformat (i, "sw_if_index %d", &sw_if_index))
10108 sw_if_index_set = 1;
10113 if (sw_if_index_set == 0)
10118 if (!vam->json_output)
10120 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10121 "sw_if_index", "local", "remote", "vni",
10122 "protocol", "encap_vrf_id", "decap_vrf_id");
10125 /* Get list of vxlan-tunnel interfaces */
10126 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10128 mp->sw_if_index = htonl (sw_if_index);
10132 /* Use a control ping for synchronization */
10134 vl_api_control_ping_t *mp;
10135 M (CONTROL_PING, control_ping);
10142 format_l2_fib_mac_address (u8 * s, va_list * args)
10144 u8 *a = va_arg (*args, u8 *);
10146 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
10147 a[2], a[3], a[4], a[5], a[6], a[7]);
10150 static void vl_api_l2_fib_table_entry_t_handler
10151 (vl_api_l2_fib_table_entry_t * mp)
10153 vat_main_t *vam = &vat_main;
10155 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
10157 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
10158 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
10162 static void vl_api_l2_fib_table_entry_t_handler_json
10163 (vl_api_l2_fib_table_entry_t * mp)
10165 vat_main_t *vam = &vat_main;
10166 vat_json_node_t *node = NULL;
10168 if (VAT_JSON_ARRAY != vam->json_tree.type)
10170 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10171 vat_json_init_array (&vam->json_tree);
10173 node = vat_json_array_add (&vam->json_tree);
10175 vat_json_init_object (node);
10176 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
10177 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
10178 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10179 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
10180 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
10181 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
10185 api_l2_fib_table_dump (vat_main_t * vam)
10187 unformat_input_t *i = vam->input;
10188 vl_api_l2_fib_table_dump_t *mp;
10193 /* Parse args required to build the message */
10194 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10196 if (unformat (i, "bd_id %d", &bd_id))
10202 if (bd_id_set == 0)
10204 errmsg ("missing bridge domain\n");
10209 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
10211 /* Get list of l2 fib entries */
10212 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
10214 mp->bd_id = ntohl (bd_id);
10217 /* Use a control ping for synchronization */
10219 vl_api_control_ping_t *mp;
10220 M (CONTROL_PING, control_ping);
10228 api_interface_name_renumber (vat_main_t * vam)
10230 unformat_input_t *line_input = vam->input;
10231 vl_api_interface_name_renumber_t *mp;
10232 u32 sw_if_index = ~0;
10234 u32 new_show_dev_instance = ~0;
10236 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10238 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
10241 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
10243 else if (unformat (line_input, "new_show_dev_instance %d",
10244 &new_show_dev_instance))
10250 if (sw_if_index == ~0)
10252 errmsg ("missing interface name or sw_if_index\n");
10256 if (new_show_dev_instance == ~0)
10258 errmsg ("missing new_show_dev_instance\n");
10262 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
10264 mp->sw_if_index = ntohl (sw_if_index);
10265 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
10272 api_want_ip4_arp_events (vat_main_t * vam)
10274 unformat_input_t *line_input = vam->input;
10275 vl_api_want_ip4_arp_events_t *mp;
10277 ip4_address_t address;
10278 int address_set = 0;
10279 u32 enable_disable = 1;
10281 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10283 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
10285 else if (unformat (line_input, "del"))
10286 enable_disable = 0;
10291 if (address_set == 0)
10293 errmsg ("missing addresses\n");
10297 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
10298 mp->enable_disable = enable_disable;
10299 mp->pid = getpid ();
10300 mp->address = address.as_u32;
10307 api_want_ip6_nd_events (vat_main_t * vam)
10309 unformat_input_t *line_input = vam->input;
10310 vl_api_want_ip6_nd_events_t *mp;
10312 ip6_address_t address;
10313 int address_set = 0;
10314 u32 enable_disable = 1;
10316 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10318 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
10320 else if (unformat (line_input, "del"))
10321 enable_disable = 0;
10326 if (address_set == 0)
10328 errmsg ("missing addresses\n");
10332 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
10333 mp->enable_disable = enable_disable;
10334 mp->pid = getpid ();
10335 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
10342 api_input_acl_set_interface (vat_main_t * vam)
10344 unformat_input_t *i = vam->input;
10345 vl_api_input_acl_set_interface_t *mp;
10348 int sw_if_index_set;
10349 u32 ip4_table_index = ~0;
10350 u32 ip6_table_index = ~0;
10351 u32 l2_table_index = ~0;
10354 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10356 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10357 sw_if_index_set = 1;
10358 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10359 sw_if_index_set = 1;
10360 else if (unformat (i, "del"))
10362 else if (unformat (i, "ip4-table %d", &ip4_table_index))
10364 else if (unformat (i, "ip6-table %d", &ip6_table_index))
10366 else if (unformat (i, "l2-table %d", &l2_table_index))
10370 clib_warning ("parse error '%U'", format_unformat_error, i);
10375 if (sw_if_index_set == 0)
10377 errmsg ("missing interface name or sw_if_index\n");
10381 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
10383 mp->sw_if_index = ntohl (sw_if_index);
10384 mp->ip4_table_index = ntohl (ip4_table_index);
10385 mp->ip6_table_index = ntohl (ip6_table_index);
10386 mp->l2_table_index = ntohl (l2_table_index);
10387 mp->is_add = is_add;
10396 api_ip_address_dump (vat_main_t * vam)
10398 unformat_input_t *i = vam->input;
10399 vl_api_ip_address_dump_t *mp;
10400 u32 sw_if_index = ~0;
10401 u8 sw_if_index_set = 0;
10406 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10408 if (unformat (i, "sw_if_index %d", &sw_if_index))
10409 sw_if_index_set = 1;
10410 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10411 sw_if_index_set = 1;
10412 else if (unformat (i, "ipv4"))
10414 else if (unformat (i, "ipv6"))
10420 if (ipv4_set && ipv6_set)
10422 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10426 if ((!ipv4_set) && (!ipv6_set))
10428 errmsg ("no ipv4 nor ipv6 flag set\n");
10432 if (sw_if_index_set == 0)
10434 errmsg ("missing interface name or sw_if_index\n");
10438 vam->current_sw_if_index = sw_if_index;
10439 vam->is_ipv6 = ipv6_set;
10441 M (IP_ADDRESS_DUMP, ip_address_dump);
10442 mp->sw_if_index = ntohl (sw_if_index);
10443 mp->is_ipv6 = ipv6_set;
10446 /* Use a control ping for synchronization */
10448 vl_api_control_ping_t *mp;
10449 M (CONTROL_PING, control_ping);
10456 api_ip_dump (vat_main_t * vam)
10458 vl_api_ip_dump_t *mp;
10459 unformat_input_t *in = vam->input;
10466 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
10468 if (unformat (in, "ipv4"))
10470 else if (unformat (in, "ipv6"))
10476 if (ipv4_set && ipv6_set)
10478 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
10482 if ((!ipv4_set) && (!ipv6_set))
10484 errmsg ("no ipv4 nor ipv6 flag set\n");
10488 is_ipv6 = ipv6_set;
10489 vam->is_ipv6 = is_ipv6;
10491 /* free old data */
10492 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
10494 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
10496 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
10498 M (IP_DUMP, ip_dump);
10499 mp->is_ipv6 = ipv6_set;
10502 /* Use a control ping for synchronization */
10504 vl_api_control_ping_t *mp;
10505 M (CONTROL_PING, control_ping);
10512 api_ipsec_spd_add_del (vat_main_t * vam)
10515 unformat_input_t *i = vam->input;
10516 vl_api_ipsec_spd_add_del_t *mp;
10521 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10523 if (unformat (i, "spd_id %d", &spd_id))
10525 else if (unformat (i, "del"))
10529 clib_warning ("parse error '%U'", format_unformat_error, i);
10535 errmsg ("spd_id must be set\n");
10539 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
10541 mp->spd_id = ntohl (spd_id);
10542 mp->is_add = is_add;
10549 clib_warning ("unsupported (no dpdk)");
10555 api_ipsec_interface_add_del_spd (vat_main_t * vam)
10558 unformat_input_t *i = vam->input;
10559 vl_api_ipsec_interface_add_del_spd_t *mp;
10562 u8 sw_if_index_set = 0;
10563 u32 spd_id = (u32) ~ 0;
10566 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10568 if (unformat (i, "del"))
10570 else if (unformat (i, "spd_id %d", &spd_id))
10572 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10573 sw_if_index_set = 1;
10574 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10575 sw_if_index_set = 1;
10578 clib_warning ("parse error '%U'", format_unformat_error, i);
10584 if (spd_id == (u32) ~ 0)
10586 errmsg ("spd_id must be set\n");
10590 if (sw_if_index_set == 0)
10592 errmsg ("missing interface name or sw_if_index\n");
10596 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
10598 mp->spd_id = ntohl (spd_id);
10599 mp->sw_if_index = ntohl (sw_if_index);
10600 mp->is_add = is_add;
10607 clib_warning ("unsupported (no dpdk)");
10613 api_ipsec_spd_add_del_entry (vat_main_t * vam)
10616 unformat_input_t *i = vam->input;
10617 vl_api_ipsec_spd_add_del_entry_t *mp;
10619 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
10620 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
10622 u32 rport_start = 0, rport_stop = (u32) ~ 0;
10623 u32 lport_start = 0, lport_stop = (u32) ~ 0;
10624 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
10625 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
10627 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
10628 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
10629 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
10630 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
10631 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
10632 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
10634 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10636 if (unformat (i, "del"))
10638 if (unformat (i, "outbound"))
10640 if (unformat (i, "inbound"))
10642 else if (unformat (i, "spd_id %d", &spd_id))
10644 else if (unformat (i, "sa_id %d", &sa_id))
10646 else if (unformat (i, "priority %d", &priority))
10648 else if (unformat (i, "protocol %d", &protocol))
10650 else if (unformat (i, "lport_start %d", &lport_start))
10652 else if (unformat (i, "lport_stop %d", &lport_stop))
10654 else if (unformat (i, "rport_start %d", &rport_start))
10656 else if (unformat (i, "rport_stop %d", &rport_stop))
10660 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
10666 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
10673 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
10679 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
10686 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
10692 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
10699 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
10705 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
10711 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
10713 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
10715 clib_warning ("unsupported action: 'resolve'");
10721 clib_warning ("parse error '%U'", format_unformat_error, i);
10727 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
10729 mp->spd_id = ntohl (spd_id);
10730 mp->priority = ntohl (priority);
10731 mp->is_outbound = is_outbound;
10733 mp->is_ipv6 = is_ipv6;
10734 if (is_ipv6 || is_ip_any)
10736 clib_memcpy (mp->remote_address_start, &raddr6_start,
10737 sizeof (ip6_address_t));
10738 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
10739 sizeof (ip6_address_t));
10740 clib_memcpy (mp->local_address_start, &laddr6_start,
10741 sizeof (ip6_address_t));
10742 clib_memcpy (mp->local_address_stop, &laddr6_stop,
10743 sizeof (ip6_address_t));
10747 clib_memcpy (mp->remote_address_start, &raddr4_start,
10748 sizeof (ip4_address_t));
10749 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
10750 sizeof (ip4_address_t));
10751 clib_memcpy (mp->local_address_start, &laddr4_start,
10752 sizeof (ip4_address_t));
10753 clib_memcpy (mp->local_address_stop, &laddr4_stop,
10754 sizeof (ip4_address_t));
10756 mp->protocol = (u8) protocol;
10757 mp->local_port_start = ntohs ((u16) lport_start);
10758 mp->local_port_stop = ntohs ((u16) lport_stop);
10759 mp->remote_port_start = ntohs ((u16) rport_start);
10760 mp->remote_port_stop = ntohs ((u16) rport_stop);
10761 mp->policy = (u8) policy;
10762 mp->sa_id = ntohl (sa_id);
10763 mp->is_add = is_add;
10764 mp->is_ip_any = is_ip_any;
10770 clib_warning ("unsupported (no dpdk)");
10776 api_ipsec_sad_add_del_entry (vat_main_t * vam)
10779 unformat_input_t *i = vam->input;
10780 vl_api_ipsec_sad_add_del_entry_t *mp;
10782 u32 sad_id = 0, spi = 0;
10783 u8 *ck = 0, *ik = 0;
10786 u8 protocol = IPSEC_PROTOCOL_AH;
10787 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
10788 u32 crypto_alg = 0, integ_alg = 0;
10789 ip4_address_t tun_src4;
10790 ip4_address_t tun_dst4;
10791 ip6_address_t tun_src6;
10792 ip6_address_t tun_dst6;
10794 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10796 if (unformat (i, "del"))
10798 else if (unformat (i, "sad_id %d", &sad_id))
10800 else if (unformat (i, "spi %d", &spi))
10802 else if (unformat (i, "esp"))
10803 protocol = IPSEC_PROTOCOL_ESP;
10804 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
10807 is_tunnel_ipv6 = 0;
10809 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
10812 is_tunnel_ipv6 = 0;
10814 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
10817 is_tunnel_ipv6 = 1;
10819 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
10822 is_tunnel_ipv6 = 1;
10826 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
10828 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
10829 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
10831 clib_warning ("unsupported crypto-alg: '%U'",
10832 format_ipsec_crypto_alg, crypto_alg);
10836 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10840 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
10842 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
10843 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
10845 clib_warning ("unsupported integ-alg: '%U'",
10846 format_ipsec_integ_alg, integ_alg);
10850 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10854 clib_warning ("parse error '%U'", format_unformat_error, i);
10860 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
10862 mp->sad_id = ntohl (sad_id);
10863 mp->is_add = is_add;
10864 mp->protocol = protocol;
10865 mp->spi = ntohl (spi);
10866 mp->is_tunnel = is_tunnel;
10867 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
10868 mp->crypto_algorithm = crypto_alg;
10869 mp->integrity_algorithm = integ_alg;
10870 mp->crypto_key_length = vec_len (ck);
10871 mp->integrity_key_length = vec_len (ik);
10873 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10874 mp->crypto_key_length = sizeof (mp->crypto_key);
10876 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10877 mp->integrity_key_length = sizeof (mp->integrity_key);
10880 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10882 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10886 if (is_tunnel_ipv6)
10888 clib_memcpy (mp->tunnel_src_address, &tun_src6,
10889 sizeof (ip6_address_t));
10890 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
10891 sizeof (ip6_address_t));
10895 clib_memcpy (mp->tunnel_src_address, &tun_src4,
10896 sizeof (ip4_address_t));
10897 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
10898 sizeof (ip4_address_t));
10907 clib_warning ("unsupported (no dpdk)");
10913 api_ipsec_sa_set_key (vat_main_t * vam)
10916 unformat_input_t *i = vam->input;
10917 vl_api_ipsec_sa_set_key_t *mp;
10920 u8 *ck = 0, *ik = 0;
10922 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10924 if (unformat (i, "sa_id %d", &sa_id))
10926 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
10928 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
10932 clib_warning ("parse error '%U'", format_unformat_error, i);
10937 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
10939 mp->sa_id = ntohl (sa_id);
10940 mp->crypto_key_length = vec_len (ck);
10941 mp->integrity_key_length = vec_len (ik);
10943 if (mp->crypto_key_length > sizeof (mp->crypto_key))
10944 mp->crypto_key_length = sizeof (mp->crypto_key);
10946 if (mp->integrity_key_length > sizeof (mp->integrity_key))
10947 mp->integrity_key_length = sizeof (mp->integrity_key);
10950 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
10952 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
10959 clib_warning ("unsupported (no dpdk)");
10965 api_ikev2_profile_add_del (vat_main_t * vam)
10968 unformat_input_t *i = vam->input;
10969 vl_api_ikev2_profile_add_del_t *mp;
10974 const char *valid_chars = "a-zA-Z0-9_";
10976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10978 if (unformat (i, "del"))
10980 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
10981 vec_add1 (name, 0);
10984 errmsg ("parse error '%U'", format_unformat_error, i);
10989 if (!vec_len (name))
10991 errmsg ("profile name must be specified");
10995 if (vec_len (name) > 64)
10997 errmsg ("profile name too long");
11001 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
11003 clib_memcpy (mp->name, name, vec_len (name));
11004 mp->is_add = is_add;
11012 clib_warning ("unsupported (no dpdk)");
11018 api_ikev2_profile_set_auth (vat_main_t * vam)
11021 unformat_input_t *i = vam->input;
11022 vl_api_ikev2_profile_set_auth_t *mp;
11026 u32 auth_method = 0;
11029 const char *valid_chars = "a-zA-Z0-9_";
11031 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11033 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11034 vec_add1 (name, 0);
11035 else if (unformat (i, "auth_method %U",
11036 unformat_ikev2_auth_method, &auth_method))
11038 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11040 else if (unformat (i, "auth_data %v", &data))
11044 errmsg ("parse error '%U'", format_unformat_error, i);
11049 if (!vec_len (name))
11051 errmsg ("profile name must be specified");
11055 if (vec_len (name) > 64)
11057 errmsg ("profile name too long");
11061 if (!vec_len (data))
11063 errmsg ("auth_data must be specified");
11069 errmsg ("auth_method must be specified");
11073 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
11075 mp->is_hex = is_hex;
11076 mp->auth_method = (u8) auth_method;
11077 mp->data_len = vec_len (data);
11078 clib_memcpy (mp->name, name, vec_len (name));
11079 clib_memcpy (mp->data, data, vec_len (data));
11088 clib_warning ("unsupported (no dpdk)");
11094 api_ikev2_profile_set_id (vat_main_t * vam)
11097 unformat_input_t *i = vam->input;
11098 vl_api_ikev2_profile_set_id_t *mp;
11106 const char *valid_chars = "a-zA-Z0-9_";
11108 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11110 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11111 vec_add1 (name, 0);
11112 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11114 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11116 data = vec_new (u8, 4);
11117 clib_memcpy (data, ip4.as_u8, 4);
11119 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11121 else if (unformat (i, "id_data %v", &data))
11123 else if (unformat (i, "local"))
11125 else if (unformat (i, "remote"))
11129 errmsg ("parse error '%U'", format_unformat_error, i);
11134 if (!vec_len (name))
11136 errmsg ("profile name must be specified");
11140 if (vec_len (name) > 64)
11142 errmsg ("profile name too long");
11146 if (!vec_len (data))
11148 errmsg ("id_data must be specified");
11154 errmsg ("id_type must be specified");
11158 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
11160 mp->is_local = is_local;
11161 mp->id_type = (u8) id_type;
11162 mp->data_len = vec_len (data);
11163 clib_memcpy (mp->name, name, vec_len (name));
11164 clib_memcpy (mp->data, data, vec_len (data));
11173 clib_warning ("unsupported (no dpdk)");
11179 api_ikev2_profile_set_ts (vat_main_t * vam)
11182 unformat_input_t *i = vam->input;
11183 vl_api_ikev2_profile_set_ts_t *mp;
11187 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
11188 ip4_address_t start_addr, end_addr;
11190 const char *valid_chars = "a-zA-Z0-9_";
11192 start_addr.as_u32 = 0;
11193 end_addr.as_u32 = (u32) ~ 0;
11195 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11197 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11198 vec_add1 (name, 0);
11199 else if (unformat (i, "protocol %d", &proto))
11201 else if (unformat (i, "start_port %d", &start_port))
11203 else if (unformat (i, "end_port %d", &end_port))
11206 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
11208 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
11210 else if (unformat (i, "local"))
11212 else if (unformat (i, "remote"))
11216 errmsg ("parse error '%U'", format_unformat_error, i);
11221 if (!vec_len (name))
11223 errmsg ("profile name must be specified");
11227 if (vec_len (name) > 64)
11229 errmsg ("profile name too long");
11233 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
11235 mp->is_local = is_local;
11236 mp->proto = (u8) proto;
11237 mp->start_port = (u16) start_port;
11238 mp->end_port = (u16) end_port;
11239 mp->start_addr = start_addr.as_u32;
11240 mp->end_addr = end_addr.as_u32;
11241 clib_memcpy (mp->name, name, vec_len (name));
11249 clib_warning ("unsupported (no dpdk)");
11255 api_ikev2_set_local_key (vat_main_t * vam)
11258 unformat_input_t *i = vam->input;
11259 vl_api_ikev2_set_local_key_t *mp;
11263 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11265 if (unformat (i, "file %v", &file))
11266 vec_add1 (file, 0);
11269 errmsg ("parse error '%U'", format_unformat_error, i);
11274 if (!vec_len (file))
11276 errmsg ("RSA key file must be specified");
11280 if (vec_len (file) > 256)
11282 errmsg ("file name too long");
11286 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
11288 clib_memcpy (mp->key_file, file, vec_len (file));
11296 clib_warning ("unsupported (no dpdk)");
11305 api_map_add_domain (vat_main_t * vam)
11307 unformat_input_t *i = vam->input;
11308 vl_api_map_add_domain_t *mp;
11311 ip4_address_t ip4_prefix;
11312 ip6_address_t ip6_prefix;
11313 ip6_address_t ip6_src;
11314 u32 num_m_args = 0;
11315 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
11316 0, psid_length = 0;
11317 u8 is_translation = 0;
11319 u32 ip6_src_len = 128;
11321 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11323 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
11324 &ip4_prefix, &ip4_prefix_len))
11326 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
11327 &ip6_prefix, &ip6_prefix_len))
11331 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
11334 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
11336 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
11338 else if (unformat (i, "psid-offset %d", &psid_offset))
11340 else if (unformat (i, "psid-len %d", &psid_length))
11342 else if (unformat (i, "mtu %d", &mtu))
11344 else if (unformat (i, "map-t"))
11345 is_translation = 1;
11348 clib_warning ("parse error '%U'", format_unformat_error, i);
11353 if (num_m_args < 3)
11355 errmsg ("mandatory argument(s) missing\n");
11359 /* Construct the API message */
11360 M (MAP_ADD_DOMAIN, map_add_domain);
11362 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
11363 mp->ip4_prefix_len = ip4_prefix_len;
11365 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
11366 mp->ip6_prefix_len = ip6_prefix_len;
11368 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
11369 mp->ip6_src_prefix_len = ip6_src_len;
11371 mp->ea_bits_len = ea_bits_len;
11372 mp->psid_offset = psid_offset;
11373 mp->psid_length = psid_length;
11374 mp->is_translation = is_translation;
11375 mp->mtu = htons (mtu);
11380 /* Wait for a reply, return good/bad news */
11385 api_map_del_domain (vat_main_t * vam)
11387 unformat_input_t *i = vam->input;
11388 vl_api_map_del_domain_t *mp;
11391 u32 num_m_args = 0;
11394 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11396 if (unformat (i, "index %d", &index))
11400 clib_warning ("parse error '%U'", format_unformat_error, i);
11405 if (num_m_args != 1)
11407 errmsg ("mandatory argument(s) missing\n");
11411 /* Construct the API message */
11412 M (MAP_DEL_DOMAIN, map_del_domain);
11414 mp->index = ntohl (index);
11419 /* Wait for a reply, return good/bad news */
11424 api_map_add_del_rule (vat_main_t * vam)
11426 unformat_input_t *i = vam->input;
11427 vl_api_map_add_del_rule_t *mp;
11430 ip6_address_t ip6_dst;
11431 u32 num_m_args = 0, index, psid = 0;
11433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11435 if (unformat (i, "index %d", &index))
11437 else if (unformat (i, "psid %d", &psid))
11439 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
11441 else if (unformat (i, "del"))
11447 clib_warning ("parse error '%U'", format_unformat_error, i);
11452 /* Construct the API message */
11453 M (MAP_ADD_DEL_RULE, map_add_del_rule);
11455 mp->index = ntohl (index);
11456 mp->is_add = is_add;
11457 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
11458 mp->psid = ntohs (psid);
11463 /* Wait for a reply, return good/bad news */
11468 api_map_domain_dump (vat_main_t * vam)
11470 vl_api_map_domain_dump_t *mp;
11473 /* Construct the API message */
11474 M (MAP_DOMAIN_DUMP, map_domain_dump);
11479 /* Use a control ping for synchronization */
11481 vl_api_control_ping_t *mp;
11482 M (CONTROL_PING, control_ping);
11489 api_map_rule_dump (vat_main_t * vam)
11491 unformat_input_t *i = vam->input;
11492 vl_api_map_rule_dump_t *mp;
11494 u32 domain_index = ~0;
11496 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11498 if (unformat (i, "index %u", &domain_index))
11504 if (domain_index == ~0)
11506 clib_warning ("parse error: domain index expected");
11510 /* Construct the API message */
11511 M (MAP_RULE_DUMP, map_rule_dump);
11513 mp->domain_index = htonl (domain_index);
11518 /* Use a control ping for synchronization */
11520 vl_api_control_ping_t *mp;
11521 M (CONTROL_PING, control_ping);
11527 static void vl_api_map_add_domain_reply_t_handler
11528 (vl_api_map_add_domain_reply_t * mp)
11530 vat_main_t *vam = &vat_main;
11531 i32 retval = ntohl (mp->retval);
11533 if (vam->async_mode)
11535 vam->async_errors += (retval < 0);
11539 vam->retval = retval;
11540 vam->result_ready = 1;
11544 static void vl_api_map_add_domain_reply_t_handler_json
11545 (vl_api_map_add_domain_reply_t * mp)
11547 vat_main_t *vam = &vat_main;
11548 vat_json_node_t node;
11550 vat_json_init_object (&node);
11551 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
11552 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
11554 vat_json_print (vam->ofp, &node);
11555 vat_json_free (&node);
11557 vam->retval = ntohl (mp->retval);
11558 vam->result_ready = 1;
11562 api_get_first_msg_id (vat_main_t * vam)
11564 vl_api_get_first_msg_id_t *mp;
11566 unformat_input_t *i = vam->input;
11570 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11572 if (unformat (i, "client %s", &name))
11580 errmsg ("missing client name\n");
11583 vec_add1 (name, 0);
11585 if (vec_len (name) > 63)
11587 errmsg ("client name too long\n");
11591 M (GET_FIRST_MSG_ID, get_first_msg_id);
11592 clib_memcpy (mp->name, name, vec_len (name));
11600 api_cop_interface_enable_disable (vat_main_t * vam)
11602 unformat_input_t *line_input = vam->input;
11603 vl_api_cop_interface_enable_disable_t *mp;
11605 u32 sw_if_index = ~0;
11606 u8 enable_disable = 1;
11608 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11610 if (unformat (line_input, "disable"))
11611 enable_disable = 0;
11612 if (unformat (line_input, "enable"))
11613 enable_disable = 1;
11614 else if (unformat (line_input, "%U", unformat_sw_if_index,
11615 vam, &sw_if_index))
11617 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11623 if (sw_if_index == ~0)
11625 errmsg ("missing interface name or sw_if_index\n");
11629 /* Construct the API message */
11630 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
11631 mp->sw_if_index = ntohl (sw_if_index);
11632 mp->enable_disable = enable_disable;
11636 /* Wait for the reply */
11641 api_cop_whitelist_enable_disable (vat_main_t * vam)
11643 unformat_input_t *line_input = vam->input;
11644 vl_api_cop_whitelist_enable_disable_t *mp;
11646 u32 sw_if_index = ~0;
11647 u8 ip4 = 0, ip6 = 0, default_cop = 0;
11650 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11652 if (unformat (line_input, "ip4"))
11654 else if (unformat (line_input, "ip6"))
11656 else if (unformat (line_input, "default"))
11658 else if (unformat (line_input, "%U", unformat_sw_if_index,
11659 vam, &sw_if_index))
11661 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11663 else if (unformat (line_input, "fib-id %d", &fib_id))
11669 if (sw_if_index == ~0)
11671 errmsg ("missing interface name or sw_if_index\n");
11675 /* Construct the API message */
11676 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
11677 mp->sw_if_index = ntohl (sw_if_index);
11678 mp->fib_id = ntohl (fib_id);
11681 mp->default_cop = default_cop;
11685 /* Wait for the reply */
11690 api_get_node_graph (vat_main_t * vam)
11692 vl_api_get_node_graph_t *mp;
11695 M (GET_NODE_GRAPH, get_node_graph);
11699 /* Wait for the reply */
11704 /** Used for parsing LISP eids */
11705 typedef CLIB_PACKED(struct{
11706 u8 addr[16]; /**< eid address */
11707 u32 len; /**< prefix length if IP */
11708 u8 type; /**< type of eid */
11713 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
11715 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
11717 memset (a, 0, sizeof (a[0]));
11719 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
11721 a->type = 0; /* ipv4 type */
11723 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
11725 a->type = 1; /* ipv6 type */
11727 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
11729 a->type = 2; /* mac type */
11736 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
11745 lisp_eid_size_vat (u8 type)
11760 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
11762 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
11766 /** Used for transferring locators via VPP API */
11767 typedef CLIB_PACKED(struct
11769 u32 sw_if_index; /**< locator sw_if_index */
11770 u8 priority; /**< locator priority */
11771 u8 weight; /**< locator weight */
11776 api_lisp_add_del_locator_set (vat_main_t * vam)
11778 unformat_input_t *input = vam->input;
11779 vl_api_lisp_add_del_locator_set_t *mp;
11782 u8 *locator_set_name = NULL;
11783 u8 locator_set_name_set = 0;
11784 ls_locator_t locator, *locators = 0;
11785 u32 sw_if_index, priority, weight;
11787 /* Parse args required to build the message */
11788 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11790 if (unformat (input, "del"))
11794 else if (unformat (input, "locator-set %s", &locator_set_name))
11796 locator_set_name_set = 1;
11798 else if (unformat (input, "sw_if_index %u p %u w %u",
11799 &sw_if_index, &priority, &weight))
11801 locator.sw_if_index = htonl (sw_if_index);
11802 locator.priority = priority;
11803 locator.weight = weight;
11804 vec_add1 (locators, locator);
11806 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
11807 vam, &sw_if_index, &priority, &weight))
11809 locator.sw_if_index = htonl (sw_if_index);
11810 locator.priority = priority;
11811 locator.weight = weight;
11812 vec_add1 (locators, locator);
11818 if (locator_set_name_set == 0)
11820 errmsg ("missing locator-set name");
11821 vec_free (locators);
11825 if (vec_len (locator_set_name) > 64)
11827 errmsg ("locator-set name too long\n");
11828 vec_free (locator_set_name);
11829 vec_free (locators);
11832 vec_add1 (locator_set_name, 0);
11834 /* Construct the API message */
11835 M (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
11837 mp->is_add = is_add;
11838 clib_memcpy (mp->locator_set_name, locator_set_name,
11839 vec_len (locator_set_name));
11840 vec_free (locator_set_name);
11842 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
11844 clib_memcpy (mp->locators, locators,
11845 (sizeof (ls_locator_t) * vec_len (locators)));
11846 vec_free (locators);
11851 /* Wait for a reply... */
11859 api_lisp_add_del_locator (vat_main_t * vam)
11861 unformat_input_t *input = vam->input;
11862 vl_api_lisp_add_del_locator_t *mp;
11864 u32 tmp_if_index = ~0;
11865 u32 sw_if_index = ~0;
11866 u8 sw_if_index_set = 0;
11867 u8 sw_if_index_if_name_set = 0;
11869 u8 priority_set = 0;
11873 u8 *locator_set_name = NULL;
11874 u8 locator_set_name_set = 0;
11876 /* Parse args required to build the message */
11877 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11879 if (unformat (input, "del"))
11883 else if (unformat (input, "locator-set %s", &locator_set_name))
11885 locator_set_name_set = 1;
11887 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
11890 sw_if_index_if_name_set = 1;
11891 sw_if_index = tmp_if_index;
11893 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
11895 sw_if_index_set = 1;
11896 sw_if_index = tmp_if_index;
11898 else if (unformat (input, "p %d", &priority))
11902 else if (unformat (input, "w %d", &weight))
11910 if (locator_set_name_set == 0)
11912 errmsg ("missing locator-set name");
11916 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
11918 errmsg ("missing sw_if_index");
11919 vec_free (locator_set_name);
11923 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
11925 errmsg ("cannot use both params interface name and sw_if_index");
11926 vec_free (locator_set_name);
11930 if (priority_set == 0)
11932 errmsg ("missing locator-set priority\n");
11933 vec_free (locator_set_name);
11937 if (weight_set == 0)
11939 errmsg ("missing locator-set weight\n");
11940 vec_free (locator_set_name);
11944 if (vec_len (locator_set_name) > 64)
11946 errmsg ("locator-set name too long\n");
11947 vec_free (locator_set_name);
11950 vec_add1 (locator_set_name, 0);
11952 /* Construct the API message */
11953 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
11955 mp->is_add = is_add;
11956 mp->sw_if_index = ntohl (sw_if_index);
11957 mp->priority = priority;
11958 mp->weight = weight;
11959 clib_memcpy (mp->locator_set_name, locator_set_name,
11960 vec_len (locator_set_name));
11961 vec_free (locator_set_name);
11966 /* Wait for a reply... */
11974 api_lisp_add_del_local_eid (vat_main_t * vam)
11976 unformat_input_t *input = vam->input;
11977 vl_api_lisp_add_del_local_eid_t *mp;
11981 lisp_eid_vat_t _eid, *eid = &_eid;
11982 u8 *locator_set_name = 0;
11983 u8 locator_set_name_set = 0;
11986 /* Parse args required to build the message */
11987 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11989 if (unformat (input, "del"))
11993 else if (unformat (input, "vni %d", &vni))
11997 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
12001 else if (unformat (input, "locator-set %s", &locator_set_name))
12003 locator_set_name_set = 1;
12009 if (locator_set_name_set == 0)
12011 errmsg ("missing locator-set name\n");
12017 errmsg ("EID address not set!");
12018 vec_free (locator_set_name);
12022 if (vec_len (locator_set_name) > 64)
12024 errmsg ("locator-set name too long\n");
12025 vec_free (locator_set_name);
12028 vec_add1 (locator_set_name, 0);
12030 /* Construct the API message */
12031 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
12033 mp->is_add = is_add;
12034 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12035 mp->eid_type = eid->type;
12036 mp->prefix_len = eid->len;
12037 mp->vni = clib_host_to_net_u32 (vni);
12038 clib_memcpy (mp->locator_set_name, locator_set_name,
12039 vec_len (locator_set_name));
12041 vec_free (locator_set_name);
12046 /* Wait for a reply... */
12054 /** Used for transferring locators via VPP API */
12055 typedef CLIB_PACKED(struct
12057 u8 is_ip4; /**< is locator an IPv4 address? */
12058 u8 priority; /**< locator priority */
12059 u8 weight; /**< locator weight */
12060 u8 addr[16]; /**< IPv4/IPv6 address */
12065 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
12067 unformat_input_t *input = vam->input;
12068 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12071 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12072 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12073 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12074 u32 action = ~0, p, w;
12075 ip4_address_t rmt_rloc4, lcl_rloc4;
12076 ip6_address_t rmt_rloc6, lcl_rloc6;
12077 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
12079 memset (&rloc, 0, sizeof (rloc));
12081 /* Parse args required to build the message */
12082 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12084 if (unformat (input, "del"))
12088 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12092 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12096 else if (unformat (input, "p %d w %d", &p, &w))
12100 errmsg ("No RLOC configured for setting priority/weight!");
12103 curr_rloc->priority = p;
12104 curr_rloc->weight = w;
12106 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12107 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12111 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
12112 rloc.priority = rloc.weight = 0;
12113 vec_add1 (lcl_locs, rloc);
12115 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12116 vec_add1 (rmt_locs, rloc);
12117 /* priority and weight saved in rmt loc */
12118 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12120 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
12121 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12124 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
12125 rloc.priority = rloc.weight = 0;
12126 vec_add1 (lcl_locs, rloc);
12128 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12129 vec_add1 (rmt_locs, rloc);
12130 /* priority and weight saved in rmt loc */
12131 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12133 else if (unformat (input, "action %d", &action))
12139 clib_warning ("parse error '%U'", format_unformat_error, input);
12146 errmsg ("remote eid addresses not set\n");
12150 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
12152 errmsg ("eid types don't match\n");
12156 if (0 == rmt_locs && (u32) ~ 0 == action)
12158 errmsg ("action not set for negative mapping\n");
12162 /* Construct the API message */
12163 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
12165 mp->is_add = is_add;
12166 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
12167 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
12168 mp->eid_type = rmt_eid->type;
12169 mp->rmt_len = rmt_eid->len;
12170 mp->lcl_len = lcl_eid->len;
12171 mp->action = action;
12173 if (0 != rmt_locs && 0 != lcl_locs)
12175 mp->loc_num = vec_len (rmt_locs);
12176 clib_memcpy (mp->lcl_locs, lcl_locs,
12177 (sizeof (rloc_t) * vec_len (lcl_locs)));
12178 clib_memcpy (mp->rmt_locs, rmt_locs,
12179 (sizeof (rloc_t) * vec_len (rmt_locs)));
12181 vec_free (lcl_locs);
12182 vec_free (rmt_locs);
12187 /* Wait for a reply... */
12195 api_lisp_add_del_map_resolver (vat_main_t * vam)
12197 unformat_input_t *input = vam->input;
12198 vl_api_lisp_add_del_map_resolver_t *mp;
12203 ip4_address_t ipv4;
12204 ip6_address_t ipv6;
12206 /* Parse args required to build the message */
12207 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12209 if (unformat (input, "del"))
12213 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
12217 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
12225 if (ipv4_set && ipv6_set)
12227 errmsg ("both eid v4 and v6 addresses set\n");
12231 if (!ipv4_set && !ipv6_set)
12233 errmsg ("eid addresses not set\n");
12237 /* Construct the API message */
12238 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
12240 mp->is_add = is_add;
12244 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
12249 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
12255 /* Wait for a reply... */
12263 api_lisp_gpe_enable_disable (vat_main_t * vam)
12265 unformat_input_t *input = vam->input;
12266 vl_api_lisp_gpe_enable_disable_t *mp;
12271 /* Parse args required to build the message */
12272 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12274 if (unformat (input, "enable"))
12279 else if (unformat (input, "disable"))
12290 errmsg ("Value not set\n");
12294 /* Construct the API message */
12295 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
12302 /* Wait for a reply... */
12310 api_lisp_enable_disable (vat_main_t * vam)
12312 unformat_input_t *input = vam->input;
12313 vl_api_lisp_enable_disable_t *mp;
12318 /* Parse args required to build the message */
12319 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12321 if (unformat (input, "enable"))
12326 else if (unformat (input, "disable"))
12336 errmsg ("Value not set\n");
12340 /* Construct the API message */
12341 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
12348 /* Wait for a reply... */
12356 * Enable/disable LISP proxy ITR.
12358 * @param vam vpp API test context
12359 * @return return code
12362 api_lisp_pitr_set_locator_set (vat_main_t * vam)
12365 u8 ls_name_set = 0;
12366 unformat_input_t *input = vam->input;
12367 vl_api_lisp_pitr_set_locator_set_t *mp;
12371 /* Parse args required to build the message */
12372 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12374 if (unformat (input, "del"))
12376 else if (unformat (input, "locator-set %s", &ls_name))
12380 errmsg ("parse error '%U'", format_unformat_error, input);
12387 errmsg ("locator-set name not set!");
12391 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
12393 mp->is_add = is_add;
12394 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
12395 vec_free (ls_name);
12400 /* wait for reply */
12408 api_show_lisp_pitr (vat_main_t * vam)
12410 vl_api_show_lisp_pitr_t *mp;
12413 if (!vam->json_output)
12415 fformat (vam->ofp, "%=20s\n", "lisp status:");
12418 M (SHOW_LISP_PITR, show_lisp_pitr);
12422 /* Wait for a reply... */
12430 * Add/delete mapping between vni and vrf
12433 api_lisp_eid_table_add_del_map (vat_main_t * vam)
12436 unformat_input_t *input = vam->input;
12437 vl_api_lisp_eid_table_add_del_map_t *mp;
12438 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
12439 u32 vni, vrf, bd_index;
12441 /* Parse args required to build the message */
12442 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12444 if (unformat (input, "del"))
12446 else if (unformat (input, "vrf %d", &vrf))
12448 else if (unformat (input, "bd_index %d", &bd_index))
12450 else if (unformat (input, "vni %d", &vni))
12456 if (!vni_set || (!vrf_set && !bd_index_set))
12458 errmsg ("missing arguments!");
12462 if (vrf_set && bd_index_set)
12464 errmsg ("error: both vrf and bd entered!");
12468 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
12470 mp->is_add = is_add;
12471 mp->vni = htonl (vni);
12472 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
12473 mp->is_l2 = bd_index_set;
12478 /* wait for reply */
12486 * Add/del remote mapping to/from LISP control plane
12488 * @param vam vpp API test context
12489 * @return return code
12492 api_lisp_add_del_remote_mapping (vat_main_t * vam)
12494 unformat_input_t *input = vam->input;
12495 vl_api_lisp_add_del_remote_mapping_t *mp;
12498 //TODO: seid need remove
12499 lisp_eid_vat_t _eid, *eid = &_eid;
12500 lisp_eid_vat_t _seid, *seid = &_seid;
12501 u8 is_add = 1, del_all = 0, eid_set = 0;
12502 u32 action = ~0, p, w;
12503 ip4_address_t rloc4;
12504 ip6_address_t rloc6;
12505 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
12507 memset (&rloc, 0, sizeof (rloc));
12509 /* Parse args required to build the message */
12510 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12512 if (unformat (input, "del-all"))
12516 else if (unformat (input, "del"))
12520 else if (unformat (input, "add"))
12524 else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid))
12528 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, &seid))
12530 //TODO: Need remove, but first must be remove from CSIT test
12532 else if (unformat (input, "vni %d", &vni))
12536 else if (unformat (input, "p %d w %d", &p, &w))
12540 errmsg ("No RLOC configured for setting priority/weight!");
12543 curr_rloc->priority = p;
12544 curr_rloc->weight = w;
12546 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
12549 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
12550 vec_add1 (rlocs, rloc);
12551 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12553 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
12556 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
12557 vec_add1 (rlocs, rloc);
12558 curr_rloc = &rlocs[vec_len (rlocs) - 1];
12560 else if (unformat (input, "action %d", &action))
12566 clib_warning ("parse error '%U'", format_unformat_error, input);
12573 errmsg ("missing params!");
12577 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
12579 errmsg ("no action set for negative map-reply!");
12583 M (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
12584 mp->is_add = is_add;
12585 mp->vni = htonl (vni);
12586 mp->action = (u8) action;
12587 mp->eid_len = eid->len;
12588 mp->del_all = del_all;
12589 mp->eid_type = eid->type;
12590 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12592 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
12593 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
12599 /* Wait for a reply... */
12607 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
12608 * forwarding entries in data-plane accordingly.
12610 * @param vam vpp API test context
12611 * @return return code
12614 api_lisp_add_del_adjacency (vat_main_t * vam)
12616 unformat_input_t *input = vam->input;
12617 vl_api_lisp_add_del_adjacency_t *mp;
12620 ip4_address_t seid4, deid4;
12621 ip6_address_t seid6, deid6;
12622 u8 deid_mac[6] = { 0 };
12623 u8 seid_mac[6] = { 0 };
12624 u8 deid_type, seid_type;
12625 u32 seid_len = 0, deid_len = 0, len;
12628 seid_type = deid_type = (u8) ~ 0;
12630 /* Parse args required to build the message */
12631 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12633 if (unformat (input, "del"))
12637 else if (unformat (input, "add"))
12641 else if (unformat (input, "deid %U/%d", unformat_ip4_address,
12644 deid_type = 0; /* ipv4 */
12647 else if (unformat (input, "deid %U/%d", unformat_ip6_address,
12650 deid_type = 1; /* ipv6 */
12653 else if (unformat (input, "deid %U", unformat_ethernet_address,
12656 deid_type = 2; /* mac */
12658 else if (unformat (input, "seid %U/%d", unformat_ip4_address,
12661 seid_type = 0; /* ipv4 */
12664 else if (unformat (input, "seid %U/%d", unformat_ip6_address,
12667 seid_type = 1; /* ipv6 */
12670 else if (unformat (input, "seid %U", unformat_ethernet_address,
12673 seid_type = 2; /* mac */
12675 else if (unformat (input, "vni %d", &vni))
12681 errmsg ("parse error '%U'", format_unformat_error, input);
12686 if ((u8) ~ 0 == deid_type)
12688 errmsg ("missing params!");
12692 if (seid_type != deid_type)
12694 errmsg ("source and destination EIDs are of different types!");
12698 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
12699 mp->is_add = is_add;
12700 mp->vni = htonl (vni);
12701 mp->seid_len = seid_len;
12702 mp->deid_len = deid_len;
12703 mp->eid_type = deid_type;
12705 switch (mp->eid_type)
12708 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
12709 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
12712 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
12713 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
12716 clib_memcpy (mp->seid, seid_mac, 6);
12717 clib_memcpy (mp->deid, deid_mac, 6);
12720 errmsg ("unknown EID type %d!", mp->eid_type);
12727 /* Wait for a reply... */
12735 api_lisp_gpe_add_del_iface (vat_main_t * vam)
12737 unformat_input_t *input = vam->input;
12738 vl_api_lisp_gpe_add_del_iface_t *mp;
12740 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
12741 u32 dp_table = 0, vni = 0;
12743 /* Parse args required to build the message */
12744 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12746 if (unformat (input, "up"))
12751 else if (unformat (input, "down"))
12756 else if (unformat (input, "table_id %d", &dp_table))
12760 else if (unformat (input, "bd_id %d", &dp_table))
12765 else if (unformat (input, "vni %d", &vni))
12773 if (action_set == 0)
12775 errmsg ("Action not set\n");
12778 if (dp_table_set == 0 || vni_set == 0)
12780 errmsg ("vni and dp_table must be set\n");
12784 /* Construct the API message */
12785 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
12787 mp->is_add = is_add;
12788 mp->dp_table = dp_table;
12795 /* Wait for a reply... */
12803 * Add/del map request itr rlocs from LISP control plane and updates
12805 * @param vam vpp API test context
12806 * @return return code
12809 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
12811 unformat_input_t *input = vam->input;
12812 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
12814 u8 *locator_set_name = 0;
12815 u8 locator_set_name_set = 0;
12818 /* Parse args required to build the message */
12819 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12821 if (unformat (input, "del"))
12825 else if (unformat (input, "%_%v%_", &locator_set_name))
12827 locator_set_name_set = 1;
12831 clib_warning ("parse error '%U'", format_unformat_error, input);
12836 if (is_add && !locator_set_name_set)
12838 errmsg ("itr-rloc is not set!");
12842 if (is_add && vec_len (locator_set_name) > 64)
12844 errmsg ("itr-rloc locator-set name too long\n");
12845 vec_free (locator_set_name);
12849 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
12850 mp->is_add = is_add;
12853 clib_memcpy (mp->locator_set_name, locator_set_name,
12854 vec_len (locator_set_name));
12858 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
12860 vec_free (locator_set_name);
12865 /* Wait for a reply... */
12873 lisp_locator_dump_send_msg (vat_main_t * vam, u32 locator_set_index,
12876 vl_api_lisp_locator_dump_t *mp;
12879 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
12881 mp->locator_set_index = htonl (locator_set_index);
12882 mp->filter = filter;
12887 /* Use a control ping for synchronization */
12889 vl_api_noprint_control_ping_t *mp;
12890 M (NOPRINT_CONTROL_PING, noprint_control_ping);
12893 /* Wait for a reply... */
12898 clean_locator_set_message (vat_main_t * vam)
12900 locator_set_msg_t *ls = 0;
12902 vec_foreach (ls, vam->locator_set_msg)
12904 vec_free (ls->locator_set_name);
12907 vec_free (vam->locator_set_msg);
12911 print_locator_in_locator_set (vat_main_t * vam, u8 filter)
12913 locator_set_msg_t *ls;
12914 locator_msg_t *loc;
12916 int i = 0, ret = 0;
12918 vec_foreach (ls, vam->locator_set_msg)
12920 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12923 vec_free (vam->locator_msg);
12924 clean_locator_set_message (vam);
12928 tmp_str = format (0, "%=20s%=16d%s", ls->locator_set_name,
12929 ls->locator_set_index,
12930 vec_len (vam->locator_msg) ? "" : "\n");
12932 vec_foreach (loc, vam->locator_msg)
12936 tmp_str = format (tmp_str, "%=37s", " ");
12940 tmp_str = format (tmp_str, "%=16d%=16d%=16d\n",
12941 loc->sw_if_index, loc->priority, loc->weight);
12945 tmp_str = format (tmp_str, "%=16U%=16d%=16d\n",
12946 loc->is_ipv6 ? format_ip6_address :
12947 format_ip4_address,
12948 loc->ip_address, loc->priority, loc->weight);
12953 fformat (vam->ofp, "%s", tmp_str);
12954 vec_free (tmp_str);
12955 vec_free (vam->locator_msg);
12958 clean_locator_set_message (vam);
12964 json_locator_in_locator_set (vat_main_t * vam, u8 filter)
12966 locator_set_msg_t *ls;
12967 locator_msg_t *loc;
12968 vat_json_node_t *node = NULL;
12969 vat_json_node_t *locator_array;
12970 vat_json_node_t *locator;
12971 struct in6_addr ip6;
12972 struct in_addr ip4;
12975 if (!vec_len (vam->locator_set_msg))
12977 /* just print [] */
12978 vat_json_init_array (&vam->json_tree);
12979 vat_json_print (vam->ofp, &vam->json_tree);
12980 vam->json_tree.type = VAT_JSON_NONE;
12984 if (VAT_JSON_ARRAY != vam->json_tree.type)
12986 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12987 vat_json_init_array (&vam->json_tree);
12990 vec_foreach (ls, vam->locator_set_msg)
12992 ret = lisp_locator_dump_send_msg (vam, ls->locator_set_index, filter);
12995 vec_free (ls->locator_set_name);
12996 vec_free (vam->locator_msg);
12997 vec_free (vam->locator_set_msg);
12998 vat_json_free (&vam->json_tree);
12999 vam->json_tree.type = VAT_JSON_NONE;
13003 node = vat_json_array_add (&vam->json_tree);
13004 vat_json_init_object (node);
13006 vat_json_object_add_uint (node, "locator-set-index",
13007 ls->locator_set_index);
13008 vat_json_object_add_string_copy (node, "locator-set",
13009 ls->locator_set_name);
13010 locator_array = vat_json_object_add_list (node, "locator");
13011 vec_foreach (loc, vam->locator_msg)
13013 locator = vat_json_array_add (locator_array);
13014 vat_json_init_object (locator);
13017 vat_json_object_add_uint (locator, "locator-index",
13024 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13025 vat_json_object_add_ip6 (locator, "locator", ip6);
13029 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13030 vat_json_object_add_ip4 (locator, "locator", ip4);
13033 vat_json_object_add_uint (locator, "priority", loc->priority);
13034 vat_json_object_add_uint (locator, "weight", loc->weight);
13037 vec_free (ls->locator_set_name);
13038 vec_free (vam->locator_msg);
13041 vat_json_print (vam->ofp, &vam->json_tree);
13042 vat_json_free (&vam->json_tree);
13043 vam->json_tree.type = VAT_JSON_NONE;
13045 vec_free (vam->locator_set_msg);
13051 get_locator_set_index_from_msg (vat_main_t * vam, u8 * locator_set,
13052 u32 * locator_set_index)
13054 locator_set_msg_t *ls;
13057 *locator_set_index = ~0;
13059 if (!vec_len (vam->locator_set_msg))
13064 vec_foreach (ls, vam->locator_set_msg)
13066 if (!strcmp ((char *) locator_set, (char *) ls->locator_set_name))
13068 *locator_set_index = ls->locator_set_index;
13069 vec_free (vam->locator_set_msg);
13074 vec_free (vam->locator_set_msg);
13080 get_locator_set_index (vat_main_t * vam, u8 * locator_set,
13081 u32 * locator_set_index)
13083 vl_api_lisp_locator_set_dump_t *mp;
13086 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13090 /* Use a control ping for synchronization */
13092 vl_api_noprint_control_ping_t *mp;
13093 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13097 vam->noprint_msg = 1;
13098 /* Wait for a reply... */
13102 get_locator_set_index_from_msg (vam, locator_set, locator_set_index);
13103 vam->noprint_msg = 0;
13112 lisp_locator_dump (vat_main_t * vam, u32 locator_set_index, u8 * locator_set,
13119 if (!vam->json_output)
13121 fformat (vam->ofp, "%=20s%=16s%=16s\n",
13122 "locator", "priority", "weight");
13127 ret = get_locator_set_index (vam, locator_set, &locator_set_index);
13130 if (!ret && ~0 == locator_set_index)
13135 ret = lisp_locator_dump_send_msg (vam, locator_set_index, filter);
13141 lisp_locator_set_dump (vat_main_t * vam, u8 filter)
13143 vl_api_lisp_locator_set_dump_t *mp;
13146 if (!vam->json_output)
13148 fformat (vam->ofp, "%=20s%=16s%=16s%=16s%=16s\n",
13149 "locator-set", "locator-set-index", "locator", "priority",
13153 vam->noprint_msg = 1;
13155 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13157 mp->filter = filter;
13162 /* Use a control ping for synchronization */
13164 vl_api_noprint_control_ping_t *mp;
13165 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13169 /* Wait for a reply... */
13173 if (vam->noprint_msg)
13175 if (!vam->json_output)
13177 print_locator_in_locator_set(vam, filter);
13181 json_locator_in_locator_set(vam, filter);
13184 vam->noprint_msg = 0;
13193 api_lisp_locator_set_dump (vat_main_t * vam)
13195 unformat_input_t *input = vam->input;
13196 vam->noprint_msg = 0;
13197 u32 locator_set_index = ~0;
13198 u8 locator_set_index_set = 0;
13199 u8 *locator_set = 0;
13200 u8 locator_set_set = 0;
13204 /* Parse args required to build the message */
13205 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13207 if (unformat (input, "locator-set-index %u", &locator_set_index))
13209 locator_set_index_set = 1;
13211 else if (unformat (input, "locator-set %s", &locator_set))
13213 locator_set_set = 1;
13215 else if (unformat (input, "local"))
13219 else if (unformat (input, "remote"))
13229 if (locator_set_index_set && locator_set_set)
13231 errmsg ("use only input parameter!\n");
13235 if (locator_set_index_set || locator_set_set)
13237 ret = lisp_locator_dump (vam, locator_set_index, locator_set, filter);
13241 ret = lisp_locator_set_dump (vam, filter);
13244 vec_free (locator_set);
13250 api_lisp_eid_table_map_dump (vat_main_t * vam)
13254 unformat_input_t *input = vam->input;
13255 vl_api_lisp_eid_table_map_dump_t *mp;
13258 /* Parse args required to build the message */
13259 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13261 if (unformat (input, "l2"))
13266 else if (unformat (input, "l3"))
13273 errmsg ("parse error '%U'", format_unformat_error, input);
13280 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13284 if (!vam->json_output)
13286 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
13289 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
13295 /* Use a control ping for synchronization */
13297 vl_api_control_ping_t *mp;
13298 M (CONTROL_PING, control_ping);
13301 /* Wait for a reply... */
13309 api_lisp_eid_table_vni_dump (vat_main_t * vam)
13311 vl_api_lisp_eid_table_vni_dump_t *mp;
13314 if (!vam->json_output)
13316 fformat (vam->ofp, "VNI\n");
13319 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
13324 /* Use a control ping for synchronization */
13326 vl_api_control_ping_t *mp;
13327 M (CONTROL_PING, control_ping);
13330 /* Wait for a reply... */
13338 get_locator_set (vat_main_t * vam)
13340 vl_api_lisp_locator_set_dump_t *mp;
13343 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13347 /* Use a control ping for synchronization */
13349 vl_api_noprint_control_ping_t *mp;
13350 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13354 /* Wait for a reply... */
13362 format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table,
13365 u8 *(*format_eid) (u8 *, va_list *) = 0;
13367 ASSERT (vam != NULL);
13368 ASSERT (eid_table != NULL);
13375 switch (eid_table->eid_type)
13379 format_eid = (eid_table->eid_type ? format_ip6_address :
13380 format_ip4_address);
13381 str = format (0, "[%d] %U/%d", eid_table->vni,
13382 format_eid, eid_table->eid, eid_table->eid_prefix_len);
13385 str = format (0, "[%d] %U", eid_table->vni,
13386 format_ethernet_address, eid_table->eid);
13389 errmsg ("unknown EID type %d!", eid_table->eid_type);
13401 format_locator_set_for_eid_table (vat_main_t * vam, u8 * str,
13402 eid_table_t * eid_table)
13404 locator_set_msg_t *ls = 0;
13406 ASSERT (vam != NULL);
13407 ASSERT (eid_table != NULL);
13409 if (eid_table->is_local)
13411 vec_foreach (ls, vam->locator_set_msg)
13413 if (ls->locator_set_index == eid_table->locator_set_index)
13415 str = format (0, "local(%s)", ls->locator_set_name);
13420 str = format (0, "local(N/A)");
13424 str = format (0, "remote");
13431 format_locator_for_eid_table (vat_main_t * vam, u8 * str,
13432 eid_table_t * eid_table)
13434 locator_msg_t *loc = 0;
13435 int first_line = 1;
13437 ASSERT (vam != NULL);
13438 ASSERT (eid_table != NULL);
13440 if (~0 == eid_table->locator_set_index)
13442 return format (0, "action: %d\n", eid_table->action);
13445 vec_foreach (loc, vam->locator_msg)
13451 str = format (str, "%-55s%-d\n", " ", loc->sw_if_index);
13455 str = format (str, "%=55s%-U\n", " ",
13456 loc->is_ipv6 ? format_ip6_address :
13457 format_ip4_address, loc->ip_address);
13465 str = format (str, "%-30d%-20u%-u\n", loc->sw_if_index,
13466 eid_table->ttl, eid_table->authoritative);
13470 str = format (str, "%-30U%-20u%-u\n",
13471 loc->is_ipv6 ? format_ip6_address :
13472 format_ip4_address,
13473 loc->ip_address, eid_table->ttl,
13474 eid_table->authoritative);
13483 print_lisp_eid_table_dump (vat_main_t * vam)
13485 eid_table_t *eid_table = 0;
13486 u8 *tmp_str = 0, *tmp_str2 = 0;
13489 ASSERT (vam != NULL);
13491 ret = get_locator_set (vam);
13494 vec_free (vam->eid_tables);
13498 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", "locators",
13499 "ttl", "authoritative");
13501 vec_foreach (eid_table, vam->eid_tables)
13503 if (~0 != eid_table->locator_set_index)
13505 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index,
13509 vec_free (vam->locator_msg);
13510 clean_locator_set_message (vam);
13511 vec_free (vam->eid_tables);
13516 tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret);
13519 vec_free (vam->locator_msg);
13520 clean_locator_set_message (vam);
13521 vec_free (vam->eid_tables);
13525 tmp_str = format (0, "%-35s", tmp_str2);
13526 vec_free (tmp_str2);
13528 tmp_str2 = format_locator_set_for_eid_table (vam, tmp_str2, eid_table);
13529 tmp_str = format (tmp_str, "%-20s", tmp_str2);
13530 vec_free (tmp_str2);
13532 tmp_str2 = format_locator_for_eid_table (vam, tmp_str2, eid_table);
13533 tmp_str = format (tmp_str, "%-s", tmp_str2);
13534 vec_free (tmp_str2);
13536 fformat (vam->ofp, "%s", tmp_str);
13537 vec_free (tmp_str);
13538 vec_free (vam->locator_msg);
13541 clean_locator_set_message (vam);
13542 vec_free (vam->eid_tables);
13548 json_locator_set_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13549 eid_table_t * eid_table)
13551 locator_set_msg_t *ls = 0;
13554 ASSERT (vam != NULL);
13555 ASSERT (node != NULL);
13556 ASSERT (eid_table != NULL);
13558 if (eid_table->is_local)
13560 vec_foreach (ls, vam->locator_set_msg)
13562 if (ls->locator_set_index == eid_table->locator_set_index)
13564 vat_json_object_add_string_copy (node, "locator-set",
13565 ls->locator_set_name);
13570 s = format (0, "N/A");
13572 vat_json_object_add_string_copy (node, "locator-set", s);
13577 s = format (0, "remote");
13579 vat_json_object_add_string_copy (node, "locator-set", s);
13585 json_eid_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13586 eid_table_t * eid_table)
13589 struct in6_addr ip6;
13590 struct in_addr ip4;
13592 ASSERT (vam != NULL);
13593 ASSERT (node != NULL);
13594 ASSERT (eid_table != NULL);
13596 switch (eid_table->eid_type)
13599 clib_memcpy (&ip4, eid_table->eid, sizeof (ip4));
13600 vat_json_object_add_ip4 (node, "eid", ip4);
13601 vat_json_object_add_uint (node, "eid-prefix-len",
13602 eid_table->eid_prefix_len);
13605 clib_memcpy (&ip6, eid_table->eid, sizeof (ip6));
13606 vat_json_object_add_ip6 (node, "eid", ip6);
13607 vat_json_object_add_uint (node, "eid-prefix-len",
13608 eid_table->eid_prefix_len);
13611 s = format (0, "%U", format_ethernet_address, eid_table->eid);
13613 vat_json_object_add_string_copy (node, "eid", s);
13617 errmsg ("unknown EID type %d!", eid_table->eid_type);
13625 json_locator_for_eid_table (vat_main_t * vam, vat_json_node_t * node,
13626 eid_table_t * eid_table)
13628 locator_msg_t *loc = 0;
13629 vat_json_node_t *locator_array = 0;
13630 vat_json_node_t *locator = 0;
13631 struct in6_addr ip6;
13632 struct in_addr ip4;
13634 ASSERT (vam != NULL);
13635 ASSERT (node != NULL);
13636 ASSERT (eid_table != NULL);
13638 locator_array = vat_json_object_add_list (node, "locator");
13639 vec_foreach (loc, vam->locator_msg)
13641 locator = vat_json_array_add (locator_array);
13642 vat_json_init_object (locator);
13645 vat_json_object_add_uint (locator, "locator-index", loc->sw_if_index);
13651 clib_memcpy (&ip6, loc->ip_address, sizeof (ip6));
13652 vat_json_object_add_ip6 (locator, "locator", ip6);
13656 clib_memcpy (&ip4, loc->ip_address, sizeof (ip4));
13657 vat_json_object_add_ip4 (locator, "locator", ip4);
13664 json_lisp_eid_table_dump (vat_main_t * vam)
13666 eid_table_t *eid_table;
13667 vat_json_node_t *node = 0;
13670 ASSERT (vam != NULL);
13672 ret = get_locator_set (vam);
13675 vec_free (vam->eid_tables);
13679 if (!vec_len (vam->eid_tables))
13681 /* just print [] */
13682 vat_json_init_array (&vam->json_tree);
13683 vat_json_print (vam->ofp, &vam->json_tree);
13684 vam->json_tree.type = VAT_JSON_NONE;
13688 if (VAT_JSON_ARRAY != vam->json_tree.type)
13690 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13691 vat_json_init_array (&vam->json_tree);
13694 vec_foreach (eid_table, vam->eid_tables)
13696 ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0);
13699 vec_free (vam->locator_msg);
13700 vec_free (vam->eid_tables);
13701 clean_locator_set_message (vam);
13702 vat_json_free (&vam->json_tree);
13703 vam->json_tree.type = VAT_JSON_NONE;
13707 node = vat_json_array_add (&vam->json_tree);
13708 vat_json_init_object (node);
13710 vat_json_object_add_uint (node, "vni", eid_table->vni);
13712 json_locator_set_for_eid_table (vam, node, eid_table);
13713 ret = json_eid_for_eid_table (vam, node, eid_table);
13716 vec_free (vam->locator_msg);
13717 vec_free (vam->eid_tables);
13718 clean_locator_set_message (vam);
13719 vat_json_free (&vam->json_tree);
13720 vam->json_tree.type = VAT_JSON_NONE;
13724 json_locator_for_eid_table (vam, node, eid_table);
13726 vat_json_object_add_uint (node, "ttl", eid_table->ttl);
13727 vat_json_object_add_uint (node, "authoritative",
13728 eid_table->authoritative);
13730 vec_free (vam->locator_msg);
13733 vat_json_print (vam->ofp, &vam->json_tree);
13734 vat_json_free (&vam->json_tree);
13735 vam->json_tree.type = VAT_JSON_NONE;
13737 clean_locator_set_message (vam);
13738 vec_free (vam->eid_tables);
13744 api_lisp_eid_table_dump (vat_main_t * vam)
13746 unformat_input_t *i = vam->input;
13747 vl_api_lisp_eid_table_dump_t *mp;
13749 struct in_addr ip4;
13750 struct in6_addr ip6;
13752 u8 eid_type = ~0, eid_set = 0;
13753 u32 prefix_length = ~0, t, vni = 0;
13756 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13758 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
13764 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
13770 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
13775 else if (unformat (i, "vni %d", &t))
13779 else if (unformat (i, "local"))
13783 else if (unformat (i, "remote"))
13789 errmsg ("parse error '%U'", format_unformat_error, i);
13794 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
13796 mp->filter = filter;
13800 mp->vni = htonl (vni);
13801 mp->eid_type = eid_type;
13805 mp->prefix_length = prefix_length;
13806 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
13809 mp->prefix_length = prefix_length;
13810 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
13813 clib_memcpy (mp->eid, mac, sizeof (mac));
13816 errmsg ("unknown EID type %d!", eid_type);
13821 vam->noprint_msg = 1;
13826 /* Use a control ping for synchronization */
13828 vl_api_noprint_control_ping_t *mp;
13829 M (NOPRINT_CONTROL_PING, noprint_control_ping);
13833 /* Wait for a reply... */
13837 if (vam->noprint_msg)
13839 if (!vam->json_output)
13841 vam->retval = print_lisp_eid_table_dump(vam);
13845 vam->retval = json_lisp_eid_table_dump(vam);
13848 vam->noprint_msg = 0;
13857 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
13859 vl_api_lisp_gpe_tunnel_dump_t *mp;
13862 if (!vam->json_output)
13864 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
13865 "%=16s%=16s%=16s%=16s%=16s\n",
13866 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
13867 "Decap next", "Lisp version", "Flags", "Next protocol",
13868 "ver_res", "res", "iid");
13871 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
13875 /* Use a control ping for synchronization */
13877 vl_api_control_ping_t *mp;
13878 M (CONTROL_PING, control_ping);
13881 /* Wait for a reply... */
13889 api_lisp_map_resolver_dump (vat_main_t * vam)
13891 vl_api_lisp_map_resolver_dump_t *mp;
13894 if (!vam->json_output)
13896 fformat (vam->ofp, "%=20s\n", "Map resolver");
13899 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
13903 /* Use a control ping for synchronization */
13905 vl_api_control_ping_t *mp;
13906 M (CONTROL_PING, control_ping);
13909 /* Wait for a reply... */
13917 api_show_lisp_status (vat_main_t * vam)
13919 vl_api_show_lisp_status_t *mp;
13922 if (!vam->json_output)
13924 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
13927 M (SHOW_LISP_STATUS, show_lisp_status);
13930 /* Wait for a reply... */
13938 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
13940 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
13943 if (!vam->json_output)
13945 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
13948 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
13951 /* Wait for a reply... */
13959 api_af_packet_create (vat_main_t * vam)
13961 unformat_input_t *i = vam->input;
13962 vl_api_af_packet_create_t *mp;
13964 u8 *host_if_name = 0;
13966 u8 random_hw_addr = 1;
13968 memset (hw_addr, 0, sizeof (hw_addr));
13970 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13972 if (unformat (i, "name %s", &host_if_name))
13973 vec_add1 (host_if_name, 0);
13974 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
13975 random_hw_addr = 0;
13980 if (!vec_len (host_if_name))
13982 errmsg ("host-interface name must be specified");
13986 if (vec_len (host_if_name) > 64)
13988 errmsg ("host-interface name too long");
13992 M (AF_PACKET_CREATE, af_packet_create);
13994 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
13995 clib_memcpy (mp->hw_addr, hw_addr, 6);
13996 mp->use_random_hw_addr = random_hw_addr;
13997 vec_free (host_if_name);
14000 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14006 api_af_packet_delete (vat_main_t * vam)
14008 unformat_input_t *i = vam->input;
14009 vl_api_af_packet_delete_t *mp;
14011 u8 *host_if_name = 0;
14013 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14015 if (unformat (i, "name %s", &host_if_name))
14016 vec_add1 (host_if_name, 0);
14021 if (!vec_len (host_if_name))
14023 errmsg ("host-interface name must be specified");
14027 if (vec_len (host_if_name) > 64)
14029 errmsg ("host-interface name too long");
14033 M (AF_PACKET_DELETE, af_packet_delete);
14035 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14036 vec_free (host_if_name);
14045 api_policer_add_del (vat_main_t * vam)
14047 unformat_input_t *i = vam->input;
14048 vl_api_policer_add_del_t *mp;
14059 u8 color_aware = 0;
14060 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
14062 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14063 conform_action.dscp = 0;
14064 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14065 exceed_action.dscp = 0;
14066 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14067 violate_action.dscp = 0;
14069 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14071 if (unformat (i, "del"))
14073 else if (unformat (i, "name %s", &name))
14074 vec_add1 (name, 0);
14075 else if (unformat (i, "cir %u", &cir))
14077 else if (unformat (i, "eir %u", &eir))
14079 else if (unformat (i, "cb %u", &cb))
14081 else if (unformat (i, "eb %u", &eb))
14083 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14086 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14089 else if (unformat (i, "type %U", unformat_policer_type, &type))
14091 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14094 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14097 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14100 else if (unformat (i, "color-aware"))
14106 if (!vec_len (name))
14108 errmsg ("policer name must be specified");
14112 if (vec_len (name) > 64)
14114 errmsg ("policer name too long");
14118 M (POLICER_ADD_DEL, policer_add_del);
14120 clib_memcpy (mp->name, name, vec_len (name));
14122 mp->is_add = is_add;
14127 mp->rate_type = rate_type;
14128 mp->round_type = round_type;
14130 mp->conform_action_type = conform_action.action_type;
14131 mp->conform_dscp = conform_action.dscp;
14132 mp->exceed_action_type = exceed_action.action_type;
14133 mp->exceed_dscp = exceed_action.dscp;
14134 mp->violate_action_type = violate_action.action_type;
14135 mp->violate_dscp = violate_action.dscp;
14136 mp->color_aware = color_aware;
14145 api_policer_dump (vat_main_t * vam)
14147 unformat_input_t *i = vam->input;
14148 vl_api_policer_dump_t *mp;
14150 u8 *match_name = 0;
14151 u8 match_name_valid = 0;
14153 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14155 if (unformat (i, "name %s", &match_name))
14157 vec_add1 (match_name, 0);
14158 match_name_valid = 1;
14164 M (POLICER_DUMP, policer_dump);
14165 mp->match_name_valid = match_name_valid;
14166 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14167 vec_free (match_name);
14171 /* Use a control ping for synchronization */
14173 vl_api_control_ping_t *mp;
14174 M (CONTROL_PING, control_ping);
14177 /* Wait for a reply... */
14185 api_policer_classify_set_interface (vat_main_t * vam)
14187 unformat_input_t *i = vam->input;
14188 vl_api_policer_classify_set_interface_t *mp;
14191 int sw_if_index_set;
14192 u32 ip4_table_index = ~0;
14193 u32 ip6_table_index = ~0;
14194 u32 l2_table_index = ~0;
14197 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14199 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14200 sw_if_index_set = 1;
14201 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14202 sw_if_index_set = 1;
14203 else if (unformat (i, "del"))
14205 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14207 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14209 else if (unformat (i, "l2-table %d", &l2_table_index))
14213 clib_warning ("parse error '%U'", format_unformat_error, i);
14218 if (sw_if_index_set == 0)
14220 errmsg ("missing interface name or sw_if_index\n");
14224 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14226 mp->sw_if_index = ntohl (sw_if_index);
14227 mp->ip4_table_index = ntohl (ip4_table_index);
14228 mp->ip6_table_index = ntohl (ip6_table_index);
14229 mp->l2_table_index = ntohl (l2_table_index);
14230 mp->is_add = is_add;
14239 api_policer_classify_dump (vat_main_t * vam)
14241 unformat_input_t *i = vam->input;
14242 vl_api_policer_classify_dump_t *mp;
14244 u8 type = POLICER_CLASSIFY_N_TABLES;
14246 if (unformat (i, "type %U", unformat_classify_table_type, &type))
14250 errmsg ("classify table type must be specified\n");
14254 if (!vam->json_output)
14256 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14259 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14264 /* Use a control ping for synchronization */
14266 vl_api_control_ping_t *mp;
14267 M (CONTROL_PING, control_ping);
14270 /* Wait for a reply... */
14278 api_netmap_create (vat_main_t * vam)
14280 unformat_input_t *i = vam->input;
14281 vl_api_netmap_create_t *mp;
14285 u8 random_hw_addr = 1;
14289 memset (hw_addr, 0, sizeof (hw_addr));
14291 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14293 if (unformat (i, "name %s", &if_name))
14294 vec_add1 (if_name, 0);
14295 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14296 random_hw_addr = 0;
14297 else if (unformat (i, "pipe"))
14299 else if (unformat (i, "master"))
14301 else if (unformat (i, "slave"))
14307 if (!vec_len (if_name))
14309 errmsg ("interface name must be specified");
14313 if (vec_len (if_name) > 64)
14315 errmsg ("interface name too long");
14319 M (NETMAP_CREATE, netmap_create);
14321 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14322 clib_memcpy (mp->hw_addr, hw_addr, 6);
14323 mp->use_random_hw_addr = random_hw_addr;
14324 mp->is_pipe = is_pipe;
14325 mp->is_master = is_master;
14326 vec_free (if_name);
14335 api_netmap_delete (vat_main_t * vam)
14337 unformat_input_t *i = vam->input;
14338 vl_api_netmap_delete_t *mp;
14342 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14344 if (unformat (i, "name %s", &if_name))
14345 vec_add1 (if_name, 0);
14350 if (!vec_len (if_name))
14352 errmsg ("interface name must be specified");
14356 if (vec_len (if_name) > 64)
14358 errmsg ("interface name too long");
14362 M (NETMAP_DELETE, netmap_delete);
14364 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14365 vec_free (if_name);
14373 static void vl_api_mpls_gre_tunnel_details_t_handler
14374 (vl_api_mpls_gre_tunnel_details_t * mp)
14376 vat_main_t *vam = &vat_main;
14378 i32 len = ntohl (mp->nlabels);
14380 if (mp->l2_only == 0)
14382 fformat (vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
14383 ntohl (mp->tunnel_index),
14384 format_ip4_address, &mp->tunnel_src,
14385 format_ip4_address, &mp->tunnel_dst,
14386 format_ip4_address, &mp->intfc_address,
14387 ntohl (mp->mask_width));
14388 for (i = 0; i < len; i++)
14390 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14392 fformat (vam->ofp, "\n");
14393 fformat (vam->ofp, " inner fib index %d, outer fib index %d\n",
14394 ntohl (mp->inner_fib_index), ntohl (mp->outer_fib_index));
14398 fformat (vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
14399 ntohl (mp->tunnel_index),
14400 format_ip4_address, &mp->tunnel_src,
14401 format_ip4_address, &mp->tunnel_dst,
14402 format_ip4_address, &mp->intfc_address);
14403 for (i = 0; i < len; i++)
14405 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14407 fformat (vam->ofp, "\n");
14408 fformat (vam->ofp, " l2 interface %d, outer fib index %d\n",
14409 ntohl (mp->hw_if_index), ntohl (mp->outer_fib_index));
14413 static void vl_api_mpls_gre_tunnel_details_t_handler_json
14414 (vl_api_mpls_gre_tunnel_details_t * mp)
14416 vat_main_t *vam = &vat_main;
14417 vat_json_node_t *node = NULL;
14418 struct in_addr ip4;
14420 i32 len = ntohl (mp->nlabels);
14422 if (VAT_JSON_ARRAY != vam->json_tree.type)
14424 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14425 vat_json_init_array (&vam->json_tree);
14427 node = vat_json_array_add (&vam->json_tree);
14429 vat_json_init_object (node);
14430 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14431 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14432 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14433 vat_json_object_add_uint (node, "inner_fib_index",
14434 ntohl (mp->inner_fib_index));
14435 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14436 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14437 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14438 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14439 clib_memcpy (&ip4, &(mp->tunnel_src), sizeof (ip4));
14440 vat_json_object_add_ip4 (node, "tunnel_src", ip4);
14441 clib_memcpy (&ip4, &(mp->tunnel_dst), sizeof (ip4));
14442 vat_json_object_add_ip4 (node, "tunnel_dst", ip4);
14443 vat_json_object_add_uint (node, "outer_fib_index",
14444 ntohl (mp->outer_fib_index));
14445 vat_json_object_add_uint (node, "label_count", len);
14446 for (i = 0; i < len; i++)
14448 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14453 api_mpls_gre_tunnel_dump (vat_main_t * vam)
14455 vl_api_mpls_gre_tunnel_dump_t *mp;
14459 /* Parse args required to build the message */
14460 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14462 if (!unformat (vam->input, "tunnel_index %d", &index))
14469 fformat (vam->ofp, " tunnel_index %d\n", index);
14471 M (MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
14472 mp->tunnel_index = htonl (index);
14475 /* Use a control ping for synchronization */
14477 vl_api_control_ping_t *mp;
14478 M (CONTROL_PING, control_ping);
14484 static void vl_api_mpls_eth_tunnel_details_t_handler
14485 (vl_api_mpls_eth_tunnel_details_t * mp)
14487 vat_main_t *vam = &vat_main;
14489 i32 len = ntohl (mp->nlabels);
14491 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14492 ntohl (mp->tunnel_index),
14493 format_ethernet_address, &mp->tunnel_dst_mac,
14494 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14495 for (i = 0; i < len; i++)
14497 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14499 fformat (vam->ofp, "\n");
14500 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14501 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14504 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14505 (vl_api_mpls_eth_tunnel_details_t * mp)
14507 vat_main_t *vam = &vat_main;
14508 vat_json_node_t *node = NULL;
14509 struct in_addr ip4;
14511 i32 len = ntohl (mp->nlabels);
14513 if (VAT_JSON_ARRAY != vam->json_tree.type)
14515 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14516 vat_json_init_array (&vam->json_tree);
14518 node = vat_json_array_add (&vam->json_tree);
14520 vat_json_init_object (node);
14521 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14522 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14523 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14524 vat_json_object_add_uint (node, "inner_fib_index",
14525 ntohl (mp->inner_fib_index));
14526 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14527 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14528 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14529 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14530 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14531 format (0, "%U", format_ethernet_address,
14532 &mp->tunnel_dst_mac));
14533 vat_json_object_add_uint (node, "tx_sw_if_index",
14534 ntohl (mp->tx_sw_if_index));
14535 vat_json_object_add_uint (node, "label_count", len);
14536 for (i = 0; i < len; i++)
14538 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14543 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14545 vl_api_mpls_eth_tunnel_dump_t *mp;
14549 /* Parse args required to build the message */
14550 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14552 if (!unformat (vam->input, "tunnel_index %d", &index))
14559 fformat (vam->ofp, " tunnel_index %d\n", index);
14561 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14562 mp->tunnel_index = htonl (index);
14565 /* Use a control ping for synchronization */
14567 vl_api_control_ping_t *mp;
14568 M (CONTROL_PING, control_ping);
14574 static void vl_api_mpls_fib_encap_details_t_handler
14575 (vl_api_mpls_fib_encap_details_t * mp)
14577 vat_main_t *vam = &vat_main;
14579 i32 len = ntohl (mp->nlabels);
14581 fformat (vam->ofp, "table %d, dest %U, label ",
14582 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14583 for (i = 0; i < len; i++)
14585 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14587 fformat (vam->ofp, "\n");
14590 static void vl_api_mpls_fib_encap_details_t_handler_json
14591 (vl_api_mpls_fib_encap_details_t * mp)
14593 vat_main_t *vam = &vat_main;
14594 vat_json_node_t *node = NULL;
14596 i32 len = ntohl (mp->nlabels);
14597 struct in_addr ip4;
14599 if (VAT_JSON_ARRAY != vam->json_tree.type)
14601 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14602 vat_json_init_array (&vam->json_tree);
14604 node = vat_json_array_add (&vam->json_tree);
14606 vat_json_init_object (node);
14607 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14608 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14609 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14610 vat_json_object_add_ip4 (node, "dest", ip4);
14611 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14612 vat_json_object_add_uint (node, "label_count", len);
14613 for (i = 0; i < len; i++)
14615 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14620 api_mpls_fib_encap_dump (vat_main_t * vam)
14622 vl_api_mpls_fib_encap_dump_t *mp;
14625 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14628 /* Use a control ping for synchronization */
14630 vl_api_control_ping_t *mp;
14631 M (CONTROL_PING, control_ping);
14637 static void vl_api_mpls_fib_decap_details_t_handler
14638 (vl_api_mpls_fib_decap_details_t * mp)
14640 vat_main_t *vam = &vat_main;
14643 "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
14644 ntohl (mp->rx_table_id), ntohl (mp->tx_table_id), mp->swif_tag,
14645 ntohl (mp->label), ntohl (mp->s_bit));
14648 static void vl_api_mpls_fib_decap_details_t_handler_json
14649 (vl_api_mpls_fib_decap_details_t * mp)
14651 vat_main_t *vam = &vat_main;
14652 vat_json_node_t *node = NULL;
14653 struct in_addr ip4;
14655 if (VAT_JSON_ARRAY != vam->json_tree.type)
14657 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14658 vat_json_init_array (&vam->json_tree);
14660 node = vat_json_array_add (&vam->json_tree);
14662 vat_json_init_object (node);
14663 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14664 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14665 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14666 vat_json_object_add_ip4 (node, "dest", ip4);
14667 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14668 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14669 vat_json_object_add_uint (node, "rx_table_id", ntohl (mp->rx_table_id));
14670 vat_json_object_add_uint (node, "tx_table_id", ntohl (mp->tx_table_id));
14671 vat_json_object_add_string_copy (node, "swif_tag", mp->swif_tag);
14675 api_mpls_fib_decap_dump (vat_main_t * vam)
14677 vl_api_mpls_fib_decap_dump_t *mp;
14680 M (MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
14683 /* Use a control ping for synchronization */
14685 vl_api_control_ping_t *mp;
14686 M (CONTROL_PING, control_ping);
14693 api_classify_table_ids (vat_main_t * vam)
14695 vl_api_classify_table_ids_t *mp;
14698 /* Construct the API message */
14699 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14709 api_classify_table_by_interface (vat_main_t * vam)
14711 unformat_input_t *input = vam->input;
14712 vl_api_classify_table_by_interface_t *mp;
14715 u32 sw_if_index = ~0;
14716 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14718 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14720 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14725 if (sw_if_index == ~0)
14727 errmsg ("missing interface name or sw_if_index\n");
14731 /* Construct the API message */
14732 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14734 mp->sw_if_index = ntohl (sw_if_index);
14743 api_classify_table_info (vat_main_t * vam)
14745 unformat_input_t *input = vam->input;
14746 vl_api_classify_table_info_t *mp;
14750 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14752 if (unformat (input, "table_id %d", &table_id))
14757 if (table_id == ~0)
14759 errmsg ("missing table id\n");
14763 /* Construct the API message */
14764 M (CLASSIFY_TABLE_INFO, classify_table_info);
14766 mp->table_id = ntohl (table_id);
14775 api_classify_session_dump (vat_main_t * vam)
14777 unformat_input_t *input = vam->input;
14778 vl_api_classify_session_dump_t *mp;
14782 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14784 if (unformat (input, "table_id %d", &table_id))
14789 if (table_id == ~0)
14791 errmsg ("missing table id\n");
14795 /* Construct the API message */
14796 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
14798 mp->table_id = ntohl (table_id);
14801 /* Use a control ping for synchronization */
14803 vl_api_control_ping_t *mp;
14804 M (CONTROL_PING, control_ping);
14813 vl_api_ipfix_details_t_handler (vl_api_ipfix_details_t * mp)
14815 vat_main_t *vam = &vat_main;
14817 fformat (vam->ofp, "collector_address %U, collector_port %d, "
14818 "src_address %U, fib_index %u, path_mtu %u, "
14819 "template_interval %u\n",
14820 format_ip4_address, mp->collector_address,
14821 ntohs (mp->collector_port),
14822 format_ip4_address, mp->src_address,
14823 ntohl (mp->fib_index),
14824 ntohl (mp->path_mtu), ntohl (mp->template_interval));
14827 vam->result_ready = 1;
14831 vl_api_ipfix_details_t_handler_json (vl_api_ipfix_details_t * mp)
14833 vat_main_t *vam = &vat_main;
14834 vat_json_node_t node;
14835 struct in_addr collector_address;
14836 struct in_addr src_address;
14838 vat_json_init_object (&node);
14839 clib_memcpy (&collector_address, &mp->collector_address,
14840 sizeof (collector_address));
14841 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
14842 vat_json_object_add_uint (&node, "collector_port",
14843 ntohs (mp->collector_port));
14844 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
14845 vat_json_object_add_ip4 (&node, "src_address", src_address);
14846 vat_json_object_add_uint (&node, "fib_index", ntohl (mp->fib_index));
14847 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
14848 vat_json_object_add_uint (&node, "template_interval",
14849 ntohl (mp->template_interval));
14851 vat_json_print (vam->ofp, &node);
14852 vat_json_free (&node);
14854 vam->result_ready = 1;
14858 api_ipfix_dump (vat_main_t * vam)
14860 vl_api_ipfix_dump_t *mp;
14863 /* Construct the API message */
14864 M (IPFIX_DUMP, ipfix_dump);
14874 api_pg_create_interface (vat_main_t * vam)
14876 unformat_input_t *input = vam->input;
14877 vl_api_pg_create_interface_t *mp;
14881 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14883 if (unformat (input, "if_id %d", &if_id))
14890 errmsg ("missing pg interface index\n");
14894 /* Construct the API message */
14895 M (PG_CREATE_INTERFACE, pg_create_interface);
14897 mp->interface_id = ntohl (if_id);
14906 api_pg_capture (vat_main_t * vam)
14908 unformat_input_t *input = vam->input;
14909 vl_api_pg_capture_t *mp;
14915 u8 pcap_file_set = 0;
14917 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14919 if (unformat (input, "if_id %d", &if_id))
14921 else if (unformat (input, "pcap %s", &pcap_file))
14923 else if (unformat (input, "count %d", &count))
14925 else if (unformat (input, "disable"))
14932 errmsg ("missing pg interface index\n");
14935 if (pcap_file_set > 0)
14937 if (vec_len (pcap_file) > 255)
14939 errmsg ("pcap file name is too long\n");
14944 u32 name_len = vec_len (pcap_file);
14945 /* Construct the API message */
14946 M (PG_CAPTURE, pg_capture);
14948 mp->interface_id = ntohl (if_id);
14949 mp->is_enabled = enable;
14950 mp->count = ntohl (count);
14951 mp->pcap_name_length = ntohl (name_len);
14952 if (pcap_file_set != 0)
14954 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
14956 vec_free (pcap_file);
14965 api_pg_enable_disable (vat_main_t * vam)
14967 unformat_input_t *input = vam->input;
14968 vl_api_pg_enable_disable_t *mp;
14972 u8 stream_name_set = 0;
14973 u8 *stream_name = 0;
14974 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14976 if (unformat (input, "stream %s", &stream_name))
14977 stream_name_set = 1;
14978 else if (unformat (input, "disable"))
14984 if (stream_name_set > 0)
14986 if (vec_len (stream_name) > 255)
14988 errmsg ("stream name too long\n");
14993 u32 name_len = vec_len (stream_name);
14994 /* Construct the API message */
14995 M (PG_ENABLE_DISABLE, pg_enable_disable);
14997 mp->is_enabled = enable;
14998 if (stream_name_set != 0)
15000 mp->stream_name_length = ntohl (name_len);
15001 clib_memcpy (mp->stream_name, stream_name, name_len);
15003 vec_free (stream_name);
15012 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15014 unformat_input_t *input = vam->input;
15015 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15018 u16 *low_ports = 0;
15019 u16 *high_ports = 0;
15022 ip4_address_t ip4_addr;
15023 ip6_address_t ip6_addr;
15031 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15033 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15039 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15044 else if (unformat (input, "vrf %d", &vrf_id))
15046 else if (unformat (input, "del"))
15048 else if (unformat (input, "port %d", &tmp))
15050 if (tmp == 0 || tmp > 65535)
15052 errmsg ("port %d out of range", tmp);
15056 this_hi = this_low + 1;
15057 vec_add1 (low_ports, this_low);
15058 vec_add1 (high_ports, this_hi);
15060 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15062 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15064 errmsg ("incorrect range parameters\n");
15068 /* Note: in debug CLI +1 is added to high before
15069 passing to real fn that does "the work"
15070 (ip_source_and_port_range_check_add_del).
15071 This fn is a wrapper around the binary API fn a
15072 control plane will call, which expects this increment
15073 to have occurred. Hence letting the binary API control
15074 plane fn do the increment for consistency between VAT
15075 and other control planes.
15078 vec_add1 (low_ports, this_low);
15079 vec_add1 (high_ports, this_hi);
15085 if (prefix_set == 0)
15087 errmsg ("<address>/<mask> not specified\n");
15093 errmsg ("VRF ID required, not specified\n");
15100 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15104 if (vec_len (low_ports) == 0)
15106 errmsg ("At least one port or port range required\n");
15110 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15111 ip_source_and_port_range_check_add_del);
15113 mp->is_add = is_add;
15118 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15123 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15126 mp->mask_length = length;
15127 mp->number_of_ranges = vec_len (low_ports);
15129 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15130 vec_free (low_ports);
15132 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15133 vec_free (high_ports);
15135 mp->vrf_id = ntohl (vrf_id);
15144 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15146 unformat_input_t *input = vam->input;
15147 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15149 u32 sw_if_index = ~0;
15151 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15152 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15155 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15157 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15159 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15161 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15163 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15165 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15167 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15169 else if (unformat (input, "del"))
15175 if (sw_if_index == ~0)
15177 errmsg ("Interface required but not specified\n");
15183 errmsg ("VRF ID required but not specified\n");
15187 if (tcp_out_vrf_id == 0
15188 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15191 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15195 /* Construct the API message */
15196 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15197 ip_source_and_port_range_check_interface_add_del);
15199 mp->sw_if_index = ntohl (sw_if_index);
15200 mp->is_add = is_add;
15201 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15202 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15203 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15204 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15209 /* Wait for a reply... */
15214 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15216 unformat_input_t *i = vam->input;
15217 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15219 u32 local_sa_id = 0;
15220 u32 remote_sa_id = 0;
15221 ip4_address_t src_address;
15222 ip4_address_t dst_address;
15225 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15227 if (unformat (i, "local_sa %d", &local_sa_id))
15229 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15231 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15233 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15235 else if (unformat (i, "del"))
15239 clib_warning ("parse error '%U'", format_unformat_error, i);
15244 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15246 mp->local_sa_id = ntohl (local_sa_id);
15247 mp->remote_sa_id = ntohl (remote_sa_id);
15248 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15249 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15250 mp->is_add = is_add;
15258 static void vl_api_ipsec_gre_tunnel_details_t_handler
15259 (vl_api_ipsec_gre_tunnel_details_t * mp)
15261 vat_main_t *vam = &vat_main;
15263 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15264 ntohl (mp->sw_if_index),
15265 format_ip4_address, &mp->src_address,
15266 format_ip4_address, &mp->dst_address,
15267 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15270 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15271 (vl_api_ipsec_gre_tunnel_details_t * mp)
15273 vat_main_t *vam = &vat_main;
15274 vat_json_node_t *node = NULL;
15275 struct in_addr ip4;
15277 if (VAT_JSON_ARRAY != vam->json_tree.type)
15279 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15280 vat_json_init_array (&vam->json_tree);
15282 node = vat_json_array_add (&vam->json_tree);
15284 vat_json_init_object (node);
15285 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15286 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15287 vat_json_object_add_ip4 (node, "src_address", ip4);
15288 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15289 vat_json_object_add_ip4 (node, "dst_address", ip4);
15290 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15291 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15295 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15297 unformat_input_t *i = vam->input;
15298 vl_api_ipsec_gre_tunnel_dump_t *mp;
15301 u8 sw_if_index_set = 0;
15303 /* Parse args required to build the message */
15304 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15306 if (unformat (i, "sw_if_index %d", &sw_if_index))
15307 sw_if_index_set = 1;
15312 if (sw_if_index_set == 0)
15317 if (!vam->json_output)
15319 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15320 "sw_if_index", "src_address", "dst_address",
15321 "local_sa_id", "remote_sa_id");
15324 /* Get list of gre-tunnel interfaces */
15325 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15327 mp->sw_if_index = htonl (sw_if_index);
15331 /* Use a control ping for synchronization */
15333 vl_api_control_ping_t *mp;
15334 M (CONTROL_PING, control_ping);
15341 api_delete_subif (vat_main_t * vam)
15343 unformat_input_t *i = vam->input;
15344 vl_api_delete_subif_t *mp;
15346 u32 sw_if_index = ~0;
15348 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15350 if (unformat (i, "sw_if_index %d", &sw_if_index))
15356 if (sw_if_index == ~0)
15358 errmsg ("missing sw_if_index\n");
15362 /* Construct the API message */
15363 M (DELETE_SUBIF, delete_subif);
15364 mp->sw_if_index = ntohl (sw_if_index);
15371 q_or_quit (vat_main_t * vam)
15373 longjmp (vam->jump_buf, 1);
15374 return 0; /* not so much */
15378 q (vat_main_t * vam)
15380 return q_or_quit (vam);
15384 quit (vat_main_t * vam)
15386 return q_or_quit (vam);
15390 comment (vat_main_t * vam)
15396 cmd_cmp (void *a1, void *a2)
15401 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15405 help (vat_main_t * vam)
15410 unformat_input_t *i = vam->input;
15413 if (unformat (i, "%s", &name))
15417 vec_add1 (name, 0);
15419 hs = hash_get_mem (vam->help_by_name, name);
15421 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15423 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15428 fformat (vam->ofp, "Help is available for the following:\n");
15431 hash_foreach_pair (p, vam->function_by_name,
15433 vec_add1 (cmds, (u8 *)(p->key));
15437 vec_sort_with_function (cmds, cmd_cmp);
15439 for (j = 0; j < vec_len (cmds); j++)
15440 fformat (vam->ofp, "%s\n", cmds[j]);
15447 set (vat_main_t * vam)
15449 u8 *name = 0, *value = 0;
15450 unformat_input_t *i = vam->input;
15452 if (unformat (i, "%s", &name))
15454 /* The input buffer is a vector, not a string. */
15455 value = vec_dup (i->buffer);
15456 vec_delete (value, i->index, 0);
15457 /* Almost certainly has a trailing newline */
15458 if (value[vec_len (value) - 1] == '\n')
15459 value[vec_len (value) - 1] = 0;
15460 /* Make sure it's a proper string, one way or the other */
15461 vec_add1 (value, 0);
15462 (void) clib_macro_set_value (&vam->macro_main,
15463 (char *) name, (char *) value);
15466 errmsg ("usage: set <name> <value>\n");
15474 unset (vat_main_t * vam)
15478 if (unformat (vam->input, "%s", &name))
15479 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
15480 errmsg ("unset: %s wasn't set\n", name);
15493 macro_sort_cmp (void *a1, void *a2)
15495 macro_sort_t *s1 = a1;
15496 macro_sort_t *s2 = a2;
15498 return strcmp ((char *) (s1->name), (char *) (s2->name));
15502 dump_macro_table (vat_main_t * vam)
15504 macro_sort_t *sort_me = 0, *sm;
15509 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
15511 vec_add2 (sort_me, sm, 1);
15512 sm->name = (u8 *)(p->key);
15513 sm->value = (u8 *) (p->value[0]);
15517 vec_sort_with_function (sort_me, macro_sort_cmp);
15519 if (vec_len (sort_me))
15520 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
15522 fformat (vam->ofp, "The macro table is empty...\n");
15524 for (i = 0; i < vec_len (sort_me); i++)
15525 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
15530 dump_node_table (vat_main_t * vam)
15533 vlib_node_t *node, *next_node;
15535 if (vec_len (vam->graph_nodes) == 0)
15537 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15541 for (i = 0; i < vec_len (vam->graph_nodes); i++)
15543 node = vam->graph_nodes[i];
15544 fformat (vam->ofp, "[%d] %s\n", i, node->name);
15545 for (j = 0; j < vec_len (node->next_nodes); j++)
15547 if (node->next_nodes[j] != ~0)
15549 next_node = vam->graph_nodes[node->next_nodes[j]];
15550 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15558 search_node_table (vat_main_t * vam)
15560 unformat_input_t *line_input = vam->input;
15563 vlib_node_t *node, *next_node;
15566 if (vam->graph_node_index_by_name == 0)
15568 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
15572 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15574 if (unformat (line_input, "%s", &node_to_find))
15576 vec_add1 (node_to_find, 0);
15577 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
15580 fformat (vam->ofp, "%s not found...\n", node_to_find);
15583 node = vam->graph_nodes[p[0]];
15584 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
15585 for (j = 0; j < vec_len (node->next_nodes); j++)
15587 if (node->next_nodes[j] != ~0)
15589 next_node = vam->graph_nodes[node->next_nodes[j]];
15590 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
15597 clib_warning ("parse error '%U'", format_unformat_error,
15603 vec_free (node_to_find);
15612 script (vat_main_t * vam)
15615 char *save_current_file;
15616 unformat_input_t save_input;
15617 jmp_buf save_jump_buf;
15618 u32 save_line_number;
15620 FILE *new_fp, *save_ifp;
15622 if (unformat (vam->input, "%s", &s))
15624 new_fp = fopen ((char *) s, "r");
15627 errmsg ("Couldn't open script file %s\n", s);
15634 errmsg ("Missing script name\n");
15638 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
15639 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
15640 save_ifp = vam->ifp;
15641 save_line_number = vam->input_line_number;
15642 save_current_file = (char *) vam->current_file;
15644 vam->input_line_number = 0;
15646 vam->current_file = s;
15649 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
15650 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
15651 vam->ifp = save_ifp;
15652 vam->input_line_number = save_line_number;
15653 vam->current_file = (u8 *) save_current_file;
15660 echo (vat_main_t * vam)
15662 fformat (vam->ofp, "%v", vam->input->buffer);
15666 /* List of API message constructors, CLI names map to api_xxx */
15667 #define foreach_vpe_api_msg \
15668 _(create_loopback,"[mac <mac-addr>]") \
15669 _(sw_interface_dump,"") \
15670 _(sw_interface_set_flags, \
15671 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
15672 _(sw_interface_add_del_address, \
15673 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
15674 _(sw_interface_set_table, \
15675 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
15676 _(sw_interface_set_vpath, \
15677 "<intfc> | sw_if_index <id> enable | disable") \
15678 _(sw_interface_set_l2_xconnect, \
15679 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15680 "enable | disable") \
15681 _(sw_interface_set_l2_bridge, \
15682 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
15683 "[shg <split-horizon-group>] [bvi]\n" \
15684 "enable | disable") \
15685 _(bridge_domain_add_del, \
15686 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
15687 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
15689 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
15691 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
15693 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
15695 "tapname <name> mac <mac-addr> | random-mac") \
15697 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
15699 "<vpp-if-name> | sw_if_index <id>") \
15700 _(sw_interface_tap_dump, "") \
15701 _(ip_add_del_route, \
15702 "<addr>/<mask> via <addr> [vrf <n>]\n" \
15703 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
15704 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
15705 "[multipath] [count <n>]") \
15706 _(proxy_arp_add_del, \
15707 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
15708 _(proxy_arp_intfc_enable_disable, \
15709 "<intfc> | sw_if_index <id> enable | disable") \
15710 _(mpls_add_del_encap, \
15711 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
15712 _(mpls_add_del_decap, \
15713 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
15714 _(mpls_gre_add_del_tunnel, \
15715 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
15716 "adj <ip4-address>/<mask-width> [del]") \
15717 _(sw_interface_set_unnumbered, \
15718 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
15719 _(ip_neighbor_add_del, \
15720 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
15721 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
15722 _(reset_vrf, "vrf <id> [ipv6]") \
15723 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
15724 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
15725 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
15726 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
15727 "[outer_vlan_id_any][inner_vlan_id_any]") \
15728 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
15729 _(reset_fib, "vrf <n> [ipv6]") \
15730 _(dhcp_proxy_config, \
15731 "svr <v46-address> src <v46-address>\n" \
15732 "insert-cid <n> [del]") \
15733 _(dhcp_proxy_config_2, \
15734 "svr <v46-address> src <v46-address>\n" \
15735 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
15736 _(dhcp_proxy_set_vss, \
15737 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
15738 _(dhcp_client_config, \
15739 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
15740 _(set_ip_flow_hash, \
15741 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
15742 _(sw_interface_ip6_enable_disable, \
15743 "<intfc> | sw_if_index <id> enable | disable") \
15744 _(sw_interface_ip6_set_link_local_address, \
15745 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
15746 _(sw_interface_ip6nd_ra_prefix, \
15747 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
15748 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
15749 "[nolink] [isno]") \
15750 _(sw_interface_ip6nd_ra_config, \
15751 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
15752 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
15753 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
15754 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
15755 _(l2_patch_add_del, \
15756 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
15757 "enable | disable") \
15758 _(mpls_ethernet_add_del_tunnel, \
15759 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
15760 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
15761 _(mpls_ethernet_add_del_tunnel_2, \
15762 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
15763 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
15764 _(sr_tunnel_add_del, \
15765 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
15766 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
15767 "[policy <policy_name>]") \
15768 _(sr_policy_add_del, \
15769 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
15770 _(sr_multicast_map_add_del, \
15771 "address [ip6 multicast address] sr-policy [policy name] [del]") \
15772 _(classify_add_del_table, \
15773 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
15774 "[del] mask <mask-value>\n" \
15775 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
15776 _(classify_add_del_session, \
15777 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
15778 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
15779 " [l3 [ip4|ip6]]") \
15780 _(classify_set_interface_ip_table, \
15781 "<intfc> | sw_if_index <nn> table <nn>") \
15782 _(classify_set_interface_l2_tables, \
15783 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15784 " [other-table <nn>]") \
15785 _(get_node_index, "node <node-name") \
15786 _(add_node_next, "node <node-name> next <next-node-name>") \
15787 _(l2tpv3_create_tunnel, \
15788 "client_address <ip6-addr> our_address <ip6-addr>\n" \
15789 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
15790 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
15791 _(l2tpv3_set_tunnel_cookies, \
15792 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
15793 "[new_remote_cookie <nn>]\n") \
15794 _(l2tpv3_interface_enable_disable, \
15795 "<intfc> | sw_if_index <nn> enable | disable") \
15796 _(l2tpv3_set_lookup_key, \
15797 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
15798 _(sw_if_l2tpv3_tunnel_dump, "") \
15799 _(vxlan_add_del_tunnel, \
15800 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
15801 " [decap-next l2|ip4|ip6] [del]") \
15802 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15803 _(gre_add_del_tunnel, \
15804 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
15805 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15806 _(l2_fib_clear_table, "") \
15807 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
15808 _(l2_interface_vlan_tag_rewrite, \
15809 "<intfc> | sw_if_index <nn> \n" \
15810 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
15811 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
15812 _(create_vhost_user_if, \
15813 "socket <filename> [server] [renumber <dev_instance>] " \
15814 "[mac <mac_address>]") \
15815 _(modify_vhost_user_if, \
15816 "<intfc> | sw_if_index <nn> socket <filename>\n" \
15817 "[server] [renumber <dev_instance>]") \
15818 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
15819 _(sw_interface_vhost_user_dump, "") \
15820 _(show_version, "") \
15821 _(vxlan_gpe_add_del_tunnel, \
15822 "local <addr> remote <addr> vni <nn>\n" \
15823 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
15824 "[next-ethernet] [next-nsh]\n") \
15825 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
15826 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
15827 _(interface_name_renumber, \
15828 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
15829 _(input_acl_set_interface, \
15830 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15831 " [l2-table <nn>] [del]") \
15832 _(want_ip4_arp_events, "address <ip4-address> [del]") \
15833 _(want_ip6_nd_events, "address <ip6-address> [del]") \
15834 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
15835 _(ip_dump, "ipv4 | ipv6") \
15836 _(ipsec_spd_add_del, "spd_id <n> [del]") \
15837 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
15839 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
15840 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
15841 " integ_alg <alg> integ_key <hex>") \
15842 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
15843 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
15844 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
15845 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
15846 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
15847 _(ikev2_profile_add_del, "name <profile_name> [del]") \
15848 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
15849 "(auth_data 0x<data> | auth_data <data>)") \
15850 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
15851 "(id_data 0x<data> | id_data <data>) (local|remote)") \
15852 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
15853 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
15854 "(local|remote)") \
15855 _(ikev2_set_local_key, "file <absolute_file_path>") \
15856 _(delete_loopback,"sw_if_index <nn>") \
15857 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
15858 _(map_add_domain, \
15859 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
15860 "ip6-src <ip6addr> " \
15861 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
15862 _(map_del_domain, "index <n>") \
15863 _(map_add_del_rule, \
15864 "index <n> psid <n> dst <ip6addr> [del]") \
15865 _(map_domain_dump, "") \
15866 _(map_rule_dump, "index <map-domain>") \
15867 _(want_interface_events, "enable|disable") \
15868 _(want_stats,"enable|disable") \
15869 _(get_first_msg_id, "client <name>") \
15870 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
15871 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
15872 "fib-id <nn> [ip4][ip6][default]") \
15873 _(get_node_graph, " ") \
15874 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
15875 _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> " \
15876 "trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> " \
15877 "app-data <app_data in hex> [pow] [ppc <encap|decap>]") \
15878 _(trace_profile_apply, "id <nn> <ip6-address>/<width>" \
15879 " vrf_id <nn> add | pop | none") \
15880 _(trace_profile_del, "") \
15881 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
15882 " sw_if_index <sw_if_index> p <priority> " \
15883 "w <weight>] [del]") \
15884 _(lisp_add_del_locator, "locator-set <locator_name> " \
15885 "iface <intf> | sw_if_index <sw_if_index> " \
15886 "p <priority> w <weight> [del]") \
15887 _(lisp_add_del_local_eid,"vni <vni> eid " \
15888 "<ipv4|ipv6>/<prefix> | <L2 address> " \
15889 "locator-set <locator_name> [del]") \
15890 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
15891 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
15892 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
15893 _(lisp_gpe_enable_disable, "enable|disable") \
15894 _(lisp_enable_disable, "enable|disable") \
15895 _(lisp_gpe_add_del_iface, "up|down") \
15896 _(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> " \
15897 "rloc <locator> p <prio> " \
15898 "w <weight> [rloc <loc> ... ] " \
15899 "action <action> [del-all]") \
15900 _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \
15901 "<src-eid> rloc <locator> p <prio> w <weight>"\
15902 "[rloc <loc> ... ] action <action>") \
15903 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
15904 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
15905 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
15906 _(lisp_locator_set_dump, "[locator-set-index <ls-index> | " \
15907 "locator-set <loc-set-name>] [local | remote]")\
15908 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
15909 "[local] | [remote]") \
15910 _(lisp_eid_table_vni_dump, "") \
15911 _(lisp_eid_table_map_dump, "l2|l3") \
15912 _(lisp_gpe_tunnel_dump, "") \
15913 _(lisp_map_resolver_dump, "") \
15914 _(show_lisp_status, "") \
15915 _(lisp_get_map_request_itr_rlocs, "") \
15916 _(show_lisp_pitr, "") \
15917 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
15918 _(af_packet_delete, "name <host interface name>") \
15919 _(policer_add_del, "name <policer name> <params> [del]") \
15920 _(policer_dump, "[name <policer name>]") \
15921 _(policer_classify_set_interface, \
15922 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
15923 " [l2-table <nn>] [del]") \
15924 _(policer_classify_dump, "type [ip4|ip6|l2]") \
15925 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
15926 "[master|slave]") \
15927 _(netmap_delete, "name <interface name>") \
15928 _(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
15929 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
15930 _(mpls_fib_encap_dump, "") \
15931 _(mpls_fib_decap_dump, "") \
15932 _(classify_table_ids, "") \
15933 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
15934 _(classify_table_info, "table_id <nn>") \
15935 _(classify_session_dump, "table_id <nn>") \
15936 _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \
15937 "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \
15938 "[template_interval <nn>]") \
15939 _(ipfix_dump, "") \
15940 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
15941 _(pg_create_interface, "if_id <nn>") \
15942 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
15943 _(pg_enable_disable, "[stream <id>] disable") \
15944 _(ip_source_and_port_range_check_add_del, \
15945 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
15946 _(ip_source_and_port_range_check_interface_add_del, \
15947 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
15948 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
15949 _(ipsec_gre_add_del_tunnel, \
15950 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
15951 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
15952 _(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>")
15954 /* List of command functions, CLI names map directly to functions */
15955 #define foreach_cli_function \
15956 _(comment, "usage: comment <ignore-rest-of-line>") \
15957 _(dump_interface_table, "usage: dump_interface_table") \
15958 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
15959 _(dump_ipv4_table, "usage: dump_ipv4_table") \
15960 _(dump_ipv6_table, "usage: dump_ipv6_table") \
15961 _(dump_stats_table, "usage: dump_stats_table") \
15962 _(dump_macro_table, "usage: dump_macro_table ") \
15963 _(dump_node_table, "usage: dump_node_table") \
15964 _(echo, "usage: echo <message>") \
15965 _(exec, "usage: exec <vpe-debug-CLI-command>") \
15966 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
15967 _(help, "usage: help") \
15968 _(q, "usage: quit") \
15969 _(quit, "usage: quit") \
15970 _(search_node_table, "usage: search_node_table <name>...") \
15971 _(set, "usage: set <variable-name> <value>") \
15972 _(script, "usage: script <file-name>") \
15973 _(unset, "usage: unset <variable-name>")
15976 static void vl_api_##n##_t_handler_uni \
15977 (vl_api_##n##_t * mp) \
15979 vat_main_t * vam = &vat_main; \
15980 if (vam->json_output) { \
15981 vl_api_##n##_t_handler_json(mp); \
15983 vl_api_##n##_t_handler(mp); \
15986 foreach_vpe_api_reply_msg;
15990 vat_api_hookup (vat_main_t * vam)
15993 vl_msg_api_set_handlers(VL_API_##N, #n, \
15994 vl_api_##n##_t_handler_uni, \
15996 vl_api_##n##_t_endian, \
15997 vl_api_##n##_t_print, \
15998 sizeof(vl_api_##n##_t), 1);
15999 foreach_vpe_api_reply_msg;
16002 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
16004 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
16006 vam->function_by_name = hash_create_string (0, sizeof (uword));
16008 vam->help_by_name = hash_create_string (0, sizeof (uword));
16010 /* API messages we can send */
16011 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
16012 foreach_vpe_api_msg;
16016 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16017 foreach_vpe_api_msg;
16020 /* CLI functions */
16021 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
16022 foreach_cli_function;
16026 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16027 foreach_cli_function;
16031 #undef vl_api_version
16032 #define vl_api_version(n,v) static u32 vpe_api_version = v;
16033 #include <vpp-api/vpe.api.h>
16034 #undef vl_api_version
16037 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
16040 * Send the main API signature in slot 0. This bit of code must
16041 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16043 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
16047 * fd.io coding-style-patch-verification: ON
16050 * eval: (c-set-style "gnu")