2 *------------------------------------------------------------------
5 * Copyright (c) 2014-2016 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/classify/flow_classify.h>
39 #include <vnet/mpls/mpls.h>
41 #include <vnet/ipsec/ipsec.h>
42 #include <vnet/ipsec/ikev2.h>
46 #include <vnet/map/map.h>
47 #include <vnet/cop/cop.h>
48 #include <vnet/ip/ip6_hop_by_hop.h>
49 #include <vnet/ip/ip_source_and_port_range_check.h>
50 #include <vnet/policer/xlate.h>
51 #include <vnet/policer/policer.h>
52 #include <vnet/policer/police.h>
54 #include "vat/json_format.h"
58 #define vl_typedefs /* define message structures */
59 #include <vpp-api/vpe_all_api_h.h>
62 /* declare message handlers for each api */
64 #define vl_endianfun /* define message structures */
65 #include <vpp-api/vpe_all_api_h.h>
68 /* instantiate all the print functions we know about */
69 #define vl_print(handle, ...)
71 #include <vpp-api/vpe_all_api_h.h>
75 unformat_sw_if_index (unformat_input_t * input, va_list * args)
77 vat_main_t *vam = va_arg (*args, vat_main_t *);
78 u32 *result = va_arg (*args, u32 *);
82 if (!unformat (input, "%s", &if_name))
85 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
92 /* Parse an IP4 address %d.%d.%d.%d. */
94 unformat_ip4_address (unformat_input_t * input, va_list * args)
96 u8 *result = va_arg (*args, u8 *);
99 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
102 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
115 unformat_ethernet_address (unformat_input_t * input, va_list * args)
117 u8 *result = va_arg (*args, u8 *);
120 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
121 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
125 for (i = 0; i < 6; i++)
126 if (a[i] >= (1 << 8))
129 for (i = 0; i < 6; i++)
135 /* Returns ethernet type as an int in host byte order. */
137 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
140 u16 *result = va_arg (*args, u16 *);
144 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
146 if (type >= (1 << 16))
154 /* Parse an IP6 address. */
156 unformat_ip6_address (unformat_input_t * input, va_list * args)
158 ip6_address_t *result = va_arg (*args, ip6_address_t *);
160 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
161 uword c, n_colon, double_colon_index;
163 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
164 double_colon_index = ARRAY_LEN (hex_quads);
165 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
168 if (c >= '0' && c <= '9')
170 else if (c >= 'a' && c <= 'f')
171 hex_digit = c + 10 - 'a';
172 else if (c >= 'A' && c <= 'F')
173 hex_digit = c + 10 - 'A';
174 else if (c == ':' && n_colon < 2)
178 unformat_put_input (input);
182 /* Too many hex quads. */
183 if (n_hex_quads >= ARRAY_LEN (hex_quads))
188 hex_quad = (hex_quad << 4) | hex_digit;
190 /* Hex quad must fit in 16 bits. */
191 if (n_hex_digits >= 4)
198 /* Save position of :: */
201 /* More than one :: ? */
202 if (double_colon_index < ARRAY_LEN (hex_quads))
204 double_colon_index = n_hex_quads;
207 if (n_colon > 0 && n_hex_digits > 0)
209 hex_quads[n_hex_quads++] = hex_quad;
215 if (n_hex_digits > 0)
216 hex_quads[n_hex_quads++] = hex_quad;
221 /* Expand :: to appropriate number of zero hex quads. */
222 if (double_colon_index < ARRAY_LEN (hex_quads))
224 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
226 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
227 hex_quads[n_zero + i] = hex_quads[i];
229 for (i = 0; i < n_zero; i++)
230 hex_quads[double_colon_index + i] = 0;
232 n_hex_quads = ARRAY_LEN (hex_quads);
235 /* Too few hex quads given. */
236 if (n_hex_quads < ARRAY_LEN (hex_quads))
239 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
240 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
247 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
250 u32 *r = va_arg (*args, u32 *);
253 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
254 foreach_ipsec_policy_action
265 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
268 u32 *r = va_arg (*args, u32 *);
271 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
272 foreach_ipsec_crypto_alg
283 format_ipsec_crypto_alg (u8 * s, va_list * args)
286 u32 i = va_arg (*args, u32);
291 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
292 foreach_ipsec_crypto_alg
295 return format (s, "unknown");
297 return format (s, "%s", t);
299 return format (s, "Unimplemented");
304 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
307 u32 *r = va_arg (*args, u32 *);
310 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
311 foreach_ipsec_integ_alg
322 format_ipsec_integ_alg (u8 * s, va_list * args)
325 u32 i = va_arg (*args, u32);
330 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
331 foreach_ipsec_integ_alg
334 return format (s, "unknown");
336 return format (s, "%s", t);
338 return format (s, "Unsupported");
343 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
346 u32 *r = va_arg (*args, u32 *);
349 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
350 foreach_ikev2_auth_method
361 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
364 u32 *r = va_arg (*args, u32 *);
367 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
368 foreach_ikev2_id_type
379 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
381 u8 *r = va_arg (*args, u8 *);
383 if (unformat (input, "kbps"))
384 *r = SSE2_QOS_RATE_KBPS;
385 else if (unformat (input, "pps"))
386 *r = SSE2_QOS_RATE_PPS;
393 unformat_policer_round_type (unformat_input_t * input, va_list * args)
395 u8 *r = va_arg (*args, u8 *);
397 if (unformat (input, "closest"))
398 *r = SSE2_QOS_ROUND_TO_CLOSEST;
399 else if (unformat (input, "up"))
400 *r = SSE2_QOS_ROUND_TO_UP;
401 else if (unformat (input, "down"))
402 *r = SSE2_QOS_ROUND_TO_DOWN;
409 unformat_policer_type (unformat_input_t * input, va_list * args)
411 u8 *r = va_arg (*args, u8 *);
413 if (unformat (input, "1r2c"))
414 *r = SSE2_QOS_POLICER_TYPE_1R2C;
415 else if (unformat (input, "1r3c"))
416 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
417 else if (unformat (input, "2r3c-2698"))
418 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
419 else if (unformat (input, "2r3c-4115"))
420 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
421 else if (unformat (input, "2r3c-mef5cf1"))
422 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
429 unformat_dscp (unformat_input_t * input, va_list * va)
431 u8 *r = va_arg (*va, u8 *);
434 #define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
443 unformat_policer_action_type (unformat_input_t * input, va_list * va)
445 sse2_qos_pol_action_params_st *a
446 = va_arg (*va, sse2_qos_pol_action_params_st *);
448 if (unformat (input, "drop"))
449 a->action_type = SSE2_QOS_ACTION_DROP;
450 else if (unformat (input, "transmit"))
451 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
452 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
453 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
460 unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
462 u32 *r = va_arg (*va, u32 *);
465 if (unformat (input, "ip4"))
466 tid = POLICER_CLASSIFY_TABLE_IP4;
467 else if (unformat (input, "ip6"))
468 tid = POLICER_CLASSIFY_TABLE_IP6;
469 else if (unformat (input, "l2"))
470 tid = POLICER_CLASSIFY_TABLE_L2;
479 unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
481 u32 *r = va_arg (*va, u32 *);
484 if (unformat (input, "ip4"))
485 tid = FLOW_CLASSIFY_TABLE_IP4;
486 else if (unformat (input, "ip6"))
487 tid = FLOW_CLASSIFY_TABLE_IP6;
496 format_ip4_address (u8 * s, va_list * args)
498 u8 *a = va_arg (*args, u8 *);
499 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
503 format_ip6_address (u8 * s, va_list * args)
505 ip6_address_t *a = va_arg (*args, ip6_address_t *);
506 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
508 i_max_n_zero = ARRAY_LEN (a->as_u16);
510 i_first_zero = i_max_n_zero;
512 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
514 u32 is_zero = a->as_u16[i] == 0;
515 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
521 if ((!is_zero && n_zeros > max_n_zeros)
522 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
524 i_max_n_zero = i_first_zero;
525 max_n_zeros = n_zeros;
526 i_first_zero = ARRAY_LEN (a->as_u16);
531 last_double_colon = 0;
532 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
534 if (i == i_max_n_zero && max_n_zeros > 1)
536 s = format (s, "::");
537 i += max_n_zeros - 1;
538 last_double_colon = 1;
542 s = format (s, "%s%x",
543 (last_double_colon || i == 0) ? "" : ":",
544 clib_net_to_host_u16 (a->as_u16[i]));
545 last_double_colon = 0;
552 /* Format an IP46 address. */
554 format_ip46_address (u8 * s, va_list * args)
556 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
557 ip46_type_t type = va_arg (*args, ip46_type_t);
563 is_ip4 = ip46_address_is_ip4 (ip46);
574 format (s, "%U", format_ip4_address, &ip46->ip4) :
575 format (s, "%U", format_ip6_address, &ip46->ip6);
579 format_ethernet_address (u8 * s, va_list * args)
581 u8 *a = va_arg (*args, u8 *);
583 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
584 a[0], a[1], a[2], a[3], a[4], a[5]);
588 increment_v4_address (ip4_address_t * a)
592 v = ntohl (a->as_u32) + 1;
593 a->as_u32 = ntohl (v);
597 increment_v6_address (ip6_address_t * a)
601 v0 = clib_net_to_host_u64 (a->as_u64[0]);
602 v1 = clib_net_to_host_u64 (a->as_u64[1]);
607 a->as_u64[0] = clib_net_to_host_u64 (v0);
608 a->as_u64[1] = clib_net_to_host_u64 (v1);
612 increment_mac_address (u64 * mac)
616 tmp = clib_net_to_host_u64 (tmp);
617 tmp += 1 << 16; /* skip unused (least significant) octets */
618 tmp = clib_host_to_net_u64 (tmp);
622 static void vl_api_create_loopback_reply_t_handler
623 (vl_api_create_loopback_reply_t * mp)
625 vat_main_t *vam = &vat_main;
626 i32 retval = ntohl (mp->retval);
628 vam->retval = retval;
629 vam->regenerate_interface_table = 1;
630 vam->sw_if_index = ntohl (mp->sw_if_index);
631 vam->result_ready = 1;
634 static void vl_api_create_loopback_reply_t_handler_json
635 (vl_api_create_loopback_reply_t * mp)
637 vat_main_t *vam = &vat_main;
638 vat_json_node_t node;
640 vat_json_init_object (&node);
641 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
642 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
644 vat_json_print (vam->ofp, &node);
645 vat_json_free (&node);
646 vam->retval = ntohl (mp->retval);
647 vam->result_ready = 1;
650 static void vl_api_af_packet_create_reply_t_handler
651 (vl_api_af_packet_create_reply_t * mp)
653 vat_main_t *vam = &vat_main;
654 i32 retval = ntohl (mp->retval);
656 vam->retval = retval;
657 vam->regenerate_interface_table = 1;
658 vam->sw_if_index = ntohl (mp->sw_if_index);
659 vam->result_ready = 1;
662 static void vl_api_af_packet_create_reply_t_handler_json
663 (vl_api_af_packet_create_reply_t * mp)
665 vat_main_t *vam = &vat_main;
666 vat_json_node_t node;
668 vat_json_init_object (&node);
669 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
670 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
672 vat_json_print (vam->ofp, &node);
673 vat_json_free (&node);
675 vam->retval = ntohl (mp->retval);
676 vam->result_ready = 1;
679 static void vl_api_create_vlan_subif_reply_t_handler
680 (vl_api_create_vlan_subif_reply_t * mp)
682 vat_main_t *vam = &vat_main;
683 i32 retval = ntohl (mp->retval);
685 vam->retval = retval;
686 vam->regenerate_interface_table = 1;
687 vam->sw_if_index = ntohl (mp->sw_if_index);
688 vam->result_ready = 1;
691 static void vl_api_create_vlan_subif_reply_t_handler_json
692 (vl_api_create_vlan_subif_reply_t * mp)
694 vat_main_t *vam = &vat_main;
695 vat_json_node_t node;
697 vat_json_init_object (&node);
698 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
699 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
701 vat_json_print (vam->ofp, &node);
702 vat_json_free (&node);
704 vam->retval = ntohl (mp->retval);
705 vam->result_ready = 1;
708 static void vl_api_create_subif_reply_t_handler
709 (vl_api_create_subif_reply_t * mp)
711 vat_main_t *vam = &vat_main;
712 i32 retval = ntohl (mp->retval);
714 vam->retval = retval;
715 vam->regenerate_interface_table = 1;
716 vam->sw_if_index = ntohl (mp->sw_if_index);
717 vam->result_ready = 1;
720 static void vl_api_create_subif_reply_t_handler_json
721 (vl_api_create_subif_reply_t * mp)
723 vat_main_t *vam = &vat_main;
724 vat_json_node_t node;
726 vat_json_init_object (&node);
727 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
728 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
730 vat_json_print (vam->ofp, &node);
731 vat_json_free (&node);
733 vam->retval = ntohl (mp->retval);
734 vam->result_ready = 1;
737 static void vl_api_interface_name_renumber_reply_t_handler
738 (vl_api_interface_name_renumber_reply_t * mp)
740 vat_main_t *vam = &vat_main;
741 i32 retval = ntohl (mp->retval);
743 vam->retval = retval;
744 vam->regenerate_interface_table = 1;
745 vam->result_ready = 1;
748 static void vl_api_interface_name_renumber_reply_t_handler_json
749 (vl_api_interface_name_renumber_reply_t * mp)
751 vat_main_t *vam = &vat_main;
752 vat_json_node_t node;
754 vat_json_init_object (&node);
755 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
757 vat_json_print (vam->ofp, &node);
758 vat_json_free (&node);
760 vam->retval = ntohl (mp->retval);
761 vam->result_ready = 1;
765 * Special-case: build the interface table, maintain
766 * the next loopback sw_if_index vbl.
768 static void vl_api_sw_interface_details_t_handler
769 (vl_api_sw_interface_details_t * mp)
771 vat_main_t *vam = &vat_main;
772 u8 *s = format (0, "%s%c", mp->interface_name, 0);
774 hash_set_mem (vam->sw_if_index_by_interface_name, s,
775 ntohl (mp->sw_if_index));
777 /* In sub interface case, fill the sub interface table entry */
778 if (mp->sw_if_index != mp->sup_sw_if_index)
780 sw_interface_subif_t *sub = NULL;
782 vec_add2 (vam->sw_if_subif_table, sub, 1);
784 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
785 strncpy ((char *) sub->interface_name, (char *) s,
786 vec_len (sub->interface_name));
787 sub->sw_if_index = ntohl (mp->sw_if_index);
788 sub->sub_id = ntohl (mp->sub_id);
790 sub->sub_dot1ad = mp->sub_dot1ad;
791 sub->sub_number_of_tags = mp->sub_number_of_tags;
792 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
793 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
794 sub->sub_exact_match = mp->sub_exact_match;
795 sub->sub_default = mp->sub_default;
796 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
797 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
799 /* vlan tag rewrite */
800 sub->vtr_op = ntohl (mp->vtr_op);
801 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
802 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
803 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
807 static void vl_api_sw_interface_details_t_handler_json
808 (vl_api_sw_interface_details_t * mp)
810 vat_main_t *vam = &vat_main;
811 vat_json_node_t *node = NULL;
813 if (VAT_JSON_ARRAY != vam->json_tree.type)
815 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
816 vat_json_init_array (&vam->json_tree);
818 node = vat_json_array_add (&vam->json_tree);
820 vat_json_init_object (node);
821 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
822 vat_json_object_add_uint (node, "sup_sw_if_index",
823 ntohl (mp->sup_sw_if_index));
824 vat_json_object_add_uint (node, "l2_address_length",
825 ntohl (mp->l2_address_length));
826 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
827 sizeof (mp->l2_address));
828 vat_json_object_add_string_copy (node, "interface_name",
830 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
831 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
832 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
833 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
834 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
835 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
836 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
837 vat_json_object_add_uint (node, "sub_number_of_tags",
838 mp->sub_number_of_tags);
839 vat_json_object_add_uint (node, "sub_outer_vlan_id",
840 ntohs (mp->sub_outer_vlan_id));
841 vat_json_object_add_uint (node, "sub_inner_vlan_id",
842 ntohs (mp->sub_inner_vlan_id));
843 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
844 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
845 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
846 mp->sub_outer_vlan_id_any);
847 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
848 mp->sub_inner_vlan_id_any);
849 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
850 vat_json_object_add_uint (node, "vtr_push_dot1q",
851 ntohl (mp->vtr_push_dot1q));
852 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
853 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
856 static void vl_api_sw_interface_set_flags_t_handler
857 (vl_api_sw_interface_set_flags_t * mp)
859 vat_main_t *vam = &vat_main;
860 if (vam->interface_event_display)
861 errmsg ("interface flags: sw_if_index %d %s %s\n",
862 ntohl (mp->sw_if_index),
863 mp->admin_up_down ? "admin-up" : "admin-down",
864 mp->link_up_down ? "link-up" : "link-down");
867 static void vl_api_sw_interface_set_flags_t_handler_json
868 (vl_api_sw_interface_set_flags_t * mp)
870 /* JSON output not supported */
874 vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
876 vat_main_t *vam = &vat_main;
877 i32 retval = ntohl (mp->retval);
879 vam->retval = retval;
880 vam->shmem_result = (u8 *) mp->reply_in_shmem;
881 vam->result_ready = 1;
885 vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
887 vat_main_t *vam = &vat_main;
888 vat_json_node_t node;
889 api_main_t *am = &api_main;
893 vat_json_init_object (&node);
894 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
895 vat_json_object_add_uint (&node, "reply_in_shmem",
896 ntohl (mp->reply_in_shmem));
897 /* Toss the shared-memory original... */
898 pthread_mutex_lock (&am->vlib_rp->mutex);
899 oldheap = svm_push_data_heap (am->vlib_rp);
901 reply = (u8 *) (mp->reply_in_shmem);
904 svm_pop_heap (oldheap);
905 pthread_mutex_unlock (&am->vlib_rp->mutex);
907 vat_json_print (vam->ofp, &node);
908 vat_json_free (&node);
910 vam->retval = ntohl (mp->retval);
911 vam->result_ready = 1;
915 vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
917 vat_main_t *vam = &vat_main;
918 i32 retval = ntohl (mp->retval);
920 vam->retval = retval;
921 vam->cmd_reply = mp->reply;
922 vam->result_ready = 1;
926 vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
928 vat_main_t *vam = &vat_main;
929 vat_json_node_t node;
931 vat_json_init_object (&node);
932 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
933 vat_json_object_add_string_copy (&node, "reply", mp->reply);
935 vat_json_print (vam->ofp, &node);
936 vat_json_free (&node);
938 vam->retval = ntohl (mp->retval);
939 vam->result_ready = 1;
942 static void vl_api_classify_add_del_table_reply_t_handler
943 (vl_api_classify_add_del_table_reply_t * mp)
945 vat_main_t *vam = &vat_main;
946 i32 retval = ntohl (mp->retval);
949 vam->async_errors += (retval < 0);
953 vam->retval = retval;
955 ((mp->new_table_index != 0xFFFFFFFF) ||
956 (mp->skip_n_vectors != 0xFFFFFFFF) ||
957 (mp->match_n_vectors != 0xFFFFFFFF)))
959 * Note: this is just barely thread-safe, depends on
960 * the main thread spinning waiting for an answer...
962 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
963 ntohl (mp->new_table_index),
964 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
965 vam->result_ready = 1;
969 static void vl_api_classify_add_del_table_reply_t_handler_json
970 (vl_api_classify_add_del_table_reply_t * mp)
972 vat_main_t *vam = &vat_main;
973 vat_json_node_t node;
975 vat_json_init_object (&node);
976 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
977 vat_json_object_add_uint (&node, "new_table_index",
978 ntohl (mp->new_table_index));
979 vat_json_object_add_uint (&node, "skip_n_vectors",
980 ntohl (mp->skip_n_vectors));
981 vat_json_object_add_uint (&node, "match_n_vectors",
982 ntohl (mp->match_n_vectors));
984 vat_json_print (vam->ofp, &node);
985 vat_json_free (&node);
987 vam->retval = ntohl (mp->retval);
988 vam->result_ready = 1;
991 static void vl_api_get_node_index_reply_t_handler
992 (vl_api_get_node_index_reply_t * mp)
994 vat_main_t *vam = &vat_main;
995 i32 retval = ntohl (mp->retval);
998 vam->async_errors += (retval < 0);
1002 vam->retval = retval;
1004 errmsg ("node index %d\n", ntohl (mp->node_index));
1005 vam->result_ready = 1;
1009 static void vl_api_get_node_index_reply_t_handler_json
1010 (vl_api_get_node_index_reply_t * mp)
1012 vat_main_t *vam = &vat_main;
1013 vat_json_node_t node;
1015 vat_json_init_object (&node);
1016 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1017 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1019 vat_json_print (vam->ofp, &node);
1020 vat_json_free (&node);
1022 vam->retval = ntohl (mp->retval);
1023 vam->result_ready = 1;
1026 static void vl_api_get_next_index_reply_t_handler
1027 (vl_api_get_next_index_reply_t * mp)
1029 vat_main_t *vam = &vat_main;
1030 i32 retval = ntohl (mp->retval);
1031 if (vam->async_mode)
1033 vam->async_errors += (retval < 0);
1037 vam->retval = retval;
1039 errmsg ("next node index %d\n", ntohl (mp->next_index));
1040 vam->result_ready = 1;
1044 static void vl_api_get_next_index_reply_t_handler_json
1045 (vl_api_get_next_index_reply_t * mp)
1047 vat_main_t *vam = &vat_main;
1048 vat_json_node_t node;
1050 vat_json_init_object (&node);
1051 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1052 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1054 vat_json_print (vam->ofp, &node);
1055 vat_json_free (&node);
1057 vam->retval = ntohl (mp->retval);
1058 vam->result_ready = 1;
1061 static void vl_api_add_node_next_reply_t_handler
1062 (vl_api_add_node_next_reply_t * mp)
1064 vat_main_t *vam = &vat_main;
1065 i32 retval = ntohl (mp->retval);
1066 if (vam->async_mode)
1068 vam->async_errors += (retval < 0);
1072 vam->retval = retval;
1074 errmsg ("next index %d\n", ntohl (mp->next_index));
1075 vam->result_ready = 1;
1079 static void vl_api_add_node_next_reply_t_handler_json
1080 (vl_api_add_node_next_reply_t * mp)
1082 vat_main_t *vam = &vat_main;
1083 vat_json_node_t node;
1085 vat_json_init_object (&node);
1086 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1087 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1089 vat_json_print (vam->ofp, &node);
1090 vat_json_free (&node);
1092 vam->retval = ntohl (mp->retval);
1093 vam->result_ready = 1;
1096 static void vl_api_show_version_reply_t_handler
1097 (vl_api_show_version_reply_t * mp)
1099 vat_main_t *vam = &vat_main;
1100 i32 retval = ntohl (mp->retval);
1104 errmsg (" program: %s\n", mp->program);
1105 errmsg (" version: %s\n", mp->version);
1106 errmsg (" build date: %s\n", mp->build_date);
1107 errmsg ("build directory: %s\n", mp->build_directory);
1109 vam->retval = retval;
1110 vam->result_ready = 1;
1113 static void vl_api_show_version_reply_t_handler_json
1114 (vl_api_show_version_reply_t * mp)
1116 vat_main_t *vam = &vat_main;
1117 vat_json_node_t node;
1119 vat_json_init_object (&node);
1120 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1121 vat_json_object_add_string_copy (&node, "program", mp->program);
1122 vat_json_object_add_string_copy (&node, "version", mp->version);
1123 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1124 vat_json_object_add_string_copy (&node, "build_directory",
1125 mp->build_directory);
1127 vat_json_print (vam->ofp, &node);
1128 vat_json_free (&node);
1130 vam->retval = ntohl (mp->retval);
1131 vam->result_ready = 1;
1135 vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1137 vat_main_t *vam = &vat_main;
1138 errmsg ("arp %s event: address %U new mac %U sw_if_index %d\n",
1139 mp->mac_ip ? "mac/ip binding" : "address resolution",
1140 format_ip4_address, &mp->address,
1141 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1145 vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1147 /* JSON output not supported */
1151 vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1153 vat_main_t *vam = &vat_main;
1154 errmsg ("ip6 nd %s event: address %U new mac %U sw_if_index %d\n",
1155 mp->mac_ip ? "mac/ip binding" : "address resolution",
1156 format_ip6_address, mp->address,
1157 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1161 vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1163 /* JSON output not supported */
1167 * Special-case: build the bridge domain table, maintain
1168 * the next bd id vbl.
1170 static void vl_api_bridge_domain_details_t_handler
1171 (vl_api_bridge_domain_details_t * mp)
1173 vat_main_t *vam = &vat_main;
1174 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1176 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1177 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1179 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1180 ntohl (mp->bd_id), mp->learn, mp->forward,
1181 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1184 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1188 static void vl_api_bridge_domain_details_t_handler_json
1189 (vl_api_bridge_domain_details_t * mp)
1191 vat_main_t *vam = &vat_main;
1192 vat_json_node_t *node, *array = NULL;
1194 if (VAT_JSON_ARRAY != vam->json_tree.type)
1196 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1197 vat_json_init_array (&vam->json_tree);
1199 node = vat_json_array_add (&vam->json_tree);
1201 vat_json_init_object (node);
1202 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1203 vat_json_object_add_uint (node, "flood", mp->flood);
1204 vat_json_object_add_uint (node, "forward", mp->forward);
1205 vat_json_object_add_uint (node, "learn", mp->learn);
1206 vat_json_object_add_uint (node, "bvi_sw_if_index",
1207 ntohl (mp->bvi_sw_if_index));
1208 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1209 array = vat_json_object_add (node, "sw_if");
1210 vat_json_init_array (array);
1214 * Special-case: build the bridge domain sw if table.
1216 static void vl_api_bridge_domain_sw_if_details_t_handler
1217 (vl_api_bridge_domain_sw_if_details_t * mp)
1219 vat_main_t *vam = &vat_main;
1224 sw_if_index = ntohl (mp->sw_if_index);
1226 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1228 if ((u32) p->value[0] == sw_if_index)
1230 sw_if_name = (u8 *)(p->key);
1236 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1237 mp->shg, sw_if_name ? (char *) sw_if_name :
1238 "sw_if_index not found!");
1241 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1242 (vl_api_bridge_domain_sw_if_details_t * mp)
1244 vat_main_t *vam = &vat_main;
1245 vat_json_node_t *node = NULL;
1246 uword last_index = 0;
1248 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1249 ASSERT (vec_len (vam->json_tree.array) >= 1);
1250 last_index = vec_len (vam->json_tree.array) - 1;
1251 node = &vam->json_tree.array[last_index];
1252 node = vat_json_object_get_element (node, "sw_if");
1253 ASSERT (NULL != node);
1254 node = vat_json_array_add (node);
1256 vat_json_init_object (node);
1257 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1258 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1259 vat_json_object_add_uint (node, "shg", mp->shg);
1262 static void vl_api_control_ping_reply_t_handler
1263 (vl_api_control_ping_reply_t * mp)
1265 vat_main_t *vam = &vat_main;
1266 i32 retval = ntohl (mp->retval);
1267 if (vam->async_mode)
1269 vam->async_errors += (retval < 0);
1273 vam->retval = retval;
1274 vam->result_ready = 1;
1278 static void vl_api_control_ping_reply_t_handler_json
1279 (vl_api_control_ping_reply_t * mp)
1281 vat_main_t *vam = &vat_main;
1282 i32 retval = ntohl (mp->retval);
1284 if (VAT_JSON_NONE != vam->json_tree.type)
1286 vat_json_print (vam->ofp, &vam->json_tree);
1287 vat_json_free (&vam->json_tree);
1288 vam->json_tree.type = VAT_JSON_NONE;
1293 vat_json_init_array (&vam->json_tree);
1294 vat_json_print (vam->ofp, &vam->json_tree);
1295 vam->json_tree.type = VAT_JSON_NONE;
1298 vam->retval = retval;
1299 vam->result_ready = 1;
1303 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1305 vat_main_t *vam = &vat_main;
1306 i32 retval = ntohl (mp->retval);
1307 if (vam->async_mode)
1309 vam->async_errors += (retval < 0);
1313 vam->retval = retval;
1314 vam->result_ready = 1;
1318 static void vl_api_l2_flags_reply_t_handler_json
1319 (vl_api_l2_flags_reply_t * mp)
1321 vat_main_t *vam = &vat_main;
1322 vat_json_node_t node;
1324 vat_json_init_object (&node);
1325 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1326 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1327 ntohl (mp->resulting_feature_bitmap));
1329 vat_json_print (vam->ofp, &node);
1330 vat_json_free (&node);
1332 vam->retval = ntohl (mp->retval);
1333 vam->result_ready = 1;
1336 static void vl_api_bridge_flags_reply_t_handler
1337 (vl_api_bridge_flags_reply_t * mp)
1339 vat_main_t *vam = &vat_main;
1340 i32 retval = ntohl (mp->retval);
1341 if (vam->async_mode)
1343 vam->async_errors += (retval < 0);
1347 vam->retval = retval;
1348 vam->result_ready = 1;
1352 static void vl_api_bridge_flags_reply_t_handler_json
1353 (vl_api_bridge_flags_reply_t * mp)
1355 vat_main_t *vam = &vat_main;
1356 vat_json_node_t node;
1358 vat_json_init_object (&node);
1359 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1360 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1361 ntohl (mp->resulting_feature_bitmap));
1363 vat_json_print (vam->ofp, &node);
1364 vat_json_free (&node);
1366 vam->retval = ntohl (mp->retval);
1367 vam->result_ready = 1;
1370 static void vl_api_tap_connect_reply_t_handler
1371 (vl_api_tap_connect_reply_t * mp)
1373 vat_main_t *vam = &vat_main;
1374 i32 retval = ntohl (mp->retval);
1375 if (vam->async_mode)
1377 vam->async_errors += (retval < 0);
1381 vam->retval = retval;
1382 vam->sw_if_index = ntohl (mp->sw_if_index);
1383 vam->result_ready = 1;
1388 static void vl_api_tap_connect_reply_t_handler_json
1389 (vl_api_tap_connect_reply_t * mp)
1391 vat_main_t *vam = &vat_main;
1392 vat_json_node_t node;
1394 vat_json_init_object (&node);
1395 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1396 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1398 vat_json_print (vam->ofp, &node);
1399 vat_json_free (&node);
1401 vam->retval = ntohl (mp->retval);
1402 vam->result_ready = 1;
1407 vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
1409 vat_main_t *vam = &vat_main;
1410 i32 retval = ntohl (mp->retval);
1411 if (vam->async_mode)
1413 vam->async_errors += (retval < 0);
1417 vam->retval = retval;
1418 vam->sw_if_index = ntohl (mp->sw_if_index);
1419 vam->result_ready = 1;
1423 static void vl_api_tap_modify_reply_t_handler_json
1424 (vl_api_tap_modify_reply_t * mp)
1426 vat_main_t *vam = &vat_main;
1427 vat_json_node_t node;
1429 vat_json_init_object (&node);
1430 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1431 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1433 vat_json_print (vam->ofp, &node);
1434 vat_json_free (&node);
1436 vam->retval = ntohl (mp->retval);
1437 vam->result_ready = 1;
1441 vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
1443 vat_main_t *vam = &vat_main;
1444 i32 retval = ntohl (mp->retval);
1445 if (vam->async_mode)
1447 vam->async_errors += (retval < 0);
1451 vam->retval = retval;
1452 vam->result_ready = 1;
1456 static void vl_api_tap_delete_reply_t_handler_json
1457 (vl_api_tap_delete_reply_t * mp)
1459 vat_main_t *vam = &vat_main;
1460 vat_json_node_t node;
1462 vat_json_init_object (&node);
1463 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1465 vat_json_print (vam->ofp, &node);
1466 vat_json_free (&node);
1468 vam->retval = ntohl (mp->retval);
1469 vam->result_ready = 1;
1472 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1473 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1475 vat_main_t *vam = &vat_main;
1476 i32 retval = ntohl (mp->retval);
1477 if (vam->async_mode)
1479 vam->async_errors += (retval < 0);
1483 vam->retval = retval;
1484 vam->result_ready = 1;
1488 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1489 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1491 vat_main_t *vam = &vat_main;
1492 vat_json_node_t node;
1494 vat_json_init_object (&node);
1495 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1496 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1497 ntohl (mp->tunnel_sw_if_index));
1499 vat_json_print (vam->ofp, &node);
1500 vat_json_free (&node);
1502 vam->retval = ntohl (mp->retval);
1503 vam->result_ready = 1;
1506 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1507 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1509 vat_main_t *vam = &vat_main;
1510 i32 retval = ntohl (mp->retval);
1511 if (vam->async_mode)
1513 vam->async_errors += (retval < 0);
1517 vam->retval = retval;
1518 vam->sw_if_index = ntohl (mp->sw_if_index);
1519 vam->result_ready = 1;
1523 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1524 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1526 vat_main_t *vam = &vat_main;
1527 vat_json_node_t node;
1529 vat_json_init_object (&node);
1530 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1531 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1533 vat_json_print (vam->ofp, &node);
1534 vat_json_free (&node);
1536 vam->retval = ntohl (mp->retval);
1537 vam->result_ready = 1;
1541 static void vl_api_lisp_add_del_locator_set_reply_t_handler
1542 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1544 vat_main_t *vam = &vat_main;
1545 i32 retval = ntohl (mp->retval);
1546 if (vam->async_mode)
1548 vam->async_errors += (retval < 0);
1552 vam->retval = retval;
1553 vam->result_ready = 1;
1557 static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1558 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1560 vat_main_t *vam = &vat_main;
1561 vat_json_node_t node;
1563 vat_json_init_object (&node);
1564 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1565 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1567 vat_json_print (vam->ofp, &node);
1568 vat_json_free (&node);
1570 vam->retval = ntohl (mp->retval);
1571 vam->result_ready = 1;
1574 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1575 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1577 vat_main_t *vam = &vat_main;
1578 i32 retval = ntohl (mp->retval);
1579 if (vam->async_mode)
1581 vam->async_errors += (retval < 0);
1585 vam->retval = retval;
1586 vam->sw_if_index = ntohl (mp->sw_if_index);
1587 vam->result_ready = 1;
1591 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1592 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1594 vat_main_t *vam = &vat_main;
1595 vat_json_node_t node;
1597 vat_json_init_object (&node);
1598 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1599 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1601 vat_json_print (vam->ofp, &node);
1602 vat_json_free (&node);
1604 vam->retval = ntohl (mp->retval);
1605 vam->result_ready = 1;
1608 static void vl_api_gre_add_del_tunnel_reply_t_handler
1609 (vl_api_gre_add_del_tunnel_reply_t * mp)
1611 vat_main_t *vam = &vat_main;
1612 i32 retval = ntohl (mp->retval);
1613 if (vam->async_mode)
1615 vam->async_errors += (retval < 0);
1619 vam->retval = retval;
1620 vam->sw_if_index = ntohl (mp->sw_if_index);
1621 vam->result_ready = 1;
1625 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1626 (vl_api_gre_add_del_tunnel_reply_t * mp)
1628 vat_main_t *vam = &vat_main;
1629 vat_json_node_t node;
1631 vat_json_init_object (&node);
1632 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1633 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1635 vat_json_print (vam->ofp, &node);
1636 vat_json_free (&node);
1638 vam->retval = ntohl (mp->retval);
1639 vam->result_ready = 1;
1642 static void vl_api_create_vhost_user_if_reply_t_handler
1643 (vl_api_create_vhost_user_if_reply_t * mp)
1645 vat_main_t *vam = &vat_main;
1646 i32 retval = ntohl (mp->retval);
1647 if (vam->async_mode)
1649 vam->async_errors += (retval < 0);
1653 vam->retval = retval;
1654 vam->sw_if_index = ntohl (mp->sw_if_index);
1655 vam->result_ready = 1;
1659 static void vl_api_create_vhost_user_if_reply_t_handler_json
1660 (vl_api_create_vhost_user_if_reply_t * mp)
1662 vat_main_t *vam = &vat_main;
1663 vat_json_node_t node;
1665 vat_json_init_object (&node);
1666 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1667 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1669 vat_json_print (vam->ofp, &node);
1670 vat_json_free (&node);
1672 vam->retval = ntohl (mp->retval);
1673 vam->result_ready = 1;
1676 static void vl_api_ip_address_details_t_handler
1677 (vl_api_ip_address_details_t * mp)
1679 vat_main_t *vam = &vat_main;
1680 static ip_address_details_t empty_ip_address_details = { {0} };
1681 ip_address_details_t *address = NULL;
1682 ip_details_t *current_ip_details = NULL;
1683 ip_details_t *details = NULL;
1685 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1687 if (!details || vam->current_sw_if_index >= vec_len (details)
1688 || !details[vam->current_sw_if_index].present)
1690 errmsg ("ip address details arrived but not stored\n");
1691 errmsg ("ip_dump should be called first\n");
1695 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
1697 #define addresses (current_ip_details->addr)
1699 vec_validate_init_empty (addresses, vec_len (addresses),
1700 empty_ip_address_details);
1702 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
1704 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1705 address->prefix_length = mp->prefix_length;
1709 static void vl_api_ip_address_details_t_handler_json
1710 (vl_api_ip_address_details_t * mp)
1712 vat_main_t *vam = &vat_main;
1713 vat_json_node_t *node = NULL;
1714 struct in6_addr ip6;
1717 if (VAT_JSON_ARRAY != vam->json_tree.type)
1719 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1720 vat_json_init_array (&vam->json_tree);
1722 node = vat_json_array_add (&vam->json_tree);
1724 vat_json_init_object (node);
1727 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1728 vat_json_object_add_ip6 (node, "ip", ip6);
1732 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1733 vat_json_object_add_ip4 (node, "ip", ip4);
1735 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
1739 vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1741 vat_main_t *vam = &vat_main;
1742 static ip_details_t empty_ip_details = { 0 };
1743 ip_details_t *ip = NULL;
1744 u32 sw_if_index = ~0;
1746 sw_if_index = ntohl (mp->sw_if_index);
1748 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1749 sw_if_index, empty_ip_details);
1751 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1758 vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1760 vat_main_t *vam = &vat_main;
1762 if (VAT_JSON_ARRAY != vam->json_tree.type)
1764 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1765 vat_json_init_array (&vam->json_tree);
1767 vat_json_array_add_uint (&vam->json_tree,
1768 clib_net_to_host_u32 (mp->sw_if_index));
1771 static void vl_api_map_domain_details_t_handler_json
1772 (vl_api_map_domain_details_t * mp)
1774 vat_json_node_t *node = NULL;
1775 vat_main_t *vam = &vat_main;
1776 struct in6_addr ip6;
1779 if (VAT_JSON_ARRAY != vam->json_tree.type)
1781 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1782 vat_json_init_array (&vam->json_tree);
1785 node = vat_json_array_add (&vam->json_tree);
1786 vat_json_init_object (node);
1788 vat_json_object_add_uint (node, "domain_index",
1789 clib_net_to_host_u32 (mp->domain_index));
1790 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1791 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1792 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1793 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1794 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1795 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1796 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1797 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1798 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1799 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1800 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1801 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1802 vat_json_object_add_uint (node, "flags", mp->flags);
1803 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1804 vat_json_object_add_int (node, "is_translation", mp->is_translation);
1807 static void vl_api_map_domain_details_t_handler
1808 (vl_api_map_domain_details_t * mp)
1810 vat_main_t *vam = &vat_main;
1812 if (mp->is_translation)
1815 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1816 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1817 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1818 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1819 clib_net_to_host_u32 (mp->domain_index));
1824 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1825 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1826 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1827 format_ip6_address, mp->ip6_src,
1828 clib_net_to_host_u32 (mp->domain_index));
1830 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1831 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1832 mp->is_translation ? "map-t" : "");
1835 static void vl_api_map_rule_details_t_handler_json
1836 (vl_api_map_rule_details_t * mp)
1838 struct in6_addr ip6;
1839 vat_json_node_t *node = NULL;
1840 vat_main_t *vam = &vat_main;
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, "psid", clib_net_to_host_u16 (mp->psid));
1852 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1853 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
1857 vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
1859 vat_main_t *vam = &vat_main;
1860 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1861 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
1865 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
1867 vat_main_t *vam = &vat_main;
1868 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1869 "router_addr %U host_mac %U\n",
1870 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1871 format_ip4_address, &mp->host_address,
1872 format_ip4_address, &mp->router_address,
1873 format_ethernet_address, mp->host_mac);
1876 static void vl_api_dhcp_compl_event_t_handler_json
1877 (vl_api_dhcp_compl_event_t * mp)
1879 /* JSON output not supported */
1883 set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1886 vat_main_t *vam = &vat_main;
1887 static u64 default_counter = 0;
1889 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1891 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1892 sw_if_index, default_counter);
1893 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1897 set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1898 interface_counter_t counter)
1900 vat_main_t *vam = &vat_main;
1901 static interface_counter_t default_counter = { 0, };
1903 vec_validate_init_empty (vam->combined_interface_counters,
1904 vnet_counter_type, NULL);
1905 vec_validate_init_empty (vam->combined_interface_counters
1906 [vnet_counter_type], sw_if_index, default_counter);
1907 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1910 static void vl_api_vnet_interface_counters_t_handler
1911 (vl_api_vnet_interface_counters_t * mp)
1916 static void vl_api_vnet_interface_counters_t_handler_json
1917 (vl_api_vnet_interface_counters_t * mp)
1919 interface_counter_t counter;
1924 u32 first_sw_if_index;
1927 count = ntohl (mp->count);
1928 first_sw_if_index = ntohl (mp->first_sw_if_index);
1930 if (!mp->is_combined)
1932 v_packets = (u64 *) & mp->data;
1933 for (i = 0; i < count; i++)
1936 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
1937 set_simple_interface_counter (mp->vnet_counter_type,
1938 first_sw_if_index + i, packets);
1944 v = (vlib_counter_t *) & mp->data;
1945 for (i = 0; i < count; i++)
1948 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
1950 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
1951 set_combined_interface_counter (mp->vnet_counter_type,
1952 first_sw_if_index + i, counter);
1959 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1961 vat_main_t *vam = &vat_main;
1964 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
1966 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
1975 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1977 vat_main_t *vam = &vat_main;
1980 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
1982 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
1990 static void vl_api_vnet_ip4_fib_counters_t_handler
1991 (vl_api_vnet_ip4_fib_counters_t * mp)
1996 static void vl_api_vnet_ip4_fib_counters_t_handler_json
1997 (vl_api_vnet_ip4_fib_counters_t * mp)
1999 vat_main_t *vam = &vat_main;
2000 vl_api_ip4_fib_counter_t *v;
2001 ip4_fib_counter_t *counter;
2008 vrf_id = ntohl (mp->vrf_id);
2009 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2010 if (~0 == vrf_index)
2012 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2013 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2014 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2015 vec_validate (vam->ip4_fib_counters, vrf_index);
2016 vam->ip4_fib_counters[vrf_index] = NULL;
2019 vec_free (vam->ip4_fib_counters[vrf_index]);
2020 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2021 count = ntohl (mp->count);
2022 for (i = 0; i < count; i++)
2024 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2025 counter = &vam->ip4_fib_counters[vrf_index][i];
2026 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2027 counter->address = ip4;
2028 counter->address_length = v->address_length;
2029 counter->packets = clib_net_to_host_u64 (v->packets);
2030 counter->bytes = clib_net_to_host_u64 (v->bytes);
2035 static void vl_api_vnet_ip6_fib_counters_t_handler
2036 (vl_api_vnet_ip6_fib_counters_t * mp)
2041 static void vl_api_vnet_ip6_fib_counters_t_handler_json
2042 (vl_api_vnet_ip6_fib_counters_t * mp)
2044 vat_main_t *vam = &vat_main;
2045 vl_api_ip6_fib_counter_t *v;
2046 ip6_fib_counter_t *counter;
2047 struct in6_addr ip6;
2053 vrf_id = ntohl (mp->vrf_id);
2054 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2055 if (~0 == vrf_index)
2057 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2058 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2059 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2060 vec_validate (vam->ip6_fib_counters, vrf_index);
2061 vam->ip6_fib_counters[vrf_index] = NULL;
2064 vec_free (vam->ip6_fib_counters[vrf_index]);
2065 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2066 count = ntohl (mp->count);
2067 for (i = 0; i < count; i++)
2069 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2070 counter = &vam->ip6_fib_counters[vrf_index][i];
2071 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2072 counter->address = ip6;
2073 counter->address_length = v->address_length;
2074 counter->packets = clib_net_to_host_u64 (v->packets);
2075 counter->bytes = clib_net_to_host_u64 (v->bytes);
2080 static void vl_api_get_first_msg_id_reply_t_handler
2081 (vl_api_get_first_msg_id_reply_t * mp)
2083 vat_main_t *vam = &vat_main;
2084 i32 retval = ntohl (mp->retval);
2086 if (vam->async_mode)
2088 vam->async_errors += (retval < 0);
2092 vam->retval = retval;
2093 vam->result_ready = 1;
2097 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
2101 static void vl_api_get_first_msg_id_reply_t_handler_json
2102 (vl_api_get_first_msg_id_reply_t * mp)
2104 vat_main_t *vam = &vat_main;
2105 vat_json_node_t node;
2107 vat_json_init_object (&node);
2108 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2109 vat_json_object_add_uint (&node, "first_msg_id",
2110 (uint) ntohs (mp->first_msg_id));
2112 vat_json_print (vam->ofp, &node);
2113 vat_json_free (&node);
2115 vam->retval = ntohl (mp->retval);
2116 vam->result_ready = 1;
2119 static void vl_api_get_node_graph_reply_t_handler
2120 (vl_api_get_node_graph_reply_t * mp)
2122 vat_main_t *vam = &vat_main;
2123 api_main_t *am = &api_main;
2124 i32 retval = ntohl (mp->retval);
2125 u8 *pvt_copy, *reply;
2130 if (vam->async_mode)
2132 vam->async_errors += (retval < 0);
2136 vam->retval = retval;
2137 vam->result_ready = 1;
2140 /* "Should never happen..." */
2144 reply = (u8 *) (mp->reply_in_shmem);
2145 pvt_copy = vec_dup (reply);
2147 /* Toss the shared-memory original... */
2148 pthread_mutex_lock (&am->vlib_rp->mutex);
2149 oldheap = svm_push_data_heap (am->vlib_rp);
2153 svm_pop_heap (oldheap);
2154 pthread_mutex_unlock (&am->vlib_rp->mutex);
2156 if (vam->graph_nodes)
2158 hash_free (vam->graph_node_index_by_name);
2160 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2162 node = vam->graph_nodes[i];
2163 vec_free (node->name);
2164 vec_free (node->next_nodes);
2167 vec_free (vam->graph_nodes);
2170 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2171 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2172 vec_free (pvt_copy);
2174 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2176 node = vam->graph_nodes[i];
2177 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2181 static void vl_api_get_node_graph_reply_t_handler_json
2182 (vl_api_get_node_graph_reply_t * mp)
2184 vat_main_t *vam = &vat_main;
2185 api_main_t *am = &api_main;
2187 vat_json_node_t node;
2190 /* $$$$ make this real? */
2191 vat_json_init_object (&node);
2192 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2193 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2195 reply = (u8 *) (mp->reply_in_shmem);
2197 /* Toss the shared-memory original... */
2198 pthread_mutex_lock (&am->vlib_rp->mutex);
2199 oldheap = svm_push_data_heap (am->vlib_rp);
2203 svm_pop_heap (oldheap);
2204 pthread_mutex_unlock (&am->vlib_rp->mutex);
2206 vat_json_print (vam->ofp, &node);
2207 vat_json_free (&node);
2209 vam->retval = ntohl (mp->retval);
2210 vam->result_ready = 1;
2214 vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
2216 vat_main_t *vam = &vat_main;
2221 s = format (s, "%=16d%=16d%=16d\n",
2222 ntohl (mp->sw_if_index), mp->priority, mp->weight);
2226 s = format (s, "%=16U%=16d%=16d\n",
2227 mp->is_ipv6 ? format_ip6_address :
2229 mp->ip_address, mp->priority, mp->weight);
2232 fformat (vam->ofp, "%v", s);
2237 vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2240 vat_main_t *vam = &vat_main;
2241 vat_json_node_t *node = NULL;
2242 struct in6_addr ip6;
2245 if (VAT_JSON_ARRAY != vam->json_tree.type)
2247 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2248 vat_json_init_array (&vam->json_tree);
2250 node = vat_json_array_add (&vam->json_tree);
2251 vat_json_init_object (node);
2253 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2254 vat_json_object_add_uint (node, "priority", mp->priority);
2255 vat_json_object_add_uint (node, "weight", mp->weight);
2258 vat_json_object_add_uint (node, "sw_if_index",
2259 clib_net_to_host_u32 (mp->sw_if_index));
2264 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2265 vat_json_object_add_ip6 (node, "address", ip6);
2269 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2270 vat_json_object_add_ip4 (node, "address", ip4);
2276 vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2279 vat_main_t *vam = &vat_main;
2282 ls_name = format (0, "%s", mp->ls_name);
2284 fformat (vam->ofp, "%=10d%=15v\n", clib_net_to_host_u32 (mp->ls_index),
2290 vl_api_lisp_locator_set_details_t_handler_json
2291 (vl_api_lisp_locator_set_details_t * mp)
2293 vat_main_t *vam = &vat_main;
2294 vat_json_node_t *node = 0;
2297 ls_name = format (0, "%s", mp->ls_name);
2298 vec_add1 (ls_name, 0);
2300 if (VAT_JSON_ARRAY != vam->json_tree.type)
2302 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2303 vat_json_init_array (&vam->json_tree);
2305 node = vat_json_array_add (&vam->json_tree);
2307 vat_json_init_object (node);
2308 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2309 vat_json_object_add_uint (node, "ls_index",
2310 clib_net_to_host_u32 (mp->ls_index));
2315 format_lisp_flat_eid (u8 * s, va_list * args)
2317 u32 type = va_arg (*args, u32);
2318 u8 *eid = va_arg (*args, u8 *);
2319 u32 eid_len = va_arg (*args, u32);
2324 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
2326 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
2328 return format (s, "%U", format_ethernet_address, eid);
2334 format_lisp_eid_vat (u8 * s, va_list * args)
2336 u32 type = va_arg (*args, u32);
2337 u8 *eid = va_arg (*args, u8 *);
2338 u32 eid_len = va_arg (*args, u32);
2339 u8 *seid = va_arg (*args, u8 *);
2340 u32 seid_len = va_arg (*args, u32);
2341 u32 is_src_dst = va_arg (*args, u32);
2344 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
2346 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
2352 vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2354 vat_main_t *vam = &vat_main;
2355 u8 *s = 0, *eid = 0;
2357 if (~0 == mp->locator_set_index)
2358 s = format (0, "action: %d", mp->action);
2360 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
2362 eid = format (0, "%U", format_lisp_eid_vat,
2366 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2369 fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-d\n",
2370 clib_net_to_host_u32 (mp->vni),
2372 mp->is_local ? "local" : "remote",
2373 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative);
2379 vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2382 vat_main_t *vam = &vat_main;
2383 vat_json_node_t *node = 0;
2386 if (VAT_JSON_ARRAY != vam->json_tree.type)
2388 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2389 vat_json_init_array (&vam->json_tree);
2391 node = vat_json_array_add (&vam->json_tree);
2393 vat_json_init_object (node);
2394 if (~0 == mp->locator_set_index)
2395 vat_json_object_add_uint (node, "action", mp->action);
2397 vat_json_object_add_uint (node, "locator_set_index",
2398 clib_net_to_host_u32 (mp->locator_set_index));
2400 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
2401 eid = format (0, "%U", format_lisp_eid_vat,
2405 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2407 vat_json_object_add_string_copy (node, "eid", eid);
2408 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2409 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
2410 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
2415 vl_api_lisp_eid_table_map_details_t_handler
2416 (vl_api_lisp_eid_table_map_details_t * mp)
2418 vat_main_t *vam = &vat_main;
2420 u8 *line = format (0, "%=10d%=10d",
2421 clib_net_to_host_u32 (mp->vni),
2422 clib_net_to_host_u32 (mp->dp_table));
2423 fformat (vam->ofp, "%v\n", line);
2428 vl_api_lisp_eid_table_map_details_t_handler_json
2429 (vl_api_lisp_eid_table_map_details_t * mp)
2431 vat_main_t *vam = &vat_main;
2432 vat_json_node_t *node = NULL;
2434 if (VAT_JSON_ARRAY != vam->json_tree.type)
2436 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2437 vat_json_init_array (&vam->json_tree);
2439 node = vat_json_array_add (&vam->json_tree);
2440 vat_json_init_object (node);
2441 vat_json_object_add_uint (node, "dp_table",
2442 clib_net_to_host_u32 (mp->dp_table));
2443 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2447 vl_api_lisp_eid_table_vni_details_t_handler
2448 (vl_api_lisp_eid_table_vni_details_t * mp)
2450 vat_main_t *vam = &vat_main;
2452 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2453 fformat (vam->ofp, "%v\n", line);
2458 vl_api_lisp_eid_table_vni_details_t_handler_json
2459 (vl_api_lisp_eid_table_vni_details_t * mp)
2461 vat_main_t *vam = &vat_main;
2462 vat_json_node_t *node = NULL;
2464 if (VAT_JSON_ARRAY != vam->json_tree.type)
2466 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2467 vat_json_init_array (&vam->json_tree);
2469 node = vat_json_array_add (&vam->json_tree);
2470 vat_json_init_object (node);
2471 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2475 format_decap_next (u8 * s, va_list * args)
2477 u32 next_index = va_arg (*args, u32);
2481 case LISP_GPE_INPUT_NEXT_DROP:
2482 return format (s, "drop");
2483 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2484 return format (s, "ip4");
2485 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2486 return format (s, "ip6");
2488 return format (s, "unknown %d", next_index);
2494 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2497 vat_main_t *vam = &vat_main;
2499 u8 *flag_str = NULL;
2501 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
2503 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2504 foreach_lisp_gpe_flag_bit;
2507 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2508 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2510 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2512 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2514 ntohl (mp->encap_fib_id),
2515 ntohl (mp->decap_fib_id),
2516 format_decap_next, ntohl (mp->dcap_next),
2518 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
2524 vl_api_lisp_gpe_tunnel_details_t_handler_json
2525 (vl_api_lisp_gpe_tunnel_details_t * mp)
2527 vat_main_t *vam = &vat_main;
2528 vat_json_node_t *node = NULL;
2529 struct in6_addr ip6;
2533 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
2535 if (VAT_JSON_ARRAY != vam->json_tree.type)
2537 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2538 vat_json_init_array (&vam->json_tree);
2540 node = vat_json_array_add (&vam->json_tree);
2542 vat_json_init_object (node);
2543 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2546 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2547 vat_json_object_add_ip6 (node, "source address", ip6);
2548 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2549 vat_json_object_add_ip6 (node, "destination address", ip6);
2553 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2554 vat_json_object_add_ip4 (node, "source address", ip4);
2555 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2556 vat_json_object_add_ip4 (node, "destination address", ip4);
2558 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2559 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2560 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2561 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2562 vat_json_object_add_uint (node, "flags", mp->flags);
2563 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2564 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2565 vat_json_object_add_uint (node, "res", mp->res);
2566 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
2568 vec_free (next_decap_str);
2572 vl_api_lisp_adjacencies_get_reply_t_handler
2573 (vl_api_lisp_adjacencies_get_reply_t * mp)
2575 vat_main_t *vam = &vat_main;
2577 int retval = clib_net_to_host_u32 (mp->retval);
2578 vl_api_lisp_adjacency_t *a;
2583 n = clib_net_to_host_u32 (mp->count);
2585 for (i = 0; i < n; i++)
2587 a = &mp->adjacencies[i];
2588 fformat (vam->ofp, "%U %40U\n",
2589 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
2590 format_lisp_flat_eid, a->eid_type, a->reid,
2591 a->reid_prefix_len);
2595 vam->retval = retval;
2596 vam->result_ready = 1;
2600 vl_api_lisp_adjacencies_get_reply_t_handler_json
2601 (vl_api_lisp_adjacencies_get_reply_t * mp)
2604 vat_main_t *vam = &vat_main;
2605 vat_json_node_t *e = 0, root;
2607 int retval = clib_net_to_host_u32 (mp->retval);
2608 vl_api_lisp_adjacency_t *a;
2613 n = clib_net_to_host_u32 (mp->count);
2614 vat_json_init_array (&root);
2616 for (i = 0; i < n; i++)
2618 e = vat_json_array_add (&root);
2619 a = &mp->adjacencies[i];
2621 vat_json_init_object (e);
2622 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
2623 a->leid_prefix_len);
2625 vat_json_object_add_string_copy (e, "leid", s);
2628 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
2629 a->reid_prefix_len);
2631 vat_json_object_add_string_copy (e, "reid", s);
2635 vat_json_print (vam->ofp, &root);
2636 vat_json_free (&root);
2639 vam->retval = retval;
2640 vam->result_ready = 1;
2644 vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2647 vat_main_t *vam = &vat_main;
2649 fformat (vam->ofp, "%=20U\n",
2650 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2655 vl_api_lisp_map_resolver_details_t_handler_json
2656 (vl_api_lisp_map_resolver_details_t * mp)
2658 vat_main_t *vam = &vat_main;
2659 vat_json_node_t *node = NULL;
2660 struct in6_addr ip6;
2663 if (VAT_JSON_ARRAY != vam->json_tree.type)
2665 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2666 vat_json_init_array (&vam->json_tree);
2668 node = vat_json_array_add (&vam->json_tree);
2670 vat_json_init_object (node);
2673 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2674 vat_json_object_add_ip6 (node, "map resolver", ip6);
2678 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2679 vat_json_object_add_ip4 (node, "map resolver", ip4);
2684 vl_api_show_lisp_status_reply_t_handler
2685 (vl_api_show_lisp_status_reply_t * mp)
2687 vat_main_t *vam = &vat_main;
2688 i32 retval = ntohl (mp->retval);
2692 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2693 mp->feature_status ? "enabled" : "disabled",
2694 mp->gpe_status ? "enabled" : "disabled");
2697 vam->retval = retval;
2698 vam->result_ready = 1;
2702 vl_api_show_lisp_status_reply_t_handler_json
2703 (vl_api_show_lisp_status_reply_t * mp)
2705 vat_main_t *vam = &vat_main;
2706 vat_json_node_t node;
2707 u8 *gpe_status = NULL;
2708 u8 *feature_status = NULL;
2710 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2711 feature_status = format (0, "%s",
2712 mp->feature_status ? "enabled" : "disabled");
2713 vec_add1 (gpe_status, 0);
2714 vec_add1 (feature_status, 0);
2716 vat_json_init_object (&node);
2717 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2718 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
2720 vec_free (gpe_status);
2721 vec_free (feature_status);
2723 vat_json_print (vam->ofp, &node);
2724 vat_json_free (&node);
2726 vam->retval = ntohl (mp->retval);
2727 vam->result_ready = 1;
2731 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2732 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2734 vat_main_t *vam = &vat_main;
2735 i32 retval = ntohl (mp->retval);
2739 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
2742 vam->retval = retval;
2743 vam->result_ready = 1;
2747 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2748 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2750 vat_main_t *vam = &vat_main;
2751 vat_json_node_t *node = NULL;
2753 if (VAT_JSON_ARRAY != vam->json_tree.type)
2755 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2756 vat_json_init_array (&vam->json_tree);
2758 node = vat_json_array_add (&vam->json_tree);
2760 vat_json_init_object (node);
2761 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
2763 vat_json_print (vam->ofp, node);
2764 vat_json_free (node);
2766 vam->retval = ntohl (mp->retval);
2767 vam->result_ready = 1;
2771 format_lisp_map_request_mode (u8 * s, va_list * args)
2773 u32 mode = va_arg (*args, u32);
2778 return format (0, "dst-only");
2780 return format (0, "src-dst");
2786 vl_api_show_lisp_map_request_mode_reply_t_handler
2787 (vl_api_show_lisp_map_request_mode_reply_t * mp)
2789 vat_main_t *vam = &vat_main;
2790 i32 retval = ntohl (mp->retval);
2794 u32 mode = mp->mode;
2795 fformat (vam->ofp, "map_request_mode: %U\n",
2796 format_lisp_map_request_mode, mode);
2799 vam->retval = retval;
2800 vam->result_ready = 1;
2804 vl_api_show_lisp_map_request_mode_reply_t_handler_json
2805 (vl_api_show_lisp_map_request_mode_reply_t * mp)
2807 vat_main_t *vam = &vat_main;
2808 vat_json_node_t node;
2813 s = format (0, "%U", format_lisp_map_request_mode, mode);
2816 vat_json_init_object (&node);
2817 vat_json_object_add_string_copy (&node, "map_request_mode", s);
2818 vat_json_print (vam->ofp, &node);
2819 vat_json_free (&node);
2822 vam->retval = ntohl (mp->retval);
2823 vam->result_ready = 1;
2827 vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2829 vat_main_t *vam = &vat_main;
2830 i32 retval = ntohl (mp->retval);
2834 fformat (vam->ofp, "%-20s%-16s\n",
2835 mp->status ? "enabled" : "disabled",
2836 mp->status ? (char *) mp->locator_set_name : "");
2839 vam->retval = retval;
2840 vam->result_ready = 1;
2844 vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2847 vat_main_t *vam = &vat_main;
2848 vat_json_node_t node;
2851 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2852 vec_add1 (status, 0);
2854 vat_json_init_object (&node);
2855 vat_json_object_add_string_copy (&node, "status", status);
2858 vat_json_object_add_string_copy (&node, "locator_set",
2859 mp->locator_set_name);
2864 vat_json_print (vam->ofp, &node);
2865 vat_json_free (&node);
2867 vam->retval = ntohl (mp->retval);
2868 vam->result_ready = 1;
2872 format_policer_type (u8 * s, va_list * va)
2874 u32 i = va_arg (*va, u32);
2876 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2877 s = format (s, "1r2c");
2878 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2879 s = format (s, "1r3c");
2880 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2881 s = format (s, "2r3c-2698");
2882 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2883 s = format (s, "2r3c-4115");
2884 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2885 s = format (s, "2r3c-mef5cf1");
2887 s = format (s, "ILLEGAL");
2892 format_policer_rate_type (u8 * s, va_list * va)
2894 u32 i = va_arg (*va, u32);
2896 if (i == SSE2_QOS_RATE_KBPS)
2897 s = format (s, "kbps");
2898 else if (i == SSE2_QOS_RATE_PPS)
2899 s = format (s, "pps");
2901 s = format (s, "ILLEGAL");
2906 format_policer_round_type (u8 * s, va_list * va)
2908 u32 i = va_arg (*va, u32);
2910 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2911 s = format (s, "closest");
2912 else if (i == SSE2_QOS_ROUND_TO_UP)
2913 s = format (s, "up");
2914 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2915 s = format (s, "down");
2917 s = format (s, "ILLEGAL");
2922 format_policer_action_type (u8 * s, va_list * va)
2924 u32 i = va_arg (*va, u32);
2926 if (i == SSE2_QOS_ACTION_DROP)
2927 s = format (s, "drop");
2928 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2929 s = format (s, "transmit");
2930 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2931 s = format (s, "mark-and-transmit");
2933 s = format (s, "ILLEGAL");
2938 format_dscp (u8 * s, va_list * va)
2940 u32 i = va_arg (*va, u32);
2945 #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2949 return format (s, "ILLEGAL");
2951 s = format (s, "%s", t);
2956 vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
2958 vat_main_t *vam = &vat_main;
2959 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
2961 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2962 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2964 conform_dscp_str = format (0, "");
2966 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2967 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2969 exceed_dscp_str = format (0, "");
2971 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2972 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2974 violate_dscp_str = format (0, "");
2976 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2977 "rate type %U, round type %U, %s rate, %s color-aware, "
2978 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2979 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2980 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2982 format_policer_type, mp->type,
2985 clib_net_to_host_u64 (mp->cb),
2986 clib_net_to_host_u64 (mp->eb),
2987 format_policer_rate_type, mp->rate_type,
2988 format_policer_round_type, mp->round_type,
2989 mp->single_rate ? "single" : "dual",
2990 mp->color_aware ? "is" : "not",
2991 ntohl (mp->cir_tokens_per_period),
2992 ntohl (mp->pir_tokens_per_period),
2994 ntohl (mp->current_limit),
2995 ntohl (mp->current_bucket),
2996 ntohl (mp->extended_limit),
2997 ntohl (mp->extended_bucket),
2998 clib_net_to_host_u64 (mp->last_update_time),
2999 format_policer_action_type, mp->conform_action_type,
3001 format_policer_action_type, mp->exceed_action_type,
3003 format_policer_action_type, mp->violate_action_type,
3006 vec_free (conform_dscp_str);
3007 vec_free (exceed_dscp_str);
3008 vec_free (violate_dscp_str);
3011 static void vl_api_policer_details_t_handler_json
3012 (vl_api_policer_details_t * mp)
3014 vat_main_t *vam = &vat_main;
3015 vat_json_node_t *node;
3016 u8 *rate_type_str, *round_type_str, *type_str;
3017 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
3019 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
3021 format (0, "%U", format_policer_round_type, mp->round_type);
3022 type_str = format (0, "%U", format_policer_type, mp->type);
3023 conform_action_str = format (0, "%U", format_policer_action_type,
3024 mp->conform_action_type);
3025 exceed_action_str = format (0, "%U", format_policer_action_type,
3026 mp->exceed_action_type);
3027 violate_action_str = format (0, "%U", format_policer_action_type,
3028 mp->violate_action_type);
3030 if (VAT_JSON_ARRAY != vam->json_tree.type)
3032 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3033 vat_json_init_array (&vam->json_tree);
3035 node = vat_json_array_add (&vam->json_tree);
3037 vat_json_init_object (node);
3038 vat_json_object_add_string_copy (node, "name", mp->name);
3039 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
3040 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
3041 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
3042 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
3043 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
3044 vat_json_object_add_string_copy (node, "round_type", round_type_str);
3045 vat_json_object_add_string_copy (node, "type", type_str);
3046 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
3047 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
3048 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
3049 vat_json_object_add_uint (node, "cir_tokens_per_period",
3050 ntohl (mp->cir_tokens_per_period));
3051 vat_json_object_add_uint (node, "eir_tokens_per_period",
3052 ntohl (mp->pir_tokens_per_period));
3053 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
3054 vat_json_object_add_uint (node, "current_bucket",
3055 ntohl (mp->current_bucket));
3056 vat_json_object_add_uint (node, "extended_limit",
3057 ntohl (mp->extended_limit));
3058 vat_json_object_add_uint (node, "extended_bucket",
3059 ntohl (mp->extended_bucket));
3060 vat_json_object_add_uint (node, "last_update_time",
3061 ntohl (mp->last_update_time));
3062 vat_json_object_add_string_copy (node, "conform_action",
3063 conform_action_str);
3064 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3066 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
3067 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
3068 vec_free (dscp_str);
3070 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
3071 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3073 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
3074 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
3075 vec_free (dscp_str);
3077 vat_json_object_add_string_copy (node, "violate_action",
3078 violate_action_str);
3079 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3081 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
3082 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
3083 vec_free (dscp_str);
3086 vec_free (rate_type_str);
3087 vec_free (round_type_str);
3088 vec_free (type_str);
3089 vec_free (conform_action_str);
3090 vec_free (exceed_action_str);
3091 vec_free (violate_action_str);
3095 vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
3098 vat_main_t *vam = &vat_main;
3099 int i, count = ntohl (mp->count);
3102 fformat (vam->ofp, "classify table ids (%d) : ", count);
3103 for (i = 0; i < count; i++)
3105 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
3106 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
3108 vam->retval = ntohl (mp->retval);
3109 vam->result_ready = 1;
3113 vl_api_classify_table_ids_reply_t_handler_json
3114 (vl_api_classify_table_ids_reply_t * mp)
3116 vat_main_t *vam = &vat_main;
3117 int i, count = ntohl (mp->count);
3121 vat_json_node_t node;
3123 vat_json_init_object (&node);
3124 for (i = 0; i < count; i++)
3126 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
3128 vat_json_print (vam->ofp, &node);
3129 vat_json_free (&node);
3131 vam->retval = ntohl (mp->retval);
3132 vam->result_ready = 1;
3136 vl_api_classify_table_by_interface_reply_t_handler
3137 (vl_api_classify_table_by_interface_reply_t * mp)
3139 vat_main_t *vam = &vat_main;
3142 table_id = ntohl (mp->l2_table_id);
3144 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3146 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3147 table_id = ntohl (mp->ip4_table_id);
3149 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3151 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3152 table_id = ntohl (mp->ip6_table_id);
3154 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3156 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3157 vam->retval = ntohl (mp->retval);
3158 vam->result_ready = 1;
3162 vl_api_classify_table_by_interface_reply_t_handler_json
3163 (vl_api_classify_table_by_interface_reply_t * mp)
3165 vat_main_t *vam = &vat_main;
3166 vat_json_node_t node;
3168 vat_json_init_object (&node);
3170 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3171 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3172 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3174 vat_json_print (vam->ofp, &node);
3175 vat_json_free (&node);
3177 vam->retval = ntohl (mp->retval);
3178 vam->result_ready = 1;
3181 static void vl_api_policer_add_del_reply_t_handler
3182 (vl_api_policer_add_del_reply_t * mp)
3184 vat_main_t *vam = &vat_main;
3185 i32 retval = ntohl (mp->retval);
3186 if (vam->async_mode)
3188 vam->async_errors += (retval < 0);
3192 vam->retval = retval;
3193 vam->result_ready = 1;
3194 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3196 * Note: this is just barely thread-safe, depends on
3197 * the main thread spinning waiting for an answer...
3199 errmsg ("policer index %d\n", ntohl (mp->policer_index));
3203 static void vl_api_policer_add_del_reply_t_handler_json
3204 (vl_api_policer_add_del_reply_t * mp)
3206 vat_main_t *vam = &vat_main;
3207 vat_json_node_t node;
3209 vat_json_init_object (&node);
3210 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3211 vat_json_object_add_uint (&node, "policer_index",
3212 ntohl (mp->policer_index));
3214 vat_json_print (vam->ofp, &node);
3215 vat_json_free (&node);
3217 vam->retval = ntohl (mp->retval);
3218 vam->result_ready = 1;
3221 /* Format hex dump. */
3223 format_hex_bytes (u8 * s, va_list * va)
3225 u8 *bytes = va_arg (*va, u8 *);
3226 int n_bytes = va_arg (*va, int);
3229 /* Print short or long form depending on byte count. */
3230 uword short_form = n_bytes <= 32;
3231 uword indent = format_get_indent (s);
3236 for (i = 0; i < n_bytes; i++)
3238 if (!short_form && (i % 32) == 0)
3239 s = format (s, "%08x: ", i);
3240 s = format (s, "%02x", bytes[i]);
3241 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3242 s = format (s, "\n%U", format_white_space, indent);
3249 vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3252 vat_main_t *vam = &vat_main;
3253 i32 retval = ntohl (mp->retval);
3256 fformat (vam->ofp, "classify table info :\n");
3257 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3258 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3259 ntohl (mp->miss_next_index));
3260 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3261 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3262 ntohl (mp->match_n_vectors));
3263 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3264 ntohl (mp->mask_length));
3266 vam->retval = retval;
3267 vam->result_ready = 1;
3271 vl_api_classify_table_info_reply_t_handler_json
3272 (vl_api_classify_table_info_reply_t * mp)
3274 vat_main_t *vam = &vat_main;
3275 vat_json_node_t node;
3277 i32 retval = ntohl (mp->retval);
3280 vat_json_init_object (&node);
3282 vat_json_object_add_int (&node, "sessions",
3283 ntohl (mp->active_sessions));
3284 vat_json_object_add_int (&node, "nexttbl",
3285 ntohl (mp->next_table_index));
3286 vat_json_object_add_int (&node, "nextnode",
3287 ntohl (mp->miss_next_index));
3288 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3289 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3290 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3291 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3292 ntohl (mp->mask_length), 0);
3293 vat_json_object_add_string_copy (&node, "mask", s);
3295 vat_json_print (vam->ofp, &node);
3296 vat_json_free (&node);
3298 vam->retval = ntohl (mp->retval);
3299 vam->result_ready = 1;
3303 vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3306 vat_main_t *vam = &vat_main;
3308 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3309 ntohl (mp->hit_next_index), ntohl (mp->advance),
3310 ntohl (mp->opaque_index));
3311 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3312 ntohl (mp->match_length));
3316 vl_api_classify_session_details_t_handler_json
3317 (vl_api_classify_session_details_t * mp)
3319 vat_main_t *vam = &vat_main;
3320 vat_json_node_t *node = NULL;
3322 if (VAT_JSON_ARRAY != vam->json_tree.type)
3324 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3325 vat_json_init_array (&vam->json_tree);
3327 node = vat_json_array_add (&vam->json_tree);
3329 vat_json_init_object (node);
3330 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3331 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3332 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3334 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3336 vat_json_object_add_string_copy (node, "match", s);
3339 static void vl_api_pg_create_interface_reply_t_handler
3340 (vl_api_pg_create_interface_reply_t * mp)
3342 vat_main_t *vam = &vat_main;
3344 vam->retval = ntohl (mp->retval);
3345 vam->result_ready = 1;
3348 static void vl_api_pg_create_interface_reply_t_handler_json
3349 (vl_api_pg_create_interface_reply_t * mp)
3351 vat_main_t *vam = &vat_main;
3352 vat_json_node_t node;
3354 i32 retval = ntohl (mp->retval);
3357 vat_json_init_object (&node);
3359 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
3361 vat_json_print (vam->ofp, &node);
3362 vat_json_free (&node);
3364 vam->retval = ntohl (mp->retval);
3365 vam->result_ready = 1;
3368 static void vl_api_policer_classify_details_t_handler
3369 (vl_api_policer_classify_details_t * mp)
3371 vat_main_t *vam = &vat_main;
3373 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3374 ntohl (mp->table_index));
3377 static void vl_api_policer_classify_details_t_handler_json
3378 (vl_api_policer_classify_details_t * mp)
3380 vat_main_t *vam = &vat_main;
3381 vat_json_node_t *node;
3383 if (VAT_JSON_ARRAY != vam->json_tree.type)
3385 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3386 vat_json_init_array (&vam->json_tree);
3388 node = vat_json_array_add (&vam->json_tree);
3390 vat_json_init_object (node);
3391 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3392 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3395 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3396 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3398 vat_main_t *vam = &vat_main;
3399 i32 retval = ntohl (mp->retval);
3400 if (vam->async_mode)
3402 vam->async_errors += (retval < 0);
3406 vam->retval = retval;
3407 vam->sw_if_index = ntohl (mp->sw_if_index);
3408 vam->result_ready = 1;
3412 static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3413 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3415 vat_main_t *vam = &vat_main;
3416 vat_json_node_t node;
3418 vat_json_init_object (&node);
3419 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3420 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3422 vat_json_print (vam->ofp, &node);
3423 vat_json_free (&node);
3425 vam->retval = ntohl (mp->retval);
3426 vam->result_ready = 1;
3429 static void vl_api_flow_classify_details_t_handler
3430 (vl_api_flow_classify_details_t * mp)
3432 vat_main_t *vam = &vat_main;
3434 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3435 ntohl (mp->table_index));
3438 static void vl_api_flow_classify_details_t_handler_json
3439 (vl_api_flow_classify_details_t * mp)
3441 vat_main_t *vam = &vat_main;
3442 vat_json_node_t *node;
3444 if (VAT_JSON_ARRAY != vam->json_tree.type)
3446 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3447 vat_json_init_array (&vam->json_tree);
3449 node = vat_json_array_add (&vam->json_tree);
3451 vat_json_init_object (node);
3452 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3453 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3458 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3459 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3460 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3461 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
3462 #define vl_api_lisp_adjacencies_get_reply_t_endian vl_noop_handler
3463 #define vl_api_lisp_adjacencies_get_reply_t_print vl_noop_handler
3466 * Generate boilerplate reply handlers, which
3467 * dig the return value out of the xxx_reply_t API message,
3468 * stick it into vam->retval, and set vam->result_ready
3470 * Could also do this by pointing N message decode slots at
3471 * a single function, but that could break in subtle ways.
3474 #define foreach_standard_reply_retval_handler \
3475 _(sw_interface_set_flags_reply) \
3476 _(sw_interface_add_del_address_reply) \
3477 _(sw_interface_set_table_reply) \
3478 _(sw_interface_set_mpls_enable_reply) \
3479 _(sw_interface_set_vpath_reply) \
3480 _(sw_interface_set_l2_bridge_reply) \
3481 _(sw_interface_set_dpdk_hqos_pipe_reply) \
3482 _(sw_interface_set_dpdk_hqos_subport_reply) \
3483 _(sw_interface_set_dpdk_hqos_tctbl_reply) \
3484 _(bridge_domain_add_del_reply) \
3485 _(sw_interface_set_l2_xconnect_reply) \
3486 _(l2fib_add_del_reply) \
3487 _(ip_add_del_route_reply) \
3488 _(mpls_route_add_del_reply) \
3489 _(mpls_ip_bind_unbind_reply) \
3490 _(proxy_arp_add_del_reply) \
3491 _(proxy_arp_intfc_enable_disable_reply) \
3492 _(mpls_add_del_encap_reply) \
3493 _(mpls_ethernet_add_del_tunnel_2_reply) \
3494 _(sw_interface_set_unnumbered_reply) \
3495 _(ip_neighbor_add_del_reply) \
3496 _(reset_vrf_reply) \
3497 _(oam_add_del_reply) \
3498 _(reset_fib_reply) \
3499 _(dhcp_proxy_config_reply) \
3500 _(dhcp_proxy_config_2_reply) \
3501 _(dhcp_proxy_set_vss_reply) \
3502 _(dhcp_client_config_reply) \
3503 _(set_ip_flow_hash_reply) \
3504 _(sw_interface_ip6_enable_disable_reply) \
3505 _(sw_interface_ip6_set_link_local_address_reply) \
3506 _(sw_interface_ip6nd_ra_prefix_reply) \
3507 _(sw_interface_ip6nd_ra_config_reply) \
3508 _(set_arp_neighbor_limit_reply) \
3509 _(l2_patch_add_del_reply) \
3510 _(sr_tunnel_add_del_reply) \
3511 _(sr_policy_add_del_reply) \
3512 _(sr_multicast_map_add_del_reply) \
3513 _(classify_add_del_session_reply) \
3514 _(classify_set_interface_ip_table_reply) \
3515 _(classify_set_interface_l2_tables_reply) \
3516 _(l2tpv3_set_tunnel_cookies_reply) \
3517 _(l2tpv3_interface_enable_disable_reply) \
3518 _(l2tpv3_set_lookup_key_reply) \
3519 _(l2_fib_clear_table_reply) \
3520 _(l2_interface_efp_filter_reply) \
3521 _(l2_interface_vlan_tag_rewrite_reply) \
3522 _(modify_vhost_user_if_reply) \
3523 _(delete_vhost_user_if_reply) \
3524 _(want_ip4_arp_events_reply) \
3525 _(want_ip6_nd_events_reply) \
3526 _(input_acl_set_interface_reply) \
3527 _(ipsec_spd_add_del_reply) \
3528 _(ipsec_interface_add_del_spd_reply) \
3529 _(ipsec_spd_add_del_entry_reply) \
3530 _(ipsec_sad_add_del_entry_reply) \
3531 _(ipsec_sa_set_key_reply) \
3532 _(ikev2_profile_add_del_reply) \
3533 _(ikev2_profile_set_auth_reply) \
3534 _(ikev2_profile_set_id_reply) \
3535 _(ikev2_profile_set_ts_reply) \
3536 _(ikev2_set_local_key_reply) \
3537 _(delete_loopback_reply) \
3538 _(bd_ip_mac_add_del_reply) \
3539 _(map_del_domain_reply) \
3540 _(map_add_del_rule_reply) \
3541 _(want_interface_events_reply) \
3542 _(want_stats_reply) \
3543 _(cop_interface_enable_disable_reply) \
3544 _(cop_whitelist_enable_disable_reply) \
3545 _(sw_interface_clear_stats_reply) \
3546 _(ioam_enable_reply) \
3547 _(ioam_disable_reply) \
3548 _(lisp_add_del_locator_reply) \
3549 _(lisp_add_del_local_eid_reply) \
3550 _(lisp_add_del_remote_mapping_reply) \
3551 _(lisp_add_del_adjacency_reply) \
3552 _(lisp_gpe_add_del_fwd_entry_reply) \
3553 _(lisp_add_del_map_resolver_reply) \
3554 _(lisp_gpe_enable_disable_reply) \
3555 _(lisp_gpe_add_del_iface_reply) \
3556 _(lisp_enable_disable_reply) \
3557 _(lisp_pitr_set_locator_set_reply) \
3558 _(lisp_map_request_mode_reply) \
3559 _(lisp_add_del_map_request_itr_rlocs_reply) \
3560 _(lisp_eid_table_add_del_map_reply) \
3561 _(vxlan_gpe_add_del_tunnel_reply) \
3562 _(af_packet_delete_reply) \
3563 _(policer_classify_set_interface_reply) \
3564 _(netmap_create_reply) \
3565 _(netmap_delete_reply) \
3566 _(set_ipfix_exporter_reply) \
3567 _(set_ipfix_classify_stream_reply) \
3568 _(ipfix_classify_table_add_del_reply) \
3569 _(flow_classify_set_interface_reply) \
3570 _(pg_capture_reply) \
3571 _(pg_enable_disable_reply) \
3572 _(ip_source_and_port_range_check_add_del_reply) \
3573 _(ip_source_and_port_range_check_interface_add_del_reply)\
3574 _(delete_subif_reply) \
3575 _(l2_interface_pbb_tag_rewrite_reply) \
3579 static void vl_api_##n##_t_handler \
3580 (vl_api_##n##_t * mp) \
3582 vat_main_t * vam = &vat_main; \
3583 i32 retval = ntohl(mp->retval); \
3584 if (vam->async_mode) { \
3585 vam->async_errors += (retval < 0); \
3587 vam->retval = retval; \
3588 vam->result_ready = 1; \
3591 foreach_standard_reply_retval_handler;
3595 static void vl_api_##n##_t_handler_json \
3596 (vl_api_##n##_t * mp) \
3598 vat_main_t * vam = &vat_main; \
3599 vat_json_node_t node; \
3600 vat_json_init_object(&node); \
3601 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3602 vat_json_print(vam->ofp, &node); \
3603 vam->retval = ntohl(mp->retval); \
3604 vam->result_ready = 1; \
3606 foreach_standard_reply_retval_handler;
3610 * Table of message reply handlers, must include boilerplate handlers
3614 #define foreach_vpe_api_reply_msg \
3615 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3616 _(SW_INTERFACE_DETAILS, sw_interface_details) \
3617 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3618 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3619 _(CONTROL_PING_REPLY, control_ping_reply) \
3620 _(CLI_REPLY, cli_reply) \
3621 _(CLI_INBAND_REPLY, cli_inband_reply) \
3622 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3623 sw_interface_add_del_address_reply) \
3624 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
3625 _(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
3626 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3627 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3628 sw_interface_set_l2_xconnect_reply) \
3629 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3630 sw_interface_set_l2_bridge_reply) \
3631 _(SW_INTERFACE_SET_DPDK_HQOS_PIPE_REPLY, \
3632 sw_interface_set_dpdk_hqos_pipe_reply) \
3633 _(SW_INTERFACE_SET_DPDK_HQOS_SUBPORT_REPLY, \
3634 sw_interface_set_dpdk_hqos_subport_reply) \
3635 _(SW_INTERFACE_SET_DPDK_HQOS_TCTBL_REPLY, \
3636 sw_interface_set_dpdk_hqos_tctbl_reply) \
3637 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3638 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3639 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3640 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3641 _(L2_FLAGS_REPLY, l2_flags_reply) \
3642 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3643 _(TAP_CONNECT_REPLY, tap_connect_reply) \
3644 _(TAP_MODIFY_REPLY, tap_modify_reply) \
3645 _(TAP_DELETE_REPLY, tap_delete_reply) \
3646 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3647 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
3648 _(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
3649 _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
3650 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3651 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3652 proxy_arp_intfc_enable_disable_reply) \
3653 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
3654 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3655 mpls_ethernet_add_del_tunnel_reply) \
3656 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3657 mpls_ethernet_add_del_tunnel_2_reply) \
3658 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3659 sw_interface_set_unnumbered_reply) \
3660 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3661 _(RESET_VRF_REPLY, reset_vrf_reply) \
3662 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3663 _(CREATE_SUBIF_REPLY, create_subif_reply) \
3664 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3665 _(RESET_FIB_REPLY, reset_fib_reply) \
3666 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3667 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3668 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3669 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3670 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3671 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3672 sw_interface_ip6_enable_disable_reply) \
3673 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3674 sw_interface_ip6_set_link_local_address_reply) \
3675 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3676 sw_interface_ip6nd_ra_prefix_reply) \
3677 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3678 sw_interface_ip6nd_ra_config_reply) \
3679 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3680 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3681 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
3682 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3683 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
3684 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3685 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3686 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3687 classify_set_interface_ip_table_reply) \
3688 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3689 classify_set_interface_l2_tables_reply) \
3690 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3691 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3692 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3693 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3694 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3695 l2tpv3_interface_enable_disable_reply) \
3696 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3697 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3698 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
3699 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
3700 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3701 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
3702 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3703 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3704 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3705 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3706 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3707 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3708 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3709 _(SHOW_VERSION_REPLY, show_version_reply) \
3710 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
3711 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3712 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
3713 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3714 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3715 _(IP4_ARP_EVENT, ip4_arp_event) \
3716 _(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
3717 _(IP6_ND_EVENT, ip6_nd_event) \
3718 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3719 _(IP_ADDRESS_DETAILS, ip_address_details) \
3720 _(IP_DETAILS, ip_details) \
3721 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3722 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3723 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3724 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3725 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
3726 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3727 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3728 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3729 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3730 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
3731 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3732 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3733 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
3734 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3735 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3736 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3737 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3738 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
3739 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
3740 _(MAP_DOMAIN_DETAILS, map_domain_details) \
3741 _(MAP_RULE_DETAILS, map_rule_details) \
3742 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3743 _(WANT_STATS_REPLY, want_stats_reply) \
3744 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3745 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
3746 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
3747 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
3748 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
3749 _(IOAM_ENABLE_REPLY, ioam_enable_reply) \
3750 _(IOAM_DISABLE_REPLY, ioam_disable_reply) \
3751 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3752 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3753 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
3754 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3755 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
3756 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3757 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
3758 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
3759 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
3760 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
3761 _(LISP_MAP_REQUEST_MODE_REPLY, lisp_map_request_mode_reply) \
3762 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
3763 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3764 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
3765 _(LISP_LOCATOR_DETAILS, lisp_locator_details) \
3766 _(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
3767 _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
3768 _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
3769 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
3770 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
3771 _(LISP_ADJACENCIES_GET_REPLY, lisp_adjacencies_get_reply) \
3772 _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
3773 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3774 lisp_add_del_map_request_itr_rlocs_reply) \
3775 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3776 lisp_get_map_request_itr_rlocs_reply) \
3777 _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
3778 _(SHOW_LISP_MAP_REQUEST_MODE_REPLY, show_lisp_map_request_mode_reply) \
3779 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
3780 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
3781 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
3782 _(POLICER_DETAILS, policer_details) \
3783 _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3784 _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
3785 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
3786 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
3787 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3788 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
3789 _(MPLS_FIB_DETAILS, mpls_fib_details) \
3790 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3791 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3792 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
3793 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
3794 _(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
3795 _(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
3796 _(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
3797 _(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
3798 _(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
3799 _(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
3800 _(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
3801 _(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
3802 _(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3803 _(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3804 _(PG_CAPTURE_REPLY, pg_capture_reply) \
3805 _(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3806 _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3807 ip_source_and_port_range_check_add_del_reply) \
3808 _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
3809 ip_source_and_port_range_check_interface_add_del_reply) \
3810 _(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
3811 _(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
3812 _(DELETE_SUBIF_REPLY, delete_subif_reply) \
3813 _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
3814 _(PUNT_REPLY, punt_reply)
3816 /* M: construct, but don't yet send a message */
3820 vam->result_ready = 0; \
3821 mp = vl_msg_api_alloc(sizeof(*mp)); \
3822 memset (mp, 0, sizeof (*mp)); \
3823 mp->_vl_msg_id = ntohs (VL_API_##T); \
3824 mp->client_index = vam->my_client_index; \
3829 vam->result_ready = 0; \
3830 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3831 memset (mp, 0, sizeof (*mp)); \
3832 mp->_vl_msg_id = ntohs (VL_API_##T); \
3833 mp->client_index = vam->my_client_index; \
3837 /* S: send a message */
3838 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3840 /* W: wait for results, with timeout */
3843 timeout = vat_time_now (vam) + 1.0; \
3845 while (vat_time_now (vam) < timeout) { \
3846 if (vam->result_ready == 1) { \
3847 return (vam->retval); \
3853 /* W2: wait for results, with timeout */
3856 timeout = vat_time_now (vam) + 1.0; \
3858 while (vat_time_now (vam) < timeout) { \
3859 if (vam->result_ready == 1) { \
3861 return (vam->retval); \
3874 #define STR_VTR_OP_CASE(op) \
3875 case L2_VTR_ ## op: \
3879 str_vtr_op (u32 vtr_op)
3883 STR_VTR_OP_CASE (DISABLED);
3884 STR_VTR_OP_CASE (PUSH_1);
3885 STR_VTR_OP_CASE (PUSH_2);
3886 STR_VTR_OP_CASE (POP_1);
3887 STR_VTR_OP_CASE (POP_2);
3888 STR_VTR_OP_CASE (TRANSLATE_1_1);
3889 STR_VTR_OP_CASE (TRANSLATE_1_2);
3890 STR_VTR_OP_CASE (TRANSLATE_2_1);
3891 STR_VTR_OP_CASE (TRANSLATE_2_2);
3898 dump_sub_interface_table (vat_main_t * vam)
3900 const sw_interface_subif_t *sub = NULL;
3902 if (vam->json_output)
3905 ("JSON output supported only for VPE API calls and dump_stats_table");
3910 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3911 "Interface", "sw_if_index",
3912 "sub id", "dot1ad", "tags", "outer id",
3913 "inner id", "exact", "default", "outer any", "inner any");
3915 vec_foreach (sub, vam->sw_if_subif_table)
3918 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3919 sub->interface_name,
3921 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3922 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3923 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3924 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3925 if (sub->vtr_op != L2_VTR_DISABLED)
3928 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3929 "tag1: %d tag2: %d ]\n",
3930 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3931 sub->vtr_tag1, sub->vtr_tag2);
3939 name_sort_cmp (void *a1, void *a2)
3941 name_sort_t *n1 = a1;
3942 name_sort_t *n2 = a2;
3944 return strcmp ((char *) n1->name, (char *) n2->name);
3948 dump_interface_table (vat_main_t * vam)
3951 name_sort_t *nses = 0, *ns;
3953 if (vam->json_output)
3956 ("JSON output supported only for VPE API calls and dump_stats_table");
3961 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3963 vec_add2 (nses, ns, 1);
3964 ns->name = (u8 *)(p->key);
3965 ns->value = (u32) p->value[0];
3969 vec_sort_with_function (nses, name_sort_cmp);
3971 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3972 vec_foreach (ns, nses)
3974 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3981 dump_ip_table (vat_main_t * vam, int is_ipv6)
3983 const ip_details_t *det = NULL;
3984 const ip_address_details_t *address = NULL;
3987 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3989 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3996 fformat (vam->ofp, "%-12d\n", i);
3998 " %-30s%-13s\n", "Address", "Prefix length");
4003 vec_foreach (address, det->addr)
4007 is_ipv6 ? format_ip6_address : format_ip4_address,
4008 address->ip, address->prefix_length);
4016 dump_ipv4_table (vat_main_t * vam)
4018 if (vam->json_output)
4021 ("JSON output supported only for VPE API calls and dump_stats_table");
4025 return dump_ip_table (vam, 0);
4029 dump_ipv6_table (vat_main_t * vam)
4031 if (vam->json_output)
4034 ("JSON output supported only for VPE API calls and dump_stats_table");
4038 return dump_ip_table (vam, 1);
4042 counter_type_to_str (u8 counter_type, u8 is_combined)
4046 switch (counter_type)
4048 case VNET_INTERFACE_COUNTER_DROP:
4050 case VNET_INTERFACE_COUNTER_PUNT:
4052 case VNET_INTERFACE_COUNTER_IP4:
4054 case VNET_INTERFACE_COUNTER_IP6:
4056 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
4058 case VNET_INTERFACE_COUNTER_RX_MISS:
4060 case VNET_INTERFACE_COUNTER_RX_ERROR:
4062 case VNET_INTERFACE_COUNTER_TX_ERROR:
4065 return "INVALID-COUNTER-TYPE";
4070 switch (counter_type)
4072 case VNET_INTERFACE_COUNTER_RX:
4074 case VNET_INTERFACE_COUNTER_TX:
4077 return "INVALID-COUNTER-TYPE";
4083 dump_stats_table (vat_main_t * vam)
4085 vat_json_node_t node;
4086 vat_json_node_t *msg_array;
4087 vat_json_node_t *msg;
4088 vat_json_node_t *counter_array;
4089 vat_json_node_t *counter;
4090 interface_counter_t c;
4092 ip4_fib_counter_t *c4;
4093 ip6_fib_counter_t *c6;
4096 if (!vam->json_output)
4098 clib_warning ("dump_stats_table supported only in JSON format");
4102 vat_json_init_object (&node);
4104 /* interface counters */
4105 msg_array = vat_json_object_add (&node, "interface_counters");
4106 vat_json_init_array (msg_array);
4107 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
4109 msg = vat_json_array_add (msg_array);
4110 vat_json_init_object (msg);
4111 vat_json_object_add_string_copy (msg, "vnet_counter_type",
4112 (u8 *) counter_type_to_str (i, 0));
4113 vat_json_object_add_int (msg, "is_combined", 0);
4114 counter_array = vat_json_object_add (msg, "data");
4115 vat_json_init_array (counter_array);
4116 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
4118 packets = vam->simple_interface_counters[i][j];
4119 vat_json_array_add_uint (counter_array, packets);
4122 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
4124 msg = vat_json_array_add (msg_array);
4125 vat_json_init_object (msg);
4126 vat_json_object_add_string_copy (msg, "vnet_counter_type",
4127 (u8 *) counter_type_to_str (i, 1));
4128 vat_json_object_add_int (msg, "is_combined", 1);
4129 counter_array = vat_json_object_add (msg, "data");
4130 vat_json_init_array (counter_array);
4131 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
4133 c = vam->combined_interface_counters[i][j];
4134 counter = vat_json_array_add (counter_array);
4135 vat_json_init_object (counter);
4136 vat_json_object_add_uint (counter, "packets", c.packets);
4137 vat_json_object_add_uint (counter, "bytes", c.bytes);
4141 /* ip4 fib counters */
4142 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
4143 vat_json_init_array (msg_array);
4144 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
4146 msg = vat_json_array_add (msg_array);
4147 vat_json_init_object (msg);
4148 vat_json_object_add_uint (msg, "vrf_id",
4149 vam->ip4_fib_counters_vrf_id_by_index[i]);
4150 counter_array = vat_json_object_add (msg, "c");
4151 vat_json_init_array (counter_array);
4152 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
4154 counter = vat_json_array_add (counter_array);
4155 vat_json_init_object (counter);
4156 c4 = &vam->ip4_fib_counters[i][j];
4157 vat_json_object_add_ip4 (counter, "address", c4->address);
4158 vat_json_object_add_uint (counter, "address_length",
4159 c4->address_length);
4160 vat_json_object_add_uint (counter, "packets", c4->packets);
4161 vat_json_object_add_uint (counter, "bytes", c4->bytes);
4165 /* ip6 fib counters */
4166 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
4167 vat_json_init_array (msg_array);
4168 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
4170 msg = vat_json_array_add (msg_array);
4171 vat_json_init_object (msg);
4172 vat_json_object_add_uint (msg, "vrf_id",
4173 vam->ip6_fib_counters_vrf_id_by_index[i]);
4174 counter_array = vat_json_object_add (msg, "c");
4175 vat_json_init_array (counter_array);
4176 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
4178 counter = vat_json_array_add (counter_array);
4179 vat_json_init_object (counter);
4180 c6 = &vam->ip6_fib_counters[i][j];
4181 vat_json_object_add_ip6 (counter, "address", c6->address);
4182 vat_json_object_add_uint (counter, "address_length",
4183 c6->address_length);
4184 vat_json_object_add_uint (counter, "packets", c6->packets);
4185 vat_json_object_add_uint (counter, "bytes", c6->bytes);
4189 vat_json_print (vam->ofp, &node);
4190 vat_json_free (&node);
4196 exec (vat_main_t * vam)
4198 api_main_t *am = &api_main;
4199 vl_api_cli_request_t *mp;
4203 unformat_input_t *i = vam->input;
4205 if (vec_len (i->buffer) == 0)
4208 if (vam->exec_mode == 0 && unformat (i, "mode"))
4213 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4220 M (CLI_REQUEST, cli_request);
4223 * Copy cmd into shared memory.
4224 * In order for the CLI command to work, it
4225 * must be a vector ending in \n, not a C-string ending
4228 pthread_mutex_lock (&am->vlib_rp->mutex);
4229 oldheap = svm_push_data_heap (am->vlib_rp);
4231 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4232 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4234 svm_pop_heap (oldheap);
4235 pthread_mutex_unlock (&am->vlib_rp->mutex);
4237 mp->cmd_in_shmem = (u64) cmd;
4239 timeout = vat_time_now (vam) + 10.0;
4241 while (vat_time_now (vam) < timeout)
4243 if (vam->result_ready == 1)
4246 if (vam->shmem_result != NULL)
4247 fformat (vam->ofp, "%s", vam->shmem_result);
4248 pthread_mutex_lock (&am->vlib_rp->mutex);
4249 oldheap = svm_push_data_heap (am->vlib_rp);
4251 free_me = (u8 *) vam->shmem_result;
4254 svm_pop_heap (oldheap);
4255 pthread_mutex_unlock (&am->vlib_rp->mutex);
4263 * Future replacement of exec() that passes CLI buffers directly in
4264 * the API messages instead of an additional shared memory area.
4267 exec_inband (vat_main_t * vam)
4269 vl_api_cli_inband_t *mp;
4271 unformat_input_t *i = vam->input;
4273 if (vec_len (i->buffer) == 0)
4276 if (vam->exec_mode == 0 && unformat (i, "mode"))
4281 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4288 * In order for the CLI command to work, it
4289 * must be a vector ending in \n, not a C-string ending
4292 u32 len = vec_len (vam->input->buffer);
4293 M2 (CLI_INBAND, cli_inband, len);
4294 clib_memcpy (mp->cmd, vam->input->buffer, len);
4295 mp->length = htonl (len);
4298 W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
4302 api_create_loopback (vat_main_t * vam)
4304 unformat_input_t *i = vam->input;
4305 vl_api_create_loopback_t *mp;
4310 memset (mac_address, 0, sizeof (mac_address));
4312 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4314 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4320 /* Construct the API message */
4321 M (CREATE_LOOPBACK, create_loopback);
4323 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4330 api_delete_loopback (vat_main_t * vam)
4332 unformat_input_t *i = vam->input;
4333 vl_api_delete_loopback_t *mp;
4335 u32 sw_if_index = ~0;
4337 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4339 if (unformat (i, "sw_if_index %d", &sw_if_index))
4345 if (sw_if_index == ~0)
4347 errmsg ("missing sw_if_index\n");
4351 /* Construct the API message */
4352 M (DELETE_LOOPBACK, delete_loopback);
4353 mp->sw_if_index = ntohl (sw_if_index);
4360 api_want_stats (vat_main_t * vam)
4362 unformat_input_t *i = vam->input;
4363 vl_api_want_stats_t *mp;
4367 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4369 if (unformat (i, "enable"))
4371 else if (unformat (i, "disable"))
4379 errmsg ("missing enable|disable\n");
4383 M (WANT_STATS, want_stats);
4384 mp->enable_disable = enable;
4391 api_want_interface_events (vat_main_t * vam)
4393 unformat_input_t *i = vam->input;
4394 vl_api_want_interface_events_t *mp;
4398 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4400 if (unformat (i, "enable"))
4402 else if (unformat (i, "disable"))
4410 errmsg ("missing enable|disable\n");
4414 M (WANT_INTERFACE_EVENTS, want_interface_events);
4415 mp->enable_disable = enable;
4417 vam->interface_event_display = enable;
4424 /* Note: non-static, called once to set up the initial intfc table */
4426 api_sw_interface_dump (vat_main_t * vam)
4428 vl_api_sw_interface_dump_t *mp;
4431 name_sort_t *nses = 0, *ns;
4432 sw_interface_subif_t *sub = NULL;
4434 /* Toss the old name table */
4436 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4438 vec_add2 (nses, ns, 1);
4439 ns->name = (u8 *)(p->key);
4440 ns->value = (u32) p->value[0];
4444 hash_free (vam->sw_if_index_by_interface_name);
4446 vec_foreach (ns, nses) vec_free (ns->name);
4450 vec_foreach (sub, vam->sw_if_subif_table)
4452 vec_free (sub->interface_name);
4454 vec_free (vam->sw_if_subif_table);
4456 /* recreate the interface name hash table */
4457 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
4459 /* Get list of ethernets */
4460 M (SW_INTERFACE_DUMP, sw_interface_dump);
4461 mp->name_filter_valid = 1;
4462 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4465 /* and local / loopback interfaces */
4466 M (SW_INTERFACE_DUMP, sw_interface_dump);
4467 mp->name_filter_valid = 1;
4468 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4471 /* and packet-generator interfaces */
4472 M (SW_INTERFACE_DUMP, sw_interface_dump);
4473 mp->name_filter_valid = 1;
4474 strncpy ((char *) mp->name_filter, "pg", sizeof (mp->name_filter) - 1);
4477 /* and vxlan-gpe tunnel interfaces */
4478 M (SW_INTERFACE_DUMP, sw_interface_dump);
4479 mp->name_filter_valid = 1;
4480 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4481 sizeof (mp->name_filter) - 1);
4484 /* and vxlan tunnel interfaces */
4485 M (SW_INTERFACE_DUMP, sw_interface_dump);
4486 mp->name_filter_valid = 1;
4487 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4490 /* and host (af_packet) interfaces */
4491 M (SW_INTERFACE_DUMP, sw_interface_dump);
4492 mp->name_filter_valid = 1;
4493 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4496 /* and l2tpv3 tunnel interfaces */
4497 M (SW_INTERFACE_DUMP, sw_interface_dump);
4498 mp->name_filter_valid = 1;
4499 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4500 sizeof (mp->name_filter) - 1);
4503 /* and GRE tunnel interfaces */
4504 M (SW_INTERFACE_DUMP, sw_interface_dump);
4505 mp->name_filter_valid = 1;
4506 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4509 /* and LISP-GPE interfaces */
4510 M (SW_INTERFACE_DUMP, sw_interface_dump);
4511 mp->name_filter_valid = 1;
4512 strncpy ((char *) mp->name_filter, "lisp_gpe",
4513 sizeof (mp->name_filter) - 1);
4516 /* and IPSEC tunnel interfaces */
4517 M (SW_INTERFACE_DUMP, sw_interface_dump);
4518 mp->name_filter_valid = 1;
4519 strncpy ((char *) mp->name_filter, "ipsec", sizeof (mp->name_filter) - 1);
4522 /* Use a control ping for synchronization */
4524 vl_api_control_ping_t *mp;
4525 M (CONTROL_PING, control_ping);
4532 api_sw_interface_set_flags (vat_main_t * vam)
4534 unformat_input_t *i = vam->input;
4535 vl_api_sw_interface_set_flags_t *mp;
4538 u8 sw_if_index_set = 0;
4539 u8 admin_up = 0, link_up = 0;
4541 /* Parse args required to build the message */
4542 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4544 if (unformat (i, "admin-up"))
4546 else if (unformat (i, "admin-down"))
4548 else if (unformat (i, "link-up"))
4550 else if (unformat (i, "link-down"))
4552 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4553 sw_if_index_set = 1;
4554 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4555 sw_if_index_set = 1;
4560 if (sw_if_index_set == 0)
4562 errmsg ("missing interface name or sw_if_index\n");
4566 /* Construct the API message */
4567 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4568 mp->sw_if_index = ntohl (sw_if_index);
4569 mp->admin_up_down = admin_up;
4570 mp->link_up_down = link_up;
4575 /* Wait for a reply, return the good/bad news... */
4580 api_sw_interface_clear_stats (vat_main_t * vam)
4582 unformat_input_t *i = vam->input;
4583 vl_api_sw_interface_clear_stats_t *mp;
4586 u8 sw_if_index_set = 0;
4588 /* Parse args required to build the message */
4589 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4591 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4592 sw_if_index_set = 1;
4593 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4594 sw_if_index_set = 1;
4599 /* Construct the API message */
4600 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
4602 if (sw_if_index_set == 1)
4603 mp->sw_if_index = ntohl (sw_if_index);
4605 mp->sw_if_index = ~0;
4610 /* Wait for a reply, return the good/bad news... */
4615 api_sw_interface_set_dpdk_hqos_pipe (vat_main_t * vam)
4617 unformat_input_t *i = vam->input;
4618 vl_api_sw_interface_set_dpdk_hqos_pipe_t *mp;
4621 u8 sw_if_index_set = 0;
4629 /* Parse args required to build the message */
4630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4632 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4633 sw_if_index_set = 1;
4634 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4635 sw_if_index_set = 1;
4636 else if (unformat (i, "subport %u", &subport))
4638 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4639 sw_if_index_set = 1;
4640 else if (unformat (i, "pipe %u", &pipe))
4642 else if (unformat (i, "profile %u", &profile))
4648 if (sw_if_index_set == 0)
4650 errmsg ("missing interface name or sw_if_index\n");
4654 if (subport_set == 0)
4656 errmsg ("missing subport \n");
4662 errmsg ("missing pipe\n");
4666 if (profile_set == 0)
4668 errmsg ("missing profile\n");
4672 M (SW_INTERFACE_SET_DPDK_HQOS_PIPE, sw_interface_set_dpdk_hqos_pipe);
4674 mp->sw_if_index = ntohl (sw_if_index);
4675 mp->subport = ntohl (subport);
4676 mp->pipe = ntohl (pipe);
4677 mp->profile = ntohl (profile);
4687 api_sw_interface_set_dpdk_hqos_subport (vat_main_t * vam)
4689 unformat_input_t *i = vam->input;
4690 vl_api_sw_interface_set_dpdk_hqos_subport_t *mp;
4693 u8 sw_if_index_set = 0;
4696 u32 tb_rate = 1250000000; /* 10GbE */
4697 u32 tb_size = 1000000;
4698 u32 tc_rate[] = { 1250000000, 1250000000, 1250000000, 1250000000 };
4701 /* Parse args required to build the message */
4702 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4704 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4705 sw_if_index_set = 1;
4706 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4707 sw_if_index_set = 1;
4708 else if (unformat (i, "subport %u", &subport))
4710 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4711 sw_if_index_set = 1;
4712 else if (unformat (i, "rate %u", &tb_rate))
4716 for (tc_id = 0; tc_id < (sizeof (tc_rate) / sizeof (tc_rate[0]));
4718 tc_rate[tc_id] = tb_rate;
4720 else if (unformat (i, "bktsize %u", &tb_size))
4722 else if (unformat (i, "tc0 %u", &tc_rate[0]))
4724 else if (unformat (i, "tc1 %u", &tc_rate[1]))
4726 else if (unformat (i, "tc2 %u", &tc_rate[2]))
4728 else if (unformat (i, "tc3 %u", &tc_rate[3]))
4730 else if (unformat (i, "period %u", &tc_period))
4736 if (sw_if_index_set == 0)
4738 errmsg ("missing interface name or sw_if_index\n");
4742 if (subport_set == 0)
4744 errmsg ("missing subport \n");
4748 M (SW_INTERFACE_SET_DPDK_HQOS_SUBPORT, sw_interface_set_dpdk_hqos_subport);
4750 mp->sw_if_index = ntohl (sw_if_index);
4751 mp->subport = ntohl (subport);
4752 mp->tb_rate = ntohl (tb_rate);
4753 mp->tb_size = ntohl (tb_size);
4754 mp->tc_rate[0] = ntohl (tc_rate[0]);
4755 mp->tc_rate[1] = ntohl (tc_rate[1]);
4756 mp->tc_rate[2] = ntohl (tc_rate[2]);
4757 mp->tc_rate[3] = ntohl (tc_rate[3]);
4758 mp->tc_period = ntohl (tc_period);
4767 api_sw_interface_set_dpdk_hqos_tctbl (vat_main_t * vam)
4769 unformat_input_t *i = vam->input;
4770 vl_api_sw_interface_set_dpdk_hqos_tctbl_t *mp;
4773 u8 sw_if_index_set = 0;
4777 u32 entry, tc, queue;
4779 /* Parse args required to build the message */
4780 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4782 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4783 sw_if_index_set = 1;
4784 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4785 sw_if_index_set = 1;
4786 else if (unformat (i, "entry %d", &entry))
4788 else if (unformat (i, "tc %d", &tc))
4790 else if (unformat (i, "queue %d", &queue))
4796 if (sw_if_index_set == 0)
4798 errmsg ("missing interface name or sw_if_index\n");
4804 errmsg ("missing entry \n");
4810 errmsg ("missing traffic class \n");
4816 errmsg ("missing queue \n");
4820 M (SW_INTERFACE_SET_DPDK_HQOS_TCTBL, sw_interface_set_dpdk_hqos_tctbl);
4822 mp->sw_if_index = ntohl (sw_if_index);
4823 mp->entry = ntohl (entry);
4824 mp->tc = ntohl (tc);
4825 mp->queue = ntohl (queue);
4834 api_sw_interface_add_del_address (vat_main_t * vam)
4836 unformat_input_t *i = vam->input;
4837 vl_api_sw_interface_add_del_address_t *mp;
4840 u8 sw_if_index_set = 0;
4841 u8 is_add = 1, del_all = 0;
4842 u32 address_length = 0;
4843 u8 v4_address_set = 0;
4844 u8 v6_address_set = 0;
4845 ip4_address_t v4address;
4846 ip6_address_t v6address;
4848 /* Parse args required to build the message */
4849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4851 if (unformat (i, "del-all"))
4853 else if (unformat (i, "del"))
4855 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4856 sw_if_index_set = 1;
4857 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4858 sw_if_index_set = 1;
4859 else if (unformat (i, "%U/%d",
4860 unformat_ip4_address, &v4address, &address_length))
4862 else if (unformat (i, "%U/%d",
4863 unformat_ip6_address, &v6address, &address_length))
4869 if (sw_if_index_set == 0)
4871 errmsg ("missing interface name or sw_if_index\n");
4874 if (v4_address_set && v6_address_set)
4876 errmsg ("both v4 and v6 addresses set\n");
4879 if (!v4_address_set && !v6_address_set && !del_all)
4881 errmsg ("no addresses set\n");
4885 /* Construct the API message */
4886 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4888 mp->sw_if_index = ntohl (sw_if_index);
4889 mp->is_add = is_add;
4890 mp->del_all = del_all;
4894 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4898 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4900 mp->address_length = address_length;
4905 /* Wait for a reply, return good/bad news */
4910 api_sw_interface_set_mpls_enable (vat_main_t * vam)
4912 unformat_input_t *i = vam->input;
4913 vl_api_sw_interface_set_mpls_enable_t *mp;
4916 u8 sw_if_index_set = 0;
4919 /* Parse args required to build the message */
4920 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4922 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4923 sw_if_index_set = 1;
4924 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4925 sw_if_index_set = 1;
4926 else if (unformat (i, "disable"))
4928 else if (unformat (i, "dis"))
4934 if (sw_if_index_set == 0)
4936 errmsg ("missing interface name or sw_if_index\n");
4940 /* Construct the API message */
4941 M (SW_INTERFACE_SET_MPLS_ENABLE, sw_interface_set_mpls_enable);
4943 mp->sw_if_index = ntohl (sw_if_index);
4944 mp->enable = enable;
4949 /* Wait for a reply... */
4954 api_sw_interface_set_table (vat_main_t * vam)
4956 unformat_input_t *i = vam->input;
4957 vl_api_sw_interface_set_table_t *mp;
4959 u32 sw_if_index, vrf_id = 0;
4960 u8 sw_if_index_set = 0;
4963 /* Parse args required to build the message */
4964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4966 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4967 sw_if_index_set = 1;
4968 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4969 sw_if_index_set = 1;
4970 else if (unformat (i, "vrf %d", &vrf_id))
4972 else if (unformat (i, "ipv6"))
4978 if (sw_if_index_set == 0)
4980 errmsg ("missing interface name or sw_if_index\n");
4984 /* Construct the API message */
4985 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4987 mp->sw_if_index = ntohl (sw_if_index);
4988 mp->is_ipv6 = is_ipv6;
4989 mp->vrf_id = ntohl (vrf_id);
4994 /* Wait for a reply... */
4999 api_sw_interface_set_vpath (vat_main_t * vam)
5001 unformat_input_t *i = vam->input;
5002 vl_api_sw_interface_set_vpath_t *mp;
5004 u32 sw_if_index = 0;
5005 u8 sw_if_index_set = 0;
5008 /* Parse args required to build the message */
5009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5011 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5012 sw_if_index_set = 1;
5013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5014 sw_if_index_set = 1;
5015 else if (unformat (i, "enable"))
5017 else if (unformat (i, "disable"))
5023 if (sw_if_index_set == 0)
5025 errmsg ("missing interface name or sw_if_index\n");
5029 /* Construct the API message */
5030 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
5032 mp->sw_if_index = ntohl (sw_if_index);
5033 mp->enable = is_enable;
5038 /* Wait for a reply... */
5043 api_sw_interface_set_l2_xconnect (vat_main_t * vam)
5045 unformat_input_t *i = vam->input;
5046 vl_api_sw_interface_set_l2_xconnect_t *mp;
5049 u8 rx_sw_if_index_set = 0;
5051 u8 tx_sw_if_index_set = 0;
5054 /* Parse args required to build the message */
5055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5057 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5058 rx_sw_if_index_set = 1;
5059 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5060 tx_sw_if_index_set = 1;
5061 else if (unformat (i, "rx"))
5063 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5065 if (unformat (i, "%U", unformat_sw_if_index, vam,
5067 rx_sw_if_index_set = 1;
5072 else if (unformat (i, "tx"))
5074 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5076 if (unformat (i, "%U", unformat_sw_if_index, vam,
5078 tx_sw_if_index_set = 1;
5083 else if (unformat (i, "enable"))
5085 else if (unformat (i, "disable"))
5091 if (rx_sw_if_index_set == 0)
5093 errmsg ("missing rx interface name or rx_sw_if_index\n");
5097 if (enable && (tx_sw_if_index_set == 0))
5099 errmsg ("missing tx interface name or tx_sw_if_index\n");
5103 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
5105 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5106 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5107 mp->enable = enable;
5116 api_sw_interface_set_l2_bridge (vat_main_t * vam)
5118 unformat_input_t *i = vam->input;
5119 vl_api_sw_interface_set_l2_bridge_t *mp;
5122 u8 rx_sw_if_index_set = 0;
5129 /* Parse args required to build the message */
5130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5132 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
5133 rx_sw_if_index_set = 1;
5134 else if (unformat (i, "bd_id %d", &bd_id))
5136 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
5137 rx_sw_if_index_set = 1;
5138 else if (unformat (i, "shg %d", &shg))
5140 else if (unformat (i, "bvi"))
5142 else if (unformat (i, "enable"))
5144 else if (unformat (i, "disable"))
5150 if (rx_sw_if_index_set == 0)
5152 errmsg ("missing rx interface name or sw_if_index\n");
5156 if (enable && (bd_id_set == 0))
5158 errmsg ("missing bridge domain\n");
5162 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
5164 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5165 mp->bd_id = ntohl (bd_id);
5168 mp->enable = enable;
5177 api_bridge_domain_dump (vat_main_t * vam)
5179 unformat_input_t *i = vam->input;
5180 vl_api_bridge_domain_dump_t *mp;
5184 /* Parse args required to build the message */
5185 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5187 if (unformat (i, "bd_id %d", &bd_id))
5193 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
5194 mp->bd_id = ntohl (bd_id);
5197 /* Use a control ping for synchronization */
5199 vl_api_control_ping_t *mp;
5200 M (CONTROL_PING, control_ping);
5210 api_bridge_domain_add_del (vat_main_t * vam)
5212 unformat_input_t *i = vam->input;
5213 vl_api_bridge_domain_add_del_t *mp;
5217 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
5219 /* Parse args required to build the message */
5220 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5222 if (unformat (i, "bd_id %d", &bd_id))
5224 else if (unformat (i, "flood %d", &flood))
5226 else if (unformat (i, "uu-flood %d", &uu_flood))
5228 else if (unformat (i, "forward %d", &forward))
5230 else if (unformat (i, "learn %d", &learn))
5232 else if (unformat (i, "arp-term %d", &arp_term))
5234 else if (unformat (i, "del"))
5237 flood = uu_flood = forward = learn = 0;
5245 errmsg ("missing bridge domain\n");
5249 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
5251 mp->bd_id = ntohl (bd_id);
5253 mp->uu_flood = uu_flood;
5254 mp->forward = forward;
5256 mp->arp_term = arp_term;
5257 mp->is_add = is_add;
5266 api_l2fib_add_del (vat_main_t * vam)
5268 unformat_input_t *i = vam->input;
5269 vl_api_l2fib_add_del_t *mp;
5276 u8 sw_if_index_set = 0;
5285 /* Parse args required to build the message */
5286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5288 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
5290 else if (unformat (i, "bd_id %d", &bd_id))
5292 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5293 sw_if_index_set = 1;
5294 else if (unformat (i, "sw_if"))
5296 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5298 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5299 sw_if_index_set = 1;
5304 else if (unformat (i, "static"))
5306 else if (unformat (i, "filter"))
5311 else if (unformat (i, "bvi"))
5316 else if (unformat (i, "del"))
5318 else if (unformat (i, "count %d", &count))
5326 errmsg ("missing mac address\n");
5332 errmsg ("missing bridge domain\n");
5336 if (is_add && (sw_if_index_set == 0))
5338 errmsg ("missing interface name or sw_if_index\n");
5344 /* Turn on async mode */
5345 vam->async_mode = 1;
5346 vam->async_errors = 0;
5347 before = vat_time_now (vam);
5350 for (j = 0; j < count; j++)
5352 M (L2FIB_ADD_DEL, l2fib_add_del);
5355 mp->bd_id = ntohl (bd_id);
5356 mp->is_add = is_add;
5360 mp->sw_if_index = ntohl (sw_if_index);
5361 mp->static_mac = static_mac;
5362 mp->filter_mac = filter_mac;
5363 mp->bvi_mac = bvi_mac;
5365 increment_mac_address (&mac);
5372 vl_api_control_ping_t *mp;
5375 /* Shut off async mode */
5376 vam->async_mode = 0;
5378 M (CONTROL_PING, control_ping);
5381 timeout = vat_time_now (vam) + 1.0;
5382 while (vat_time_now (vam) < timeout)
5383 if (vam->result_ready == 1)
5388 if (vam->retval == -99)
5389 errmsg ("timeout\n");
5391 if (vam->async_errors > 0)
5393 errmsg ("%d asynchronous errors\n", vam->async_errors);
5396 vam->async_errors = 0;
5397 after = vat_time_now (vam);
5399 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5400 count, after - before, count / (after - before));
5404 /* Wait for a reply... */
5407 /* Return the good/bad news */
5408 return (vam->retval);
5412 api_l2_flags (vat_main_t * vam)
5414 unformat_input_t *i = vam->input;
5415 vl_api_l2_flags_t *mp;
5418 u32 feature_bitmap = 0;
5419 u8 sw_if_index_set = 0;
5421 /* Parse args required to build the message */
5422 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5424 if (unformat (i, "sw_if_index %d", &sw_if_index))
5425 sw_if_index_set = 1;
5426 else if (unformat (i, "sw_if"))
5428 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5430 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5431 sw_if_index_set = 1;
5436 else if (unformat (i, "learn"))
5437 feature_bitmap |= L2INPUT_FEAT_LEARN;
5438 else if (unformat (i, "forward"))
5439 feature_bitmap |= L2INPUT_FEAT_FWD;
5440 else if (unformat (i, "flood"))
5441 feature_bitmap |= L2INPUT_FEAT_FLOOD;
5442 else if (unformat (i, "uu-flood"))
5443 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
5448 if (sw_if_index_set == 0)
5450 errmsg ("missing interface name or sw_if_index\n");
5454 M (L2_FLAGS, l2_flags);
5456 mp->sw_if_index = ntohl (sw_if_index);
5457 mp->feature_bitmap = ntohl (feature_bitmap);
5466 api_bridge_flags (vat_main_t * vam)
5468 unformat_input_t *i = vam->input;
5469 vl_api_bridge_flags_t *mp;
5476 /* Parse args required to build the message */
5477 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5479 if (unformat (i, "bd_id %d", &bd_id))
5481 else if (unformat (i, "learn"))
5483 else if (unformat (i, "forward"))
5485 else if (unformat (i, "flood"))
5487 else if (unformat (i, "uu-flood"))
5488 flags |= L2_UU_FLOOD;
5489 else if (unformat (i, "arp-term"))
5490 flags |= L2_ARP_TERM;
5491 else if (unformat (i, "off"))
5493 else if (unformat (i, "disable"))
5501 errmsg ("missing bridge domain\n");
5505 M (BRIDGE_FLAGS, bridge_flags);
5507 mp->bd_id = ntohl (bd_id);
5508 mp->feature_bitmap = ntohl (flags);
5509 mp->is_set = is_set;
5518 api_bd_ip_mac_add_del (vat_main_t * vam)
5520 unformat_input_t *i = vam->input;
5521 vl_api_bd_ip_mac_add_del_t *mp;
5529 ip4_address_t v4addr;
5530 ip6_address_t v6addr;
5534 /* Parse args required to build the message */
5535 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5537 if (unformat (i, "bd_id %d", &bd_id))
5541 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5545 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5550 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5554 else if (unformat (i, "del"))
5562 errmsg ("missing bridge domain\n");
5565 else if (ip_set == 0)
5567 errmsg ("missing IP address\n");
5570 else if (mac_set == 0)
5572 errmsg ("missing MAC address\n");
5576 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
5578 mp->bd_id = ntohl (bd_id);
5579 mp->is_ipv6 = is_ipv6;
5580 mp->is_add = is_add;
5582 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5584 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5585 clib_memcpy (mp->mac_address, macaddr, 6);
5593 api_tap_connect (vat_main_t * vam)
5595 unformat_input_t *i = vam->input;
5596 vl_api_tap_connect_t *mp;
5603 memset (mac_address, 0, sizeof (mac_address));
5605 /* Parse args required to build the message */
5606 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5608 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5612 else if (unformat (i, "random-mac"))
5614 else if (unformat (i, "tapname %s", &tap_name))
5622 errmsg ("missing tap name\n");
5625 if (vec_len (tap_name) > 63)
5627 errmsg ("tap name too long\n");
5629 vec_add1 (tap_name, 0);
5631 /* Construct the API message */
5632 M (TAP_CONNECT, tap_connect);
5634 mp->use_random_mac = random_mac;
5635 clib_memcpy (mp->mac_address, mac_address, 6);
5636 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5637 vec_free (tap_name);
5642 /* Wait for a reply... */
5647 api_tap_modify (vat_main_t * vam)
5649 unformat_input_t *i = vam->input;
5650 vl_api_tap_modify_t *mp;
5656 u32 sw_if_index = ~0;
5657 u8 sw_if_index_set = 0;
5659 memset (mac_address, 0, sizeof (mac_address));
5661 /* Parse args required to build the message */
5662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5664 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5665 sw_if_index_set = 1;
5666 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5667 sw_if_index_set = 1;
5668 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5672 else if (unformat (i, "random-mac"))
5674 else if (unformat (i, "tapname %s", &tap_name))
5680 if (sw_if_index_set == 0)
5682 errmsg ("missing vpp interface name");
5687 errmsg ("missing tap name\n");
5690 if (vec_len (tap_name) > 63)
5692 errmsg ("tap name too long\n");
5694 vec_add1 (tap_name, 0);
5696 /* Construct the API message */
5697 M (TAP_MODIFY, tap_modify);
5699 mp->use_random_mac = random_mac;
5700 mp->sw_if_index = ntohl (sw_if_index);
5701 clib_memcpy (mp->mac_address, mac_address, 6);
5702 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5703 vec_free (tap_name);
5708 /* Wait for a reply... */
5713 api_tap_delete (vat_main_t * vam)
5715 unformat_input_t *i = vam->input;
5716 vl_api_tap_delete_t *mp;
5718 u32 sw_if_index = ~0;
5719 u8 sw_if_index_set = 0;
5721 /* Parse args required to build the message */
5722 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5724 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5725 sw_if_index_set = 1;
5726 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5727 sw_if_index_set = 1;
5732 if (sw_if_index_set == 0)
5734 errmsg ("missing vpp interface name");
5738 /* Construct the API message */
5739 M (TAP_DELETE, tap_delete);
5741 mp->sw_if_index = ntohl (sw_if_index);
5746 /* Wait for a reply... */
5751 api_ip_add_del_route (vat_main_t * vam)
5753 unformat_input_t *i = vam->input;
5754 vl_api_ip_add_del_route_t *mp;
5756 u32 sw_if_index = ~0, vrf_id = 0;
5757 u8 sw_if_index_set = 0;
5759 u8 is_local = 0, is_drop = 0;
5760 u8 is_unreach = 0, is_prohibit = 0;
5761 u8 create_vrf_if_needed = 0;
5763 u8 next_hop_weight = 1;
5765 u8 is_multipath = 0;
5767 u8 address_length_set = 0;
5768 u32 next_hop_table_id = 0;
5769 u32 resolve_attempts = 0;
5770 u32 dst_address_length = 0;
5771 u8 next_hop_set = 0;
5772 ip4_address_t v4_dst_address, v4_next_hop_address;
5773 ip6_address_t v6_dst_address, v6_next_hop_address;
5777 u32 random_add_del = 0;
5778 u32 *random_vector = 0;
5780 u32 random_seed = 0xdeaddabe;
5781 u32 classify_table_index = ~0;
5783 u8 resolve_host = 0, resolve_attached = 0;
5784 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
5786 /* Parse args required to build the message */
5787 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5789 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5790 sw_if_index_set = 1;
5791 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5792 sw_if_index_set = 1;
5793 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5798 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5803 else if (unformat (i, "/%d", &dst_address_length))
5805 address_length_set = 1;
5808 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5809 &v4_next_hop_address))
5813 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5814 &v6_next_hop_address))
5818 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5820 else if (unformat (i, "weight %d", &next_hop_weight))
5822 else if (unformat (i, "drop"))
5826 else if (unformat (i, "null-send-unreach"))
5830 else if (unformat (i, "null-send-prohibit"))
5834 else if (unformat (i, "local"))
5838 else if (unformat (i, "classify %d", &classify_table_index))
5842 else if (unformat (i, "del"))
5844 else if (unformat (i, "add"))
5846 else if (unformat (i, "not-last"))
5848 else if (unformat (i, "resolve-via-host"))
5850 else if (unformat (i, "resolve-via-attached"))
5851 resolve_attached = 1;
5852 else if (unformat (i, "multipath"))
5854 else if (unformat (i, "vrf %d", &vrf_id))
5856 else if (unformat (i, "create-vrf"))
5857 create_vrf_if_needed = 1;
5858 else if (unformat (i, "count %d", &count))
5860 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
5862 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
5864 else if (unformat (i, "out-label %d", &next_hop_out_label))
5866 else if (unformat (i, "random"))
5868 else if (unformat (i, "seed %d", &random_seed))
5872 clib_warning ("parse error '%U'", format_unformat_error, i);
5877 if (resolve_attempts > 0 && sw_if_index_set == 0)
5879 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5883 if (!next_hop_set && !is_drop && !is_local &&
5884 !is_classify && !is_unreach && !is_prohibit)
5887 ("next hop / local / drop / unreach / prohibit / classify not set\n");
5891 if (address_set == 0)
5893 errmsg ("missing addresses\n");
5897 if (address_length_set == 0)
5899 errmsg ("missing address length\n");
5903 /* Generate a pile of unique, random routes */
5906 u32 this_random_address;
5907 random_hash = hash_create (count, sizeof (uword));
5909 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5910 for (j = 0; j <= count; j++)
5914 this_random_address = random_u32 (&random_seed);
5915 this_random_address =
5916 clib_host_to_net_u32 (this_random_address);
5918 while (hash_get (random_hash, this_random_address));
5919 vec_add1 (random_vector, this_random_address);
5920 hash_set (random_hash, this_random_address, 1);
5922 hash_free (random_hash);
5923 v4_dst_address.as_u32 = random_vector[0];
5928 /* Turn on async mode */
5929 vam->async_mode = 1;
5930 vam->async_errors = 0;
5931 before = vat_time_now (vam);
5934 for (j = 0; j < count; j++)
5936 /* Construct the API message */
5937 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
5939 mp->next_hop_sw_if_index = ntohl (sw_if_index);
5940 mp->table_id = ntohl (vrf_id);
5941 if (resolve_attempts > 0)
5943 mp->resolve_attempts = ntohl (resolve_attempts);
5944 mp->resolve_if_needed = 1;
5946 mp->create_vrf_if_needed = create_vrf_if_needed;
5948 mp->is_add = is_add;
5949 mp->is_drop = is_drop;
5950 mp->is_unreach = is_unreach;
5951 mp->is_prohibit = is_prohibit;
5952 mp->is_ipv6 = is_ipv6;
5953 mp->is_local = is_local;
5954 mp->is_classify = is_classify;
5955 mp->is_multipath = is_multipath;
5956 mp->is_resolve_host = resolve_host;
5957 mp->is_resolve_attached = resolve_attached;
5958 mp->not_last = not_last;
5959 mp->next_hop_weight = next_hop_weight;
5960 mp->dst_address_length = dst_address_length;
5961 mp->next_hop_table_id = ntohl (next_hop_table_id);
5962 mp->classify_table_index = ntohl (classify_table_index);
5963 mp->next_hop_out_label = ntohl (next_hop_out_label);
5967 clib_memcpy (mp->dst_address, &v6_dst_address,
5968 sizeof (v6_dst_address));
5970 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5971 sizeof (v6_next_hop_address));
5972 increment_v6_address (&v6_dst_address);
5976 clib_memcpy (mp->dst_address, &v4_dst_address,
5977 sizeof (v4_dst_address));
5979 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5980 sizeof (v4_next_hop_address));
5982 v4_dst_address.as_u32 = random_vector[j + 1];
5984 increment_v4_address (&v4_dst_address);
5988 /* If we receive SIGTERM, stop now... */
5993 /* When testing multiple add/del ops, use a control-ping to sync */
5996 vl_api_control_ping_t *mp;
5999 /* Shut off async mode */
6000 vam->async_mode = 0;
6002 M (CONTROL_PING, control_ping);
6005 timeout = vat_time_now (vam) + 1.0;
6006 while (vat_time_now (vam) < timeout)
6007 if (vam->result_ready == 1)
6012 if (vam->retval == -99)
6013 errmsg ("timeout\n");
6015 if (vam->async_errors > 0)
6017 errmsg ("%d asynchronous errors\n", vam->async_errors);
6020 vam->async_errors = 0;
6021 after = vat_time_now (vam);
6023 /* slim chance, but we might have eaten SIGTERM on the first iteration */
6027 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
6028 count, after - before, count / (after - before));
6032 /* Wait for a reply... */
6036 /* Return the good/bad news */
6037 return (vam->retval);
6041 api_mpls_route_add_del (vat_main_t * vam)
6043 unformat_input_t *i = vam->input;
6044 vl_api_mpls_route_add_del_t *mp;
6046 u32 sw_if_index = ~0, table_id = 0;
6047 u8 create_table_if_needed = 0;
6049 u8 next_hop_weight = 1;
6050 u8 is_multipath = 0;
6051 u32 next_hop_table_id = 0;
6052 u8 next_hop_set = 0;
6053 ip4_address_t v4_next_hop_address = {
6056 ip6_address_t v6_next_hop_address = { {0} };
6060 u32 classify_table_index = ~0;
6062 u8 resolve_host = 0, resolve_attached = 0;
6063 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
6064 mpls_label_t local_label = MPLS_LABEL_INVALID;
6066 u8 next_hop_proto_is_ip4 = 1;
6068 /* Parse args required to build the message */
6069 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6071 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6073 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6075 else if (unformat (i, "%d", &local_label))
6077 else if (unformat (i, "eos"))
6079 else if (unformat (i, "non-eos"))
6081 else if (unformat (i, "via %U", unformat_ip4_address,
6082 &v4_next_hop_address))
6085 next_hop_proto_is_ip4 = 1;
6087 else if (unformat (i, "via %U", unformat_ip6_address,
6088 &v6_next_hop_address))
6091 next_hop_proto_is_ip4 = 0;
6093 else if (unformat (i, "weight %d", &next_hop_weight))
6095 else if (unformat (i, "create-table"))
6096 create_table_if_needed = 1;
6097 else if (unformat (i, "classify %d", &classify_table_index))
6101 else if (unformat (i, "del"))
6103 else if (unformat (i, "add"))
6105 else if (unformat (i, "resolve-via-host"))
6107 else if (unformat (i, "resolve-via-attached"))
6108 resolve_attached = 1;
6109 else if (unformat (i, "multipath"))
6111 else if (unformat (i, "count %d", &count))
6113 else if (unformat (i, "lookup-in-ip4-table %d", &next_hop_table_id))
6116 next_hop_proto_is_ip4 = 1;
6118 else if (unformat (i, "lookup-in-ip6-table %d", &next_hop_table_id))
6121 next_hop_proto_is_ip4 = 0;
6123 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
6125 else if (unformat (i, "out-label %d", &next_hop_out_label))
6129 clib_warning ("parse error '%U'", format_unformat_error, i);
6134 if (!next_hop_set && !is_classify)
6136 errmsg ("next hop / classify not set\n");
6140 if (MPLS_LABEL_INVALID == local_label)
6142 errmsg ("missing label\n");
6148 /* Turn on async mode */
6149 vam->async_mode = 1;
6150 vam->async_errors = 0;
6151 before = vat_time_now (vam);
6154 for (j = 0; j < count; j++)
6156 /* Construct the API message */
6157 M (MPLS_ROUTE_ADD_DEL, mpls_route_add_del);
6159 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
6160 mp->mr_table_id = ntohl (table_id);
6161 mp->mr_create_table_if_needed = create_table_if_needed;
6163 mp->mr_is_add = is_add;
6164 mp->mr_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
6165 mp->mr_is_classify = is_classify;
6166 mp->mr_is_multipath = is_multipath;
6167 mp->mr_is_resolve_host = resolve_host;
6168 mp->mr_is_resolve_attached = resolve_attached;
6169 mp->mr_next_hop_weight = next_hop_weight;
6170 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
6171 mp->mr_classify_table_index = ntohl (classify_table_index);
6172 mp->mr_next_hop_out_label = ntohl (next_hop_out_label);
6173 mp->mr_label = ntohl (local_label);
6174 mp->mr_eos = is_eos;
6178 if (next_hop_proto_is_ip4)
6180 clib_memcpy (mp->mr_next_hop,
6181 &v4_next_hop_address,
6182 sizeof (v4_next_hop_address));
6186 clib_memcpy (mp->mr_next_hop,
6187 &v6_next_hop_address,
6188 sizeof (v6_next_hop_address));
6195 /* If we receive SIGTERM, stop now... */
6200 /* When testing multiple add/del ops, use a control-ping to sync */
6203 vl_api_control_ping_t *mp;
6206 /* Shut off async mode */
6207 vam->async_mode = 0;
6209 M (CONTROL_PING, control_ping);
6212 timeout = vat_time_now (vam) + 1.0;
6213 while (vat_time_now (vam) < timeout)
6214 if (vam->result_ready == 1)
6219 if (vam->retval == -99)
6220 errmsg ("timeout\n");
6222 if (vam->async_errors > 0)
6224 errmsg ("%d asynchronous errors\n", vam->async_errors);
6227 vam->async_errors = 0;
6228 after = vat_time_now (vam);
6230 /* slim chance, but we might have eaten SIGTERM on the first iteration */
6234 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
6235 count, after - before, count / (after - before));
6239 /* Wait for a reply... */
6243 /* Return the good/bad news */
6244 return (vam->retval);
6248 api_mpls_ip_bind_unbind (vat_main_t * vam)
6250 unformat_input_t *i = vam->input;
6251 vl_api_mpls_ip_bind_unbind_t *mp;
6253 u32 ip_table_id = 0;
6254 u8 create_table_if_needed = 0;
6257 ip4_address_t v4_address;
6258 ip6_address_t v6_address;
6261 mpls_label_t local_label = MPLS_LABEL_INVALID;
6263 /* Parse args required to build the message */
6264 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6266 if (unformat (i, "%U/%d", unformat_ip4_address,
6267 &v4_address, &address_length))
6272 else if (unformat (i, "%U/%d", unformat_ip6_address,
6273 &v6_address, &address_length))
6278 else if (unformat (i, "%d", &local_label))
6280 else if (unformat (i, "create-table"))
6281 create_table_if_needed = 1;
6282 else if (unformat (i, "table-id %d", &ip_table_id))
6284 else if (unformat (i, "unbind"))
6286 else if (unformat (i, "bind"))
6290 clib_warning ("parse error '%U'", format_unformat_error, i);
6297 errmsg ("IP addres not set\n");
6301 if (MPLS_LABEL_INVALID == local_label)
6303 errmsg ("missing label\n");
6307 /* Construct the API message */
6308 M (MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind);
6310 mp->mb_create_table_if_needed = create_table_if_needed;
6311 mp->mb_is_bind = is_bind;
6312 mp->mb_is_ip4 = is_ip4;
6313 mp->mb_ip_table_id = ntohl (ip_table_id);
6314 mp->mb_mpls_table_id = 0;
6315 mp->mb_label = ntohl (local_label);
6316 mp->mb_address_length = address_length;
6319 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
6321 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
6326 /* Wait for a reply... */
6331 api_proxy_arp_add_del (vat_main_t * vam)
6333 unformat_input_t *i = vam->input;
6334 vl_api_proxy_arp_add_del_t *mp;
6338 ip4_address_t lo, hi;
6341 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6343 if (unformat (i, "vrf %d", &vrf_id))
6345 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
6346 unformat_ip4_address, &hi))
6348 else if (unformat (i, "del"))
6352 clib_warning ("parse error '%U'", format_unformat_error, i);
6359 errmsg ("address range not set\n");
6363 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
6365 mp->vrf_id = ntohl (vrf_id);
6366 mp->is_add = is_add;
6367 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
6368 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
6377 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
6379 unformat_input_t *i = vam->input;
6380 vl_api_proxy_arp_intfc_enable_disable_t *mp;
6384 u8 sw_if_index_set = 0;
6386 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6388 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6389 sw_if_index_set = 1;
6390 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6391 sw_if_index_set = 1;
6392 else if (unformat (i, "enable"))
6394 else if (unformat (i, "disable"))
6398 clib_warning ("parse error '%U'", format_unformat_error, i);
6403 if (sw_if_index_set == 0)
6405 errmsg ("missing interface name or sw_if_index\n");
6409 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
6411 mp->sw_if_index = ntohl (sw_if_index);
6412 mp->enable_disable = enable;
6421 api_mpls_add_del_encap (vat_main_t * vam)
6423 unformat_input_t *i = vam->input;
6424 vl_api_mpls_add_del_encap_t *mp;
6429 ip4_address_t dst_address;
6432 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6434 if (unformat (i, "vrf %d", &vrf_id))
6436 else if (unformat (i, "label %d", &label))
6437 vec_add1 (labels, ntohl (label));
6438 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
6440 else if (unformat (i, "del"))
6444 clib_warning ("parse error '%U'", format_unformat_error, i);
6449 if (vec_len (labels) == 0)
6451 errmsg ("missing encap label stack\n");
6455 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
6456 sizeof (u32) * vec_len (labels));
6458 mp->vrf_id = ntohl (vrf_id);
6459 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
6460 mp->is_add = is_add;
6461 mp->nlabels = vec_len (labels);
6462 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
6473 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
6475 unformat_input_t *i = vam->input;
6476 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
6478 u32 inner_vrf_id = 0;
6479 ip4_address_t intfc_address;
6480 u8 dst_mac_address[6];
6483 u8 intfc_address_length = 0;
6487 int tx_sw_if_index_set = 0;
6489 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6491 if (unformat (i, "vrf %d", &inner_vrf_id))
6493 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6494 &intfc_address, &tmp))
6495 intfc_address_length = tmp;
6496 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
6497 tx_sw_if_index_set = 1;
6498 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6499 tx_sw_if_index_set = 1;
6500 else if (unformat (i, "dst %U", unformat_ethernet_address,
6503 else if (unformat (i, "l2-only"))
6505 else if (unformat (i, "del"))
6509 clib_warning ("parse error '%U'", format_unformat_error, i);
6516 errmsg ("dst (mac address) not set\n");
6519 if (!tx_sw_if_index_set)
6521 errmsg ("tx-intfc not set\n");
6525 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
6527 mp->vrf_id = ntohl (inner_vrf_id);
6528 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
6529 mp->adj_address_length = intfc_address_length;
6530 clib_memcpy (mp->dst_mac_address, dst_mac_address,
6531 sizeof (dst_mac_address));
6532 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6533 mp->l2_only = l2_only;
6534 mp->is_add = is_add;
6543 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
6545 unformat_input_t *i = vam->input;
6546 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
6548 u32 inner_vrf_id = 0;
6549 u32 outer_vrf_id = 0;
6550 ip4_address_t adj_address;
6551 int adj_address_set = 0;
6552 ip4_address_t next_hop_address;
6553 int next_hop_address_set = 0;
6555 u8 adj_address_length = 0;
6558 u32 resolve_attempts = 5;
6559 u8 resolve_if_needed = 1;
6561 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6563 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
6565 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
6567 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6568 &adj_address, &tmp))
6570 adj_address_length = tmp;
6571 adj_address_set = 1;
6573 else if (unformat (i, "next-hop %U", unformat_ip4_address,
6575 next_hop_address_set = 1;
6576 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
6578 else if (unformat (i, "resolve-if-needed %d", &tmp))
6579 resolve_if_needed = tmp;
6580 else if (unformat (i, "l2-only"))
6582 else if (unformat (i, "del"))
6586 clib_warning ("parse error '%U'", format_unformat_error, i);
6591 if (!adj_address_set)
6593 errmsg ("adjacency address/mask not set\n");
6596 if (!next_hop_address_set)
6598 errmsg ("ip4 next hop address (in outer fib) not set\n");
6602 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
6604 mp->inner_vrf_id = ntohl (inner_vrf_id);
6605 mp->outer_vrf_id = ntohl (outer_vrf_id);
6606 mp->resolve_attempts = ntohl (resolve_attempts);
6607 mp->resolve_if_needed = resolve_if_needed;
6608 mp->is_add = is_add;
6609 mp->l2_only = l2_only;
6610 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
6611 mp->adj_address_length = adj_address_length;
6612 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
6613 sizeof (next_hop_address));
6622 api_sw_interface_set_unnumbered (vat_main_t * vam)
6624 unformat_input_t *i = vam->input;
6625 vl_api_sw_interface_set_unnumbered_t *mp;
6628 u32 unnum_sw_index = ~0;
6630 u8 sw_if_index_set = 0;
6632 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6634 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6635 sw_if_index_set = 1;
6636 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6637 sw_if_index_set = 1;
6638 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
6640 else if (unformat (i, "del"))
6644 clib_warning ("parse error '%U'", format_unformat_error, i);
6649 if (sw_if_index_set == 0)
6651 errmsg ("missing interface name or sw_if_index\n");
6655 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
6657 mp->sw_if_index = ntohl (sw_if_index);
6658 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6659 mp->is_add = is_add;
6668 api_ip_neighbor_add_del (vat_main_t * vam)
6670 unformat_input_t *i = vam->input;
6671 vl_api_ip_neighbor_add_del_t *mp;
6674 u8 sw_if_index_set = 0;
6680 u8 v4_address_set = 0;
6681 u8 v6_address_set = 0;
6682 ip4_address_t v4address;
6683 ip6_address_t v6address;
6685 memset (mac_address, 0, sizeof (mac_address));
6687 /* Parse args required to build the message */
6688 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6690 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6694 else if (unformat (i, "del"))
6696 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6697 sw_if_index_set = 1;
6698 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6699 sw_if_index_set = 1;
6700 else if (unformat (i, "is_static"))
6702 else if (unformat (i, "vrf %d", &vrf_id))
6704 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6706 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6710 clib_warning ("parse error '%U'", format_unformat_error, i);
6715 if (sw_if_index_set == 0)
6717 errmsg ("missing interface name or sw_if_index\n");
6720 if (v4_address_set && v6_address_set)
6722 errmsg ("both v4 and v6 addresses set\n");
6725 if (!v4_address_set && !v6_address_set)
6727 errmsg ("no address set\n");
6731 /* Construct the API message */
6732 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6734 mp->sw_if_index = ntohl (sw_if_index);
6735 mp->is_add = is_add;
6736 mp->vrf_id = ntohl (vrf_id);
6737 mp->is_static = is_static;
6739 clib_memcpy (mp->mac_address, mac_address, 6);
6743 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6747 /* mp->is_ipv6 = 0; via memset in M macro above */
6748 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6754 /* Wait for a reply, return good/bad news */
6762 api_reset_vrf (vat_main_t * vam)
6764 unformat_input_t *i = vam->input;
6765 vl_api_reset_vrf_t *mp;
6771 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6773 if (unformat (i, "vrf %d", &vrf_id))
6775 else if (unformat (i, "ipv6"))
6779 clib_warning ("parse error '%U'", format_unformat_error, i);
6784 if (vrf_id_set == 0)
6786 errmsg ("missing vrf id\n");
6790 M (RESET_VRF, reset_vrf);
6792 mp->vrf_id = ntohl (vrf_id);
6793 mp->is_ipv6 = is_ipv6;
6802 api_create_vlan_subif (vat_main_t * vam)
6804 unformat_input_t *i = vam->input;
6805 vl_api_create_vlan_subif_t *mp;
6808 u8 sw_if_index_set = 0;
6812 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6814 if (unformat (i, "sw_if_index %d", &sw_if_index))
6815 sw_if_index_set = 1;
6816 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6817 sw_if_index_set = 1;
6818 else if (unformat (i, "vlan %d", &vlan_id))
6822 clib_warning ("parse error '%U'", format_unformat_error, i);
6827 if (sw_if_index_set == 0)
6829 errmsg ("missing interface name or sw_if_index\n");
6833 if (vlan_id_set == 0)
6835 errmsg ("missing vlan_id\n");
6838 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6840 mp->sw_if_index = ntohl (sw_if_index);
6841 mp->vlan_id = ntohl (vlan_id);
6849 #define foreach_create_subif_bit \
6856 _(outer_vlan_id_any) \
6857 _(inner_vlan_id_any)
6860 api_create_subif (vat_main_t * vam)
6862 unformat_input_t *i = vam->input;
6863 vl_api_create_subif_t *mp;
6866 u8 sw_if_index_set = 0;
6873 u32 exact_match = 0;
6874 u32 default_sub = 0;
6875 u32 outer_vlan_id_any = 0;
6876 u32 inner_vlan_id_any = 0;
6878 u16 outer_vlan_id = 0;
6879 u16 inner_vlan_id = 0;
6881 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6883 if (unformat (i, "sw_if_index %d", &sw_if_index))
6884 sw_if_index_set = 1;
6885 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6886 sw_if_index_set = 1;
6887 else if (unformat (i, "sub_id %d", &sub_id))
6889 else if (unformat (i, "outer_vlan_id %d", &tmp))
6890 outer_vlan_id = tmp;
6891 else if (unformat (i, "inner_vlan_id %d", &tmp))
6892 inner_vlan_id = tmp;
6894 #define _(a) else if (unformat (i, #a)) a = 1 ;
6895 foreach_create_subif_bit
6899 clib_warning ("parse error '%U'", format_unformat_error, i);
6904 if (sw_if_index_set == 0)
6906 errmsg ("missing interface name or sw_if_index\n");
6910 if (sub_id_set == 0)
6912 errmsg ("missing sub_id\n");
6915 M (CREATE_SUBIF, create_subif);
6917 mp->sw_if_index = ntohl (sw_if_index);
6918 mp->sub_id = ntohl (sub_id);
6920 #define _(a) mp->a = a;
6921 foreach_create_subif_bit;
6924 mp->outer_vlan_id = ntohs (outer_vlan_id);
6925 mp->inner_vlan_id = ntohs (inner_vlan_id);
6934 api_oam_add_del (vat_main_t * vam)
6936 unformat_input_t *i = vam->input;
6937 vl_api_oam_add_del_t *mp;
6941 ip4_address_t src, dst;
6945 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6947 if (unformat (i, "vrf %d", &vrf_id))
6949 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6951 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6953 else if (unformat (i, "del"))
6957 clib_warning ("parse error '%U'", format_unformat_error, i);
6964 errmsg ("missing src addr\n");
6970 errmsg ("missing dst addr\n");
6974 M (OAM_ADD_DEL, oam_add_del);
6976 mp->vrf_id = ntohl (vrf_id);
6977 mp->is_add = is_add;
6978 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6979 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6988 api_reset_fib (vat_main_t * vam)
6990 unformat_input_t *i = vam->input;
6991 vl_api_reset_fib_t *mp;
6997 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6999 if (unformat (i, "vrf %d", &vrf_id))
7001 else if (unformat (i, "ipv6"))
7005 clib_warning ("parse error '%U'", format_unformat_error, i);
7010 if (vrf_id_set == 0)
7012 errmsg ("missing vrf id\n");
7016 M (RESET_FIB, reset_fib);
7018 mp->vrf_id = ntohl (vrf_id);
7019 mp->is_ipv6 = is_ipv6;
7028 api_dhcp_proxy_config (vat_main_t * vam)
7030 unformat_input_t *i = vam->input;
7031 vl_api_dhcp_proxy_config_t *mp;
7036 u8 v4_address_set = 0;
7037 u8 v6_address_set = 0;
7038 ip4_address_t v4address;
7039 ip6_address_t v6address;
7040 u8 v4_src_address_set = 0;
7041 u8 v6_src_address_set = 0;
7042 ip4_address_t v4srcaddress;
7043 ip6_address_t v6srcaddress;
7045 /* Parse args required to build the message */
7046 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7048 if (unformat (i, "del"))
7050 else if (unformat (i, "vrf %d", &vrf_id))
7052 else if (unformat (i, "insert-cid %d", &insert_cid))
7054 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7056 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7058 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7059 v4_src_address_set = 1;
7060 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7061 v6_src_address_set = 1;
7066 if (v4_address_set && v6_address_set)
7068 errmsg ("both v4 and v6 server addresses set\n");
7071 if (!v4_address_set && !v6_address_set)
7073 errmsg ("no server addresses set\n");
7077 if (v4_src_address_set && v6_src_address_set)
7079 errmsg ("both v4 and v6 src addresses set\n");
7082 if (!v4_src_address_set && !v6_src_address_set)
7084 errmsg ("no src addresses set\n");
7088 if (!(v4_src_address_set && v4_address_set) &&
7089 !(v6_src_address_set && v6_address_set))
7091 errmsg ("no matching server and src addresses set\n");
7095 /* Construct the API message */
7096 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
7098 mp->insert_circuit_id = insert_cid;
7099 mp->is_add = is_add;
7100 mp->vrf_id = ntohl (vrf_id);
7104 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7105 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7109 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7110 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
7116 /* Wait for a reply, return good/bad news */
7123 api_dhcp_proxy_config_2 (vat_main_t * vam)
7125 unformat_input_t *i = vam->input;
7126 vl_api_dhcp_proxy_config_2_t *mp;
7129 u32 server_vrf_id = 0;
7132 u8 v4_address_set = 0;
7133 u8 v6_address_set = 0;
7134 ip4_address_t v4address;
7135 ip6_address_t v6address;
7136 u8 v4_src_address_set = 0;
7137 u8 v6_src_address_set = 0;
7138 ip4_address_t v4srcaddress;
7139 ip6_address_t v6srcaddress;
7141 /* Parse args required to build the message */
7142 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7144 if (unformat (i, "del"))
7146 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
7148 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
7150 else if (unformat (i, "insert-cid %d", &insert_cid))
7152 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7154 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7156 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7157 v4_src_address_set = 1;
7158 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7159 v6_src_address_set = 1;
7164 if (v4_address_set && v6_address_set)
7166 errmsg ("both v4 and v6 server addresses set\n");
7169 if (!v4_address_set && !v6_address_set)
7171 errmsg ("no server addresses set\n");
7175 if (v4_src_address_set && v6_src_address_set)
7177 errmsg ("both v4 and v6 src addresses set\n");
7180 if (!v4_src_address_set && !v6_src_address_set)
7182 errmsg ("no src addresses set\n");
7186 if (!(v4_src_address_set && v4_address_set) &&
7187 !(v6_src_address_set && v6_address_set))
7189 errmsg ("no matching server and src addresses set\n");
7193 /* Construct the API message */
7194 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
7196 mp->insert_circuit_id = insert_cid;
7197 mp->is_add = is_add;
7198 mp->rx_vrf_id = ntohl (rx_vrf_id);
7199 mp->server_vrf_id = ntohl (server_vrf_id);
7203 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7204 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7208 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7209 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
7215 /* Wait for a reply, return good/bad news */
7222 api_dhcp_proxy_set_vss (vat_main_t * vam)
7224 unformat_input_t *i = vam->input;
7225 vl_api_dhcp_proxy_set_vss_t *mp;
7236 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7238 if (unformat (i, "tbl_id %d", &tbl_id))
7240 if (unformat (i, "fib_id %d", &fib_id))
7242 if (unformat (i, "oui %d", &oui))
7244 else if (unformat (i, "ipv6"))
7246 else if (unformat (i, "del"))
7250 clib_warning ("parse error '%U'", format_unformat_error, i);
7255 if (tbl_id_set == 0)
7257 errmsg ("missing tbl id\n");
7261 if (fib_id_set == 0)
7263 errmsg ("missing fib id\n");
7268 errmsg ("missing oui\n");
7272 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
7273 mp->tbl_id = ntohl (tbl_id);
7274 mp->fib_id = ntohl (fib_id);
7275 mp->oui = ntohl (oui);
7276 mp->is_ipv6 = is_ipv6;
7277 mp->is_add = is_add;
7286 api_dhcp_client_config (vat_main_t * vam)
7288 unformat_input_t *i = vam->input;
7289 vl_api_dhcp_client_config_t *mp;
7292 u8 sw_if_index_set = 0;
7295 u8 disable_event = 0;
7297 /* Parse args required to build the message */
7298 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7300 if (unformat (i, "del"))
7302 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7303 sw_if_index_set = 1;
7304 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7305 sw_if_index_set = 1;
7306 else if (unformat (i, "hostname %s", &hostname))
7308 else if (unformat (i, "disable_event"))
7314 if (sw_if_index_set == 0)
7316 errmsg ("missing interface name or sw_if_index\n");
7320 if (vec_len (hostname) > 63)
7322 errmsg ("hostname too long\n");
7324 vec_add1 (hostname, 0);
7326 /* Construct the API message */
7327 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
7329 mp->sw_if_index = ntohl (sw_if_index);
7330 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
7331 vec_free (hostname);
7332 mp->is_add = is_add;
7333 mp->want_dhcp_event = disable_event ? 0 : 1;
7334 mp->pid = getpid ();
7339 /* Wait for a reply, return good/bad news */
7346 api_set_ip_flow_hash (vat_main_t * vam)
7348 unformat_input_t *i = vam->input;
7349 vl_api_set_ip_flow_hash_t *mp;
7361 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7363 if (unformat (i, "vrf %d", &vrf_id))
7365 else if (unformat (i, "ipv6"))
7367 else if (unformat (i, "src"))
7369 else if (unformat (i, "dst"))
7371 else if (unformat (i, "sport"))
7373 else if (unformat (i, "dport"))
7375 else if (unformat (i, "proto"))
7377 else if (unformat (i, "reverse"))
7382 clib_warning ("parse error '%U'", format_unformat_error, i);
7387 if (vrf_id_set == 0)
7389 errmsg ("missing vrf id\n");
7393 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
7399 mp->reverse = reverse;
7400 mp->vrf_id = ntohl (vrf_id);
7401 mp->is_ipv6 = is_ipv6;
7410 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
7412 unformat_input_t *i = vam->input;
7413 vl_api_sw_interface_ip6_enable_disable_t *mp;
7416 u8 sw_if_index_set = 0;
7419 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7421 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7422 sw_if_index_set = 1;
7423 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7424 sw_if_index_set = 1;
7425 else if (unformat (i, "enable"))
7427 else if (unformat (i, "disable"))
7431 clib_warning ("parse error '%U'", format_unformat_error, i);
7436 if (sw_if_index_set == 0)
7438 errmsg ("missing interface name or sw_if_index\n");
7442 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
7444 mp->sw_if_index = ntohl (sw_if_index);
7445 mp->enable = enable;
7454 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
7456 unformat_input_t *i = vam->input;
7457 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
7460 u8 sw_if_index_set = 0;
7461 u32 address_length = 0;
7462 u8 v6_address_set = 0;
7463 ip6_address_t v6address;
7465 /* Parse args required to build the message */
7466 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7468 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7469 sw_if_index_set = 1;
7470 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7471 sw_if_index_set = 1;
7472 else if (unformat (i, "%U/%d",
7473 unformat_ip6_address, &v6address, &address_length))
7479 if (sw_if_index_set == 0)
7481 errmsg ("missing interface name or sw_if_index\n");
7484 if (!v6_address_set)
7486 errmsg ("no address set\n");
7490 /* Construct the API message */
7491 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
7492 sw_interface_ip6_set_link_local_address);
7494 mp->sw_if_index = ntohl (sw_if_index);
7495 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7496 mp->address_length = address_length;
7501 /* Wait for a reply, return good/bad news */
7510 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
7512 unformat_input_t *i = vam->input;
7513 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
7516 u8 sw_if_index_set = 0;
7517 u32 address_length = 0;
7518 u8 v6_address_set = 0;
7519 ip6_address_t v6address;
7521 u8 no_advertise = 0;
7523 u8 no_autoconfig = 0;
7526 u32 val_lifetime = 0;
7527 u32 pref_lifetime = 0;
7529 /* Parse args required to build the message */
7530 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7532 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7533 sw_if_index_set = 1;
7534 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7535 sw_if_index_set = 1;
7536 else if (unformat (i, "%U/%d",
7537 unformat_ip6_address, &v6address, &address_length))
7539 else if (unformat (i, "val_life %d", &val_lifetime))
7541 else if (unformat (i, "pref_life %d", &pref_lifetime))
7543 else if (unformat (i, "def"))
7545 else if (unformat (i, "noadv"))
7547 else if (unformat (i, "offl"))
7549 else if (unformat (i, "noauto"))
7551 else if (unformat (i, "nolink"))
7553 else if (unformat (i, "isno"))
7557 clib_warning ("parse error '%U'", format_unformat_error, i);
7562 if (sw_if_index_set == 0)
7564 errmsg ("missing interface name or sw_if_index\n");
7567 if (!v6_address_set)
7569 errmsg ("no address set\n");
7573 /* Construct the API message */
7574 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
7576 mp->sw_if_index = ntohl (sw_if_index);
7577 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7578 mp->address_length = address_length;
7579 mp->use_default = use_default;
7580 mp->no_advertise = no_advertise;
7581 mp->off_link = off_link;
7582 mp->no_autoconfig = no_autoconfig;
7583 mp->no_onlink = no_onlink;
7585 mp->val_lifetime = ntohl (val_lifetime);
7586 mp->pref_lifetime = ntohl (pref_lifetime);
7591 /* Wait for a reply, return good/bad news */
7599 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
7601 unformat_input_t *i = vam->input;
7602 vl_api_sw_interface_ip6nd_ra_config_t *mp;
7605 u8 sw_if_index_set = 0;
7610 u8 send_unicast = 0;
7613 u8 default_router = 0;
7614 u32 max_interval = 0;
7615 u32 min_interval = 0;
7617 u32 initial_count = 0;
7618 u32 initial_interval = 0;
7621 /* Parse args required to build the message */
7622 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7624 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7625 sw_if_index_set = 1;
7626 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7627 sw_if_index_set = 1;
7628 else if (unformat (i, "maxint %d", &max_interval))
7630 else if (unformat (i, "minint %d", &min_interval))
7632 else if (unformat (i, "life %d", &lifetime))
7634 else if (unformat (i, "count %d", &initial_count))
7636 else if (unformat (i, "interval %d", &initial_interval))
7638 else if (unformat (i, "suppress") || unformat (i, "surpress"))
7640 else if (unformat (i, "managed"))
7642 else if (unformat (i, "other"))
7644 else if (unformat (i, "ll"))
7646 else if (unformat (i, "send"))
7648 else if (unformat (i, "cease"))
7650 else if (unformat (i, "isno"))
7652 else if (unformat (i, "def"))
7656 clib_warning ("parse error '%U'", format_unformat_error, i);
7661 if (sw_if_index_set == 0)
7663 errmsg ("missing interface name or sw_if_index\n");
7667 /* Construct the API message */
7668 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
7670 mp->sw_if_index = ntohl (sw_if_index);
7671 mp->max_interval = ntohl (max_interval);
7672 mp->min_interval = ntohl (min_interval);
7673 mp->lifetime = ntohl (lifetime);
7674 mp->initial_count = ntohl (initial_count);
7675 mp->initial_interval = ntohl (initial_interval);
7676 mp->suppress = suppress;
7677 mp->managed = managed;
7679 mp->ll_option = ll_option;
7680 mp->send_unicast = send_unicast;
7683 mp->default_router = default_router;
7688 /* Wait for a reply, return good/bad news */
7696 api_set_arp_neighbor_limit (vat_main_t * vam)
7698 unformat_input_t *i = vam->input;
7699 vl_api_set_arp_neighbor_limit_t *mp;
7705 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7707 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7709 else if (unformat (i, "ipv6"))
7713 clib_warning ("parse error '%U'", format_unformat_error, i);
7720 errmsg ("missing limit value\n");
7724 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
7726 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7727 mp->is_ipv6 = is_ipv6;
7736 api_l2_patch_add_del (vat_main_t * vam)
7738 unformat_input_t *i = vam->input;
7739 vl_api_l2_patch_add_del_t *mp;
7742 u8 rx_sw_if_index_set = 0;
7744 u8 tx_sw_if_index_set = 0;
7747 /* Parse args required to build the message */
7748 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7750 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7751 rx_sw_if_index_set = 1;
7752 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7753 tx_sw_if_index_set = 1;
7754 else if (unformat (i, "rx"))
7756 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7758 if (unformat (i, "%U", unformat_sw_if_index, vam,
7760 rx_sw_if_index_set = 1;
7765 else if (unformat (i, "tx"))
7767 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7769 if (unformat (i, "%U", unformat_sw_if_index, vam,
7771 tx_sw_if_index_set = 1;
7776 else if (unformat (i, "del"))
7782 if (rx_sw_if_index_set == 0)
7784 errmsg ("missing rx interface name or rx_sw_if_index\n");
7788 if (tx_sw_if_index_set == 0)
7790 errmsg ("missing tx interface name or tx_sw_if_index\n");
7794 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7796 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7797 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7798 mp->is_add = is_add;
7807 api_ioam_enable (vat_main_t * vam)
7809 unformat_input_t *input = vam->input;
7810 vl_api_ioam_enable_t *mp;
7813 int has_trace_option = 0;
7814 int has_pot_option = 0;
7815 int has_seqno_option = 0;
7816 int has_analyse_option = 0;
7818 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7820 if (unformat (input, "trace"))
7821 has_trace_option = 1;
7822 else if (unformat (input, "pot"))
7824 else if (unformat (input, "seqno"))
7825 has_seqno_option = 1;
7826 else if (unformat (input, "analyse"))
7827 has_analyse_option = 1;
7831 M (IOAM_ENABLE, ioam_enable);
7832 mp->id = htons (id);
7833 mp->seqno = has_seqno_option;
7834 mp->analyse = has_analyse_option;
7835 mp->pot_enable = has_pot_option;
7836 mp->trace_enable = has_trace_option;
7847 api_ioam_disable (vat_main_t * vam)
7849 vl_api_ioam_disable_t *mp;
7852 M (IOAM_DISABLE, ioam_disable);
7859 api_sr_tunnel_add_del (vat_main_t * vam)
7861 unformat_input_t *i = vam->input;
7862 vl_api_sr_tunnel_add_del_t *mp;
7866 ip6_address_t src_address;
7867 int src_address_set = 0;
7868 ip6_address_t dst_address;
7870 int dst_address_set = 0;
7872 u32 rx_table_id = 0;
7873 u32 tx_table_id = 0;
7874 ip6_address_t *segments = 0;
7875 ip6_address_t *this_seg;
7876 ip6_address_t *tags = 0;
7877 ip6_address_t *this_tag;
7878 ip6_address_t next_address, tag;
7880 u8 *policy_name = 0;
7882 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7884 if (unformat (i, "del"))
7886 else if (unformat (i, "name %s", &name))
7888 else if (unformat (i, "policy %s", &policy_name))
7890 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7892 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7894 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7895 src_address_set = 1;
7896 else if (unformat (i, "dst %U/%d",
7897 unformat_ip6_address, &dst_address, &dst_mask_width))
7898 dst_address_set = 1;
7899 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7901 vec_add2 (segments, this_seg, 1);
7902 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7903 sizeof (*this_seg));
7905 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7907 vec_add2 (tags, this_tag, 1);
7908 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7910 else if (unformat (i, "clean"))
7911 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7912 else if (unformat (i, "protected"))
7913 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7914 else if (unformat (i, "InPE %d", &pl_index))
7916 if (pl_index <= 0 || pl_index > 4)
7918 pl_index_range_error:
7919 errmsg ("pl index %d out of range\n", pl_index);
7923 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7925 else if (unformat (i, "EgPE %d", &pl_index))
7927 if (pl_index <= 0 || pl_index > 4)
7928 goto pl_index_range_error;
7930 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7932 else if (unformat (i, "OrgSrc %d", &pl_index))
7934 if (pl_index <= 0 || pl_index > 4)
7935 goto pl_index_range_error;
7937 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7943 if (!src_address_set)
7945 errmsg ("src address required\n");
7949 if (!dst_address_set)
7951 errmsg ("dst address required\n");
7957 errmsg ("at least one sr segment required\n");
7961 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7962 vec_len (segments) * sizeof (ip6_address_t)
7963 + vec_len (tags) * sizeof (ip6_address_t));
7965 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7966 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7967 mp->dst_mask_width = dst_mask_width;
7968 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7969 mp->n_segments = vec_len (segments);
7970 mp->n_tags = vec_len (tags);
7971 mp->is_add = is_del == 0;
7972 clib_memcpy (mp->segs_and_tags, segments,
7973 vec_len (segments) * sizeof (ip6_address_t));
7974 clib_memcpy (mp->segs_and_tags +
7975 vec_len (segments) * sizeof (ip6_address_t), tags,
7976 vec_len (tags) * sizeof (ip6_address_t));
7978 mp->outer_vrf_id = ntohl (rx_table_id);
7979 mp->inner_vrf_id = ntohl (tx_table_id);
7980 memcpy (mp->name, name, vec_len (name));
7981 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7983 vec_free (segments);
7992 api_sr_policy_add_del (vat_main_t * vam)
7994 unformat_input_t *input = vam->input;
7995 vl_api_sr_policy_add_del_t *mp;
7999 u8 *tunnel_name = 0;
8000 u8 **tunnel_names = 0;
8005 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
8006 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
8008 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8010 if (unformat (input, "del"))
8012 else if (unformat (input, "name %s", &name))
8014 else if (unformat (input, "tunnel %s", &tunnel_name))
8018 vec_add1 (tunnel_names, tunnel_name);
8020 - length = #bytes to store in serial vector
8021 - +1 = byte to store that length
8023 tunnel_names_length += (vec_len (tunnel_name) + 1);
8034 errmsg ("policy name required\n");
8038 if ((!tunnel_set) && (!is_del))
8040 errmsg ("tunnel name required\n");
8044 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
8048 mp->is_add = !is_del;
8050 memcpy (mp->name, name, vec_len (name));
8051 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
8052 u8 *serial_orig = 0;
8053 vec_validate (serial_orig, tunnel_names_length);
8054 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
8055 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
8057 for (j = 0; j < vec_len (tunnel_names); j++)
8059 tun_name_len = vec_len (tunnel_names[j]);
8060 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
8061 serial_orig += 1; // Move along one byte to store the actual tunnel name
8062 memcpy (serial_orig, tunnel_names[j], tun_name_len);
8063 serial_orig += tun_name_len; // Advance past the copy
8065 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
8067 vec_free (tunnel_names);
8068 vec_free (tunnel_name);
8076 api_sr_multicast_map_add_del (vat_main_t * vam)
8078 unformat_input_t *input = vam->input;
8079 vl_api_sr_multicast_map_add_del_t *mp;
8082 ip6_address_t multicast_address;
8083 u8 *policy_name = 0;
8084 int multicast_address_set = 0;
8086 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8088 if (unformat (input, "del"))
8092 (input, "address %U", unformat_ip6_address, &multicast_address))
8093 multicast_address_set = 1;
8094 else if (unformat (input, "sr-policy %s", &policy_name))
8100 if (!is_del && !policy_name)
8102 errmsg ("sr-policy name required\n");
8107 if (!multicast_address_set)
8109 errmsg ("address required\n");
8113 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
8115 mp->is_add = !is_del;
8116 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
8117 clib_memcpy (mp->multicast_address, &multicast_address,
8118 sizeof (mp->multicast_address));
8121 vec_free (policy_name);
8129 #define foreach_tcp_proto_field \
8133 #define foreach_udp_proto_field \
8137 #define foreach_ip4_proto_field \
8148 unformat_tcp_mask (unformat_input_t * input, va_list * args)
8150 u8 **maskp = va_arg (*args, u8 **);
8152 u8 found_something = 0;
8155 #define _(a) u8 a=0;
8156 foreach_tcp_proto_field;
8159 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8162 #define _(a) else if (unformat (input, #a)) a=1;
8163 foreach_tcp_proto_field
8169 #define _(a) found_something += a;
8170 foreach_tcp_proto_field;
8173 if (found_something == 0)
8176 vec_validate (mask, sizeof (*tcp) - 1);
8178 tcp = (tcp_header_t *) mask;
8180 #define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
8181 foreach_tcp_proto_field;
8189 unformat_udp_mask (unformat_input_t * input, va_list * args)
8191 u8 **maskp = va_arg (*args, u8 **);
8193 u8 found_something = 0;
8196 #define _(a) u8 a=0;
8197 foreach_udp_proto_field;
8200 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8203 #define _(a) else if (unformat (input, #a)) a=1;
8204 foreach_udp_proto_field
8210 #define _(a) found_something += a;
8211 foreach_udp_proto_field;
8214 if (found_something == 0)
8217 vec_validate (mask, sizeof (*udp) - 1);
8219 udp = (udp_header_t *) mask;
8221 #define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
8222 foreach_udp_proto_field;
8231 u16 src_port, dst_port;
8235 unformat_l4_mask (unformat_input_t * input, va_list * args)
8237 u8 **maskp = va_arg (*args, u8 **);
8238 u16 src_port = 0, dst_port = 0;
8239 tcpudp_header_t *tcpudp;
8241 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8243 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
8245 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
8247 else if (unformat (input, "src_port"))
8249 else if (unformat (input, "dst_port"))
8255 if (!src_port && !dst_port)
8259 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
8261 tcpudp = (tcpudp_header_t *) mask;
8262 tcpudp->src_port = src_port;
8263 tcpudp->dst_port = dst_port;
8271 unformat_ip4_mask (unformat_input_t * input, va_list * args)
8273 u8 **maskp = va_arg (*args, u8 **);
8275 u8 found_something = 0;
8278 #define _(a) u8 a=0;
8279 foreach_ip4_proto_field;
8285 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8287 if (unformat (input, "version"))
8289 else if (unformat (input, "hdr_length"))
8291 else if (unformat (input, "src"))
8293 else if (unformat (input, "dst"))
8295 else if (unformat (input, "proto"))
8298 #define _(a) else if (unformat (input, #a)) a=1;
8299 foreach_ip4_proto_field
8305 #define _(a) found_something += a;
8306 foreach_ip4_proto_field;
8309 if (found_something == 0)
8312 vec_validate (mask, sizeof (*ip) - 1);
8314 ip = (ip4_header_t *) mask;
8316 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8317 foreach_ip4_proto_field;
8320 ip->ip_version_and_header_length = 0;
8323 ip->ip_version_and_header_length |= 0xF0;
8326 ip->ip_version_and_header_length |= 0x0F;
8332 #define foreach_ip6_proto_field \
8340 unformat_ip6_mask (unformat_input_t * input, va_list * args)
8342 u8 **maskp = va_arg (*args, u8 **);
8344 u8 found_something = 0;
8346 u32 ip_version_traffic_class_and_flow_label;
8348 #define _(a) u8 a=0;
8349 foreach_ip6_proto_field;
8352 u8 traffic_class = 0;
8355 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8357 if (unformat (input, "version"))
8359 else if (unformat (input, "traffic-class"))
8361 else if (unformat (input, "flow-label"))
8363 else if (unformat (input, "src"))
8365 else if (unformat (input, "dst"))
8367 else if (unformat (input, "proto"))
8370 #define _(a) else if (unformat (input, #a)) a=1;
8371 foreach_ip6_proto_field
8377 #define _(a) found_something += a;
8378 foreach_ip6_proto_field;
8381 if (found_something == 0)
8384 vec_validate (mask, sizeof (*ip) - 1);
8386 ip = (ip6_header_t *) mask;
8388 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8389 foreach_ip6_proto_field;
8392 ip_version_traffic_class_and_flow_label = 0;
8395 ip_version_traffic_class_and_flow_label |= 0xF0000000;
8398 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
8401 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
8403 ip->ip_version_traffic_class_and_flow_label =
8404 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8411 unformat_l3_mask (unformat_input_t * input, va_list * args)
8413 u8 **maskp = va_arg (*args, u8 **);
8415 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8417 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
8419 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
8428 unformat_l2_mask (unformat_input_t * input, va_list * args)
8430 u8 **maskp = va_arg (*args, u8 **);
8445 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8447 if (unformat (input, "src"))
8449 else if (unformat (input, "dst"))
8451 else if (unformat (input, "proto"))
8453 else if (unformat (input, "tag1"))
8455 else if (unformat (input, "tag2"))
8457 else if (unformat (input, "ignore-tag1"))
8459 else if (unformat (input, "ignore-tag2"))
8461 else if (unformat (input, "cos1"))
8463 else if (unformat (input, "cos2"))
8465 else if (unformat (input, "dot1q"))
8467 else if (unformat (input, "dot1ad"))
8472 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
8473 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8476 if (tag1 || ignore_tag1 || cos1 || dot1q)
8478 if (tag2 || ignore_tag2 || cos2 || dot1ad)
8481 vec_validate (mask, len - 1);
8484 memset (mask, 0xff, 6);
8487 memset (mask + 6, 0xff, 6);
8491 /* inner vlan tag */
8500 mask[21] = mask[20] = 0xff;
8521 mask[16] = mask[17] = 0xff;
8531 mask[12] = mask[13] = 0xff;
8538 unformat_classify_mask (unformat_input_t * input, va_list * args)
8540 u8 **maskp = va_arg (*args, u8 **);
8541 u32 *skipp = va_arg (*args, u32 *);
8542 u32 *matchp = va_arg (*args, u32 *);
8550 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8552 if (unformat (input, "hex %U", unformat_hex_string, &mask))
8554 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
8556 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
8558 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
8572 if (mask || l2 || l3 || l4)
8576 /* "With a free Ethernet header in every package" */
8578 vec_validate (l2, 13);
8582 vec_append (mask, l3);
8587 vec_append (mask, l4);
8592 /* Scan forward looking for the first significant mask octet */
8593 for (i = 0; i < vec_len (mask); i++)
8597 /* compute (skip, match) params */
8598 *skipp = i / sizeof (u32x4);
8599 vec_delete (mask, *skipp * sizeof (u32x4), 0);
8601 /* Pad mask to an even multiple of the vector size */
8602 while (vec_len (mask) % sizeof (u32x4))
8605 match = vec_len (mask) / sizeof (u32x4);
8607 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
8609 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
8610 if (*tmp || *(tmp + 1))
8615 clib_warning ("BUG: match 0");
8617 _vec_len (mask) = match * sizeof (u32x4);
8628 #define foreach_l2_next \
8630 _(ethernet, ETHERNET_INPUT) \
8635 unformat_l2_next_index (unformat_input_t * input, va_list * args)
8637 u32 *miss_next_indexp = va_arg (*args, u32 *);
8642 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
8646 if (unformat (input, "%d", &tmp))
8655 *miss_next_indexp = next_index;
8659 #define foreach_ip_next \
8665 unformat_ip_next_index (unformat_input_t * input, va_list * args)
8667 u32 *miss_next_indexp = va_arg (*args, u32 *);
8672 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
8676 if (unformat (input, "%d", &tmp))
8685 *miss_next_indexp = next_index;
8689 #define foreach_acl_next \
8693 unformat_acl_next_index (unformat_input_t * input, va_list * args)
8695 u32 *miss_next_indexp = va_arg (*args, u32 *);
8700 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
8704 if (unformat (input, "permit"))
8709 else if (unformat (input, "%d", &tmp))
8718 *miss_next_indexp = next_index;
8723 unformat_policer_precolor (unformat_input_t * input, va_list * args)
8725 u32 *r = va_arg (*args, u32 *);
8727 if (unformat (input, "conform-color"))
8728 *r = POLICE_CONFORM;
8729 else if (unformat (input, "exceed-color"))
8738 api_classify_add_del_table (vat_main_t * vam)
8740 unformat_input_t *i = vam->input;
8741 vl_api_classify_add_del_table_t *mp;
8747 u32 table_index = ~0;
8748 u32 next_table_index = ~0;
8749 u32 miss_next_index = ~0;
8750 u32 memory_size = 32 << 20;
8754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8756 if (unformat (i, "del"))
8758 else if (unformat (i, "buckets %d", &nbuckets))
8760 else if (unformat (i, "memory_size %d", &memory_size))
8762 else if (unformat (i, "skip %d", &skip))
8764 else if (unformat (i, "match %d", &match))
8766 else if (unformat (i, "table %d", &table_index))
8768 else if (unformat (i, "mask %U", unformat_classify_mask,
8769 &mask, &skip, &match))
8771 else if (unformat (i, "next-table %d", &next_table_index))
8773 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8776 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8779 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8786 if (is_add && mask == 0)
8788 errmsg ("Mask required\n");
8792 if (is_add && skip == ~0)
8794 errmsg ("skip count required\n");
8798 if (is_add && match == ~0)
8800 errmsg ("match count required\n");
8804 if (!is_add && table_index == ~0)
8806 errmsg ("table index required for delete\n");
8810 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8812 mp->is_add = is_add;
8813 mp->table_index = ntohl (table_index);
8814 mp->nbuckets = ntohl (nbuckets);
8815 mp->memory_size = ntohl (memory_size);
8816 mp->skip_n_vectors = ntohl (skip);
8817 mp->match_n_vectors = ntohl (match);
8818 mp->next_table_index = ntohl (next_table_index);
8819 mp->miss_next_index = ntohl (miss_next_index);
8820 clib_memcpy (mp->mask, mask, vec_len (mask));
8830 unformat_l4_match (unformat_input_t * input, va_list * args)
8832 u8 **matchp = va_arg (*args, u8 **);
8834 u8 *proto_header = 0;
8840 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8842 if (unformat (input, "src_port %d", &src_port))
8844 else if (unformat (input, "dst_port %d", &dst_port))
8850 h.src_port = clib_host_to_net_u16 (src_port);
8851 h.dst_port = clib_host_to_net_u16 (dst_port);
8852 vec_validate (proto_header, sizeof (h) - 1);
8853 memcpy (proto_header, &h, sizeof (h));
8855 *matchp = proto_header;
8861 unformat_ip4_match (unformat_input_t * input, va_list * args)
8863 u8 **matchp = va_arg (*args, u8 **);
8870 int src = 0, dst = 0;
8871 ip4_address_t src_val, dst_val;
8878 int fragment_id = 0;
8879 u32 fragment_id_val;
8885 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8887 if (unformat (input, "version %d", &version_val))
8889 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8891 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8893 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8895 else if (unformat (input, "proto %d", &proto_val))
8897 else if (unformat (input, "tos %d", &tos_val))
8899 else if (unformat (input, "length %d", &length_val))
8901 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8903 else if (unformat (input, "ttl %d", &ttl_val))
8905 else if (unformat (input, "checksum %d", &checksum_val))
8911 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8912 + ttl + checksum == 0)
8916 * Aligned because we use the real comparison functions
8918 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8920 ip = (ip4_header_t *) match;
8922 /* These are realistically matched in practice */
8924 ip->src_address.as_u32 = src_val.as_u32;
8927 ip->dst_address.as_u32 = dst_val.as_u32;
8930 ip->protocol = proto_val;
8933 /* These are not, but they're included for completeness */
8935 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8938 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8944 ip->length = clib_host_to_net_u16 (length_val);
8950 ip->checksum = clib_host_to_net_u16 (checksum_val);
8957 unformat_ip6_match (unformat_input_t * input, va_list * args)
8959 u8 **matchp = va_arg (*args, u8 **);
8964 u8 traffic_class = 0;
8965 u32 traffic_class_val = 0;
8968 int src = 0, dst = 0;
8969 ip6_address_t src_val, dst_val;
8972 int payload_length = 0;
8973 u32 payload_length_val;
8976 u32 ip_version_traffic_class_and_flow_label;
8978 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8980 if (unformat (input, "version %d", &version_val))
8982 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8984 else if (unformat (input, "flow_label %d", &flow_label_val))
8986 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8988 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8990 else if (unformat (input, "proto %d", &proto_val))
8992 else if (unformat (input, "payload_length %d", &payload_length_val))
8994 else if (unformat (input, "hop_limit %d", &hop_limit_val))
9000 if (version + traffic_class + flow_label + src + dst + proto +
9001 payload_length + hop_limit == 0)
9005 * Aligned because we use the real comparison functions
9007 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
9009 ip = (ip6_header_t *) match;
9012 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
9015 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
9018 ip->protocol = proto_val;
9020 ip_version_traffic_class_and_flow_label = 0;
9023 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
9026 ip_version_traffic_class_and_flow_label |=
9027 (traffic_class_val & 0xFF) << 20;
9030 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
9032 ip->ip_version_traffic_class_and_flow_label =
9033 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
9036 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
9039 ip->hop_limit = hop_limit_val;
9046 unformat_l3_match (unformat_input_t * input, va_list * args)
9048 u8 **matchp = va_arg (*args, u8 **);
9050 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9052 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
9054 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
9063 unformat_vlan_tag (unformat_input_t * input, va_list * args)
9065 u8 *tagp = va_arg (*args, u8 *);
9068 if (unformat (input, "%d", &tag))
9070 tagp[0] = (tag >> 8) & 0x0F;
9071 tagp[1] = tag & 0xFF;
9079 unformat_l2_match (unformat_input_t * input, va_list * args)
9081 u8 **matchp = va_arg (*args, u8 **);
9101 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9103 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
9106 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
9108 else if (unformat (input, "proto %U",
9109 unformat_ethernet_type_host_byte_order, &proto_val))
9111 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
9113 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
9115 else if (unformat (input, "ignore-tag1"))
9117 else if (unformat (input, "ignore-tag2"))
9119 else if (unformat (input, "cos1 %d", &cos1_val))
9121 else if (unformat (input, "cos2 %d", &cos2_val))
9126 if ((src + dst + proto + tag1 + tag2 +
9127 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
9130 if (tag1 || ignore_tag1 || cos1)
9132 if (tag2 || ignore_tag2 || cos2)
9135 vec_validate_aligned (match, len - 1, sizeof (u32x4));
9138 clib_memcpy (match, dst_val, 6);
9141 clib_memcpy (match + 6, src_val, 6);
9145 /* inner vlan tag */
9146 match[19] = tag2_val[1];
9147 match[18] = tag2_val[0];
9149 match[18] |= (cos2_val & 0x7) << 5;
9152 match[21] = proto_val & 0xff;
9153 match[20] = proto_val >> 8;
9157 match[15] = tag1_val[1];
9158 match[14] = tag1_val[0];
9161 match[14] |= (cos1_val & 0x7) << 5;
9167 match[15] = tag1_val[1];
9168 match[14] = tag1_val[0];
9171 match[17] = proto_val & 0xff;
9172 match[16] = proto_val >> 8;
9175 match[14] |= (cos1_val & 0x7) << 5;
9181 match[18] |= (cos2_val & 0x7) << 5;
9183 match[14] |= (cos1_val & 0x7) << 5;
9186 match[13] = proto_val & 0xff;
9187 match[12] = proto_val >> 8;
9196 unformat_classify_match (unformat_input_t * input, va_list * args)
9198 u8 **matchp = va_arg (*args, u8 **);
9199 u32 skip_n_vectors = va_arg (*args, u32);
9200 u32 match_n_vectors = va_arg (*args, u32);
9207 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9209 if (unformat (input, "hex %U", unformat_hex_string, &match))
9211 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
9213 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
9215 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
9229 if (match || l2 || l3 || l4)
9233 /* "Win a free Ethernet header in every packet" */
9235 vec_validate_aligned (l2, 13, sizeof (u32x4));
9239 vec_append_aligned (match, l3, sizeof (u32x4));
9244 vec_append_aligned (match, l4, sizeof (u32x4));
9249 /* Make sure the vector is big enough even if key is all 0's */
9250 vec_validate_aligned
9251 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
9254 /* Set size, include skipped vectors */
9255 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
9266 api_classify_add_del_session (vat_main_t * vam)
9268 unformat_input_t *i = vam->input;
9269 vl_api_classify_add_del_session_t *mp;
9271 u32 table_index = ~0;
9272 u32 hit_next_index = ~0;
9273 u32 opaque_index = ~0;
9277 u32 skip_n_vectors = 0;
9278 u32 match_n_vectors = 0;
9281 * Warning: you have to supply skip_n and match_n
9282 * because the API client cant simply look at the classify
9286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9288 if (unformat (i, "del"))
9290 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
9293 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
9296 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
9299 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
9301 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
9303 else if (unformat (i, "opaque-index %d", &opaque_index))
9305 else if (unformat (i, "skip_n %d", &skip_n_vectors))
9307 else if (unformat (i, "match_n %d", &match_n_vectors))
9309 else if (unformat (i, "match %U", unformat_classify_match,
9310 &match, skip_n_vectors, match_n_vectors))
9312 else if (unformat (i, "advance %d", &advance))
9314 else if (unformat (i, "table-index %d", &table_index))
9320 if (table_index == ~0)
9322 errmsg ("Table index required\n");
9326 if (is_add && match == 0)
9328 errmsg ("Match value required\n");
9332 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
9334 mp->is_add = is_add;
9335 mp->table_index = ntohl (table_index);
9336 mp->hit_next_index = ntohl (hit_next_index);
9337 mp->opaque_index = ntohl (opaque_index);
9338 mp->advance = ntohl (advance);
9339 clib_memcpy (mp->match, match, vec_len (match));
9348 api_classify_set_interface_ip_table (vat_main_t * vam)
9350 unformat_input_t *i = vam->input;
9351 vl_api_classify_set_interface_ip_table_t *mp;
9354 int sw_if_index_set;
9355 u32 table_index = ~0;
9358 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9360 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9361 sw_if_index_set = 1;
9362 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9363 sw_if_index_set = 1;
9364 else if (unformat (i, "table %d", &table_index))
9368 clib_warning ("parse error '%U'", format_unformat_error, i);
9373 if (sw_if_index_set == 0)
9375 errmsg ("missing interface name or sw_if_index\n");
9380 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
9382 mp->sw_if_index = ntohl (sw_if_index);
9383 mp->table_index = ntohl (table_index);
9384 mp->is_ipv6 = is_ipv6;
9393 api_classify_set_interface_l2_tables (vat_main_t * vam)
9395 unformat_input_t *i = vam->input;
9396 vl_api_classify_set_interface_l2_tables_t *mp;
9399 int sw_if_index_set;
9400 u32 ip4_table_index = ~0;
9401 u32 ip6_table_index = ~0;
9402 u32 other_table_index = ~0;
9405 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9407 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9408 sw_if_index_set = 1;
9409 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9410 sw_if_index_set = 1;
9411 else if (unformat (i, "ip4-table %d", &ip4_table_index))
9413 else if (unformat (i, "ip6-table %d", &ip6_table_index))
9415 else if (unformat (i, "other-table %d", &other_table_index))
9417 else if (unformat (i, "is-input %d", &is_input))
9421 clib_warning ("parse error '%U'", format_unformat_error, i);
9426 if (sw_if_index_set == 0)
9428 errmsg ("missing interface name or sw_if_index\n");
9433 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
9435 mp->sw_if_index = ntohl (sw_if_index);
9436 mp->ip4_table_index = ntohl (ip4_table_index);
9437 mp->ip6_table_index = ntohl (ip6_table_index);
9438 mp->other_table_index = ntohl (other_table_index);
9439 mp->is_input = (u8) is_input;
9448 api_set_ipfix_exporter (vat_main_t * vam)
9450 unformat_input_t *i = vam->input;
9451 vl_api_set_ipfix_exporter_t *mp;
9452 ip4_address_t collector_address;
9453 u8 collector_address_set = 0;
9454 u32 collector_port = ~0;
9455 ip4_address_t src_address;
9456 u8 src_address_set = 0;
9459 u32 template_interval = ~0;
9460 u8 udp_checksum = 0;
9463 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9465 if (unformat (i, "collector_address %U", unformat_ip4_address,
9466 &collector_address))
9467 collector_address_set = 1;
9468 else if (unformat (i, "collector_port %d", &collector_port))
9470 else if (unformat (i, "src_address %U", unformat_ip4_address,
9472 src_address_set = 1;
9473 else if (unformat (i, "vrf_id %d", &vrf_id))
9475 else if (unformat (i, "path_mtu %d", &path_mtu))
9477 else if (unformat (i, "template_interval %d", &template_interval))
9479 else if (unformat (i, "udp_checksum"))
9485 if (collector_address_set == 0)
9487 errmsg ("collector_address required\n");
9491 if (src_address_set == 0)
9493 errmsg ("src_address required\n");
9497 M (SET_IPFIX_EXPORTER, set_ipfix_exporter);
9499 memcpy (mp->collector_address, collector_address.data,
9500 sizeof (collector_address.data));
9501 mp->collector_port = htons ((u16) collector_port);
9502 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
9503 mp->vrf_id = htonl (vrf_id);
9504 mp->path_mtu = htonl (path_mtu);
9505 mp->template_interval = htonl (template_interval);
9506 mp->udp_checksum = udp_checksum;
9514 api_set_ipfix_classify_stream (vat_main_t * vam)
9516 unformat_input_t *i = vam->input;
9517 vl_api_set_ipfix_classify_stream_t *mp;
9519 u32 src_port = UDP_DST_PORT_ipfix;
9522 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9524 if (unformat (i, "domain %d", &domain_id))
9526 else if (unformat (i, "src_port %d", &src_port))
9530 errmsg ("unknown input `%U'", format_unformat_error, i);
9535 M (SET_IPFIX_CLASSIFY_STREAM, set_ipfix_classify_stream);
9537 mp->domain_id = htonl (domain_id);
9538 mp->src_port = htons ((u16) src_port);
9546 api_ipfix_classify_table_add_del (vat_main_t * vam)
9548 unformat_input_t *i = vam->input;
9549 vl_api_ipfix_classify_table_add_del_t *mp;
9551 u32 classify_table_index = ~0;
9553 u8 transport_protocol = 255;
9556 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9558 if (unformat (i, "add"))
9560 else if (unformat (i, "del"))
9562 else if (unformat (i, "table %d", &classify_table_index))
9564 else if (unformat (i, "ip4"))
9566 else if (unformat (i, "ip6"))
9568 else if (unformat (i, "tcp"))
9569 transport_protocol = 6;
9570 else if (unformat (i, "udp"))
9571 transport_protocol = 17;
9574 errmsg ("unknown input `%U'", format_unformat_error, i);
9581 errmsg ("expecting: add|del");
9584 if (classify_table_index == ~0)
9586 errmsg ("classifier table not specified");
9589 if (ip_version == 0)
9591 errmsg ("IP version not specified");
9595 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, ipfix_classify_table_add_del);
9597 mp->is_add = is_add;
9598 mp->table_id = htonl (classify_table_index);
9599 mp->ip_version = ip_version;
9600 mp->transport_protocol = transport_protocol;
9608 api_get_node_index (vat_main_t * vam)
9610 unformat_input_t *i = vam->input;
9611 vl_api_get_node_index_t *mp;
9615 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9617 if (unformat (i, "node %s", &name))
9624 errmsg ("node name required\n");
9627 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9629 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9633 M (GET_NODE_INDEX, get_node_index);
9634 clib_memcpy (mp->node_name, name, vec_len (name));
9644 api_get_next_index (vat_main_t * vam)
9646 unformat_input_t *i = vam->input;
9647 vl_api_get_next_index_t *mp;
9649 u8 *node_name = 0, *next_node_name = 0;
9651 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9653 if (unformat (i, "node-name %s", &node_name))
9655 else if (unformat (i, "next-node-name %s", &next_node_name))
9661 errmsg ("node name required\n");
9664 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
9666 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9670 if (next_node_name == 0)
9672 errmsg ("next node name required\n");
9675 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
9677 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
9681 M (GET_NEXT_INDEX, get_next_index);
9682 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
9683 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
9684 vec_free (node_name);
9685 vec_free (next_node_name);
9694 api_add_node_next (vat_main_t * vam)
9696 unformat_input_t *i = vam->input;
9697 vl_api_add_node_next_t *mp;
9702 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9704 if (unformat (i, "node %s", &name))
9706 else if (unformat (i, "next %s", &next))
9713 errmsg ("node name required\n");
9716 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9718 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9723 errmsg ("next node required\n");
9726 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
9728 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
9732 M (ADD_NODE_NEXT, add_node_next);
9733 clib_memcpy (mp->node_name, name, vec_len (name));
9734 clib_memcpy (mp->next_name, next, vec_len (next));
9745 api_l2tpv3_create_tunnel (vat_main_t * vam)
9747 unformat_input_t *i = vam->input;
9748 ip6_address_t client_address, our_address;
9749 int client_address_set = 0;
9750 int our_address_set = 0;
9751 u32 local_session_id = 0;
9752 u32 remote_session_id = 0;
9753 u64 local_cookie = 0;
9754 u64 remote_cookie = 0;
9755 u8 l2_sublayer_present = 0;
9756 vl_api_l2tpv3_create_tunnel_t *mp;
9759 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9761 if (unformat (i, "client_address %U", unformat_ip6_address,
9763 client_address_set = 1;
9764 else if (unformat (i, "our_address %U", unformat_ip6_address,
9766 our_address_set = 1;
9767 else if (unformat (i, "local_session_id %d", &local_session_id))
9769 else if (unformat (i, "remote_session_id %d", &remote_session_id))
9771 else if (unformat (i, "local_cookie %lld", &local_cookie))
9773 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
9775 else if (unformat (i, "l2-sublayer-present"))
9776 l2_sublayer_present = 1;
9781 if (client_address_set == 0)
9783 errmsg ("client_address required\n");
9787 if (our_address_set == 0)
9789 errmsg ("our_address required\n");
9793 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
9795 clib_memcpy (mp->client_address, client_address.as_u8,
9796 sizeof (mp->client_address));
9798 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
9800 mp->local_session_id = ntohl (local_session_id);
9801 mp->remote_session_id = ntohl (remote_session_id);
9802 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
9803 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
9804 mp->l2_sublayer_present = l2_sublayer_present;
9814 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
9816 unformat_input_t *i = vam->input;
9818 u8 sw_if_index_set = 0;
9819 u64 new_local_cookie = 0;
9820 u64 new_remote_cookie = 0;
9821 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
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;
9830 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
9832 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
9838 if (sw_if_index_set == 0)
9840 errmsg ("missing interface name or sw_if_index\n");
9844 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
9846 mp->sw_if_index = ntohl (sw_if_index);
9847 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
9848 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
9857 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
9859 unformat_input_t *i = vam->input;
9860 vl_api_l2tpv3_interface_enable_disable_t *mp;
9863 u8 sw_if_index_set = 0;
9864 u8 enable_disable = 1;
9866 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9868 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9869 sw_if_index_set = 1;
9870 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9871 sw_if_index_set = 1;
9872 else if (unformat (i, "enable"))
9874 else if (unformat (i, "disable"))
9880 if (sw_if_index_set == 0)
9882 errmsg ("missing interface name or sw_if_index\n");
9886 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
9888 mp->sw_if_index = ntohl (sw_if_index);
9889 mp->enable_disable = enable_disable;
9898 api_l2tpv3_set_lookup_key (vat_main_t * vam)
9900 unformat_input_t *i = vam->input;
9901 vl_api_l2tpv3_set_lookup_key_t *mp;
9905 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9907 if (unformat (i, "lookup_v6_src"))
9908 key = L2T_LOOKUP_SRC_ADDRESS;
9909 else if (unformat (i, "lookup_v6_dst"))
9910 key = L2T_LOOKUP_DST_ADDRESS;
9911 else if (unformat (i, "lookup_session_id"))
9912 key = L2T_LOOKUP_SESSION_ID;
9917 if (key == (u8) ~ 0)
9919 errmsg ("l2tp session lookup key unset\n");
9923 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
9933 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
9934 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9936 vat_main_t *vam = &vat_main;
9938 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9939 format_ip6_address, mp->our_address,
9940 format_ip6_address, mp->client_address,
9941 clib_net_to_host_u32 (mp->sw_if_index));
9944 " local cookies %016llx %016llx remote cookie %016llx\n",
9945 clib_net_to_host_u64 (mp->local_cookie[0]),
9946 clib_net_to_host_u64 (mp->local_cookie[1]),
9947 clib_net_to_host_u64 (mp->remote_cookie));
9949 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9950 clib_net_to_host_u32 (mp->local_session_id),
9951 clib_net_to_host_u32 (mp->remote_session_id));
9953 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9954 mp->l2_sublayer_present ? "preset" : "absent");
9958 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9959 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9961 vat_main_t *vam = &vat_main;
9962 vat_json_node_t *node = NULL;
9963 struct in6_addr addr;
9965 if (VAT_JSON_ARRAY != vam->json_tree.type)
9967 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9968 vat_json_init_array (&vam->json_tree);
9970 node = vat_json_array_add (&vam->json_tree);
9972 vat_json_init_object (node);
9974 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9975 vat_json_object_add_ip6 (node, "our_address", addr);
9976 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9977 vat_json_object_add_ip6 (node, "client_address", addr);
9979 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9980 vat_json_init_array (lc);
9981 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9982 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9983 vat_json_object_add_uint (node, "remote_cookie",
9984 clib_net_to_host_u64 (mp->remote_cookie));
9986 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9987 vat_json_object_add_uint (node, "local_session_id",
9988 clib_net_to_host_u32 (mp->local_session_id));
9989 vat_json_object_add_uint (node, "remote_session_id",
9990 clib_net_to_host_u32 (mp->remote_session_id));
9991 vat_json_object_add_string_copy (node, "l2_sublayer",
9992 mp->l2_sublayer_present ? (u8 *) "present"
9997 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
9999 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
10002 /* Get list of l2tpv3-tunnel interfaces */
10003 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
10006 /* Use a control ping for synchronization */
10008 vl_api_control_ping_t *mp;
10009 M (CONTROL_PING, control_ping);
10016 static void vl_api_sw_interface_tap_details_t_handler
10017 (vl_api_sw_interface_tap_details_t * mp)
10019 vat_main_t *vam = &vat_main;
10021 fformat (vam->ofp, "%-16s %d\n",
10022 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
10025 static void vl_api_sw_interface_tap_details_t_handler_json
10026 (vl_api_sw_interface_tap_details_t * mp)
10028 vat_main_t *vam = &vat_main;
10029 vat_json_node_t *node = NULL;
10031 if (VAT_JSON_ARRAY != vam->json_tree.type)
10033 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10034 vat_json_init_array (&vam->json_tree);
10036 node = vat_json_array_add (&vam->json_tree);
10038 vat_json_init_object (node);
10039 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10040 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
10044 api_sw_interface_tap_dump (vat_main_t * vam)
10046 vl_api_sw_interface_tap_dump_t *mp;
10049 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
10050 /* Get list of tap interfaces */
10051 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
10054 /* Use a control ping for synchronization */
10056 vl_api_control_ping_t *mp;
10057 M (CONTROL_PING, control_ping);
10063 static uword unformat_vxlan_decap_next
10064 (unformat_input_t * input, va_list * args)
10066 u32 *result = va_arg (*args, u32 *);
10069 if (unformat (input, "l2"))
10070 *result = VXLAN_INPUT_NEXT_L2_INPUT;
10071 else if (unformat (input, "%d", &tmp))
10079 api_vxlan_add_del_tunnel (vat_main_t * vam)
10081 unformat_input_t *line_input = vam->input;
10082 vl_api_vxlan_add_del_tunnel_t *mp;
10084 ip4_address_t src4, dst4;
10085 ip6_address_t src6, dst6;
10087 u8 ipv4_set = 0, ipv6_set = 0;
10090 u32 encap_vrf_id = 0;
10091 u32 decap_next_index = ~0;
10094 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10096 if (unformat (line_input, "del"))
10098 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10103 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10108 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
10113 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
10118 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10120 else if (unformat (line_input, "decap-next %U",
10121 unformat_vxlan_decap_next, &decap_next_index))
10123 else if (unformat (line_input, "vni %d", &vni))
10127 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10134 errmsg ("tunnel src address not specified\n");
10139 errmsg ("tunnel dst address not specified\n");
10143 if (ipv4_set && ipv6_set)
10145 errmsg ("both IPv4 and IPv6 addresses specified");
10149 if ((vni == 0) || (vni >> 24))
10151 errmsg ("vni not specified or out of range\n");
10155 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
10159 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
10160 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
10164 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10165 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10167 mp->encap_vrf_id = ntohl (encap_vrf_id);
10168 mp->decap_next_index = ntohl (decap_next_index);
10169 mp->vni = ntohl (vni);
10170 mp->is_add = is_add;
10171 mp->is_ipv6 = ipv6_set;
10179 static void vl_api_vxlan_tunnel_details_t_handler
10180 (vl_api_vxlan_tunnel_details_t * mp)
10182 vat_main_t *vam = &vat_main;
10184 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
10185 ntohl (mp->sw_if_index),
10186 format_ip46_address, &(mp->src_address[0]),
10188 format_ip46_address, &(mp->dst_address[0]),
10190 ntohl (mp->encap_vrf_id),
10191 ntohl (mp->decap_next_index), ntohl (mp->vni));
10194 static void vl_api_vxlan_tunnel_details_t_handler_json
10195 (vl_api_vxlan_tunnel_details_t * mp)
10197 vat_main_t *vam = &vat_main;
10198 vat_json_node_t *node = NULL;
10199 struct in_addr ip4;
10200 struct in6_addr ip6;
10202 if (VAT_JSON_ARRAY != vam->json_tree.type)
10204 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10205 vat_json_init_array (&vam->json_tree);
10207 node = vat_json_array_add (&vam->json_tree);
10209 vat_json_init_object (node);
10210 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10213 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
10214 vat_json_object_add_ip6 (node, "src_address", ip6);
10215 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
10216 vat_json_object_add_ip6 (node, "dst_address", ip6);
10220 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
10221 vat_json_object_add_ip4 (node, "src_address", ip4);
10222 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
10223 vat_json_object_add_ip4 (node, "dst_address", ip4);
10225 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10226 vat_json_object_add_uint (node, "decap_next_index",
10227 ntohl (mp->decap_next_index));
10228 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10229 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10233 api_vxlan_tunnel_dump (vat_main_t * vam)
10235 unformat_input_t *i = vam->input;
10236 vl_api_vxlan_tunnel_dump_t *mp;
10239 u8 sw_if_index_set = 0;
10241 /* Parse args required to build the message */
10242 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10244 if (unformat (i, "sw_if_index %d", &sw_if_index))
10245 sw_if_index_set = 1;
10250 if (sw_if_index_set == 0)
10255 if (!vam->json_output)
10257 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
10258 "sw_if_index", "src_address", "dst_address",
10259 "encap_vrf_id", "decap_next_index", "vni");
10262 /* Get list of vxlan-tunnel interfaces */
10263 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
10265 mp->sw_if_index = htonl (sw_if_index);
10269 /* Use a control ping for synchronization */
10271 vl_api_control_ping_t *mp;
10272 M (CONTROL_PING, control_ping);
10279 api_gre_add_del_tunnel (vat_main_t * vam)
10281 unformat_input_t *line_input = vam->input;
10282 vl_api_gre_add_del_tunnel_t *mp;
10284 ip4_address_t src4, dst4;
10289 u32 outer_fib_id = 0;
10291 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10293 if (unformat (line_input, "del"))
10295 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10297 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10299 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
10301 else if (unformat (line_input, "teb"))
10305 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10312 errmsg ("tunnel src address not specified\n");
10317 errmsg ("tunnel dst address not specified\n");
10322 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
10324 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10325 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10326 mp->outer_fib_id = ntohl (outer_fib_id);
10327 mp->is_add = is_add;
10336 static void vl_api_gre_tunnel_details_t_handler
10337 (vl_api_gre_tunnel_details_t * mp)
10339 vat_main_t *vam = &vat_main;
10341 fformat (vam->ofp, "%11d%15U%15U%6d%14d\n",
10342 ntohl (mp->sw_if_index),
10343 format_ip4_address, &mp->src_address,
10344 format_ip4_address, &mp->dst_address,
10345 mp->teb, ntohl (mp->outer_fib_id));
10348 static void vl_api_gre_tunnel_details_t_handler_json
10349 (vl_api_gre_tunnel_details_t * mp)
10351 vat_main_t *vam = &vat_main;
10352 vat_json_node_t *node = NULL;
10353 struct in_addr ip4;
10355 if (VAT_JSON_ARRAY != vam->json_tree.type)
10357 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10358 vat_json_init_array (&vam->json_tree);
10360 node = vat_json_array_add (&vam->json_tree);
10362 vat_json_init_object (node);
10363 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10364 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
10365 vat_json_object_add_ip4 (node, "src_address", ip4);
10366 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
10367 vat_json_object_add_ip4 (node, "dst_address", ip4);
10368 vat_json_object_add_uint (node, "teb", mp->teb);
10369 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
10373 api_gre_tunnel_dump (vat_main_t * vam)
10375 unformat_input_t *i = vam->input;
10376 vl_api_gre_tunnel_dump_t *mp;
10379 u8 sw_if_index_set = 0;
10381 /* Parse args required to build the message */
10382 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10384 if (unformat (i, "sw_if_index %d", &sw_if_index))
10385 sw_if_index_set = 1;
10390 if (sw_if_index_set == 0)
10395 if (!vam->json_output)
10397 fformat (vam->ofp, "%11s%15s%15s%6s%14s\n",
10398 "sw_if_index", "src_address", "dst_address", "teb",
10402 /* Get list of gre-tunnel interfaces */
10403 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
10405 mp->sw_if_index = htonl (sw_if_index);
10409 /* Use a control ping for synchronization */
10411 vl_api_control_ping_t *mp;
10412 M (CONTROL_PING, control_ping);
10419 api_l2_fib_clear_table (vat_main_t * vam)
10421 // unformat_input_t * i = vam->input;
10422 vl_api_l2_fib_clear_table_t *mp;
10425 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
10434 api_l2_interface_efp_filter (vat_main_t * vam)
10436 unformat_input_t *i = vam->input;
10437 vl_api_l2_interface_efp_filter_t *mp;
10441 u8 sw_if_index_set = 0;
10443 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10445 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10446 sw_if_index_set = 1;
10447 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10448 sw_if_index_set = 1;
10449 else if (unformat (i, "enable"))
10451 else if (unformat (i, "disable"))
10455 clib_warning ("parse error '%U'", format_unformat_error, i);
10460 if (sw_if_index_set == 0)
10462 errmsg ("missing sw_if_index\n");
10466 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
10468 mp->sw_if_index = ntohl (sw_if_index);
10469 mp->enable_disable = enable;
10477 #define foreach_vtr_op \
10478 _("disable", L2_VTR_DISABLED) \
10479 _("push-1", L2_VTR_PUSH_1) \
10480 _("push-2", L2_VTR_PUSH_2) \
10481 _("pop-1", L2_VTR_POP_1) \
10482 _("pop-2", L2_VTR_POP_2) \
10483 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
10484 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
10485 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
10486 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
10489 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
10491 unformat_input_t *i = vam->input;
10492 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
10495 u8 sw_if_index_set = 0;
10498 u32 push_dot1q = 1;
10502 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10504 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10505 sw_if_index_set = 1;
10506 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10507 sw_if_index_set = 1;
10508 else if (unformat (i, "vtr_op %d", &vtr_op))
10510 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
10513 else if (unformat (i, "push_dot1q %d", &push_dot1q))
10515 else if (unformat (i, "tag1 %d", &tag1))
10517 else if (unformat (i, "tag2 %d", &tag2))
10521 clib_warning ("parse error '%U'", format_unformat_error, i);
10526 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
10528 errmsg ("missing vtr operation or sw_if_index\n");
10532 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
10533 mp->sw_if_index = ntohl (sw_if_index);
10534 mp->vtr_op = ntohl (vtr_op);
10535 mp->push_dot1q = ntohl (push_dot1q);
10536 mp->tag1 = ntohl (tag1);
10537 mp->tag2 = ntohl (tag2);
10546 api_create_vhost_user_if (vat_main_t * vam)
10548 unformat_input_t *i = vam->input;
10549 vl_api_create_vhost_user_if_t *mp;
10553 u8 file_name_set = 0;
10554 u32 custom_dev_instance = ~0;
10556 u8 use_custom_mac = 0;
10558 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10560 if (unformat (i, "socket %s", &file_name))
10564 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10566 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
10567 use_custom_mac = 1;
10568 else if (unformat (i, "server"))
10574 if (file_name_set == 0)
10576 errmsg ("missing socket file name\n");
10580 if (vec_len (file_name) > 255)
10582 errmsg ("socket file name too long\n");
10585 vec_add1 (file_name, 0);
10587 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
10589 mp->is_server = is_server;
10590 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10591 vec_free (file_name);
10592 if (custom_dev_instance != ~0)
10595 mp->custom_dev_instance = ntohl (custom_dev_instance);
10597 mp->use_custom_mac = use_custom_mac;
10598 clib_memcpy (mp->mac_address, hwaddr, 6);
10607 api_modify_vhost_user_if (vat_main_t * vam)
10609 unformat_input_t *i = vam->input;
10610 vl_api_modify_vhost_user_if_t *mp;
10614 u8 file_name_set = 0;
10615 u32 custom_dev_instance = ~0;
10616 u8 sw_if_index_set = 0;
10617 u32 sw_if_index = (u32) ~ 0;
10619 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10621 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10622 sw_if_index_set = 1;
10623 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10624 sw_if_index_set = 1;
10625 else if (unformat (i, "socket %s", &file_name))
10629 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10631 else if (unformat (i, "server"))
10637 if (sw_if_index_set == 0)
10639 errmsg ("missing sw_if_index or interface name\n");
10643 if (file_name_set == 0)
10645 errmsg ("missing socket file name\n");
10649 if (vec_len (file_name) > 255)
10651 errmsg ("socket file name too long\n");
10654 vec_add1 (file_name, 0);
10656 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
10658 mp->sw_if_index = ntohl (sw_if_index);
10659 mp->is_server = is_server;
10660 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10661 vec_free (file_name);
10662 if (custom_dev_instance != ~0)
10665 mp->custom_dev_instance = ntohl (custom_dev_instance);
10675 api_delete_vhost_user_if (vat_main_t * vam)
10677 unformat_input_t *i = vam->input;
10678 vl_api_delete_vhost_user_if_t *mp;
10680 u32 sw_if_index = ~0;
10681 u8 sw_if_index_set = 0;
10683 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10685 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10686 sw_if_index_set = 1;
10687 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10688 sw_if_index_set = 1;
10693 if (sw_if_index_set == 0)
10695 errmsg ("missing sw_if_index or interface name\n");
10700 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
10702 mp->sw_if_index = ntohl (sw_if_index);
10710 static void vl_api_sw_interface_vhost_user_details_t_handler
10711 (vl_api_sw_interface_vhost_user_details_t * mp)
10713 vat_main_t *vam = &vat_main;
10715 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
10716 (char *) mp->interface_name,
10717 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
10718 clib_net_to_host_u64 (mp->features), mp->is_server,
10719 ntohl (mp->num_regions), (char *) mp->sock_filename);
10720 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
10723 static void vl_api_sw_interface_vhost_user_details_t_handler_json
10724 (vl_api_sw_interface_vhost_user_details_t * mp)
10726 vat_main_t *vam = &vat_main;
10727 vat_json_node_t *node = NULL;
10729 if (VAT_JSON_ARRAY != vam->json_tree.type)
10731 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10732 vat_json_init_array (&vam->json_tree);
10734 node = vat_json_array_add (&vam->json_tree);
10736 vat_json_init_object (node);
10737 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10738 vat_json_object_add_string_copy (node, "interface_name",
10739 mp->interface_name);
10740 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
10741 ntohl (mp->virtio_net_hdr_sz));
10742 vat_json_object_add_uint (node, "features",
10743 clib_net_to_host_u64 (mp->features));
10744 vat_json_object_add_uint (node, "is_server", mp->is_server);
10745 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
10746 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
10747 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
10751 api_sw_interface_vhost_user_dump (vat_main_t * vam)
10753 vl_api_sw_interface_vhost_user_dump_t *mp;
10756 "Interface name idx hdr_sz features server regions filename\n");
10758 /* Get list of vhost-user interfaces */
10759 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
10762 /* Use a control ping for synchronization */
10764 vl_api_control_ping_t *mp;
10765 M (CONTROL_PING, control_ping);
10772 api_show_version (vat_main_t * vam)
10774 vl_api_show_version_t *mp;
10777 M (SHOW_VERSION, show_version);
10787 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
10789 unformat_input_t *line_input = vam->input;
10790 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
10792 ip4_address_t local4, remote4;
10793 ip6_address_t local6, remote6;
10795 u8 ipv4_set = 0, ipv6_set = 0;
10798 u32 encap_vrf_id = 0;
10799 u32 decap_vrf_id = 0;
10804 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10806 if (unformat (line_input, "del"))
10808 else if (unformat (line_input, "local %U",
10809 unformat_ip4_address, &local4))
10814 else if (unformat (line_input, "remote %U",
10815 unformat_ip4_address, &remote4))
10820 else if (unformat (line_input, "local %U",
10821 unformat_ip6_address, &local6))
10826 else if (unformat (line_input, "remote %U",
10827 unformat_ip6_address, &remote6))
10832 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10834 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
10836 else if (unformat (line_input, "vni %d", &vni))
10838 else if (unformat (line_input, "next-ip4"))
10840 else if (unformat (line_input, "next-ip6"))
10842 else if (unformat (line_input, "next-ethernet"))
10844 else if (unformat (line_input, "next-nsh"))
10848 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10853 if (local_set == 0)
10855 errmsg ("tunnel local address not specified\n");
10858 if (remote_set == 0)
10860 errmsg ("tunnel remote address not specified\n");
10863 if (ipv4_set && ipv6_set)
10865 errmsg ("both IPv4 and IPv6 addresses specified");
10871 errmsg ("vni not specified\n");
10875 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
10880 clib_memcpy (&mp->local, &local6, sizeof (local6));
10881 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10885 clib_memcpy (&mp->local, &local4, sizeof (local4));
10886 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
10889 mp->encap_vrf_id = ntohl (encap_vrf_id);
10890 mp->decap_vrf_id = ntohl (decap_vrf_id);
10891 mp->protocol = ntohl (protocol);
10892 mp->vni = ntohl (vni);
10893 mp->is_add = is_add;
10894 mp->is_ipv6 = ipv6_set;
10902 static void vl_api_vxlan_gpe_tunnel_details_t_handler
10903 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10905 vat_main_t *vam = &vat_main;
10907 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10908 ntohl (mp->sw_if_index),
10909 format_ip46_address, &(mp->local[0]),
10910 format_ip46_address, &(mp->remote[0]),
10912 ntohl (mp->protocol),
10913 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
10916 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
10917 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10919 vat_main_t *vam = &vat_main;
10920 vat_json_node_t *node = NULL;
10921 struct in_addr ip4;
10922 struct in6_addr ip6;
10924 if (VAT_JSON_ARRAY != vam->json_tree.type)
10926 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10927 vat_json_init_array (&vam->json_tree);
10929 node = vat_json_array_add (&vam->json_tree);
10931 vat_json_init_object (node);
10932 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10935 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10936 vat_json_object_add_ip6 (node, "local", ip6);
10937 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10938 vat_json_object_add_ip6 (node, "remote", ip6);
10942 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10943 vat_json_object_add_ip4 (node, "local", ip4);
10944 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10945 vat_json_object_add_ip4 (node, "remote", ip4);
10947 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10948 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10949 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10950 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10951 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10955 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10957 unformat_input_t *i = vam->input;
10958 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10961 u8 sw_if_index_set = 0;
10963 /* Parse args required to build the message */
10964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10966 if (unformat (i, "sw_if_index %d", &sw_if_index))
10967 sw_if_index_set = 1;
10972 if (sw_if_index_set == 0)
10977 if (!vam->json_output)
10979 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10980 "sw_if_index", "local", "remote", "vni",
10981 "protocol", "encap_vrf_id", "decap_vrf_id");
10984 /* Get list of vxlan-tunnel interfaces */
10985 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10987 mp->sw_if_index = htonl (sw_if_index);
10991 /* Use a control ping for synchronization */
10993 vl_api_control_ping_t *mp;
10994 M (CONTROL_PING, control_ping);
11001 format_l2_fib_mac_address (u8 * s, va_list * args)
11003 u8 *a = va_arg (*args, u8 *);
11005 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
11006 a[2], a[3], a[4], a[5], a[6], a[7]);
11009 static void vl_api_l2_fib_table_entry_t_handler
11010 (vl_api_l2_fib_table_entry_t * mp)
11012 vat_main_t *vam = &vat_main;
11014 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
11016 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
11017 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
11021 static void vl_api_l2_fib_table_entry_t_handler_json
11022 (vl_api_l2_fib_table_entry_t * mp)
11024 vat_main_t *vam = &vat_main;
11025 vat_json_node_t *node = NULL;
11027 if (VAT_JSON_ARRAY != vam->json_tree.type)
11029 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11030 vat_json_init_array (&vam->json_tree);
11032 node = vat_json_array_add (&vam->json_tree);
11034 vat_json_init_object (node);
11035 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
11036 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
11037 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11038 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
11039 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
11040 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
11044 api_l2_fib_table_dump (vat_main_t * vam)
11046 unformat_input_t *i = vam->input;
11047 vl_api_l2_fib_table_dump_t *mp;
11052 /* Parse args required to build the message */
11053 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11055 if (unformat (i, "bd_id %d", &bd_id))
11061 if (bd_id_set == 0)
11063 errmsg ("missing bridge domain\n");
11068 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
11070 /* Get list of l2 fib entries */
11071 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
11073 mp->bd_id = ntohl (bd_id);
11076 /* Use a control ping for synchronization */
11078 vl_api_control_ping_t *mp;
11079 M (CONTROL_PING, control_ping);
11087 api_interface_name_renumber (vat_main_t * vam)
11089 unformat_input_t *line_input = vam->input;
11090 vl_api_interface_name_renumber_t *mp;
11091 u32 sw_if_index = ~0;
11093 u32 new_show_dev_instance = ~0;
11095 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11097 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
11100 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11102 else if (unformat (line_input, "new_show_dev_instance %d",
11103 &new_show_dev_instance))
11109 if (sw_if_index == ~0)
11111 errmsg ("missing interface name or sw_if_index\n");
11115 if (new_show_dev_instance == ~0)
11117 errmsg ("missing new_show_dev_instance\n");
11121 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
11123 mp->sw_if_index = ntohl (sw_if_index);
11124 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
11131 api_want_ip4_arp_events (vat_main_t * vam)
11133 unformat_input_t *line_input = vam->input;
11134 vl_api_want_ip4_arp_events_t *mp;
11136 ip4_address_t address;
11137 int address_set = 0;
11138 u32 enable_disable = 1;
11140 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11142 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
11144 else if (unformat (line_input, "del"))
11145 enable_disable = 0;
11150 if (address_set == 0)
11152 errmsg ("missing addresses\n");
11156 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
11157 mp->enable_disable = enable_disable;
11158 mp->pid = getpid ();
11159 mp->address = address.as_u32;
11166 api_want_ip6_nd_events (vat_main_t * vam)
11168 unformat_input_t *line_input = vam->input;
11169 vl_api_want_ip6_nd_events_t *mp;
11171 ip6_address_t address;
11172 int address_set = 0;
11173 u32 enable_disable = 1;
11175 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11177 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
11179 else if (unformat (line_input, "del"))
11180 enable_disable = 0;
11185 if (address_set == 0)
11187 errmsg ("missing addresses\n");
11191 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
11192 mp->enable_disable = enable_disable;
11193 mp->pid = getpid ();
11194 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
11201 api_input_acl_set_interface (vat_main_t * vam)
11203 unformat_input_t *i = vam->input;
11204 vl_api_input_acl_set_interface_t *mp;
11207 int sw_if_index_set;
11208 u32 ip4_table_index = ~0;
11209 u32 ip6_table_index = ~0;
11210 u32 l2_table_index = ~0;
11213 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11215 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11216 sw_if_index_set = 1;
11217 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11218 sw_if_index_set = 1;
11219 else if (unformat (i, "del"))
11221 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11223 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11225 else if (unformat (i, "l2-table %d", &l2_table_index))
11229 clib_warning ("parse error '%U'", format_unformat_error, i);
11234 if (sw_if_index_set == 0)
11236 errmsg ("missing interface name or sw_if_index\n");
11240 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
11242 mp->sw_if_index = ntohl (sw_if_index);
11243 mp->ip4_table_index = ntohl (ip4_table_index);
11244 mp->ip6_table_index = ntohl (ip6_table_index);
11245 mp->l2_table_index = ntohl (l2_table_index);
11246 mp->is_add = is_add;
11255 api_ip_address_dump (vat_main_t * vam)
11257 unformat_input_t *i = vam->input;
11258 vl_api_ip_address_dump_t *mp;
11259 u32 sw_if_index = ~0;
11260 u8 sw_if_index_set = 0;
11265 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11267 if (unformat (i, "sw_if_index %d", &sw_if_index))
11268 sw_if_index_set = 1;
11269 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11270 sw_if_index_set = 1;
11271 else if (unformat (i, "ipv4"))
11273 else if (unformat (i, "ipv6"))
11279 if (ipv4_set && ipv6_set)
11281 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11285 if ((!ipv4_set) && (!ipv6_set))
11287 errmsg ("no ipv4 nor ipv6 flag set\n");
11291 if (sw_if_index_set == 0)
11293 errmsg ("missing interface name or sw_if_index\n");
11297 vam->current_sw_if_index = sw_if_index;
11298 vam->is_ipv6 = ipv6_set;
11300 M (IP_ADDRESS_DUMP, ip_address_dump);
11301 mp->sw_if_index = ntohl (sw_if_index);
11302 mp->is_ipv6 = ipv6_set;
11305 /* Use a control ping for synchronization */
11307 vl_api_control_ping_t *mp;
11308 M (CONTROL_PING, control_ping);
11315 api_ip_dump (vat_main_t * vam)
11317 vl_api_ip_dump_t *mp;
11318 unformat_input_t *in = vam->input;
11325 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
11327 if (unformat (in, "ipv4"))
11329 else if (unformat (in, "ipv6"))
11335 if (ipv4_set && ipv6_set)
11337 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11341 if ((!ipv4_set) && (!ipv6_set))
11343 errmsg ("no ipv4 nor ipv6 flag set\n");
11347 is_ipv6 = ipv6_set;
11348 vam->is_ipv6 = is_ipv6;
11350 /* free old data */
11351 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
11353 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
11355 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
11357 M (IP_DUMP, ip_dump);
11358 mp->is_ipv6 = ipv6_set;
11361 /* Use a control ping for synchronization */
11363 vl_api_control_ping_t *mp;
11364 M (CONTROL_PING, control_ping);
11371 api_ipsec_spd_add_del (vat_main_t * vam)
11374 unformat_input_t *i = vam->input;
11375 vl_api_ipsec_spd_add_del_t *mp;
11380 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11382 if (unformat (i, "spd_id %d", &spd_id))
11384 else if (unformat (i, "del"))
11388 clib_warning ("parse error '%U'", format_unformat_error, i);
11394 errmsg ("spd_id must be set\n");
11398 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
11400 mp->spd_id = ntohl (spd_id);
11401 mp->is_add = is_add;
11408 clib_warning ("unsupported (no dpdk)");
11414 api_ipsec_interface_add_del_spd (vat_main_t * vam)
11417 unformat_input_t *i = vam->input;
11418 vl_api_ipsec_interface_add_del_spd_t *mp;
11421 u8 sw_if_index_set = 0;
11422 u32 spd_id = (u32) ~ 0;
11425 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11427 if (unformat (i, "del"))
11429 else if (unformat (i, "spd_id %d", &spd_id))
11431 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11432 sw_if_index_set = 1;
11433 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11434 sw_if_index_set = 1;
11437 clib_warning ("parse error '%U'", format_unformat_error, i);
11443 if (spd_id == (u32) ~ 0)
11445 errmsg ("spd_id must be set\n");
11449 if (sw_if_index_set == 0)
11451 errmsg ("missing interface name or sw_if_index\n");
11455 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
11457 mp->spd_id = ntohl (spd_id);
11458 mp->sw_if_index = ntohl (sw_if_index);
11459 mp->is_add = is_add;
11466 clib_warning ("unsupported (no dpdk)");
11472 api_ipsec_spd_add_del_entry (vat_main_t * vam)
11475 unformat_input_t *i = vam->input;
11476 vl_api_ipsec_spd_add_del_entry_t *mp;
11478 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
11479 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
11481 u32 rport_start = 0, rport_stop = (u32) ~ 0;
11482 u32 lport_start = 0, lport_stop = (u32) ~ 0;
11483 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
11484 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
11486 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
11487 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
11488 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
11489 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
11490 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
11491 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
11493 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11495 if (unformat (i, "del"))
11497 if (unformat (i, "outbound"))
11499 if (unformat (i, "inbound"))
11501 else if (unformat (i, "spd_id %d", &spd_id))
11503 else if (unformat (i, "sa_id %d", &sa_id))
11505 else if (unformat (i, "priority %d", &priority))
11507 else if (unformat (i, "protocol %d", &protocol))
11509 else if (unformat (i, "lport_start %d", &lport_start))
11511 else if (unformat (i, "lport_stop %d", &lport_stop))
11513 else if (unformat (i, "rport_start %d", &rport_start))
11515 else if (unformat (i, "rport_stop %d", &rport_stop))
11519 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
11525 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
11532 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
11538 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
11545 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
11551 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
11558 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
11564 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
11570 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
11572 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
11574 clib_warning ("unsupported action: 'resolve'");
11580 clib_warning ("parse error '%U'", format_unformat_error, i);
11586 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
11588 mp->spd_id = ntohl (spd_id);
11589 mp->priority = ntohl (priority);
11590 mp->is_outbound = is_outbound;
11592 mp->is_ipv6 = is_ipv6;
11593 if (is_ipv6 || is_ip_any)
11595 clib_memcpy (mp->remote_address_start, &raddr6_start,
11596 sizeof (ip6_address_t));
11597 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
11598 sizeof (ip6_address_t));
11599 clib_memcpy (mp->local_address_start, &laddr6_start,
11600 sizeof (ip6_address_t));
11601 clib_memcpy (mp->local_address_stop, &laddr6_stop,
11602 sizeof (ip6_address_t));
11606 clib_memcpy (mp->remote_address_start, &raddr4_start,
11607 sizeof (ip4_address_t));
11608 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
11609 sizeof (ip4_address_t));
11610 clib_memcpy (mp->local_address_start, &laddr4_start,
11611 sizeof (ip4_address_t));
11612 clib_memcpy (mp->local_address_stop, &laddr4_stop,
11613 sizeof (ip4_address_t));
11615 mp->protocol = (u8) protocol;
11616 mp->local_port_start = ntohs ((u16) lport_start);
11617 mp->local_port_stop = ntohs ((u16) lport_stop);
11618 mp->remote_port_start = ntohs ((u16) rport_start);
11619 mp->remote_port_stop = ntohs ((u16) rport_stop);
11620 mp->policy = (u8) policy;
11621 mp->sa_id = ntohl (sa_id);
11622 mp->is_add = is_add;
11623 mp->is_ip_any = is_ip_any;
11629 clib_warning ("unsupported (no dpdk)");
11635 api_ipsec_sad_add_del_entry (vat_main_t * vam)
11638 unformat_input_t *i = vam->input;
11639 vl_api_ipsec_sad_add_del_entry_t *mp;
11641 u32 sad_id = 0, spi = 0;
11642 u8 *ck = 0, *ik = 0;
11645 u8 protocol = IPSEC_PROTOCOL_AH;
11646 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
11647 u32 crypto_alg = 0, integ_alg = 0;
11648 ip4_address_t tun_src4;
11649 ip4_address_t tun_dst4;
11650 ip6_address_t tun_src6;
11651 ip6_address_t tun_dst6;
11653 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11655 if (unformat (i, "del"))
11657 else if (unformat (i, "sad_id %d", &sad_id))
11659 else if (unformat (i, "spi %d", &spi))
11661 else if (unformat (i, "esp"))
11662 protocol = IPSEC_PROTOCOL_ESP;
11663 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
11666 is_tunnel_ipv6 = 0;
11668 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
11671 is_tunnel_ipv6 = 0;
11673 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
11676 is_tunnel_ipv6 = 1;
11678 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
11681 is_tunnel_ipv6 = 1;
11685 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
11687 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
11688 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
11690 clib_warning ("unsupported crypto-alg: '%U'",
11691 format_ipsec_crypto_alg, crypto_alg);
11695 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11699 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
11701 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
11702 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
11704 clib_warning ("unsupported integ-alg: '%U'",
11705 format_ipsec_integ_alg, integ_alg);
11709 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11713 clib_warning ("parse error '%U'", format_unformat_error, i);
11719 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
11721 mp->sad_id = ntohl (sad_id);
11722 mp->is_add = is_add;
11723 mp->protocol = protocol;
11724 mp->spi = ntohl (spi);
11725 mp->is_tunnel = is_tunnel;
11726 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
11727 mp->crypto_algorithm = crypto_alg;
11728 mp->integrity_algorithm = integ_alg;
11729 mp->crypto_key_length = vec_len (ck);
11730 mp->integrity_key_length = vec_len (ik);
11732 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11733 mp->crypto_key_length = sizeof (mp->crypto_key);
11735 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11736 mp->integrity_key_length = sizeof (mp->integrity_key);
11739 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11741 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
11745 if (is_tunnel_ipv6)
11747 clib_memcpy (mp->tunnel_src_address, &tun_src6,
11748 sizeof (ip6_address_t));
11749 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
11750 sizeof (ip6_address_t));
11754 clib_memcpy (mp->tunnel_src_address, &tun_src4,
11755 sizeof (ip4_address_t));
11756 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
11757 sizeof (ip4_address_t));
11766 clib_warning ("unsupported (no dpdk)");
11772 api_ipsec_sa_set_key (vat_main_t * vam)
11775 unformat_input_t *i = vam->input;
11776 vl_api_ipsec_sa_set_key_t *mp;
11779 u8 *ck = 0, *ik = 0;
11781 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11783 if (unformat (i, "sa_id %d", &sa_id))
11785 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11787 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11791 clib_warning ("parse error '%U'", format_unformat_error, i);
11796 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
11798 mp->sa_id = ntohl (sa_id);
11799 mp->crypto_key_length = vec_len (ck);
11800 mp->integrity_key_length = vec_len (ik);
11802 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11803 mp->crypto_key_length = sizeof (mp->crypto_key);
11805 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11806 mp->integrity_key_length = sizeof (mp->integrity_key);
11809 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11811 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
11818 clib_warning ("unsupported (no dpdk)");
11824 api_ikev2_profile_add_del (vat_main_t * vam)
11827 unformat_input_t *i = vam->input;
11828 vl_api_ikev2_profile_add_del_t *mp;
11833 const char *valid_chars = "a-zA-Z0-9_";
11835 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11837 if (unformat (i, "del"))
11839 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11840 vec_add1 (name, 0);
11843 errmsg ("parse error '%U'", format_unformat_error, i);
11848 if (!vec_len (name))
11850 errmsg ("profile name must be specified");
11854 if (vec_len (name) > 64)
11856 errmsg ("profile name too long");
11860 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
11862 clib_memcpy (mp->name, name, vec_len (name));
11863 mp->is_add = is_add;
11871 clib_warning ("unsupported (no dpdk)");
11877 api_ikev2_profile_set_auth (vat_main_t * vam)
11880 unformat_input_t *i = vam->input;
11881 vl_api_ikev2_profile_set_auth_t *mp;
11885 u32 auth_method = 0;
11888 const char *valid_chars = "a-zA-Z0-9_";
11890 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11892 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11893 vec_add1 (name, 0);
11894 else if (unformat (i, "auth_method %U",
11895 unformat_ikev2_auth_method, &auth_method))
11897 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11899 else if (unformat (i, "auth_data %v", &data))
11903 errmsg ("parse error '%U'", format_unformat_error, i);
11908 if (!vec_len (name))
11910 errmsg ("profile name must be specified");
11914 if (vec_len (name) > 64)
11916 errmsg ("profile name too long");
11920 if (!vec_len (data))
11922 errmsg ("auth_data must be specified");
11928 errmsg ("auth_method must be specified");
11932 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
11934 mp->is_hex = is_hex;
11935 mp->auth_method = (u8) auth_method;
11936 mp->data_len = vec_len (data);
11937 clib_memcpy (mp->name, name, vec_len (name));
11938 clib_memcpy (mp->data, data, vec_len (data));
11947 clib_warning ("unsupported (no dpdk)");
11953 api_ikev2_profile_set_id (vat_main_t * vam)
11956 unformat_input_t *i = vam->input;
11957 vl_api_ikev2_profile_set_id_t *mp;
11965 const char *valid_chars = "a-zA-Z0-9_";
11967 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11969 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11970 vec_add1 (name, 0);
11971 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11973 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11975 data = vec_new (u8, 4);
11976 clib_memcpy (data, ip4.as_u8, 4);
11978 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11980 else if (unformat (i, "id_data %v", &data))
11982 else if (unformat (i, "local"))
11984 else if (unformat (i, "remote"))
11988 errmsg ("parse error '%U'", format_unformat_error, i);
11993 if (!vec_len (name))
11995 errmsg ("profile name must be specified");
11999 if (vec_len (name) > 64)
12001 errmsg ("profile name too long");
12005 if (!vec_len (data))
12007 errmsg ("id_data must be specified");
12013 errmsg ("id_type must be specified");
12017 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
12019 mp->is_local = is_local;
12020 mp->id_type = (u8) id_type;
12021 mp->data_len = vec_len (data);
12022 clib_memcpy (mp->name, name, vec_len (name));
12023 clib_memcpy (mp->data, data, vec_len (data));
12032 clib_warning ("unsupported (no dpdk)");
12038 api_ikev2_profile_set_ts (vat_main_t * vam)
12041 unformat_input_t *i = vam->input;
12042 vl_api_ikev2_profile_set_ts_t *mp;
12046 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
12047 ip4_address_t start_addr, end_addr;
12049 const char *valid_chars = "a-zA-Z0-9_";
12051 start_addr.as_u32 = 0;
12052 end_addr.as_u32 = (u32) ~ 0;
12054 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12056 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
12057 vec_add1 (name, 0);
12058 else if (unformat (i, "protocol %d", &proto))
12060 else if (unformat (i, "start_port %d", &start_port))
12062 else if (unformat (i, "end_port %d", &end_port))
12065 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
12067 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
12069 else if (unformat (i, "local"))
12071 else if (unformat (i, "remote"))
12075 errmsg ("parse error '%U'", format_unformat_error, i);
12080 if (!vec_len (name))
12082 errmsg ("profile name must be specified");
12086 if (vec_len (name) > 64)
12088 errmsg ("profile name too long");
12092 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
12094 mp->is_local = is_local;
12095 mp->proto = (u8) proto;
12096 mp->start_port = (u16) start_port;
12097 mp->end_port = (u16) end_port;
12098 mp->start_addr = start_addr.as_u32;
12099 mp->end_addr = end_addr.as_u32;
12100 clib_memcpy (mp->name, name, vec_len (name));
12108 clib_warning ("unsupported (no dpdk)");
12114 api_ikev2_set_local_key (vat_main_t * vam)
12117 unformat_input_t *i = vam->input;
12118 vl_api_ikev2_set_local_key_t *mp;
12122 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12124 if (unformat (i, "file %v", &file))
12125 vec_add1 (file, 0);
12128 errmsg ("parse error '%U'", format_unformat_error, i);
12133 if (!vec_len (file))
12135 errmsg ("RSA key file must be specified");
12139 if (vec_len (file) > 256)
12141 errmsg ("file name too long");
12145 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
12147 clib_memcpy (mp->key_file, file, vec_len (file));
12155 clib_warning ("unsupported (no dpdk)");
12164 api_map_add_domain (vat_main_t * vam)
12166 unformat_input_t *i = vam->input;
12167 vl_api_map_add_domain_t *mp;
12170 ip4_address_t ip4_prefix;
12171 ip6_address_t ip6_prefix;
12172 ip6_address_t ip6_src;
12173 u32 num_m_args = 0;
12174 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
12175 0, psid_length = 0;
12176 u8 is_translation = 0;
12178 u32 ip6_src_len = 128;
12180 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12182 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
12183 &ip4_prefix, &ip4_prefix_len))
12185 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
12186 &ip6_prefix, &ip6_prefix_len))
12190 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
12193 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
12195 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
12197 else if (unformat (i, "psid-offset %d", &psid_offset))
12199 else if (unformat (i, "psid-len %d", &psid_length))
12201 else if (unformat (i, "mtu %d", &mtu))
12203 else if (unformat (i, "map-t"))
12204 is_translation = 1;
12207 clib_warning ("parse error '%U'", format_unformat_error, i);
12212 if (num_m_args < 3)
12214 errmsg ("mandatory argument(s) missing\n");
12218 /* Construct the API message */
12219 M (MAP_ADD_DOMAIN, map_add_domain);
12221 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
12222 mp->ip4_prefix_len = ip4_prefix_len;
12224 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
12225 mp->ip6_prefix_len = ip6_prefix_len;
12227 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
12228 mp->ip6_src_prefix_len = ip6_src_len;
12230 mp->ea_bits_len = ea_bits_len;
12231 mp->psid_offset = psid_offset;
12232 mp->psid_length = psid_length;
12233 mp->is_translation = is_translation;
12234 mp->mtu = htons (mtu);
12239 /* Wait for a reply, return good/bad news */
12244 api_map_del_domain (vat_main_t * vam)
12246 unformat_input_t *i = vam->input;
12247 vl_api_map_del_domain_t *mp;
12250 u32 num_m_args = 0;
12253 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12255 if (unformat (i, "index %d", &index))
12259 clib_warning ("parse error '%U'", format_unformat_error, i);
12264 if (num_m_args != 1)
12266 errmsg ("mandatory argument(s) missing\n");
12270 /* Construct the API message */
12271 M (MAP_DEL_DOMAIN, map_del_domain);
12273 mp->index = ntohl (index);
12278 /* Wait for a reply, return good/bad news */
12283 api_map_add_del_rule (vat_main_t * vam)
12285 unformat_input_t *i = vam->input;
12286 vl_api_map_add_del_rule_t *mp;
12289 ip6_address_t ip6_dst;
12290 u32 num_m_args = 0, index, psid = 0;
12292 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12294 if (unformat (i, "index %d", &index))
12296 else if (unformat (i, "psid %d", &psid))
12298 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
12300 else if (unformat (i, "del"))
12306 clib_warning ("parse error '%U'", format_unformat_error, i);
12311 /* Construct the API message */
12312 M (MAP_ADD_DEL_RULE, map_add_del_rule);
12314 mp->index = ntohl (index);
12315 mp->is_add = is_add;
12316 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
12317 mp->psid = ntohs (psid);
12322 /* Wait for a reply, return good/bad news */
12327 api_map_domain_dump (vat_main_t * vam)
12329 vl_api_map_domain_dump_t *mp;
12332 /* Construct the API message */
12333 M (MAP_DOMAIN_DUMP, map_domain_dump);
12338 /* Use a control ping for synchronization */
12340 vl_api_control_ping_t *mp;
12341 M (CONTROL_PING, control_ping);
12348 api_map_rule_dump (vat_main_t * vam)
12350 unformat_input_t *i = vam->input;
12351 vl_api_map_rule_dump_t *mp;
12353 u32 domain_index = ~0;
12355 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12357 if (unformat (i, "index %u", &domain_index))
12363 if (domain_index == ~0)
12365 clib_warning ("parse error: domain index expected");
12369 /* Construct the API message */
12370 M (MAP_RULE_DUMP, map_rule_dump);
12372 mp->domain_index = htonl (domain_index);
12377 /* Use a control ping for synchronization */
12379 vl_api_control_ping_t *mp;
12380 M (CONTROL_PING, control_ping);
12386 static void vl_api_map_add_domain_reply_t_handler
12387 (vl_api_map_add_domain_reply_t * mp)
12389 vat_main_t *vam = &vat_main;
12390 i32 retval = ntohl (mp->retval);
12392 if (vam->async_mode)
12394 vam->async_errors += (retval < 0);
12398 vam->retval = retval;
12399 vam->result_ready = 1;
12403 static void vl_api_map_add_domain_reply_t_handler_json
12404 (vl_api_map_add_domain_reply_t * mp)
12406 vat_main_t *vam = &vat_main;
12407 vat_json_node_t node;
12409 vat_json_init_object (&node);
12410 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
12411 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
12413 vat_json_print (vam->ofp, &node);
12414 vat_json_free (&node);
12416 vam->retval = ntohl (mp->retval);
12417 vam->result_ready = 1;
12421 api_get_first_msg_id (vat_main_t * vam)
12423 vl_api_get_first_msg_id_t *mp;
12425 unformat_input_t *i = vam->input;
12429 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12431 if (unformat (i, "client %s", &name))
12439 errmsg ("missing client name\n");
12442 vec_add1 (name, 0);
12444 if (vec_len (name) > 63)
12446 errmsg ("client name too long\n");
12450 M (GET_FIRST_MSG_ID, get_first_msg_id);
12451 clib_memcpy (mp->name, name, vec_len (name));
12459 api_cop_interface_enable_disable (vat_main_t * vam)
12461 unformat_input_t *line_input = vam->input;
12462 vl_api_cop_interface_enable_disable_t *mp;
12464 u32 sw_if_index = ~0;
12465 u8 enable_disable = 1;
12467 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12469 if (unformat (line_input, "disable"))
12470 enable_disable = 0;
12471 if (unformat (line_input, "enable"))
12472 enable_disable = 1;
12473 else if (unformat (line_input, "%U", unformat_sw_if_index,
12474 vam, &sw_if_index))
12476 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12482 if (sw_if_index == ~0)
12484 errmsg ("missing interface name or sw_if_index\n");
12488 /* Construct the API message */
12489 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
12490 mp->sw_if_index = ntohl (sw_if_index);
12491 mp->enable_disable = enable_disable;
12495 /* Wait for the reply */
12500 api_cop_whitelist_enable_disable (vat_main_t * vam)
12502 unformat_input_t *line_input = vam->input;
12503 vl_api_cop_whitelist_enable_disable_t *mp;
12505 u32 sw_if_index = ~0;
12506 u8 ip4 = 0, ip6 = 0, default_cop = 0;
12509 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12511 if (unformat (line_input, "ip4"))
12513 else if (unformat (line_input, "ip6"))
12515 else if (unformat (line_input, "default"))
12517 else if (unformat (line_input, "%U", unformat_sw_if_index,
12518 vam, &sw_if_index))
12520 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12522 else if (unformat (line_input, "fib-id %d", &fib_id))
12528 if (sw_if_index == ~0)
12530 errmsg ("missing interface name or sw_if_index\n");
12534 /* Construct the API message */
12535 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
12536 mp->sw_if_index = ntohl (sw_if_index);
12537 mp->fib_id = ntohl (fib_id);
12540 mp->default_cop = default_cop;
12544 /* Wait for the reply */
12549 api_get_node_graph (vat_main_t * vam)
12551 vl_api_get_node_graph_t *mp;
12554 M (GET_NODE_GRAPH, get_node_graph);
12558 /* Wait for the reply */
12563 /** Used for parsing LISP eids */
12564 typedef CLIB_PACKED(struct{
12565 u8 addr[16]; /**< eid address */
12566 u32 len; /**< prefix length if IP */
12567 u8 type; /**< type of eid */
12572 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
12574 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
12576 memset (a, 0, sizeof (a[0]));
12578 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
12580 a->type = 0; /* ipv4 type */
12582 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
12584 a->type = 1; /* ipv6 type */
12586 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
12588 a->type = 2; /* mac type */
12595 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
12604 lisp_eid_size_vat (u8 type)
12619 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
12621 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
12625 /** Used for transferring locators via VPP API */
12626 typedef CLIB_PACKED(struct
12628 u32 sw_if_index; /**< locator sw_if_index */
12629 u8 priority; /**< locator priority */
12630 u8 weight; /**< locator weight */
12635 api_lisp_add_del_locator_set (vat_main_t * vam)
12637 unformat_input_t *input = vam->input;
12638 vl_api_lisp_add_del_locator_set_t *mp;
12641 u8 *locator_set_name = NULL;
12642 u8 locator_set_name_set = 0;
12643 ls_locator_t locator, *locators = 0;
12644 u32 sw_if_index, priority, weight;
12647 /* Parse args required to build the message */
12648 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12650 if (unformat (input, "del"))
12654 else if (unformat (input, "locator-set %s", &locator_set_name))
12656 locator_set_name_set = 1;
12658 else if (unformat (input, "sw_if_index %u p %u w %u",
12659 &sw_if_index, &priority, &weight))
12661 locator.sw_if_index = htonl (sw_if_index);
12662 locator.priority = priority;
12663 locator.weight = weight;
12664 vec_add1 (locators, locator);
12666 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
12667 vam, &sw_if_index, &priority, &weight))
12669 locator.sw_if_index = htonl (sw_if_index);
12670 locator.priority = priority;
12671 locator.weight = weight;
12672 vec_add1 (locators, locator);
12678 if (locator_set_name_set == 0)
12680 errmsg ("missing locator-set name");
12681 vec_free (locators);
12685 if (vec_len (locator_set_name) > 64)
12687 errmsg ("locator-set name too long\n");
12688 vec_free (locator_set_name);
12689 vec_free (locators);
12692 vec_add1 (locator_set_name, 0);
12694 data_len = sizeof (ls_locator_t) * vec_len (locators);
12696 /* Construct the API message */
12697 M2 (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set, data_len);
12699 mp->is_add = is_add;
12700 clib_memcpy (mp->locator_set_name, locator_set_name,
12701 vec_len (locator_set_name));
12702 vec_free (locator_set_name);
12704 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
12706 clib_memcpy (mp->locators, locators, data_len);
12707 vec_free (locators);
12712 /* Wait for a reply... */
12720 api_lisp_add_del_locator (vat_main_t * vam)
12722 unformat_input_t *input = vam->input;
12723 vl_api_lisp_add_del_locator_t *mp;
12725 u32 tmp_if_index = ~0;
12726 u32 sw_if_index = ~0;
12727 u8 sw_if_index_set = 0;
12728 u8 sw_if_index_if_name_set = 0;
12730 u8 priority_set = 0;
12734 u8 *locator_set_name = NULL;
12735 u8 locator_set_name_set = 0;
12737 /* Parse args required to build the message */
12738 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12740 if (unformat (input, "del"))
12744 else if (unformat (input, "locator-set %s", &locator_set_name))
12746 locator_set_name_set = 1;
12748 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
12751 sw_if_index_if_name_set = 1;
12752 sw_if_index = tmp_if_index;
12754 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
12756 sw_if_index_set = 1;
12757 sw_if_index = tmp_if_index;
12759 else if (unformat (input, "p %d", &priority))
12763 else if (unformat (input, "w %d", &weight))
12771 if (locator_set_name_set == 0)
12773 errmsg ("missing locator-set name");
12777 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
12779 errmsg ("missing sw_if_index");
12780 vec_free (locator_set_name);
12784 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
12786 errmsg ("cannot use both params interface name and sw_if_index");
12787 vec_free (locator_set_name);
12791 if (priority_set == 0)
12793 errmsg ("missing locator-set priority\n");
12794 vec_free (locator_set_name);
12798 if (weight_set == 0)
12800 errmsg ("missing locator-set weight\n");
12801 vec_free (locator_set_name);
12805 if (vec_len (locator_set_name) > 64)
12807 errmsg ("locator-set name too long\n");
12808 vec_free (locator_set_name);
12811 vec_add1 (locator_set_name, 0);
12813 /* Construct the API message */
12814 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
12816 mp->is_add = is_add;
12817 mp->sw_if_index = ntohl (sw_if_index);
12818 mp->priority = priority;
12819 mp->weight = weight;
12820 clib_memcpy (mp->locator_set_name, locator_set_name,
12821 vec_len (locator_set_name));
12822 vec_free (locator_set_name);
12827 /* Wait for a reply... */
12835 api_lisp_add_del_local_eid (vat_main_t * vam)
12837 unformat_input_t *input = vam->input;
12838 vl_api_lisp_add_del_local_eid_t *mp;
12842 lisp_eid_vat_t _eid, *eid = &_eid;
12843 u8 *locator_set_name = 0;
12844 u8 locator_set_name_set = 0;
12847 /* Parse args required to build the message */
12848 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12850 if (unformat (input, "del"))
12854 else if (unformat (input, "vni %d", &vni))
12858 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
12862 else if (unformat (input, "locator-set %s", &locator_set_name))
12864 locator_set_name_set = 1;
12870 if (locator_set_name_set == 0)
12872 errmsg ("missing locator-set name\n");
12878 errmsg ("EID address not set!");
12879 vec_free (locator_set_name);
12883 if (vec_len (locator_set_name) > 64)
12885 errmsg ("locator-set name too long\n");
12886 vec_free (locator_set_name);
12889 vec_add1 (locator_set_name, 0);
12891 /* Construct the API message */
12892 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
12894 mp->is_add = is_add;
12895 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12896 mp->eid_type = eid->type;
12897 mp->prefix_len = eid->len;
12898 mp->vni = clib_host_to_net_u32 (vni);
12899 clib_memcpy (mp->locator_set_name, locator_set_name,
12900 vec_len (locator_set_name));
12902 vec_free (locator_set_name);
12907 /* Wait for a reply... */
12915 /** Used for transferring locators via VPP API */
12916 typedef CLIB_PACKED(struct
12918 u8 is_ip4; /**< is locator an IPv4 address? */
12919 u8 priority; /**< locator priority */
12920 u8 weight; /**< locator weight */
12921 u8 addr[16]; /**< IPv4/IPv6 address */
12926 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
12928 unformat_input_t *input = vam->input;
12929 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12932 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12933 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12934 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12935 u32 action = ~0, p, w;
12936 ip4_address_t rmt_rloc4, lcl_rloc4;
12937 ip6_address_t rmt_rloc6, lcl_rloc6;
12938 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
12940 memset (&rloc, 0, sizeof (rloc));
12942 /* Parse args required to build the message */
12943 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12945 if (unformat (input, "del"))
12949 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12953 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12957 else if (unformat (input, "p %d w %d", &p, &w))
12961 errmsg ("No RLOC configured for setting priority/weight!");
12964 curr_rloc->priority = p;
12965 curr_rloc->weight = w;
12967 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12968 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12972 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
12973 rloc.priority = rloc.weight = 0;
12974 vec_add1 (lcl_locs, rloc);
12976 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12977 vec_add1 (rmt_locs, rloc);
12978 /* priority and weight saved in rmt loc */
12979 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12981 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
12982 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12985 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
12986 rloc.priority = rloc.weight = 0;
12987 vec_add1 (lcl_locs, rloc);
12989 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12990 vec_add1 (rmt_locs, rloc);
12991 /* priority and weight saved in rmt loc */
12992 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12994 else if (unformat (input, "action %d", &action))
13000 clib_warning ("parse error '%U'", format_unformat_error, input);
13007 errmsg ("remote eid addresses not set\n");
13011 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
13013 errmsg ("eid types don't match\n");
13017 if (0 == rmt_locs && (u32) ~ 0 == action)
13019 errmsg ("action not set for negative mapping\n");
13023 /* Construct the API message */
13024 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
13026 mp->is_add = is_add;
13027 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
13028 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
13029 mp->eid_type = rmt_eid->type;
13030 mp->rmt_len = rmt_eid->len;
13031 mp->lcl_len = lcl_eid->len;
13032 mp->action = action;
13034 if (0 != rmt_locs && 0 != lcl_locs)
13036 mp->loc_num = vec_len (rmt_locs);
13037 clib_memcpy (mp->lcl_locs, lcl_locs,
13038 (sizeof (rloc_t) * vec_len (lcl_locs)));
13039 clib_memcpy (mp->rmt_locs, rmt_locs,
13040 (sizeof (rloc_t) * vec_len (rmt_locs)));
13042 vec_free (lcl_locs);
13043 vec_free (rmt_locs);
13048 /* Wait for a reply... */
13056 api_lisp_add_del_map_resolver (vat_main_t * vam)
13058 unformat_input_t *input = vam->input;
13059 vl_api_lisp_add_del_map_resolver_t *mp;
13064 ip4_address_t ipv4;
13065 ip6_address_t ipv6;
13067 /* Parse args required to build the message */
13068 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13070 if (unformat (input, "del"))
13074 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
13078 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
13086 if (ipv4_set && ipv6_set)
13088 errmsg ("both eid v4 and v6 addresses set\n");
13092 if (!ipv4_set && !ipv6_set)
13094 errmsg ("eid addresses not set\n");
13098 /* Construct the API message */
13099 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
13101 mp->is_add = is_add;
13105 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
13110 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
13116 /* Wait for a reply... */
13124 api_lisp_gpe_enable_disable (vat_main_t * vam)
13126 unformat_input_t *input = vam->input;
13127 vl_api_lisp_gpe_enable_disable_t *mp;
13132 /* Parse args required to build the message */
13133 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13135 if (unformat (input, "enable"))
13140 else if (unformat (input, "disable"))
13151 errmsg ("Value not set\n");
13155 /* Construct the API message */
13156 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
13163 /* Wait for a reply... */
13171 api_lisp_enable_disable (vat_main_t * vam)
13173 unformat_input_t *input = vam->input;
13174 vl_api_lisp_enable_disable_t *mp;
13179 /* Parse args required to build the message */
13180 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13182 if (unformat (input, "enable"))
13187 else if (unformat (input, "disable"))
13197 errmsg ("Value not set\n");
13201 /* Construct the API message */
13202 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
13209 /* Wait for a reply... */
13217 api_show_lisp_map_request_mode (vat_main_t * vam)
13220 vl_api_show_lisp_map_request_mode_t *mp;
13222 M (SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode);
13227 /* wait for reply */
13234 api_lisp_map_request_mode (vat_main_t * vam)
13237 unformat_input_t *input = vam->input;
13238 vl_api_lisp_map_request_mode_t *mp;
13241 /* Parse args required to build the message */
13242 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13244 if (unformat (input, "dst-only"))
13246 else if (unformat (input, "src-dst"))
13250 errmsg ("parse error '%U'", format_unformat_error, input);
13255 M (LISP_MAP_REQUEST_MODE, lisp_map_request_mode);
13262 /* wait for reply */
13270 * Enable/disable LISP proxy ITR.
13272 * @param vam vpp API test context
13273 * @return return code
13276 api_lisp_pitr_set_locator_set (vat_main_t * vam)
13279 u8 ls_name_set = 0;
13280 unformat_input_t *input = vam->input;
13281 vl_api_lisp_pitr_set_locator_set_t *mp;
13285 /* Parse args required to build the message */
13286 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13288 if (unformat (input, "del"))
13290 else if (unformat (input, "locator-set %s", &ls_name))
13294 errmsg ("parse error '%U'", format_unformat_error, input);
13301 errmsg ("locator-set name not set!");
13305 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
13307 mp->is_add = is_add;
13308 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
13309 vec_free (ls_name);
13314 /* wait for reply */
13322 api_show_lisp_pitr (vat_main_t * vam)
13324 vl_api_show_lisp_pitr_t *mp;
13327 if (!vam->json_output)
13329 fformat (vam->ofp, "%=20s\n", "lisp status:");
13332 M (SHOW_LISP_PITR, show_lisp_pitr);
13336 /* Wait for a reply... */
13344 * Add/delete mapping between vni and vrf
13347 api_lisp_eid_table_add_del_map (vat_main_t * vam)
13350 unformat_input_t *input = vam->input;
13351 vl_api_lisp_eid_table_add_del_map_t *mp;
13352 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
13353 u32 vni, vrf, bd_index;
13355 /* Parse args required to build the message */
13356 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13358 if (unformat (input, "del"))
13360 else if (unformat (input, "vrf %d", &vrf))
13362 else if (unformat (input, "bd_index %d", &bd_index))
13364 else if (unformat (input, "vni %d", &vni))
13370 if (!vni_set || (!vrf_set && !bd_index_set))
13372 errmsg ("missing arguments!");
13376 if (vrf_set && bd_index_set)
13378 errmsg ("error: both vrf and bd entered!");
13382 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
13384 mp->is_add = is_add;
13385 mp->vni = htonl (vni);
13386 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
13387 mp->is_l2 = bd_index_set;
13392 /* wait for reply */
13400 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
13402 u32 *action = va_arg (*args, u32 *);
13405 if (unformat (input, "%s", &s))
13407 if (!strcmp ((char *) s, "no-action"))
13409 else if (!strcmp ((char *) s, "natively-forward"))
13411 else if (!strcmp ((char *) s, "send-map-request"))
13413 else if (!strcmp ((char *) s, "drop"))
13417 clib_warning ("invalid action: '%s'", s);
13429 * Add/del remote mapping to/from LISP control plane
13431 * @param vam vpp API test context
13432 * @return return code
13435 api_lisp_add_del_remote_mapping (vat_main_t * vam)
13437 unformat_input_t *input = vam->input;
13438 vl_api_lisp_add_del_remote_mapping_t *mp;
13441 lisp_eid_vat_t _eid, *eid = &_eid;
13442 lisp_eid_vat_t _seid, *seid = &_seid;
13443 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
13444 u32 action = ~0, p, w, data_len;
13445 ip4_address_t rloc4;
13446 ip6_address_t rloc6;
13447 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
13449 memset (&rloc, 0, sizeof (rloc));
13451 /* Parse args required to build the message */
13452 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13454 if (unformat (input, "del-all"))
13458 else if (unformat (input, "del"))
13462 else if (unformat (input, "add"))
13466 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
13470 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
13474 else if (unformat (input, "vni %d", &vni))
13478 else if (unformat (input, "p %d w %d", &p, &w))
13482 errmsg ("No RLOC configured for setting priority/weight!");
13485 curr_rloc->priority = p;
13486 curr_rloc->weight = w;
13488 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
13491 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
13492 vec_add1 (rlocs, rloc);
13493 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13495 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
13498 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
13499 vec_add1 (rlocs, rloc);
13500 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13502 else if (unformat (input, "action %U",
13503 unformat_negative_mapping_action, &action))
13509 clib_warning ("parse error '%U'", format_unformat_error, input);
13516 errmsg ("missing params!");
13520 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
13522 errmsg ("no action set for negative map-reply!");
13526 data_len = vec_len (rlocs) * sizeof (rloc_t);
13528 M2 (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping, data_len);
13529 mp->is_add = is_add;
13530 mp->vni = htonl (vni);
13531 mp->action = (u8) action;
13532 mp->is_src_dst = seid_set;
13533 mp->eid_len = eid->len;
13534 mp->seid_len = seid->len;
13535 mp->del_all = del_all;
13536 mp->eid_type = eid->type;
13537 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
13538 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
13540 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
13541 clib_memcpy (mp->rlocs, rlocs, data_len);
13547 /* Wait for a reply... */
13555 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
13556 * forwarding entries in data-plane accordingly.
13558 * @param vam vpp API test context
13559 * @return return code
13562 api_lisp_add_del_adjacency (vat_main_t * vam)
13564 unformat_input_t *input = vam->input;
13565 vl_api_lisp_add_del_adjacency_t *mp;
13568 ip4_address_t leid4, reid4;
13569 ip6_address_t leid6, reid6;
13570 u8 reid_mac[6] = { 0 };
13571 u8 leid_mac[6] = { 0 };
13572 u8 reid_type, leid_type;
13573 u32 leid_len = 0, reid_len = 0, len;
13576 leid_type = reid_type = (u8) ~ 0;
13578 /* Parse args required to build the message */
13579 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13581 if (unformat (input, "del"))
13585 else if (unformat (input, "add"))
13589 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
13592 reid_type = 0; /* ipv4 */
13595 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
13598 reid_type = 1; /* ipv6 */
13601 else if (unformat (input, "reid %U", unformat_ethernet_address,
13604 reid_type = 2; /* mac */
13606 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
13609 leid_type = 0; /* ipv4 */
13612 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
13615 leid_type = 1; /* ipv6 */
13618 else if (unformat (input, "leid %U", unformat_ethernet_address,
13621 leid_type = 2; /* mac */
13623 else if (unformat (input, "vni %d", &vni))
13629 errmsg ("parse error '%U'", format_unformat_error, input);
13634 if ((u8) ~ 0 == reid_type)
13636 errmsg ("missing params!");
13640 if (leid_type != reid_type)
13642 errmsg ("remote and local EIDs are of different types!");
13646 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
13647 mp->is_add = is_add;
13648 mp->vni = htonl (vni);
13649 mp->leid_len = leid_len;
13650 mp->reid_len = reid_len;
13651 mp->eid_type = reid_type;
13653 switch (mp->eid_type)
13656 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
13657 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
13660 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
13661 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
13664 clib_memcpy (mp->leid, leid_mac, 6);
13665 clib_memcpy (mp->reid, reid_mac, 6);
13668 errmsg ("unknown EID type %d!", mp->eid_type);
13675 /* Wait for a reply... */
13683 api_lisp_gpe_add_del_iface (vat_main_t * vam)
13685 unformat_input_t *input = vam->input;
13686 vl_api_lisp_gpe_add_del_iface_t *mp;
13688 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
13689 u32 dp_table = 0, vni = 0;
13691 /* Parse args required to build the message */
13692 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13694 if (unformat (input, "up"))
13699 else if (unformat (input, "down"))
13704 else if (unformat (input, "table_id %d", &dp_table))
13708 else if (unformat (input, "bd_id %d", &dp_table))
13713 else if (unformat (input, "vni %d", &vni))
13721 if (action_set == 0)
13723 errmsg ("Action not set\n");
13726 if (dp_table_set == 0 || vni_set == 0)
13728 errmsg ("vni and dp_table must be set\n");
13732 /* Construct the API message */
13733 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
13735 mp->is_add = is_add;
13736 mp->dp_table = dp_table;
13743 /* Wait for a reply... */
13751 * Add/del map request itr rlocs from LISP control plane and updates
13753 * @param vam vpp API test context
13754 * @return return code
13757 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
13759 unformat_input_t *input = vam->input;
13760 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
13762 u8 *locator_set_name = 0;
13763 u8 locator_set_name_set = 0;
13766 /* Parse args required to build the message */
13767 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13769 if (unformat (input, "del"))
13773 else if (unformat (input, "%_%v%_", &locator_set_name))
13775 locator_set_name_set = 1;
13779 clib_warning ("parse error '%U'", format_unformat_error, input);
13784 if (is_add && !locator_set_name_set)
13786 errmsg ("itr-rloc is not set!");
13790 if (is_add && vec_len (locator_set_name) > 64)
13792 errmsg ("itr-rloc locator-set name too long\n");
13793 vec_free (locator_set_name);
13797 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
13798 mp->is_add = is_add;
13801 clib_memcpy (mp->locator_set_name, locator_set_name,
13802 vec_len (locator_set_name));
13806 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
13808 vec_free (locator_set_name);
13813 /* Wait for a reply... */
13821 api_lisp_locator_dump (vat_main_t * vam)
13823 unformat_input_t *input = vam->input;
13824 vl_api_lisp_locator_dump_t *mp;
13826 u8 is_index_set = 0, is_name_set = 0;
13830 /* Parse args required to build the message */
13831 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13833 if (unformat (input, "ls_name %_%v%_", &ls_name))
13837 else if (unformat (input, "ls_index %d", &ls_index))
13843 errmsg ("parse error '%U'", format_unformat_error, input);
13848 if (!is_index_set && !is_name_set)
13850 errmsg ("error: expected one of index or name!\n");
13854 if (is_index_set && is_name_set)
13856 errmsg ("error: only one param expected!\n");
13860 if (vec_len (ls_name) > 62)
13862 errmsg ("error: locator set name too long!");
13866 if (!vam->json_output)
13868 fformat (vam->ofp, "%=16s%=16s%=16s\n", "locator", "priority",
13872 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
13873 mp->is_index_set = is_index_set;
13876 mp->ls_index = clib_host_to_net_u32 (ls_index);
13879 vec_add1 (ls_name, 0);
13880 strncpy ((char *) mp->ls_name, (char *) ls_name,
13881 sizeof (mp->ls_name) - 1);
13887 /* Use a control ping for synchronization */
13889 vl_api_control_ping_t *mp;
13890 M (CONTROL_PING, control_ping);
13893 /* Wait for a reply... */
13901 api_lisp_locator_set_dump (vat_main_t * vam)
13903 vl_api_lisp_locator_set_dump_t *mp;
13904 unformat_input_t *input = vam->input;
13908 /* Parse args required to build the message */
13909 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13911 if (unformat (input, "local"))
13915 else if (unformat (input, "remote"))
13921 errmsg ("parse error '%U'", format_unformat_error, input);
13926 if (!vam->json_output)
13928 fformat (vam->ofp, "%=10s%=15s\n", "ls_index", "ls_name");
13931 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13933 mp->filter = filter;
13938 /* Use a control ping for synchronization */
13940 vl_api_control_ping_t *mp;
13941 M (CONTROL_PING, control_ping);
13944 /* Wait for a reply... */
13952 api_lisp_eid_table_map_dump (vat_main_t * vam)
13956 unformat_input_t *input = vam->input;
13957 vl_api_lisp_eid_table_map_dump_t *mp;
13960 /* Parse args required to build the message */
13961 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13963 if (unformat (input, "l2"))
13968 else if (unformat (input, "l3"))
13975 errmsg ("parse error '%U'", format_unformat_error, input);
13982 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13986 if (!vam->json_output)
13988 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
13991 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
13997 /* Use a control ping for synchronization */
13999 vl_api_control_ping_t *mp;
14000 M (CONTROL_PING, control_ping);
14003 /* Wait for a reply... */
14011 api_lisp_eid_table_vni_dump (vat_main_t * vam)
14013 vl_api_lisp_eid_table_vni_dump_t *mp;
14016 if (!vam->json_output)
14018 fformat (vam->ofp, "VNI\n");
14021 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
14026 /* Use a control ping for synchronization */
14028 vl_api_control_ping_t *mp;
14029 M (CONTROL_PING, control_ping);
14032 /* Wait for a reply... */
14040 api_lisp_eid_table_dump (vat_main_t * vam)
14042 unformat_input_t *i = vam->input;
14043 vl_api_lisp_eid_table_dump_t *mp;
14045 struct in_addr ip4;
14046 struct in6_addr ip6;
14048 u8 eid_type = ~0, eid_set = 0;
14049 u32 prefix_length = ~0, t, vni = 0;
14052 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14054 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
14060 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
14066 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
14071 else if (unformat (i, "vni %d", &t))
14075 else if (unformat (i, "local"))
14079 else if (unformat (i, "remote"))
14085 errmsg ("parse error '%U'", format_unformat_error, i);
14090 if (!vam->json_output)
14092 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type",
14093 "ls_index", "ttl", "authoritative");
14096 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
14098 mp->filter = filter;
14102 mp->vni = htonl (vni);
14103 mp->eid_type = eid_type;
14107 mp->prefix_length = prefix_length;
14108 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
14111 mp->prefix_length = prefix_length;
14112 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
14115 clib_memcpy (mp->eid, mac, sizeof (mac));
14118 errmsg ("unknown EID type %d!", eid_type);
14126 /* Use a control ping for synchronization */
14128 vl_api_control_ping_t *mp;
14129 M (CONTROL_PING, control_ping);
14133 /* Wait for a reply... */
14141 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
14143 vl_api_lisp_gpe_tunnel_dump_t *mp;
14146 if (!vam->json_output)
14148 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
14149 "%=16s%=16s%=16s%=16s%=16s\n",
14150 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
14151 "Decap next", "Lisp version", "Flags", "Next protocol",
14152 "ver_res", "res", "iid");
14155 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
14159 /* Use a control ping for synchronization */
14161 vl_api_control_ping_t *mp;
14162 M (CONTROL_PING, control_ping);
14165 /* Wait for a reply... */
14173 api_lisp_adjacencies_get (vat_main_t * vam)
14175 unformat_input_t *i = vam->input;
14176 vl_api_lisp_adjacencies_get_t *mp;
14181 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14183 if (unformat (i, "vni %d", &vni))
14189 errmsg ("parse error '%U'\n", format_unformat_error, i);
14196 errmsg ("vni not set!\n");
14200 if (!vam->json_output)
14202 fformat (vam->ofp, "%s %40s\n", "leid", "reid");
14205 M (LISP_ADJACENCIES_GET, lisp_adjacencies_get);
14206 mp->vni = clib_host_to_net_u32 (vni);
14211 /* Wait for a reply... */
14219 api_lisp_map_resolver_dump (vat_main_t * vam)
14221 vl_api_lisp_map_resolver_dump_t *mp;
14224 if (!vam->json_output)
14226 fformat (vam->ofp, "%=20s\n", "Map resolver");
14229 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
14233 /* Use a control ping for synchronization */
14235 vl_api_control_ping_t *mp;
14236 M (CONTROL_PING, control_ping);
14239 /* Wait for a reply... */
14247 api_show_lisp_status (vat_main_t * vam)
14249 vl_api_show_lisp_status_t *mp;
14252 if (!vam->json_output)
14254 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
14257 M (SHOW_LISP_STATUS, show_lisp_status);
14260 /* Wait for a reply... */
14268 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
14270 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
14273 if (!vam->json_output)
14275 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
14278 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
14281 /* Wait for a reply... */
14289 api_af_packet_create (vat_main_t * vam)
14291 unformat_input_t *i = vam->input;
14292 vl_api_af_packet_create_t *mp;
14294 u8 *host_if_name = 0;
14296 u8 random_hw_addr = 1;
14298 memset (hw_addr, 0, sizeof (hw_addr));
14300 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14302 if (unformat (i, "name %s", &host_if_name))
14303 vec_add1 (host_if_name, 0);
14304 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14305 random_hw_addr = 0;
14310 if (!vec_len (host_if_name))
14312 errmsg ("host-interface name must be specified");
14316 if (vec_len (host_if_name) > 64)
14318 errmsg ("host-interface name too long");
14322 M (AF_PACKET_CREATE, af_packet_create);
14324 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14325 clib_memcpy (mp->hw_addr, hw_addr, 6);
14326 mp->use_random_hw_addr = random_hw_addr;
14327 vec_free (host_if_name);
14330 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14336 api_af_packet_delete (vat_main_t * vam)
14338 unformat_input_t *i = vam->input;
14339 vl_api_af_packet_delete_t *mp;
14341 u8 *host_if_name = 0;
14343 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14345 if (unformat (i, "name %s", &host_if_name))
14346 vec_add1 (host_if_name, 0);
14351 if (!vec_len (host_if_name))
14353 errmsg ("host-interface name must be specified");
14357 if (vec_len (host_if_name) > 64)
14359 errmsg ("host-interface name too long");
14363 M (AF_PACKET_DELETE, af_packet_delete);
14365 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14366 vec_free (host_if_name);
14375 api_policer_add_del (vat_main_t * vam)
14377 unformat_input_t *i = vam->input;
14378 vl_api_policer_add_del_t *mp;
14389 u8 color_aware = 0;
14390 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
14392 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14393 conform_action.dscp = 0;
14394 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14395 exceed_action.dscp = 0;
14396 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14397 violate_action.dscp = 0;
14399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14401 if (unformat (i, "del"))
14403 else if (unformat (i, "name %s", &name))
14404 vec_add1 (name, 0);
14405 else if (unformat (i, "cir %u", &cir))
14407 else if (unformat (i, "eir %u", &eir))
14409 else if (unformat (i, "cb %u", &cb))
14411 else if (unformat (i, "eb %u", &eb))
14413 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14416 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14419 else if (unformat (i, "type %U", unformat_policer_type, &type))
14421 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14424 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14427 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14430 else if (unformat (i, "color-aware"))
14436 if (!vec_len (name))
14438 errmsg ("policer name must be specified");
14442 if (vec_len (name) > 64)
14444 errmsg ("policer name too long");
14448 M (POLICER_ADD_DEL, policer_add_del);
14450 clib_memcpy (mp->name, name, vec_len (name));
14452 mp->is_add = is_add;
14457 mp->rate_type = rate_type;
14458 mp->round_type = round_type;
14460 mp->conform_action_type = conform_action.action_type;
14461 mp->conform_dscp = conform_action.dscp;
14462 mp->exceed_action_type = exceed_action.action_type;
14463 mp->exceed_dscp = exceed_action.dscp;
14464 mp->violate_action_type = violate_action.action_type;
14465 mp->violate_dscp = violate_action.dscp;
14466 mp->color_aware = color_aware;
14475 api_policer_dump (vat_main_t * vam)
14477 unformat_input_t *i = vam->input;
14478 vl_api_policer_dump_t *mp;
14480 u8 *match_name = 0;
14481 u8 match_name_valid = 0;
14483 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14485 if (unformat (i, "name %s", &match_name))
14487 vec_add1 (match_name, 0);
14488 match_name_valid = 1;
14494 M (POLICER_DUMP, policer_dump);
14495 mp->match_name_valid = match_name_valid;
14496 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14497 vec_free (match_name);
14501 /* Use a control ping for synchronization */
14503 vl_api_control_ping_t *mp;
14504 M (CONTROL_PING, control_ping);
14507 /* Wait for a reply... */
14515 api_policer_classify_set_interface (vat_main_t * vam)
14517 unformat_input_t *i = vam->input;
14518 vl_api_policer_classify_set_interface_t *mp;
14521 int sw_if_index_set;
14522 u32 ip4_table_index = ~0;
14523 u32 ip6_table_index = ~0;
14524 u32 l2_table_index = ~0;
14527 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14529 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14530 sw_if_index_set = 1;
14531 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14532 sw_if_index_set = 1;
14533 else if (unformat (i, "del"))
14535 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14537 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14539 else if (unformat (i, "l2-table %d", &l2_table_index))
14543 clib_warning ("parse error '%U'", format_unformat_error, i);
14548 if (sw_if_index_set == 0)
14550 errmsg ("missing interface name or sw_if_index\n");
14554 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14556 mp->sw_if_index = ntohl (sw_if_index);
14557 mp->ip4_table_index = ntohl (ip4_table_index);
14558 mp->ip6_table_index = ntohl (ip6_table_index);
14559 mp->l2_table_index = ntohl (l2_table_index);
14560 mp->is_add = is_add;
14569 api_policer_classify_dump (vat_main_t * vam)
14571 unformat_input_t *i = vam->input;
14572 vl_api_policer_classify_dump_t *mp;
14574 u8 type = POLICER_CLASSIFY_N_TABLES;
14576 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
14580 errmsg ("classify table type must be specified\n");
14584 if (!vam->json_output)
14586 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14589 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14594 /* Use a control ping for synchronization */
14596 vl_api_control_ping_t *mp;
14597 M (CONTROL_PING, control_ping);
14600 /* Wait for a reply... */
14608 api_netmap_create (vat_main_t * vam)
14610 unformat_input_t *i = vam->input;
14611 vl_api_netmap_create_t *mp;
14615 u8 random_hw_addr = 1;
14619 memset (hw_addr, 0, sizeof (hw_addr));
14621 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14623 if (unformat (i, "name %s", &if_name))
14624 vec_add1 (if_name, 0);
14625 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14626 random_hw_addr = 0;
14627 else if (unformat (i, "pipe"))
14629 else if (unformat (i, "master"))
14631 else if (unformat (i, "slave"))
14637 if (!vec_len (if_name))
14639 errmsg ("interface name must be specified");
14643 if (vec_len (if_name) > 64)
14645 errmsg ("interface name too long");
14649 M (NETMAP_CREATE, netmap_create);
14651 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14652 clib_memcpy (mp->hw_addr, hw_addr, 6);
14653 mp->use_random_hw_addr = random_hw_addr;
14654 mp->is_pipe = is_pipe;
14655 mp->is_master = is_master;
14656 vec_free (if_name);
14665 api_netmap_delete (vat_main_t * vam)
14667 unformat_input_t *i = vam->input;
14668 vl_api_netmap_delete_t *mp;
14672 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14674 if (unformat (i, "name %s", &if_name))
14675 vec_add1 (if_name, 0);
14680 if (!vec_len (if_name))
14682 errmsg ("interface name must be specified");
14686 if (vec_len (if_name) > 64)
14688 errmsg ("interface name too long");
14692 M (NETMAP_DELETE, netmap_delete);
14694 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14695 vec_free (if_name);
14703 static void vl_api_mpls_eth_tunnel_details_t_handler
14704 (vl_api_mpls_eth_tunnel_details_t * mp)
14706 vat_main_t *vam = &vat_main;
14708 i32 len = ntohl (mp->nlabels);
14710 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14711 ntohl (mp->tunnel_index),
14712 format_ethernet_address, &mp->tunnel_dst_mac,
14713 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14714 for (i = 0; i < len; i++)
14716 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14718 fformat (vam->ofp, "\n");
14719 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14720 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14723 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14724 (vl_api_mpls_eth_tunnel_details_t * mp)
14726 vat_main_t *vam = &vat_main;
14727 vat_json_node_t *node = NULL;
14728 struct in_addr ip4;
14730 i32 len = ntohl (mp->nlabels);
14732 if (VAT_JSON_ARRAY != vam->json_tree.type)
14734 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14735 vat_json_init_array (&vam->json_tree);
14737 node = vat_json_array_add (&vam->json_tree);
14739 vat_json_init_object (node);
14740 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14741 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14742 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14743 vat_json_object_add_uint (node, "inner_fib_index",
14744 ntohl (mp->inner_fib_index));
14745 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14746 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14747 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14748 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14749 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14750 format (0, "%U", format_ethernet_address,
14751 &mp->tunnel_dst_mac));
14752 vat_json_object_add_uint (node, "tx_sw_if_index",
14753 ntohl (mp->tx_sw_if_index));
14754 vat_json_object_add_uint (node, "label_count", len);
14755 for (i = 0; i < len; i++)
14757 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14762 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14764 vl_api_mpls_eth_tunnel_dump_t *mp;
14768 /* Parse args required to build the message */
14769 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14771 if (!unformat (vam->input, "tunnel_index %d", &index))
14778 fformat (vam->ofp, " tunnel_index %d\n", index);
14780 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14781 mp->tunnel_index = htonl (index);
14784 /* Use a control ping for synchronization */
14786 vl_api_control_ping_t *mp;
14787 M (CONTROL_PING, control_ping);
14793 static void vl_api_mpls_fib_encap_details_t_handler
14794 (vl_api_mpls_fib_encap_details_t * mp)
14796 vat_main_t *vam = &vat_main;
14798 i32 len = ntohl (mp->nlabels);
14800 fformat (vam->ofp, "table %d, dest %U, label ",
14801 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14802 for (i = 0; i < len; i++)
14804 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14806 fformat (vam->ofp, "\n");
14809 static void vl_api_mpls_fib_encap_details_t_handler_json
14810 (vl_api_mpls_fib_encap_details_t * mp)
14812 vat_main_t *vam = &vat_main;
14813 vat_json_node_t *node = NULL;
14815 i32 len = ntohl (mp->nlabels);
14816 struct in_addr ip4;
14818 if (VAT_JSON_ARRAY != vam->json_tree.type)
14820 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14821 vat_json_init_array (&vam->json_tree);
14823 node = vat_json_array_add (&vam->json_tree);
14825 vat_json_init_object (node);
14826 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14827 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14828 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14829 vat_json_object_add_ip4 (node, "dest", ip4);
14830 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14831 vat_json_object_add_uint (node, "label_count", len);
14832 for (i = 0; i < len; i++)
14834 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14839 api_mpls_fib_encap_dump (vat_main_t * vam)
14841 vl_api_mpls_fib_encap_dump_t *mp;
14844 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14847 /* Use a control ping for synchronization */
14849 vl_api_control_ping_t *mp;
14850 M (CONTROL_PING, control_ping);
14857 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
14859 vat_main_t *vam = &vat_main;
14862 "table-id %d, label %u, ess_bit %u\n",
14863 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
14866 static void vl_api_mpls_fib_details_t_handler_json
14867 (vl_api_mpls_fib_details_t * mp)
14869 vat_main_t *vam = &vat_main;
14870 vat_json_node_t *node = NULL;
14872 if (VAT_JSON_ARRAY != vam->json_tree.type)
14874 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14875 vat_json_init_array (&vam->json_tree);
14877 node = vat_json_array_add (&vam->json_tree);
14879 vat_json_init_object (node);
14880 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
14881 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
14882 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14886 api_mpls_fib_dump (vat_main_t * vam)
14888 vl_api_mpls_fib_dump_t *mp;
14891 M (MPLS_FIB_DUMP, mpls_fib_dump);
14894 /* Use a control ping for synchronization */
14896 vl_api_control_ping_t *mp;
14897 M (CONTROL_PING, control_ping);
14904 api_classify_table_ids (vat_main_t * vam)
14906 vl_api_classify_table_ids_t *mp;
14909 /* Construct the API message */
14910 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14920 api_classify_table_by_interface (vat_main_t * vam)
14922 unformat_input_t *input = vam->input;
14923 vl_api_classify_table_by_interface_t *mp;
14926 u32 sw_if_index = ~0;
14927 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14929 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14931 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14936 if (sw_if_index == ~0)
14938 errmsg ("missing interface name or sw_if_index\n");
14942 /* Construct the API message */
14943 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14945 mp->sw_if_index = ntohl (sw_if_index);
14954 api_classify_table_info (vat_main_t * vam)
14956 unformat_input_t *input = vam->input;
14957 vl_api_classify_table_info_t *mp;
14961 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14963 if (unformat (input, "table_id %d", &table_id))
14968 if (table_id == ~0)
14970 errmsg ("missing table id\n");
14974 /* Construct the API message */
14975 M (CLASSIFY_TABLE_INFO, classify_table_info);
14977 mp->table_id = ntohl (table_id);
14986 api_classify_session_dump (vat_main_t * vam)
14988 unformat_input_t *input = vam->input;
14989 vl_api_classify_session_dump_t *mp;
14993 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14995 if (unformat (input, "table_id %d", &table_id))
15000 if (table_id == ~0)
15002 errmsg ("missing table id\n");
15006 /* Construct the API message */
15007 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
15009 mp->table_id = ntohl (table_id);
15012 /* Use a control ping for synchronization */
15014 vl_api_control_ping_t *mp;
15015 M (CONTROL_PING, control_ping);
15024 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
15026 vat_main_t *vam = &vat_main;
15028 fformat (vam->ofp, "collector_address %U, collector_port %d, "
15029 "src_address %U, vrf_id %d, path_mtu %u, "
15030 "template_interval %u, udp_checksum %d\n",
15031 format_ip4_address, mp->collector_address,
15032 ntohs (mp->collector_port),
15033 format_ip4_address, mp->src_address,
15034 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
15035 ntohl (mp->template_interval), mp->udp_checksum);
15038 vam->result_ready = 1;
15042 vl_api_ipfix_exporter_details_t_handler_json
15043 (vl_api_ipfix_exporter_details_t * mp)
15045 vat_main_t *vam = &vat_main;
15046 vat_json_node_t node;
15047 struct in_addr collector_address;
15048 struct in_addr src_address;
15050 vat_json_init_object (&node);
15051 clib_memcpy (&collector_address, &mp->collector_address,
15052 sizeof (collector_address));
15053 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
15054 vat_json_object_add_uint (&node, "collector_port",
15055 ntohs (mp->collector_port));
15056 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
15057 vat_json_object_add_ip4 (&node, "src_address", src_address);
15058 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
15059 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
15060 vat_json_object_add_uint (&node, "template_interval",
15061 ntohl (mp->template_interval));
15062 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
15064 vat_json_print (vam->ofp, &node);
15065 vat_json_free (&node);
15067 vam->result_ready = 1;
15071 api_ipfix_exporter_dump (vat_main_t * vam)
15073 vl_api_ipfix_exporter_dump_t *mp;
15076 /* Construct the API message */
15077 M (IPFIX_EXPORTER_DUMP, ipfix_exporter_dump);
15087 api_ipfix_classify_stream_dump (vat_main_t * vam)
15089 vl_api_ipfix_classify_stream_dump_t *mp;
15092 /* Construct the API message */
15093 M (IPFIX_CLASSIFY_STREAM_DUMP, ipfix_classify_stream_dump);
15103 vl_api_ipfix_classify_stream_details_t_handler
15104 (vl_api_ipfix_classify_stream_details_t * mp)
15106 vat_main_t *vam = &vat_main;
15107 fformat (vam->ofp, "domain_id %d, src_port %d\n",
15108 ntohl (mp->domain_id), ntohs (mp->src_port));
15110 vam->result_ready = 1;
15114 vl_api_ipfix_classify_stream_details_t_handler_json
15115 (vl_api_ipfix_classify_stream_details_t * mp)
15117 vat_main_t *vam = &vat_main;
15118 vat_json_node_t node;
15120 vat_json_init_object (&node);
15121 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
15122 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
15124 vat_json_print (vam->ofp, &node);
15125 vat_json_free (&node);
15127 vam->result_ready = 1;
15131 api_ipfix_classify_table_dump (vat_main_t * vam)
15133 vl_api_ipfix_classify_table_dump_t *mp;
15136 if (!vam->json_output)
15138 fformat (vam->ofp, "%15s%15s%20s\n", "table_id", "ip_version",
15139 "transport_protocol");
15142 /* Construct the API message */
15143 M (IPFIX_CLASSIFY_TABLE_DUMP, ipfix_classify_table_dump);
15148 /* Use a control ping for synchronization */
15150 vl_api_control_ping_t *mp;
15151 M (CONTROL_PING, control_ping);
15158 vl_api_ipfix_classify_table_details_t_handler
15159 (vl_api_ipfix_classify_table_details_t * mp)
15161 vat_main_t *vam = &vat_main;
15162 fformat (vam->ofp, "%15d%15d%20d\n", ntohl (mp->table_id), mp->ip_version,
15163 mp->transport_protocol);
15167 vl_api_ipfix_classify_table_details_t_handler_json
15168 (vl_api_ipfix_classify_table_details_t * mp)
15170 vat_json_node_t *node = NULL;
15171 vat_main_t *vam = &vat_main;
15173 if (VAT_JSON_ARRAY != vam->json_tree.type)
15175 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15176 vat_json_init_array (&vam->json_tree);
15179 node = vat_json_array_add (&vam->json_tree);
15180 vat_json_init_object (node);
15182 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
15183 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
15184 vat_json_object_add_uint (node, "transport_protocol",
15185 mp->transport_protocol);
15189 api_pg_create_interface (vat_main_t * vam)
15191 unformat_input_t *input = vam->input;
15192 vl_api_pg_create_interface_t *mp;
15196 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15198 if (unformat (input, "if_id %d", &if_id))
15205 errmsg ("missing pg interface index\n");
15209 /* Construct the API message */
15210 M (PG_CREATE_INTERFACE, pg_create_interface);
15212 mp->interface_id = ntohl (if_id);
15221 api_pg_capture (vat_main_t * vam)
15223 unformat_input_t *input = vam->input;
15224 vl_api_pg_capture_t *mp;
15230 u8 pcap_file_set = 0;
15232 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15234 if (unformat (input, "if_id %d", &if_id))
15236 else if (unformat (input, "pcap %s", &pcap_file))
15238 else if (unformat (input, "count %d", &count))
15240 else if (unformat (input, "disable"))
15247 errmsg ("missing pg interface index\n");
15250 if (pcap_file_set > 0)
15252 if (vec_len (pcap_file) > 255)
15254 errmsg ("pcap file name is too long\n");
15259 u32 name_len = vec_len (pcap_file);
15260 /* Construct the API message */
15261 M (PG_CAPTURE, pg_capture);
15263 mp->interface_id = ntohl (if_id);
15264 mp->is_enabled = enable;
15265 mp->count = ntohl (count);
15266 mp->pcap_name_length = ntohl (name_len);
15267 if (pcap_file_set != 0)
15269 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
15271 vec_free (pcap_file);
15280 api_pg_enable_disable (vat_main_t * vam)
15282 unformat_input_t *input = vam->input;
15283 vl_api_pg_enable_disable_t *mp;
15287 u8 stream_name_set = 0;
15288 u8 *stream_name = 0;
15289 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15291 if (unformat (input, "stream %s", &stream_name))
15292 stream_name_set = 1;
15293 else if (unformat (input, "disable"))
15299 if (stream_name_set > 0)
15301 if (vec_len (stream_name) > 255)
15303 errmsg ("stream name too long\n");
15308 u32 name_len = vec_len (stream_name);
15309 /* Construct the API message */
15310 M (PG_ENABLE_DISABLE, pg_enable_disable);
15312 mp->is_enabled = enable;
15313 if (stream_name_set != 0)
15315 mp->stream_name_length = ntohl (name_len);
15316 clib_memcpy (mp->stream_name, stream_name, name_len);
15318 vec_free (stream_name);
15327 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15329 unformat_input_t *input = vam->input;
15330 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15333 u16 *low_ports = 0;
15334 u16 *high_ports = 0;
15337 ip4_address_t ip4_addr;
15338 ip6_address_t ip6_addr;
15346 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15348 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15354 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15359 else if (unformat (input, "vrf %d", &vrf_id))
15361 else if (unformat (input, "del"))
15363 else if (unformat (input, "port %d", &tmp))
15365 if (tmp == 0 || tmp > 65535)
15367 errmsg ("port %d out of range", tmp);
15371 this_hi = this_low + 1;
15372 vec_add1 (low_ports, this_low);
15373 vec_add1 (high_ports, this_hi);
15375 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15377 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15379 errmsg ("incorrect range parameters\n");
15383 /* Note: in debug CLI +1 is added to high before
15384 passing to real fn that does "the work"
15385 (ip_source_and_port_range_check_add_del).
15386 This fn is a wrapper around the binary API fn a
15387 control plane will call, which expects this increment
15388 to have occurred. Hence letting the binary API control
15389 plane fn do the increment for consistency between VAT
15390 and other control planes.
15393 vec_add1 (low_ports, this_low);
15394 vec_add1 (high_ports, this_hi);
15400 if (prefix_set == 0)
15402 errmsg ("<address>/<mask> not specified\n");
15408 errmsg ("VRF ID required, not specified\n");
15415 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15419 if (vec_len (low_ports) == 0)
15421 errmsg ("At least one port or port range required\n");
15425 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15426 ip_source_and_port_range_check_add_del);
15428 mp->is_add = is_add;
15433 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15438 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15441 mp->mask_length = length;
15442 mp->number_of_ranges = vec_len (low_ports);
15444 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15445 vec_free (low_ports);
15447 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15448 vec_free (high_ports);
15450 mp->vrf_id = ntohl (vrf_id);
15459 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15461 unformat_input_t *input = vam->input;
15462 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15464 u32 sw_if_index = ~0;
15466 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15467 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15470 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15472 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15474 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15476 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15478 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15480 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15482 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15484 else if (unformat (input, "del"))
15490 if (sw_if_index == ~0)
15492 errmsg ("Interface required but not specified\n");
15498 errmsg ("VRF ID required but not specified\n");
15502 if (tcp_out_vrf_id == 0
15503 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15506 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15510 /* Construct the API message */
15511 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15512 ip_source_and_port_range_check_interface_add_del);
15514 mp->sw_if_index = ntohl (sw_if_index);
15515 mp->is_add = is_add;
15516 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15517 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15518 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15519 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15524 /* Wait for a reply... */
15529 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15531 unformat_input_t *i = vam->input;
15532 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15534 u32 local_sa_id = 0;
15535 u32 remote_sa_id = 0;
15536 ip4_address_t src_address;
15537 ip4_address_t dst_address;
15540 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15542 if (unformat (i, "local_sa %d", &local_sa_id))
15544 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15546 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15548 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15550 else if (unformat (i, "del"))
15554 clib_warning ("parse error '%U'", format_unformat_error, i);
15559 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15561 mp->local_sa_id = ntohl (local_sa_id);
15562 mp->remote_sa_id = ntohl (remote_sa_id);
15563 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15564 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15565 mp->is_add = is_add;
15574 api_punt (vat_main_t * vam)
15576 unformat_input_t *i = vam->input;
15584 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15586 if (unformat (i, "ip %d", &ipv))
15588 else if (unformat (i, "protocol %d", &protocol))
15590 else if (unformat (i, "port %d", &port))
15592 else if (unformat (i, "del"))
15596 clib_warning ("parse error '%U'", format_unformat_error, i);
15603 mp->is_add = (u8) is_add;
15604 mp->ipv = (u8) ipv;
15605 mp->l4_protocol = (u8) protocol;
15606 mp->l4_port = htons ((u16) port);
15614 static void vl_api_ipsec_gre_tunnel_details_t_handler
15615 (vl_api_ipsec_gre_tunnel_details_t * mp)
15617 vat_main_t *vam = &vat_main;
15619 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15620 ntohl (mp->sw_if_index),
15621 format_ip4_address, &mp->src_address,
15622 format_ip4_address, &mp->dst_address,
15623 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15626 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15627 (vl_api_ipsec_gre_tunnel_details_t * mp)
15629 vat_main_t *vam = &vat_main;
15630 vat_json_node_t *node = NULL;
15631 struct in_addr ip4;
15633 if (VAT_JSON_ARRAY != vam->json_tree.type)
15635 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15636 vat_json_init_array (&vam->json_tree);
15638 node = vat_json_array_add (&vam->json_tree);
15640 vat_json_init_object (node);
15641 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15642 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15643 vat_json_object_add_ip4 (node, "src_address", ip4);
15644 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15645 vat_json_object_add_ip4 (node, "dst_address", ip4);
15646 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15647 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15651 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15653 unformat_input_t *i = vam->input;
15654 vl_api_ipsec_gre_tunnel_dump_t *mp;
15657 u8 sw_if_index_set = 0;
15659 /* Parse args required to build the message */
15660 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15662 if (unformat (i, "sw_if_index %d", &sw_if_index))
15663 sw_if_index_set = 1;
15668 if (sw_if_index_set == 0)
15673 if (!vam->json_output)
15675 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15676 "sw_if_index", "src_address", "dst_address",
15677 "local_sa_id", "remote_sa_id");
15680 /* Get list of gre-tunnel interfaces */
15681 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15683 mp->sw_if_index = htonl (sw_if_index);
15687 /* Use a control ping for synchronization */
15689 vl_api_control_ping_t *mp;
15690 M (CONTROL_PING, control_ping);
15697 api_delete_subif (vat_main_t * vam)
15699 unformat_input_t *i = vam->input;
15700 vl_api_delete_subif_t *mp;
15702 u32 sw_if_index = ~0;
15704 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15706 if (unformat (i, "sw_if_index %d", &sw_if_index))
15712 if (sw_if_index == ~0)
15714 errmsg ("missing sw_if_index\n");
15718 /* Construct the API message */
15719 M (DELETE_SUBIF, delete_subif);
15720 mp->sw_if_index = ntohl (sw_if_index);
15726 #define foreach_pbb_vtr_op \
15727 _("disable", L2_VTR_DISABLED) \
15728 _("pop", L2_VTR_POP_2) \
15729 _("push", L2_VTR_PUSH_2)
15732 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
15734 unformat_input_t *i = vam->input;
15735 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
15737 u32 sw_if_index = ~0, vtr_op = ~0;
15738 u16 outer_tag = ~0;
15739 u8 dmac[6], smac[6];
15740 u8 dmac_set = 0, smac_set = 0;
15745 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15747 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15749 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15751 else if (unformat (i, "vtr_op %d", &vtr_op))
15753 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
15756 else if (unformat (i, "translate_pbb_stag"))
15758 if (unformat (i, "%d", &tmp))
15760 vtr_op = L2_VTR_TRANSLATE_2_1;
15766 ("translate_pbb_stag operation requires outer tag definition\n");
15770 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
15772 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
15774 else if (unformat (i, "sid %d", &sid))
15776 else if (unformat (i, "vlanid %d", &tmp))
15780 clib_warning ("parse error '%U'", format_unformat_error, i);
15785 if ((sw_if_index == ~0) || (vtr_op == ~0))
15787 errmsg ("missing sw_if_index or vtr operation\n");
15790 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
15791 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
15794 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid\n");
15798 M (L2_INTERFACE_PBB_TAG_REWRITE, l2_interface_pbb_tag_rewrite);
15799 mp->sw_if_index = ntohl (sw_if_index);
15800 mp->vtr_op = ntohl (vtr_op);
15801 mp->outer_tag = ntohs (outer_tag);
15802 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
15803 clib_memcpy (mp->b_smac, smac, sizeof (smac));
15804 mp->b_vlanid = ntohs (vlanid);
15805 mp->i_sid = ntohl (sid);
15814 api_flow_classify_set_interface (vat_main_t * vam)
15816 unformat_input_t *i = vam->input;
15817 vl_api_flow_classify_set_interface_t *mp;
15820 int sw_if_index_set;
15821 u32 ip4_table_index = ~0;
15822 u32 ip6_table_index = ~0;
15825 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15827 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15828 sw_if_index_set = 1;
15829 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15830 sw_if_index_set = 1;
15831 else if (unformat (i, "del"))
15833 else if (unformat (i, "ip4-table %d", &ip4_table_index))
15835 else if (unformat (i, "ip6-table %d", &ip6_table_index))
15839 clib_warning ("parse error '%U'", format_unformat_error, i);
15844 if (sw_if_index_set == 0)
15846 errmsg ("missing interface name or sw_if_index\n");
15850 M (FLOW_CLASSIFY_SET_INTERFACE, flow_classify_set_interface);
15852 mp->sw_if_index = ntohl (sw_if_index);
15853 mp->ip4_table_index = ntohl (ip4_table_index);
15854 mp->ip6_table_index = ntohl (ip6_table_index);
15855 mp->is_add = is_add;
15864 api_flow_classify_dump (vat_main_t * vam)
15866 unformat_input_t *i = vam->input;
15867 vl_api_flow_classify_dump_t *mp;
15869 u8 type = FLOW_CLASSIFY_N_TABLES;
15871 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
15875 errmsg ("classify table type must be specified\n");
15879 if (!vam->json_output)
15881 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
15884 M (FLOW_CLASSIFY_DUMP, flow_classify_dump);
15889 /* Use a control ping for synchronization */
15891 vl_api_control_ping_t *mp;
15892 M (CONTROL_PING, control_ping);
15895 /* Wait for a reply... */
15903 q_or_quit (vat_main_t * vam)
15905 longjmp (vam->jump_buf, 1);
15906 return 0; /* not so much */
15910 q (vat_main_t * vam)
15912 return q_or_quit (vam);
15916 quit (vat_main_t * vam)
15918 return q_or_quit (vam);
15922 comment (vat_main_t * vam)
15928 cmd_cmp (void *a1, void *a2)
15933 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15937 help (vat_main_t * vam)
15942 unformat_input_t *i = vam->input;
15945 if (unformat (i, "%s", &name))
15949 vec_add1 (name, 0);
15951 hs = hash_get_mem (vam->help_by_name, name);
15953 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15955 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15960 fformat (vam->ofp, "Help is available for the following:\n");
15963 hash_foreach_pair (p, vam->function_by_name,
15965 vec_add1 (cmds, (u8 *)(p->key));
15969 vec_sort_with_function (cmds, cmd_cmp);
15971 for (j = 0; j < vec_len (cmds); j++)
15972 fformat (vam->ofp, "%s\n", cmds[j]);
15979 set (vat_main_t * vam)
15981 u8 *name = 0, *value = 0;
15982 unformat_input_t *i = vam->input;
15984 if (unformat (i, "%s", &name))
15986 /* The input buffer is a vector, not a string. */
15987 value = vec_dup (i->buffer);
15988 vec_delete (value, i->index, 0);
15989 /* Almost certainly has a trailing newline */
15990 if (value[vec_len (value) - 1] == '\n')
15991 value[vec_len (value) - 1] = 0;
15992 /* Make sure it's a proper string, one way or the other */
15993 vec_add1 (value, 0);
15994 (void) clib_macro_set_value (&vam->macro_main,
15995 (char *) name, (char *) value);
15998 errmsg ("usage: set <name> <value>\n");
16006 unset (vat_main_t * vam)
16010 if (unformat (vam->input, "%s", &name))
16011 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
16012 errmsg ("unset: %s wasn't set\n", name);
16025 macro_sort_cmp (void *a1, void *a2)
16027 macro_sort_t *s1 = a1;
16028 macro_sort_t *s2 = a2;
16030 return strcmp ((char *) (s1->name), (char *) (s2->name));
16034 dump_macro_table (vat_main_t * vam)
16036 macro_sort_t *sort_me = 0, *sm;
16041 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
16043 vec_add2 (sort_me, sm, 1);
16044 sm->name = (u8 *)(p->key);
16045 sm->value = (u8 *) (p->value[0]);
16049 vec_sort_with_function (sort_me, macro_sort_cmp);
16051 if (vec_len (sort_me))
16052 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
16054 fformat (vam->ofp, "The macro table is empty...\n");
16056 for (i = 0; i < vec_len (sort_me); i++)
16057 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
16062 dump_node_table (vat_main_t * vam)
16065 vlib_node_t *node, *next_node;
16067 if (vec_len (vam->graph_nodes) == 0)
16069 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16073 for (i = 0; i < vec_len (vam->graph_nodes); i++)
16075 node = vam->graph_nodes[i];
16076 fformat (vam->ofp, "[%d] %s\n", i, node->name);
16077 for (j = 0; j < vec_len (node->next_nodes); j++)
16079 if (node->next_nodes[j] != ~0)
16081 next_node = vam->graph_nodes[node->next_nodes[j]];
16082 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16090 search_node_table (vat_main_t * vam)
16092 unformat_input_t *line_input = vam->input;
16095 vlib_node_t *node, *next_node;
16098 if (vam->graph_node_index_by_name == 0)
16100 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16104 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16106 if (unformat (line_input, "%s", &node_to_find))
16108 vec_add1 (node_to_find, 0);
16109 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
16112 fformat (vam->ofp, "%s not found...\n", node_to_find);
16115 node = vam->graph_nodes[p[0]];
16116 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
16117 for (j = 0; j < vec_len (node->next_nodes); j++)
16119 if (node->next_nodes[j] != ~0)
16121 next_node = vam->graph_nodes[node->next_nodes[j]];
16122 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16129 clib_warning ("parse error '%U'", format_unformat_error,
16135 vec_free (node_to_find);
16144 script (vat_main_t * vam)
16147 char *save_current_file;
16148 unformat_input_t save_input;
16149 jmp_buf save_jump_buf;
16150 u32 save_line_number;
16152 FILE *new_fp, *save_ifp;
16154 if (unformat (vam->input, "%s", &s))
16156 new_fp = fopen ((char *) s, "r");
16159 errmsg ("Couldn't open script file %s\n", s);
16166 errmsg ("Missing script name\n");
16170 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
16171 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
16172 save_ifp = vam->ifp;
16173 save_line_number = vam->input_line_number;
16174 save_current_file = (char *) vam->current_file;
16176 vam->input_line_number = 0;
16178 vam->current_file = s;
16181 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
16182 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
16183 vam->ifp = save_ifp;
16184 vam->input_line_number = save_line_number;
16185 vam->current_file = (u8 *) save_current_file;
16192 echo (vat_main_t * vam)
16194 fformat (vam->ofp, "%v", vam->input->buffer);
16198 /* List of API message constructors, CLI names map to api_xxx */
16199 #define foreach_vpe_api_msg \
16200 _(create_loopback,"[mac <mac-addr>]") \
16201 _(sw_interface_dump,"") \
16202 _(sw_interface_set_flags, \
16203 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
16204 _(sw_interface_add_del_address, \
16205 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
16206 _(sw_interface_set_table, \
16207 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
16208 _(sw_interface_set_mpls_enable, \
16209 "<intfc> | sw_if_index [disable | dis]") \
16210 _(sw_interface_set_vpath, \
16211 "<intfc> | sw_if_index <id> enable | disable") \
16212 _(sw_interface_set_l2_xconnect, \
16213 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16214 "enable | disable") \
16215 _(sw_interface_set_l2_bridge, \
16216 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
16217 "[shg <split-horizon-group>] [bvi]\n" \
16218 "enable | disable") \
16219 _(sw_interface_set_dpdk_hqos_pipe, \
16220 "rx <intfc> | sw_if_index <id> subport <subport-id> pipe <pipe-id>\n" \
16221 "profile <profile-id>\n") \
16222 _(sw_interface_set_dpdk_hqos_subport, \
16223 "rx <intfc> | sw_if_index <id> subport <subport-id> [rate <n>]\n" \
16224 "[bktsize <n>] [tc0 <n>] [tc1 <n>] [tc2 <n>] [tc3 <n>] [period <n>]\n") \
16225 _(sw_interface_set_dpdk_hqos_tctbl, \
16226 "rx <intfc> | sw_if_index <id> entry <n> tc <n> queue <n>\n") \
16227 _(bridge_domain_add_del, \
16228 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
16229 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
16231 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
16233 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
16235 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
16237 "tapname <name> mac <mac-addr> | random-mac") \
16239 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
16241 "<vpp-if-name> | sw_if_index <id>") \
16242 _(sw_interface_tap_dump, "") \
16243 _(ip_add_del_route, \
16244 "<addr>/<mask> via <addr> [table-id <n>]\n" \
16245 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16246 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16247 "[multipath] [count <n>]") \
16248 _(mpls_route_add_del, \
16249 "<label> <eos> via <addr> [table-id <n>]\n" \
16250 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16251 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16252 "[multipath] [count <n>]") \
16253 _(mpls_ip_bind_unbind, \
16254 "<label> <addr/len>") \
16255 _(proxy_arp_add_del, \
16256 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
16257 _(proxy_arp_intfc_enable_disable, \
16258 "<intfc> | sw_if_index <id> enable | disable") \
16259 _(mpls_add_del_encap, \
16260 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
16261 _(sw_interface_set_unnumbered, \
16262 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
16263 _(ip_neighbor_add_del, \
16264 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
16265 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
16266 _(reset_vrf, "vrf <id> [ipv6]") \
16267 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
16268 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
16269 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
16270 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
16271 "[outer_vlan_id_any][inner_vlan_id_any]") \
16272 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
16273 _(reset_fib, "vrf <n> [ipv6]") \
16274 _(dhcp_proxy_config, \
16275 "svr <v46-address> src <v46-address>\n" \
16276 "insert-cid <n> [del]") \
16277 _(dhcp_proxy_config_2, \
16278 "svr <v46-address> src <v46-address>\n" \
16279 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
16280 _(dhcp_proxy_set_vss, \
16281 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
16282 _(dhcp_client_config, \
16283 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
16284 _(set_ip_flow_hash, \
16285 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
16286 _(sw_interface_ip6_enable_disable, \
16287 "<intfc> | sw_if_index <id> enable | disable") \
16288 _(sw_interface_ip6_set_link_local_address, \
16289 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
16290 _(sw_interface_ip6nd_ra_prefix, \
16291 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
16292 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
16293 "[nolink] [isno]") \
16294 _(sw_interface_ip6nd_ra_config, \
16295 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
16296 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
16297 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
16298 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
16299 _(l2_patch_add_del, \
16300 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16301 "enable | disable") \
16302 _(mpls_ethernet_add_del_tunnel, \
16303 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
16304 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
16305 _(mpls_ethernet_add_del_tunnel_2, \
16306 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
16307 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
16308 _(sr_tunnel_add_del, \
16309 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
16310 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
16311 "[policy <policy_name>]") \
16312 _(sr_policy_add_del, \
16313 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
16314 _(sr_multicast_map_add_del, \
16315 "address [ip6 multicast address] sr-policy [policy name] [del]") \
16316 _(classify_add_del_table, \
16317 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
16318 "[del] mask <mask-value>\n" \
16319 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
16320 _(classify_add_del_session, \
16321 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
16322 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
16323 " [l3 [ip4|ip6]]") \
16324 _(classify_set_interface_ip_table, \
16325 "<intfc> | sw_if_index <nn> table <nn>") \
16326 _(classify_set_interface_l2_tables, \
16327 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16328 " [other-table <nn>]") \
16329 _(get_node_index, "node <node-name") \
16330 _(add_node_next, "node <node-name> next <next-node-name>") \
16331 _(l2tpv3_create_tunnel, \
16332 "client_address <ip6-addr> our_address <ip6-addr>\n" \
16333 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
16334 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
16335 _(l2tpv3_set_tunnel_cookies, \
16336 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
16337 "[new_remote_cookie <nn>]\n") \
16338 _(l2tpv3_interface_enable_disable, \
16339 "<intfc> | sw_if_index <nn> enable | disable") \
16340 _(l2tpv3_set_lookup_key, \
16341 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
16342 _(sw_if_l2tpv3_tunnel_dump, "") \
16343 _(vxlan_add_del_tunnel, \
16344 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
16345 " [decap-next l2|ip4|ip6] [del]") \
16346 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16347 _(gre_add_del_tunnel, \
16348 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [teb] [del]\n") \
16349 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16350 _(l2_fib_clear_table, "") \
16351 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
16352 _(l2_interface_vlan_tag_rewrite, \
16353 "<intfc> | sw_if_index <nn> \n" \
16354 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
16355 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
16356 _(create_vhost_user_if, \
16357 "socket <filename> [server] [renumber <dev_instance>] " \
16358 "[mac <mac_address>]") \
16359 _(modify_vhost_user_if, \
16360 "<intfc> | sw_if_index <nn> socket <filename>\n" \
16361 "[server] [renumber <dev_instance>]") \
16362 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
16363 _(sw_interface_vhost_user_dump, "") \
16364 _(show_version, "") \
16365 _(vxlan_gpe_add_del_tunnel, \
16366 "local <addr> remote <addr> vni <nn>\n" \
16367 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
16368 "[next-ethernet] [next-nsh]\n") \
16369 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16370 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
16371 _(interface_name_renumber, \
16372 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
16373 _(input_acl_set_interface, \
16374 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16375 " [l2-table <nn>] [del]") \
16376 _(want_ip4_arp_events, "address <ip4-address> [del]") \
16377 _(want_ip6_nd_events, "address <ip6-address> [del]") \
16378 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
16379 _(ip_dump, "ipv4 | ipv6") \
16380 _(ipsec_spd_add_del, "spd_id <n> [del]") \
16381 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
16383 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
16384 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
16385 " integ_alg <alg> integ_key <hex>") \
16386 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
16387 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
16388 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
16389 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
16390 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
16391 _(ikev2_profile_add_del, "name <profile_name> [del]") \
16392 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
16393 "(auth_data 0x<data> | auth_data <data>)") \
16394 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
16395 "(id_data 0x<data> | id_data <data>) (local|remote)") \
16396 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
16397 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
16398 "(local|remote)") \
16399 _(ikev2_set_local_key, "file <absolute_file_path>") \
16400 _(delete_loopback,"sw_if_index <nn>") \
16401 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
16402 _(map_add_domain, \
16403 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
16404 "ip6-src <ip6addr> " \
16405 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
16406 _(map_del_domain, "index <n>") \
16407 _(map_add_del_rule, \
16408 "index <n> psid <n> dst <ip6addr> [del]") \
16409 _(map_domain_dump, "") \
16410 _(map_rule_dump, "index <map-domain>") \
16411 _(want_interface_events, "enable|disable") \
16412 _(want_stats,"enable|disable") \
16413 _(get_first_msg_id, "client <name>") \
16414 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
16415 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
16416 "fib-id <nn> [ip4][ip6][default]") \
16417 _(get_node_graph, " ") \
16418 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
16419 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
16420 _(ioam_disable, "") \
16421 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
16422 " sw_if_index <sw_if_index> p <priority> " \
16423 "w <weight>] [del]") \
16424 _(lisp_add_del_locator, "locator-set <locator_name> " \
16425 "iface <intf> | sw_if_index <sw_if_index> " \
16426 "p <priority> w <weight> [del]") \
16427 _(lisp_add_del_local_eid,"vni <vni> eid " \
16428 "<ipv4|ipv6>/<prefix> | <L2 address> " \
16429 "locator-set <locator_name> [del]") \
16430 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
16431 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
16432 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
16433 _(lisp_gpe_enable_disable, "enable|disable") \
16434 _(lisp_enable_disable, "enable|disable") \
16435 _(lisp_gpe_add_del_iface, "up|down") \
16436 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
16438 "rloc <locator> p <prio> " \
16439 "w <weight> [rloc <loc> ... ] " \
16440 "action <action> [del-all]") \
16441 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
16443 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
16444 _(lisp_map_request_mode, "src-dst|dst-only") \
16445 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
16446 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
16447 _(lisp_locator_set_dump, "[local | remote]") \
16448 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
16449 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
16450 "[local] | [remote]") \
16451 _(lisp_eid_table_vni_dump, "") \
16452 _(lisp_eid_table_map_dump, "l2|l3") \
16453 _(lisp_gpe_tunnel_dump, "") \
16454 _(lisp_map_resolver_dump, "") \
16455 _(lisp_adjacencies_get, "vni <vni>") \
16456 _(show_lisp_status, "") \
16457 _(lisp_get_map_request_itr_rlocs, "") \
16458 _(show_lisp_pitr, "") \
16459 _(show_lisp_map_request_mode, "") \
16460 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
16461 _(af_packet_delete, "name <host interface name>") \
16462 _(policer_add_del, "name <policer name> <params> [del]") \
16463 _(policer_dump, "[name <policer name>]") \
16464 _(policer_classify_set_interface, \
16465 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16466 " [l2-table <nn>] [del]") \
16467 _(policer_classify_dump, "type [ip4|ip6|l2]") \
16468 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
16469 "[master|slave]") \
16470 _(netmap_delete, "name <interface name>") \
16471 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
16472 _(mpls_fib_encap_dump, "") \
16473 _(mpls_fib_dump, "") \
16474 _(classify_table_ids, "") \
16475 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
16476 _(classify_table_info, "table_id <nn>") \
16477 _(classify_session_dump, "table_id <nn>") \
16478 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
16479 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
16480 "[template_interval <nn>] [udp_checksum]") \
16481 _(ipfix_exporter_dump, "") \
16482 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
16483 _(ipfix_classify_stream_dump, "") \
16484 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]")\
16485 _(ipfix_classify_table_dump, "") \
16486 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
16487 _(pg_create_interface, "if_id <nn>") \
16488 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
16489 _(pg_enable_disable, "[stream <id>] disable") \
16490 _(ip_source_and_port_range_check_add_del, \
16491 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
16492 _(ip_source_and_port_range_check_interface_add_del, \
16493 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
16494 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
16495 _(ipsec_gre_add_del_tunnel, \
16496 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
16497 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
16498 _(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>") \
16499 _(l2_interface_pbb_tag_rewrite, \
16500 "<intfc> | sw_if_index <nn> \n" \
16501 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
16502 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
16503 _(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
16504 _(flow_classify_set_interface, \
16505 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
16506 _(flow_classify_dump, "type [ip4|ip6]")
16508 /* List of command functions, CLI names map directly to functions */
16509 #define foreach_cli_function \
16510 _(comment, "usage: comment <ignore-rest-of-line>") \
16511 _(dump_interface_table, "usage: dump_interface_table") \
16512 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
16513 _(dump_ipv4_table, "usage: dump_ipv4_table") \
16514 _(dump_ipv6_table, "usage: dump_ipv6_table") \
16515 _(dump_stats_table, "usage: dump_stats_table") \
16516 _(dump_macro_table, "usage: dump_macro_table ") \
16517 _(dump_node_table, "usage: dump_node_table") \
16518 _(echo, "usage: echo <message>") \
16519 _(exec, "usage: exec <vpe-debug-CLI-command>") \
16520 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
16521 _(help, "usage: help") \
16522 _(q, "usage: quit") \
16523 _(quit, "usage: quit") \
16524 _(search_node_table, "usage: search_node_table <name>...") \
16525 _(set, "usage: set <variable-name> <value>") \
16526 _(script, "usage: script <file-name>") \
16527 _(unset, "usage: unset <variable-name>")
16530 static void vl_api_##n##_t_handler_uni \
16531 (vl_api_##n##_t * mp) \
16533 vat_main_t * vam = &vat_main; \
16534 if (vam->json_output) { \
16535 vl_api_##n##_t_handler_json(mp); \
16537 vl_api_##n##_t_handler(mp); \
16540 foreach_vpe_api_reply_msg;
16544 vat_api_hookup (vat_main_t * vam)
16547 vl_msg_api_set_handlers(VL_API_##N, #n, \
16548 vl_api_##n##_t_handler_uni, \
16550 vl_api_##n##_t_endian, \
16551 vl_api_##n##_t_print, \
16552 sizeof(vl_api_##n##_t), 1);
16553 foreach_vpe_api_reply_msg;
16556 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
16558 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
16560 vam->function_by_name = hash_create_string (0, sizeof (uword));
16562 vam->help_by_name = hash_create_string (0, sizeof (uword));
16564 /* API messages we can send */
16565 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
16566 foreach_vpe_api_msg;
16570 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16571 foreach_vpe_api_msg;
16574 /* CLI functions */
16575 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
16576 foreach_cli_function;
16580 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16581 foreach_cli_function;
16585 #undef vl_api_version
16586 #define vl_api_version(n,v) static u32 vpe_api_version = v;
16587 #include <vpp-api/vpe.api.h>
16588 #undef vl_api_version
16591 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
16594 * Send the main API signature in slot 0. This bit of code must
16595 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16597 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
16601 * fd.io coding-style-patch-verification: ON
16604 * eval: (c-set-style "gnu")