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... */
6329 /* Return the good/bad news */
6330 return (vam->retval);
6334 api_proxy_arp_add_del (vat_main_t * vam)
6336 unformat_input_t *i = vam->input;
6337 vl_api_proxy_arp_add_del_t *mp;
6341 ip4_address_t lo, hi;
6344 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6346 if (unformat (i, "vrf %d", &vrf_id))
6348 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
6349 unformat_ip4_address, &hi))
6351 else if (unformat (i, "del"))
6355 clib_warning ("parse error '%U'", format_unformat_error, i);
6362 errmsg ("address range not set\n");
6366 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
6368 mp->vrf_id = ntohl (vrf_id);
6369 mp->is_add = is_add;
6370 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
6371 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
6380 api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
6382 unformat_input_t *i = vam->input;
6383 vl_api_proxy_arp_intfc_enable_disable_t *mp;
6387 u8 sw_if_index_set = 0;
6389 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6391 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6392 sw_if_index_set = 1;
6393 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6394 sw_if_index_set = 1;
6395 else if (unformat (i, "enable"))
6397 else if (unformat (i, "disable"))
6401 clib_warning ("parse error '%U'", format_unformat_error, i);
6406 if (sw_if_index_set == 0)
6408 errmsg ("missing interface name or sw_if_index\n");
6412 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
6414 mp->sw_if_index = ntohl (sw_if_index);
6415 mp->enable_disable = enable;
6424 api_mpls_add_del_encap (vat_main_t * vam)
6426 unformat_input_t *i = vam->input;
6427 vl_api_mpls_add_del_encap_t *mp;
6432 ip4_address_t dst_address;
6435 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6437 if (unformat (i, "vrf %d", &vrf_id))
6439 else if (unformat (i, "label %d", &label))
6440 vec_add1 (labels, ntohl (label));
6441 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
6443 else if (unformat (i, "del"))
6447 clib_warning ("parse error '%U'", format_unformat_error, i);
6452 if (vec_len (labels) == 0)
6454 errmsg ("missing encap label stack\n");
6458 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
6459 sizeof (u32) * vec_len (labels));
6461 mp->vrf_id = ntohl (vrf_id);
6462 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
6463 mp->is_add = is_add;
6464 mp->nlabels = vec_len (labels);
6465 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
6476 api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
6478 unformat_input_t *i = vam->input;
6479 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
6481 u32 inner_vrf_id = 0;
6482 ip4_address_t intfc_address;
6483 u8 dst_mac_address[6];
6486 u8 intfc_address_length = 0;
6490 int tx_sw_if_index_set = 0;
6492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6494 if (unformat (i, "vrf %d", &inner_vrf_id))
6496 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6497 &intfc_address, &tmp))
6498 intfc_address_length = tmp;
6499 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
6500 tx_sw_if_index_set = 1;
6501 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6502 tx_sw_if_index_set = 1;
6503 else if (unformat (i, "dst %U", unformat_ethernet_address,
6506 else if (unformat (i, "l2-only"))
6508 else if (unformat (i, "del"))
6512 clib_warning ("parse error '%U'", format_unformat_error, i);
6519 errmsg ("dst (mac address) not set\n");
6522 if (!tx_sw_if_index_set)
6524 errmsg ("tx-intfc not set\n");
6528 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
6530 mp->vrf_id = ntohl (inner_vrf_id);
6531 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
6532 mp->adj_address_length = intfc_address_length;
6533 clib_memcpy (mp->dst_mac_address, dst_mac_address,
6534 sizeof (dst_mac_address));
6535 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6536 mp->l2_only = l2_only;
6537 mp->is_add = is_add;
6546 api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
6548 unformat_input_t *i = vam->input;
6549 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
6551 u32 inner_vrf_id = 0;
6552 u32 outer_vrf_id = 0;
6553 ip4_address_t adj_address;
6554 int adj_address_set = 0;
6555 ip4_address_t next_hop_address;
6556 int next_hop_address_set = 0;
6558 u8 adj_address_length = 0;
6561 u32 resolve_attempts = 5;
6562 u8 resolve_if_needed = 1;
6564 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6566 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
6568 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
6570 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6571 &adj_address, &tmp))
6573 adj_address_length = tmp;
6574 adj_address_set = 1;
6576 else if (unformat (i, "next-hop %U", unformat_ip4_address,
6578 next_hop_address_set = 1;
6579 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
6581 else if (unformat (i, "resolve-if-needed %d", &tmp))
6582 resolve_if_needed = tmp;
6583 else if (unformat (i, "l2-only"))
6585 else if (unformat (i, "del"))
6589 clib_warning ("parse error '%U'", format_unformat_error, i);
6594 if (!adj_address_set)
6596 errmsg ("adjacency address/mask not set\n");
6599 if (!next_hop_address_set)
6601 errmsg ("ip4 next hop address (in outer fib) not set\n");
6605 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
6607 mp->inner_vrf_id = ntohl (inner_vrf_id);
6608 mp->outer_vrf_id = ntohl (outer_vrf_id);
6609 mp->resolve_attempts = ntohl (resolve_attempts);
6610 mp->resolve_if_needed = resolve_if_needed;
6611 mp->is_add = is_add;
6612 mp->l2_only = l2_only;
6613 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
6614 mp->adj_address_length = adj_address_length;
6615 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
6616 sizeof (next_hop_address));
6625 api_sw_interface_set_unnumbered (vat_main_t * vam)
6627 unformat_input_t *i = vam->input;
6628 vl_api_sw_interface_set_unnumbered_t *mp;
6631 u32 unnum_sw_index = ~0;
6633 u8 sw_if_index_set = 0;
6635 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6637 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6638 sw_if_index_set = 1;
6639 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6640 sw_if_index_set = 1;
6641 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
6643 else if (unformat (i, "del"))
6647 clib_warning ("parse error '%U'", format_unformat_error, i);
6652 if (sw_if_index_set == 0)
6654 errmsg ("missing interface name or sw_if_index\n");
6658 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
6660 mp->sw_if_index = ntohl (sw_if_index);
6661 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6662 mp->is_add = is_add;
6671 api_ip_neighbor_add_del (vat_main_t * vam)
6673 unformat_input_t *i = vam->input;
6674 vl_api_ip_neighbor_add_del_t *mp;
6677 u8 sw_if_index_set = 0;
6683 u8 v4_address_set = 0;
6684 u8 v6_address_set = 0;
6685 ip4_address_t v4address;
6686 ip6_address_t v6address;
6688 memset (mac_address, 0, sizeof (mac_address));
6690 /* Parse args required to build the message */
6691 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6693 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6697 else if (unformat (i, "del"))
6699 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6700 sw_if_index_set = 1;
6701 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6702 sw_if_index_set = 1;
6703 else if (unformat (i, "is_static"))
6705 else if (unformat (i, "vrf %d", &vrf_id))
6707 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6709 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6713 clib_warning ("parse error '%U'", format_unformat_error, i);
6718 if (sw_if_index_set == 0)
6720 errmsg ("missing interface name or sw_if_index\n");
6723 if (v4_address_set && v6_address_set)
6725 errmsg ("both v4 and v6 addresses set\n");
6728 if (!v4_address_set && !v6_address_set)
6730 errmsg ("no address set\n");
6734 /* Construct the API message */
6735 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
6737 mp->sw_if_index = ntohl (sw_if_index);
6738 mp->is_add = is_add;
6739 mp->vrf_id = ntohl (vrf_id);
6740 mp->is_static = is_static;
6742 clib_memcpy (mp->mac_address, mac_address, 6);
6746 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6750 /* mp->is_ipv6 = 0; via memset in M macro above */
6751 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
6757 /* Wait for a reply, return good/bad news */
6765 api_reset_vrf (vat_main_t * vam)
6767 unformat_input_t *i = vam->input;
6768 vl_api_reset_vrf_t *mp;
6774 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6776 if (unformat (i, "vrf %d", &vrf_id))
6778 else if (unformat (i, "ipv6"))
6782 clib_warning ("parse error '%U'", format_unformat_error, i);
6787 if (vrf_id_set == 0)
6789 errmsg ("missing vrf id\n");
6793 M (RESET_VRF, reset_vrf);
6795 mp->vrf_id = ntohl (vrf_id);
6796 mp->is_ipv6 = is_ipv6;
6805 api_create_vlan_subif (vat_main_t * vam)
6807 unformat_input_t *i = vam->input;
6808 vl_api_create_vlan_subif_t *mp;
6811 u8 sw_if_index_set = 0;
6815 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6817 if (unformat (i, "sw_if_index %d", &sw_if_index))
6818 sw_if_index_set = 1;
6819 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6820 sw_if_index_set = 1;
6821 else if (unformat (i, "vlan %d", &vlan_id))
6825 clib_warning ("parse error '%U'", format_unformat_error, i);
6830 if (sw_if_index_set == 0)
6832 errmsg ("missing interface name or sw_if_index\n");
6836 if (vlan_id_set == 0)
6838 errmsg ("missing vlan_id\n");
6841 M (CREATE_VLAN_SUBIF, create_vlan_subif);
6843 mp->sw_if_index = ntohl (sw_if_index);
6844 mp->vlan_id = ntohl (vlan_id);
6852 #define foreach_create_subif_bit \
6859 _(outer_vlan_id_any) \
6860 _(inner_vlan_id_any)
6863 api_create_subif (vat_main_t * vam)
6865 unformat_input_t *i = vam->input;
6866 vl_api_create_subif_t *mp;
6869 u8 sw_if_index_set = 0;
6876 u32 exact_match = 0;
6877 u32 default_sub = 0;
6878 u32 outer_vlan_id_any = 0;
6879 u32 inner_vlan_id_any = 0;
6881 u16 outer_vlan_id = 0;
6882 u16 inner_vlan_id = 0;
6884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6886 if (unformat (i, "sw_if_index %d", &sw_if_index))
6887 sw_if_index_set = 1;
6888 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6889 sw_if_index_set = 1;
6890 else if (unformat (i, "sub_id %d", &sub_id))
6892 else if (unformat (i, "outer_vlan_id %d", &tmp))
6893 outer_vlan_id = tmp;
6894 else if (unformat (i, "inner_vlan_id %d", &tmp))
6895 inner_vlan_id = tmp;
6897 #define _(a) else if (unformat (i, #a)) a = 1 ;
6898 foreach_create_subif_bit
6902 clib_warning ("parse error '%U'", format_unformat_error, i);
6907 if (sw_if_index_set == 0)
6909 errmsg ("missing interface name or sw_if_index\n");
6913 if (sub_id_set == 0)
6915 errmsg ("missing sub_id\n");
6918 M (CREATE_SUBIF, create_subif);
6920 mp->sw_if_index = ntohl (sw_if_index);
6921 mp->sub_id = ntohl (sub_id);
6923 #define _(a) mp->a = a;
6924 foreach_create_subif_bit;
6927 mp->outer_vlan_id = ntohs (outer_vlan_id);
6928 mp->inner_vlan_id = ntohs (inner_vlan_id);
6937 api_oam_add_del (vat_main_t * vam)
6939 unformat_input_t *i = vam->input;
6940 vl_api_oam_add_del_t *mp;
6944 ip4_address_t src, dst;
6948 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6950 if (unformat (i, "vrf %d", &vrf_id))
6952 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6954 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6956 else if (unformat (i, "del"))
6960 clib_warning ("parse error '%U'", format_unformat_error, i);
6967 errmsg ("missing src addr\n");
6973 errmsg ("missing dst addr\n");
6977 M (OAM_ADD_DEL, oam_add_del);
6979 mp->vrf_id = ntohl (vrf_id);
6980 mp->is_add = is_add;
6981 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6982 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
6991 api_reset_fib (vat_main_t * vam)
6993 unformat_input_t *i = vam->input;
6994 vl_api_reset_fib_t *mp;
7000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7002 if (unformat (i, "vrf %d", &vrf_id))
7004 else if (unformat (i, "ipv6"))
7008 clib_warning ("parse error '%U'", format_unformat_error, i);
7013 if (vrf_id_set == 0)
7015 errmsg ("missing vrf id\n");
7019 M (RESET_FIB, reset_fib);
7021 mp->vrf_id = ntohl (vrf_id);
7022 mp->is_ipv6 = is_ipv6;
7031 api_dhcp_proxy_config (vat_main_t * vam)
7033 unformat_input_t *i = vam->input;
7034 vl_api_dhcp_proxy_config_t *mp;
7039 u8 v4_address_set = 0;
7040 u8 v6_address_set = 0;
7041 ip4_address_t v4address;
7042 ip6_address_t v6address;
7043 u8 v4_src_address_set = 0;
7044 u8 v6_src_address_set = 0;
7045 ip4_address_t v4srcaddress;
7046 ip6_address_t v6srcaddress;
7048 /* Parse args required to build the message */
7049 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7051 if (unformat (i, "del"))
7053 else if (unformat (i, "vrf %d", &vrf_id))
7055 else if (unformat (i, "insert-cid %d", &insert_cid))
7057 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7059 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7061 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7062 v4_src_address_set = 1;
7063 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7064 v6_src_address_set = 1;
7069 if (v4_address_set && v6_address_set)
7071 errmsg ("both v4 and v6 server addresses set\n");
7074 if (!v4_address_set && !v6_address_set)
7076 errmsg ("no server addresses set\n");
7080 if (v4_src_address_set && v6_src_address_set)
7082 errmsg ("both v4 and v6 src addresses set\n");
7085 if (!v4_src_address_set && !v6_src_address_set)
7087 errmsg ("no src addresses set\n");
7091 if (!(v4_src_address_set && v4_address_set) &&
7092 !(v6_src_address_set && v6_address_set))
7094 errmsg ("no matching server and src addresses set\n");
7098 /* Construct the API message */
7099 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
7101 mp->insert_circuit_id = insert_cid;
7102 mp->is_add = is_add;
7103 mp->vrf_id = ntohl (vrf_id);
7107 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7108 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7112 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7113 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
7119 /* Wait for a reply, return good/bad news */
7126 api_dhcp_proxy_config_2 (vat_main_t * vam)
7128 unformat_input_t *i = vam->input;
7129 vl_api_dhcp_proxy_config_2_t *mp;
7132 u32 server_vrf_id = 0;
7135 u8 v4_address_set = 0;
7136 u8 v6_address_set = 0;
7137 ip4_address_t v4address;
7138 ip6_address_t v6address;
7139 u8 v4_src_address_set = 0;
7140 u8 v6_src_address_set = 0;
7141 ip4_address_t v4srcaddress;
7142 ip6_address_t v6srcaddress;
7144 /* Parse args required to build the message */
7145 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7147 if (unformat (i, "del"))
7149 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
7151 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
7153 else if (unformat (i, "insert-cid %d", &insert_cid))
7155 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7157 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7159 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7160 v4_src_address_set = 1;
7161 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7162 v6_src_address_set = 1;
7167 if (v4_address_set && v6_address_set)
7169 errmsg ("both v4 and v6 server addresses set\n");
7172 if (!v4_address_set && !v6_address_set)
7174 errmsg ("no server addresses set\n");
7178 if (v4_src_address_set && v6_src_address_set)
7180 errmsg ("both v4 and v6 src addresses set\n");
7183 if (!v4_src_address_set && !v6_src_address_set)
7185 errmsg ("no src addresses set\n");
7189 if (!(v4_src_address_set && v4_address_set) &&
7190 !(v6_src_address_set && v6_address_set))
7192 errmsg ("no matching server and src addresses set\n");
7196 /* Construct the API message */
7197 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
7199 mp->insert_circuit_id = insert_cid;
7200 mp->is_add = is_add;
7201 mp->rx_vrf_id = ntohl (rx_vrf_id);
7202 mp->server_vrf_id = ntohl (server_vrf_id);
7206 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7207 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7211 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7212 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
7218 /* Wait for a reply, return good/bad news */
7225 api_dhcp_proxy_set_vss (vat_main_t * vam)
7227 unformat_input_t *i = vam->input;
7228 vl_api_dhcp_proxy_set_vss_t *mp;
7239 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7241 if (unformat (i, "tbl_id %d", &tbl_id))
7243 if (unformat (i, "fib_id %d", &fib_id))
7245 if (unformat (i, "oui %d", &oui))
7247 else if (unformat (i, "ipv6"))
7249 else if (unformat (i, "del"))
7253 clib_warning ("parse error '%U'", format_unformat_error, i);
7258 if (tbl_id_set == 0)
7260 errmsg ("missing tbl id\n");
7264 if (fib_id_set == 0)
7266 errmsg ("missing fib id\n");
7271 errmsg ("missing oui\n");
7275 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
7276 mp->tbl_id = ntohl (tbl_id);
7277 mp->fib_id = ntohl (fib_id);
7278 mp->oui = ntohl (oui);
7279 mp->is_ipv6 = is_ipv6;
7280 mp->is_add = is_add;
7289 api_dhcp_client_config (vat_main_t * vam)
7291 unformat_input_t *i = vam->input;
7292 vl_api_dhcp_client_config_t *mp;
7295 u8 sw_if_index_set = 0;
7298 u8 disable_event = 0;
7300 /* Parse args required to build the message */
7301 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7303 if (unformat (i, "del"))
7305 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7306 sw_if_index_set = 1;
7307 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7308 sw_if_index_set = 1;
7309 else if (unformat (i, "hostname %s", &hostname))
7311 else if (unformat (i, "disable_event"))
7317 if (sw_if_index_set == 0)
7319 errmsg ("missing interface name or sw_if_index\n");
7323 if (vec_len (hostname) > 63)
7325 errmsg ("hostname too long\n");
7327 vec_add1 (hostname, 0);
7329 /* Construct the API message */
7330 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
7332 mp->sw_if_index = ntohl (sw_if_index);
7333 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
7334 vec_free (hostname);
7335 mp->is_add = is_add;
7336 mp->want_dhcp_event = disable_event ? 0 : 1;
7337 mp->pid = getpid ();
7342 /* Wait for a reply, return good/bad news */
7349 api_set_ip_flow_hash (vat_main_t * vam)
7351 unformat_input_t *i = vam->input;
7352 vl_api_set_ip_flow_hash_t *mp;
7364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7366 if (unformat (i, "vrf %d", &vrf_id))
7368 else if (unformat (i, "ipv6"))
7370 else if (unformat (i, "src"))
7372 else if (unformat (i, "dst"))
7374 else if (unformat (i, "sport"))
7376 else if (unformat (i, "dport"))
7378 else if (unformat (i, "proto"))
7380 else if (unformat (i, "reverse"))
7385 clib_warning ("parse error '%U'", format_unformat_error, i);
7390 if (vrf_id_set == 0)
7392 errmsg ("missing vrf id\n");
7396 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
7402 mp->reverse = reverse;
7403 mp->vrf_id = ntohl (vrf_id);
7404 mp->is_ipv6 = is_ipv6;
7413 api_sw_interface_ip6_enable_disable (vat_main_t * vam)
7415 unformat_input_t *i = vam->input;
7416 vl_api_sw_interface_ip6_enable_disable_t *mp;
7419 u8 sw_if_index_set = 0;
7422 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7424 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7425 sw_if_index_set = 1;
7426 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7427 sw_if_index_set = 1;
7428 else if (unformat (i, "enable"))
7430 else if (unformat (i, "disable"))
7434 clib_warning ("parse error '%U'", format_unformat_error, i);
7439 if (sw_if_index_set == 0)
7441 errmsg ("missing interface name or sw_if_index\n");
7445 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
7447 mp->sw_if_index = ntohl (sw_if_index);
7448 mp->enable = enable;
7457 api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
7459 unformat_input_t *i = vam->input;
7460 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
7463 u8 sw_if_index_set = 0;
7464 u32 address_length = 0;
7465 u8 v6_address_set = 0;
7466 ip6_address_t v6address;
7468 /* Parse args required to build the message */
7469 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7471 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7472 sw_if_index_set = 1;
7473 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7474 sw_if_index_set = 1;
7475 else if (unformat (i, "%U/%d",
7476 unformat_ip6_address, &v6address, &address_length))
7482 if (sw_if_index_set == 0)
7484 errmsg ("missing interface name or sw_if_index\n");
7487 if (!v6_address_set)
7489 errmsg ("no address set\n");
7493 /* Construct the API message */
7494 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
7495 sw_interface_ip6_set_link_local_address);
7497 mp->sw_if_index = ntohl (sw_if_index);
7498 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7499 mp->address_length = address_length;
7504 /* Wait for a reply, return good/bad news */
7513 api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
7515 unformat_input_t *i = vam->input;
7516 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
7519 u8 sw_if_index_set = 0;
7520 u32 address_length = 0;
7521 u8 v6_address_set = 0;
7522 ip6_address_t v6address;
7524 u8 no_advertise = 0;
7526 u8 no_autoconfig = 0;
7529 u32 val_lifetime = 0;
7530 u32 pref_lifetime = 0;
7532 /* Parse args required to build the message */
7533 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7535 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7536 sw_if_index_set = 1;
7537 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7538 sw_if_index_set = 1;
7539 else if (unformat (i, "%U/%d",
7540 unformat_ip6_address, &v6address, &address_length))
7542 else if (unformat (i, "val_life %d", &val_lifetime))
7544 else if (unformat (i, "pref_life %d", &pref_lifetime))
7546 else if (unformat (i, "def"))
7548 else if (unformat (i, "noadv"))
7550 else if (unformat (i, "offl"))
7552 else if (unformat (i, "noauto"))
7554 else if (unformat (i, "nolink"))
7556 else if (unformat (i, "isno"))
7560 clib_warning ("parse error '%U'", format_unformat_error, i);
7565 if (sw_if_index_set == 0)
7567 errmsg ("missing interface name or sw_if_index\n");
7570 if (!v6_address_set)
7572 errmsg ("no address set\n");
7576 /* Construct the API message */
7577 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
7579 mp->sw_if_index = ntohl (sw_if_index);
7580 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7581 mp->address_length = address_length;
7582 mp->use_default = use_default;
7583 mp->no_advertise = no_advertise;
7584 mp->off_link = off_link;
7585 mp->no_autoconfig = no_autoconfig;
7586 mp->no_onlink = no_onlink;
7588 mp->val_lifetime = ntohl (val_lifetime);
7589 mp->pref_lifetime = ntohl (pref_lifetime);
7594 /* Wait for a reply, return good/bad news */
7602 api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
7604 unformat_input_t *i = vam->input;
7605 vl_api_sw_interface_ip6nd_ra_config_t *mp;
7608 u8 sw_if_index_set = 0;
7613 u8 send_unicast = 0;
7616 u8 default_router = 0;
7617 u32 max_interval = 0;
7618 u32 min_interval = 0;
7620 u32 initial_count = 0;
7621 u32 initial_interval = 0;
7624 /* Parse args required to build the message */
7625 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7627 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7628 sw_if_index_set = 1;
7629 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7630 sw_if_index_set = 1;
7631 else if (unformat (i, "maxint %d", &max_interval))
7633 else if (unformat (i, "minint %d", &min_interval))
7635 else if (unformat (i, "life %d", &lifetime))
7637 else if (unformat (i, "count %d", &initial_count))
7639 else if (unformat (i, "interval %d", &initial_interval))
7641 else if (unformat (i, "suppress") || unformat (i, "surpress"))
7643 else if (unformat (i, "managed"))
7645 else if (unformat (i, "other"))
7647 else if (unformat (i, "ll"))
7649 else if (unformat (i, "send"))
7651 else if (unformat (i, "cease"))
7653 else if (unformat (i, "isno"))
7655 else if (unformat (i, "def"))
7659 clib_warning ("parse error '%U'", format_unformat_error, i);
7664 if (sw_if_index_set == 0)
7666 errmsg ("missing interface name or sw_if_index\n");
7670 /* Construct the API message */
7671 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
7673 mp->sw_if_index = ntohl (sw_if_index);
7674 mp->max_interval = ntohl (max_interval);
7675 mp->min_interval = ntohl (min_interval);
7676 mp->lifetime = ntohl (lifetime);
7677 mp->initial_count = ntohl (initial_count);
7678 mp->initial_interval = ntohl (initial_interval);
7679 mp->suppress = suppress;
7680 mp->managed = managed;
7682 mp->ll_option = ll_option;
7683 mp->send_unicast = send_unicast;
7686 mp->default_router = default_router;
7691 /* Wait for a reply, return good/bad news */
7699 api_set_arp_neighbor_limit (vat_main_t * vam)
7701 unformat_input_t *i = vam->input;
7702 vl_api_set_arp_neighbor_limit_t *mp;
7708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7710 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7712 else if (unformat (i, "ipv6"))
7716 clib_warning ("parse error '%U'", format_unformat_error, i);
7723 errmsg ("missing limit value\n");
7727 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
7729 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7730 mp->is_ipv6 = is_ipv6;
7739 api_l2_patch_add_del (vat_main_t * vam)
7741 unformat_input_t *i = vam->input;
7742 vl_api_l2_patch_add_del_t *mp;
7745 u8 rx_sw_if_index_set = 0;
7747 u8 tx_sw_if_index_set = 0;
7750 /* Parse args required to build the message */
7751 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7753 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7754 rx_sw_if_index_set = 1;
7755 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7756 tx_sw_if_index_set = 1;
7757 else if (unformat (i, "rx"))
7759 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7761 if (unformat (i, "%U", unformat_sw_if_index, vam,
7763 rx_sw_if_index_set = 1;
7768 else if (unformat (i, "tx"))
7770 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7772 if (unformat (i, "%U", unformat_sw_if_index, vam,
7774 tx_sw_if_index_set = 1;
7779 else if (unformat (i, "del"))
7785 if (rx_sw_if_index_set == 0)
7787 errmsg ("missing rx interface name or rx_sw_if_index\n");
7791 if (tx_sw_if_index_set == 0)
7793 errmsg ("missing tx interface name or tx_sw_if_index\n");
7797 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
7799 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7800 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7801 mp->is_add = is_add;
7810 api_ioam_enable (vat_main_t * vam)
7812 unformat_input_t *input = vam->input;
7813 vl_api_ioam_enable_t *mp;
7816 int has_trace_option = 0;
7817 int has_pow_option = 0;
7818 int has_ppc_option = 0;
7820 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7822 if (unformat (input, "trace"))
7823 has_trace_option = 1;
7824 else if (unformat (input, "pow"))
7826 else if (unformat (input, "ppc encap"))
7827 has_ppc_option = PPC_ENCAP;
7828 else if (unformat (input, "ppc decap"))
7829 has_ppc_option = PPC_DECAP;
7830 else if (unformat (input, "ppc none"))
7831 has_ppc_option = PPC_NONE;
7835 M (IOAM_ENABLE, ioam_enable);
7836 mp->id = htons (id);
7837 mp->trace_ppc = has_ppc_option;
7838 mp->pow_enable = has_pow_option;
7839 mp->trace_enable = has_trace_option;
7850 api_ioam_disable (vat_main_t * vam)
7852 vl_api_ioam_disable_t *mp;
7855 M (IOAM_DISABLE, ioam_disable);
7862 api_sr_tunnel_add_del (vat_main_t * vam)
7864 unformat_input_t *i = vam->input;
7865 vl_api_sr_tunnel_add_del_t *mp;
7869 ip6_address_t src_address;
7870 int src_address_set = 0;
7871 ip6_address_t dst_address;
7873 int dst_address_set = 0;
7875 u32 rx_table_id = 0;
7876 u32 tx_table_id = 0;
7877 ip6_address_t *segments = 0;
7878 ip6_address_t *this_seg;
7879 ip6_address_t *tags = 0;
7880 ip6_address_t *this_tag;
7881 ip6_address_t next_address, tag;
7883 u8 *policy_name = 0;
7885 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7887 if (unformat (i, "del"))
7889 else if (unformat (i, "name %s", &name))
7891 else if (unformat (i, "policy %s", &policy_name))
7893 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
7895 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
7897 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
7898 src_address_set = 1;
7899 else if (unformat (i, "dst %U/%d",
7900 unformat_ip6_address, &dst_address, &dst_mask_width))
7901 dst_address_set = 1;
7902 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7904 vec_add2 (segments, this_seg, 1);
7905 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7906 sizeof (*this_seg));
7908 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7910 vec_add2 (tags, this_tag, 1);
7911 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7913 else if (unformat (i, "clean"))
7914 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
7915 else if (unformat (i, "protected"))
7916 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
7917 else if (unformat (i, "InPE %d", &pl_index))
7919 if (pl_index <= 0 || pl_index > 4)
7921 pl_index_range_error:
7922 errmsg ("pl index %d out of range\n", pl_index);
7926 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7928 else if (unformat (i, "EgPE %d", &pl_index))
7930 if (pl_index <= 0 || pl_index > 4)
7931 goto pl_index_range_error;
7933 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7935 else if (unformat (i, "OrgSrc %d", &pl_index))
7937 if (pl_index <= 0 || pl_index > 4)
7938 goto pl_index_range_error;
7940 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7946 if (!src_address_set)
7948 errmsg ("src address required\n");
7952 if (!dst_address_set)
7954 errmsg ("dst address required\n");
7960 errmsg ("at least one sr segment required\n");
7964 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7965 vec_len (segments) * sizeof (ip6_address_t)
7966 + vec_len (tags) * sizeof (ip6_address_t));
7968 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7969 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
7970 mp->dst_mask_width = dst_mask_width;
7971 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7972 mp->n_segments = vec_len (segments);
7973 mp->n_tags = vec_len (tags);
7974 mp->is_add = is_del == 0;
7975 clib_memcpy (mp->segs_and_tags, segments,
7976 vec_len (segments) * sizeof (ip6_address_t));
7977 clib_memcpy (mp->segs_and_tags +
7978 vec_len (segments) * sizeof (ip6_address_t), tags,
7979 vec_len (tags) * sizeof (ip6_address_t));
7981 mp->outer_vrf_id = ntohl (rx_table_id);
7982 mp->inner_vrf_id = ntohl (tx_table_id);
7983 memcpy (mp->name, name, vec_len (name));
7984 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
7986 vec_free (segments);
7995 api_sr_policy_add_del (vat_main_t * vam)
7997 unformat_input_t *input = vam->input;
7998 vl_api_sr_policy_add_del_t *mp;
8002 u8 *tunnel_name = 0;
8003 u8 **tunnel_names = 0;
8008 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
8009 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
8011 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8013 if (unformat (input, "del"))
8015 else if (unformat (input, "name %s", &name))
8017 else if (unformat (input, "tunnel %s", &tunnel_name))
8021 vec_add1 (tunnel_names, tunnel_name);
8023 - length = #bytes to store in serial vector
8024 - +1 = byte to store that length
8026 tunnel_names_length += (vec_len (tunnel_name) + 1);
8037 errmsg ("policy name required\n");
8041 if ((!tunnel_set) && (!is_del))
8043 errmsg ("tunnel name required\n");
8047 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
8051 mp->is_add = !is_del;
8053 memcpy (mp->name, name, vec_len (name));
8054 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
8055 u8 *serial_orig = 0;
8056 vec_validate (serial_orig, tunnel_names_length);
8057 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
8058 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
8060 for (j = 0; j < vec_len (tunnel_names); j++)
8062 tun_name_len = vec_len (tunnel_names[j]);
8063 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
8064 serial_orig += 1; // Move along one byte to store the actual tunnel name
8065 memcpy (serial_orig, tunnel_names[j], tun_name_len);
8066 serial_orig += tun_name_len; // Advance past the copy
8068 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
8070 vec_free (tunnel_names);
8071 vec_free (tunnel_name);
8079 api_sr_multicast_map_add_del (vat_main_t * vam)
8081 unformat_input_t *input = vam->input;
8082 vl_api_sr_multicast_map_add_del_t *mp;
8085 ip6_address_t multicast_address;
8086 u8 *policy_name = 0;
8087 int multicast_address_set = 0;
8089 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8091 if (unformat (input, "del"))
8095 (input, "address %U", unformat_ip6_address, &multicast_address))
8096 multicast_address_set = 1;
8097 else if (unformat (input, "sr-policy %s", &policy_name))
8103 if (!is_del && !policy_name)
8105 errmsg ("sr-policy name required\n");
8110 if (!multicast_address_set)
8112 errmsg ("address required\n");
8116 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
8118 mp->is_add = !is_del;
8119 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
8120 clib_memcpy (mp->multicast_address, &multicast_address,
8121 sizeof (mp->multicast_address));
8124 vec_free (policy_name);
8132 #define foreach_tcp_proto_field \
8136 #define foreach_udp_proto_field \
8140 #define foreach_ip4_proto_field \
8151 unformat_tcp_mask (unformat_input_t * input, va_list * args)
8153 u8 **maskp = va_arg (*args, u8 **);
8155 u8 found_something = 0;
8158 #define _(a) u8 a=0;
8159 foreach_tcp_proto_field;
8162 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8165 #define _(a) else if (unformat (input, #a)) a=1;
8166 foreach_tcp_proto_field
8172 #define _(a) found_something += a;
8173 foreach_tcp_proto_field;
8176 if (found_something == 0)
8179 vec_validate (mask, sizeof (*tcp) - 1);
8181 tcp = (tcp_header_t *) mask;
8183 #define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
8184 foreach_tcp_proto_field;
8192 unformat_udp_mask (unformat_input_t * input, va_list * args)
8194 u8 **maskp = va_arg (*args, u8 **);
8196 u8 found_something = 0;
8199 #define _(a) u8 a=0;
8200 foreach_udp_proto_field;
8203 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8206 #define _(a) else if (unformat (input, #a)) a=1;
8207 foreach_udp_proto_field
8213 #define _(a) found_something += a;
8214 foreach_udp_proto_field;
8217 if (found_something == 0)
8220 vec_validate (mask, sizeof (*udp) - 1);
8222 udp = (udp_header_t *) mask;
8224 #define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
8225 foreach_udp_proto_field;
8234 u16 src_port, dst_port;
8238 unformat_l4_mask (unformat_input_t * input, va_list * args)
8240 u8 **maskp = va_arg (*args, u8 **);
8241 u16 src_port = 0, dst_port = 0;
8242 tcpudp_header_t *tcpudp;
8244 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8246 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
8248 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
8250 else if (unformat (input, "src_port"))
8252 else if (unformat (input, "dst_port"))
8258 if (!src_port && !dst_port)
8262 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
8264 tcpudp = (tcpudp_header_t *) mask;
8265 tcpudp->src_port = src_port;
8266 tcpudp->dst_port = dst_port;
8274 unformat_ip4_mask (unformat_input_t * input, va_list * args)
8276 u8 **maskp = va_arg (*args, u8 **);
8278 u8 found_something = 0;
8281 #define _(a) u8 a=0;
8282 foreach_ip4_proto_field;
8288 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8290 if (unformat (input, "version"))
8292 else if (unformat (input, "hdr_length"))
8294 else if (unformat (input, "src"))
8296 else if (unformat (input, "dst"))
8298 else if (unformat (input, "proto"))
8301 #define _(a) else if (unformat (input, #a)) a=1;
8302 foreach_ip4_proto_field
8308 #define _(a) found_something += a;
8309 foreach_ip4_proto_field;
8312 if (found_something == 0)
8315 vec_validate (mask, sizeof (*ip) - 1);
8317 ip = (ip4_header_t *) mask;
8319 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8320 foreach_ip4_proto_field;
8323 ip->ip_version_and_header_length = 0;
8326 ip->ip_version_and_header_length |= 0xF0;
8329 ip->ip_version_and_header_length |= 0x0F;
8335 #define foreach_ip6_proto_field \
8343 unformat_ip6_mask (unformat_input_t * input, va_list * args)
8345 u8 **maskp = va_arg (*args, u8 **);
8347 u8 found_something = 0;
8349 u32 ip_version_traffic_class_and_flow_label;
8351 #define _(a) u8 a=0;
8352 foreach_ip6_proto_field;
8355 u8 traffic_class = 0;
8358 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8360 if (unformat (input, "version"))
8362 else if (unformat (input, "traffic-class"))
8364 else if (unformat (input, "flow-label"))
8366 else if (unformat (input, "src"))
8368 else if (unformat (input, "dst"))
8370 else if (unformat (input, "proto"))
8373 #define _(a) else if (unformat (input, #a)) a=1;
8374 foreach_ip6_proto_field
8380 #define _(a) found_something += a;
8381 foreach_ip6_proto_field;
8384 if (found_something == 0)
8387 vec_validate (mask, sizeof (*ip) - 1);
8389 ip = (ip6_header_t *) mask;
8391 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8392 foreach_ip6_proto_field;
8395 ip_version_traffic_class_and_flow_label = 0;
8398 ip_version_traffic_class_and_flow_label |= 0xF0000000;
8401 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
8404 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
8406 ip->ip_version_traffic_class_and_flow_label =
8407 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
8414 unformat_l3_mask (unformat_input_t * input, va_list * args)
8416 u8 **maskp = va_arg (*args, u8 **);
8418 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8420 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
8422 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
8431 unformat_l2_mask (unformat_input_t * input, va_list * args)
8433 u8 **maskp = va_arg (*args, u8 **);
8448 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8450 if (unformat (input, "src"))
8452 else if (unformat (input, "dst"))
8454 else if (unformat (input, "proto"))
8456 else if (unformat (input, "tag1"))
8458 else if (unformat (input, "tag2"))
8460 else if (unformat (input, "ignore-tag1"))
8462 else if (unformat (input, "ignore-tag2"))
8464 else if (unformat (input, "cos1"))
8466 else if (unformat (input, "cos2"))
8468 else if (unformat (input, "dot1q"))
8470 else if (unformat (input, "dot1ad"))
8475 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
8476 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
8479 if (tag1 || ignore_tag1 || cos1 || dot1q)
8481 if (tag2 || ignore_tag2 || cos2 || dot1ad)
8484 vec_validate (mask, len - 1);
8487 memset (mask, 0xff, 6);
8490 memset (mask + 6, 0xff, 6);
8494 /* inner vlan tag */
8503 mask[21] = mask[20] = 0xff;
8524 mask[16] = mask[17] = 0xff;
8534 mask[12] = mask[13] = 0xff;
8541 unformat_classify_mask (unformat_input_t * input, va_list * args)
8543 u8 **maskp = va_arg (*args, u8 **);
8544 u32 *skipp = va_arg (*args, u32 *);
8545 u32 *matchp = va_arg (*args, u32 *);
8553 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8555 if (unformat (input, "hex %U", unformat_hex_string, &mask))
8557 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
8559 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
8561 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
8575 if (mask || l2 || l3 || l4)
8579 /* "With a free Ethernet header in every package" */
8581 vec_validate (l2, 13);
8585 vec_append (mask, l3);
8590 vec_append (mask, l4);
8595 /* Scan forward looking for the first significant mask octet */
8596 for (i = 0; i < vec_len (mask); i++)
8600 /* compute (skip, match) params */
8601 *skipp = i / sizeof (u32x4);
8602 vec_delete (mask, *skipp * sizeof (u32x4), 0);
8604 /* Pad mask to an even multiple of the vector size */
8605 while (vec_len (mask) % sizeof (u32x4))
8608 match = vec_len (mask) / sizeof (u32x4);
8610 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
8612 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
8613 if (*tmp || *(tmp + 1))
8618 clib_warning ("BUG: match 0");
8620 _vec_len (mask) = match * sizeof (u32x4);
8631 #define foreach_l2_next \
8633 _(ethernet, ETHERNET_INPUT) \
8638 unformat_l2_next_index (unformat_input_t * input, va_list * args)
8640 u32 *miss_next_indexp = va_arg (*args, u32 *);
8645 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
8649 if (unformat (input, "%d", &tmp))
8658 *miss_next_indexp = next_index;
8662 #define foreach_ip_next \
8668 unformat_ip_next_index (unformat_input_t * input, va_list * args)
8670 u32 *miss_next_indexp = va_arg (*args, u32 *);
8675 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
8679 if (unformat (input, "%d", &tmp))
8688 *miss_next_indexp = next_index;
8692 #define foreach_acl_next \
8696 unformat_acl_next_index (unformat_input_t * input, va_list * args)
8698 u32 *miss_next_indexp = va_arg (*args, u32 *);
8703 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
8707 if (unformat (input, "permit"))
8712 else if (unformat (input, "%d", &tmp))
8721 *miss_next_indexp = next_index;
8726 unformat_policer_precolor (unformat_input_t * input, va_list * args)
8728 u32 *r = va_arg (*args, u32 *);
8730 if (unformat (input, "conform-color"))
8731 *r = POLICE_CONFORM;
8732 else if (unformat (input, "exceed-color"))
8741 api_classify_add_del_table (vat_main_t * vam)
8743 unformat_input_t *i = vam->input;
8744 vl_api_classify_add_del_table_t *mp;
8750 u32 table_index = ~0;
8751 u32 next_table_index = ~0;
8752 u32 miss_next_index = ~0;
8753 u32 memory_size = 32 << 20;
8757 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8759 if (unformat (i, "del"))
8761 else if (unformat (i, "buckets %d", &nbuckets))
8763 else if (unformat (i, "memory_size %d", &memory_size))
8765 else if (unformat (i, "skip %d", &skip))
8767 else if (unformat (i, "match %d", &match))
8769 else if (unformat (i, "table %d", &table_index))
8771 else if (unformat (i, "mask %U", unformat_classify_mask,
8772 &mask, &skip, &match))
8774 else if (unformat (i, "next-table %d", &next_table_index))
8776 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8779 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8782 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8789 if (is_add && mask == 0)
8791 errmsg ("Mask required\n");
8795 if (is_add && skip == ~0)
8797 errmsg ("skip count required\n");
8801 if (is_add && match == ~0)
8803 errmsg ("match count required\n");
8807 if (!is_add && table_index == ~0)
8809 errmsg ("table index required for delete\n");
8813 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
8815 mp->is_add = is_add;
8816 mp->table_index = ntohl (table_index);
8817 mp->nbuckets = ntohl (nbuckets);
8818 mp->memory_size = ntohl (memory_size);
8819 mp->skip_n_vectors = ntohl (skip);
8820 mp->match_n_vectors = ntohl (match);
8821 mp->next_table_index = ntohl (next_table_index);
8822 mp->miss_next_index = ntohl (miss_next_index);
8823 clib_memcpy (mp->mask, mask, vec_len (mask));
8833 unformat_l4_match (unformat_input_t * input, va_list * args)
8835 u8 **matchp = va_arg (*args, u8 **);
8837 u8 *proto_header = 0;
8843 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8845 if (unformat (input, "src_port %d", &src_port))
8847 else if (unformat (input, "dst_port %d", &dst_port))
8853 h.src_port = clib_host_to_net_u16 (src_port);
8854 h.dst_port = clib_host_to_net_u16 (dst_port);
8855 vec_validate (proto_header, sizeof (h) - 1);
8856 memcpy (proto_header, &h, sizeof (h));
8858 *matchp = proto_header;
8864 unformat_ip4_match (unformat_input_t * input, va_list * args)
8866 u8 **matchp = va_arg (*args, u8 **);
8873 int src = 0, dst = 0;
8874 ip4_address_t src_val, dst_val;
8881 int fragment_id = 0;
8882 u32 fragment_id_val;
8888 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8890 if (unformat (input, "version %d", &version_val))
8892 else if (unformat (input, "hdr_length %d", &hdr_length_val))
8894 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
8896 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
8898 else if (unformat (input, "proto %d", &proto_val))
8900 else if (unformat (input, "tos %d", &tos_val))
8902 else if (unformat (input, "length %d", &length_val))
8904 else if (unformat (input, "fragment_id %d", &fragment_id_val))
8906 else if (unformat (input, "ttl %d", &ttl_val))
8908 else if (unformat (input, "checksum %d", &checksum_val))
8914 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8915 + ttl + checksum == 0)
8919 * Aligned because we use the real comparison functions
8921 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
8923 ip = (ip4_header_t *) match;
8925 /* These are realistically matched in practice */
8927 ip->src_address.as_u32 = src_val.as_u32;
8930 ip->dst_address.as_u32 = dst_val.as_u32;
8933 ip->protocol = proto_val;
8936 /* These are not, but they're included for completeness */
8938 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
8941 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
8947 ip->length = clib_host_to_net_u16 (length_val);
8953 ip->checksum = clib_host_to_net_u16 (checksum_val);
8960 unformat_ip6_match (unformat_input_t * input, va_list * args)
8962 u8 **matchp = va_arg (*args, u8 **);
8967 u8 traffic_class = 0;
8968 u32 traffic_class_val = 0;
8971 int src = 0, dst = 0;
8972 ip6_address_t src_val, dst_val;
8975 int payload_length = 0;
8976 u32 payload_length_val;
8979 u32 ip_version_traffic_class_and_flow_label;
8981 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8983 if (unformat (input, "version %d", &version_val))
8985 else if (unformat (input, "traffic_class %d", &traffic_class_val))
8987 else if (unformat (input, "flow_label %d", &flow_label_val))
8989 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
8991 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
8993 else if (unformat (input, "proto %d", &proto_val))
8995 else if (unformat (input, "payload_length %d", &payload_length_val))
8997 else if (unformat (input, "hop_limit %d", &hop_limit_val))
9003 if (version + traffic_class + flow_label + src + dst + proto +
9004 payload_length + hop_limit == 0)
9008 * Aligned because we use the real comparison functions
9010 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
9012 ip = (ip6_header_t *) match;
9015 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
9018 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
9021 ip->protocol = proto_val;
9023 ip_version_traffic_class_and_flow_label = 0;
9026 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
9029 ip_version_traffic_class_and_flow_label |=
9030 (traffic_class_val & 0xFF) << 20;
9033 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
9035 ip->ip_version_traffic_class_and_flow_label =
9036 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
9039 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
9042 ip->hop_limit = hop_limit_val;
9049 unformat_l3_match (unformat_input_t * input, va_list * args)
9051 u8 **matchp = va_arg (*args, u8 **);
9053 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9055 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
9057 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
9066 unformat_vlan_tag (unformat_input_t * input, va_list * args)
9068 u8 *tagp = va_arg (*args, u8 *);
9071 if (unformat (input, "%d", &tag))
9073 tagp[0] = (tag >> 8) & 0x0F;
9074 tagp[1] = tag & 0xFF;
9082 unformat_l2_match (unformat_input_t * input, va_list * args)
9084 u8 **matchp = va_arg (*args, u8 **);
9104 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9106 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
9109 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
9111 else if (unformat (input, "proto %U",
9112 unformat_ethernet_type_host_byte_order, &proto_val))
9114 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
9116 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
9118 else if (unformat (input, "ignore-tag1"))
9120 else if (unformat (input, "ignore-tag2"))
9122 else if (unformat (input, "cos1 %d", &cos1_val))
9124 else if (unformat (input, "cos2 %d", &cos2_val))
9129 if ((src + dst + proto + tag1 + tag2 +
9130 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
9133 if (tag1 || ignore_tag1 || cos1)
9135 if (tag2 || ignore_tag2 || cos2)
9138 vec_validate_aligned (match, len - 1, sizeof (u32x4));
9141 clib_memcpy (match, dst_val, 6);
9144 clib_memcpy (match + 6, src_val, 6);
9148 /* inner vlan tag */
9149 match[19] = tag2_val[1];
9150 match[18] = tag2_val[0];
9152 match[18] |= (cos2_val & 0x7) << 5;
9155 match[21] = proto_val & 0xff;
9156 match[20] = proto_val >> 8;
9160 match[15] = tag1_val[1];
9161 match[14] = tag1_val[0];
9164 match[14] |= (cos1_val & 0x7) << 5;
9170 match[15] = tag1_val[1];
9171 match[14] = tag1_val[0];
9174 match[17] = proto_val & 0xff;
9175 match[16] = proto_val >> 8;
9178 match[14] |= (cos1_val & 0x7) << 5;
9184 match[18] |= (cos2_val & 0x7) << 5;
9186 match[14] |= (cos1_val & 0x7) << 5;
9189 match[13] = proto_val & 0xff;
9190 match[12] = proto_val >> 8;
9199 unformat_classify_match (unformat_input_t * input, va_list * args)
9201 u8 **matchp = va_arg (*args, u8 **);
9202 u32 skip_n_vectors = va_arg (*args, u32);
9203 u32 match_n_vectors = va_arg (*args, u32);
9210 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9212 if (unformat (input, "hex %U", unformat_hex_string, &match))
9214 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
9216 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
9218 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
9232 if (match || l2 || l3 || l4)
9236 /* "Win a free Ethernet header in every packet" */
9238 vec_validate_aligned (l2, 13, sizeof (u32x4));
9242 vec_append_aligned (match, l3, sizeof (u32x4));
9247 vec_append_aligned (match, l4, sizeof (u32x4));
9252 /* Make sure the vector is big enough even if key is all 0's */
9253 vec_validate_aligned
9254 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
9257 /* Set size, include skipped vectors */
9258 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
9269 api_classify_add_del_session (vat_main_t * vam)
9271 unformat_input_t *i = vam->input;
9272 vl_api_classify_add_del_session_t *mp;
9274 u32 table_index = ~0;
9275 u32 hit_next_index = ~0;
9276 u32 opaque_index = ~0;
9280 u32 skip_n_vectors = 0;
9281 u32 match_n_vectors = 0;
9284 * Warning: you have to supply skip_n and match_n
9285 * because the API client cant simply look at the classify
9289 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9291 if (unformat (i, "del"))
9293 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
9296 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
9299 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
9302 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
9304 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
9306 else if (unformat (i, "opaque-index %d", &opaque_index))
9308 else if (unformat (i, "skip_n %d", &skip_n_vectors))
9310 else if (unformat (i, "match_n %d", &match_n_vectors))
9312 else if (unformat (i, "match %U", unformat_classify_match,
9313 &match, skip_n_vectors, match_n_vectors))
9315 else if (unformat (i, "advance %d", &advance))
9317 else if (unformat (i, "table-index %d", &table_index))
9323 if (table_index == ~0)
9325 errmsg ("Table index required\n");
9329 if (is_add && match == 0)
9331 errmsg ("Match value required\n");
9335 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
9337 mp->is_add = is_add;
9338 mp->table_index = ntohl (table_index);
9339 mp->hit_next_index = ntohl (hit_next_index);
9340 mp->opaque_index = ntohl (opaque_index);
9341 mp->advance = ntohl (advance);
9342 clib_memcpy (mp->match, match, vec_len (match));
9351 api_classify_set_interface_ip_table (vat_main_t * vam)
9353 unformat_input_t *i = vam->input;
9354 vl_api_classify_set_interface_ip_table_t *mp;
9357 int sw_if_index_set;
9358 u32 table_index = ~0;
9361 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9363 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9364 sw_if_index_set = 1;
9365 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9366 sw_if_index_set = 1;
9367 else if (unformat (i, "table %d", &table_index))
9371 clib_warning ("parse error '%U'", format_unformat_error, i);
9376 if (sw_if_index_set == 0)
9378 errmsg ("missing interface name or sw_if_index\n");
9383 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
9385 mp->sw_if_index = ntohl (sw_if_index);
9386 mp->table_index = ntohl (table_index);
9387 mp->is_ipv6 = is_ipv6;
9396 api_classify_set_interface_l2_tables (vat_main_t * vam)
9398 unformat_input_t *i = vam->input;
9399 vl_api_classify_set_interface_l2_tables_t *mp;
9402 int sw_if_index_set;
9403 u32 ip4_table_index = ~0;
9404 u32 ip6_table_index = ~0;
9405 u32 other_table_index = ~0;
9408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9410 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9411 sw_if_index_set = 1;
9412 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9413 sw_if_index_set = 1;
9414 else if (unformat (i, "ip4-table %d", &ip4_table_index))
9416 else if (unformat (i, "ip6-table %d", &ip6_table_index))
9418 else if (unformat (i, "other-table %d", &other_table_index))
9420 else if (unformat (i, "is-input %d", &is_input))
9424 clib_warning ("parse error '%U'", format_unformat_error, i);
9429 if (sw_if_index_set == 0)
9431 errmsg ("missing interface name or sw_if_index\n");
9436 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
9438 mp->sw_if_index = ntohl (sw_if_index);
9439 mp->ip4_table_index = ntohl (ip4_table_index);
9440 mp->ip6_table_index = ntohl (ip6_table_index);
9441 mp->other_table_index = ntohl (other_table_index);
9442 mp->is_input = (u8) is_input;
9451 api_set_ipfix_exporter (vat_main_t * vam)
9453 unformat_input_t *i = vam->input;
9454 vl_api_set_ipfix_exporter_t *mp;
9455 ip4_address_t collector_address;
9456 u8 collector_address_set = 0;
9457 u32 collector_port = ~0;
9458 ip4_address_t src_address;
9459 u8 src_address_set = 0;
9462 u32 template_interval = ~0;
9463 u8 udp_checksum = 0;
9466 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9468 if (unformat (i, "collector_address %U", unformat_ip4_address,
9469 &collector_address))
9470 collector_address_set = 1;
9471 else if (unformat (i, "collector_port %d", &collector_port))
9473 else if (unformat (i, "src_address %U", unformat_ip4_address,
9475 src_address_set = 1;
9476 else if (unformat (i, "vrf_id %d", &vrf_id))
9478 else if (unformat (i, "path_mtu %d", &path_mtu))
9480 else if (unformat (i, "template_interval %d", &template_interval))
9482 else if (unformat (i, "udp_checksum"))
9488 if (collector_address_set == 0)
9490 errmsg ("collector_address required\n");
9494 if (src_address_set == 0)
9496 errmsg ("src_address required\n");
9500 M (SET_IPFIX_EXPORTER, set_ipfix_exporter);
9502 memcpy (mp->collector_address, collector_address.data,
9503 sizeof (collector_address.data));
9504 mp->collector_port = htons ((u16) collector_port);
9505 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
9506 mp->vrf_id = htonl (vrf_id);
9507 mp->path_mtu = htonl (path_mtu);
9508 mp->template_interval = htonl (template_interval);
9509 mp->udp_checksum = udp_checksum;
9517 api_set_ipfix_classify_stream (vat_main_t * vam)
9519 unformat_input_t *i = vam->input;
9520 vl_api_set_ipfix_classify_stream_t *mp;
9522 u32 src_port = UDP_DST_PORT_ipfix;
9525 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9527 if (unformat (i, "domain %d", &domain_id))
9529 else if (unformat (i, "src_port %d", &src_port))
9533 errmsg ("unknown input `%U'", format_unformat_error, i);
9538 M (SET_IPFIX_CLASSIFY_STREAM, set_ipfix_classify_stream);
9540 mp->domain_id = htonl (domain_id);
9541 mp->src_port = htons ((u16) src_port);
9549 api_ipfix_classify_table_add_del (vat_main_t * vam)
9551 unformat_input_t *i = vam->input;
9552 vl_api_ipfix_classify_table_add_del_t *mp;
9554 u32 classify_table_index = ~0;
9556 u8 transport_protocol = 255;
9559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9561 if (unformat (i, "add"))
9563 else if (unformat (i, "del"))
9565 else if (unformat (i, "table %d", &classify_table_index))
9567 else if (unformat (i, "ip4"))
9569 else if (unformat (i, "ip6"))
9571 else if (unformat (i, "tcp"))
9572 transport_protocol = 6;
9573 else if (unformat (i, "udp"))
9574 transport_protocol = 17;
9577 errmsg ("unknown input `%U'", format_unformat_error, i);
9584 errmsg ("expecting: add|del");
9587 if (classify_table_index == ~0)
9589 errmsg ("classifier table not specified");
9592 if (ip_version == 0)
9594 errmsg ("IP version not specified");
9598 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, ipfix_classify_table_add_del);
9600 mp->is_add = is_add;
9601 mp->table_id = htonl (classify_table_index);
9602 mp->ip_version = ip_version;
9603 mp->transport_protocol = transport_protocol;
9611 api_get_node_index (vat_main_t * vam)
9613 unformat_input_t *i = vam->input;
9614 vl_api_get_node_index_t *mp;
9618 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9620 if (unformat (i, "node %s", &name))
9627 errmsg ("node name required\n");
9630 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9632 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9636 M (GET_NODE_INDEX, get_node_index);
9637 clib_memcpy (mp->node_name, name, vec_len (name));
9647 api_get_next_index (vat_main_t * vam)
9649 unformat_input_t *i = vam->input;
9650 vl_api_get_next_index_t *mp;
9652 u8 *node_name = 0, *next_node_name = 0;
9654 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9656 if (unformat (i, "node-name %s", &node_name))
9658 else if (unformat (i, "next-node-name %s", &next_node_name))
9664 errmsg ("node name required\n");
9667 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
9669 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9673 if (next_node_name == 0)
9675 errmsg ("next node name required\n");
9678 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
9680 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
9684 M (GET_NEXT_INDEX, get_next_index);
9685 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
9686 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
9687 vec_free (node_name);
9688 vec_free (next_node_name);
9697 api_add_node_next (vat_main_t * vam)
9699 unformat_input_t *i = vam->input;
9700 vl_api_add_node_next_t *mp;
9705 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9707 if (unformat (i, "node %s", &name))
9709 else if (unformat (i, "next %s", &next))
9716 errmsg ("node name required\n");
9719 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9721 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9726 errmsg ("next node required\n");
9729 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
9731 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
9735 M (ADD_NODE_NEXT, add_node_next);
9736 clib_memcpy (mp->node_name, name, vec_len (name));
9737 clib_memcpy (mp->next_name, next, vec_len (next));
9748 api_l2tpv3_create_tunnel (vat_main_t * vam)
9750 unformat_input_t *i = vam->input;
9751 ip6_address_t client_address, our_address;
9752 int client_address_set = 0;
9753 int our_address_set = 0;
9754 u32 local_session_id = 0;
9755 u32 remote_session_id = 0;
9756 u64 local_cookie = 0;
9757 u64 remote_cookie = 0;
9758 u8 l2_sublayer_present = 0;
9759 vl_api_l2tpv3_create_tunnel_t *mp;
9762 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9764 if (unformat (i, "client_address %U", unformat_ip6_address,
9766 client_address_set = 1;
9767 else if (unformat (i, "our_address %U", unformat_ip6_address,
9769 our_address_set = 1;
9770 else if (unformat (i, "local_session_id %d", &local_session_id))
9772 else if (unformat (i, "remote_session_id %d", &remote_session_id))
9774 else if (unformat (i, "local_cookie %lld", &local_cookie))
9776 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
9778 else if (unformat (i, "l2-sublayer-present"))
9779 l2_sublayer_present = 1;
9784 if (client_address_set == 0)
9786 errmsg ("client_address required\n");
9790 if (our_address_set == 0)
9792 errmsg ("our_address required\n");
9796 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
9798 clib_memcpy (mp->client_address, client_address.as_u8,
9799 sizeof (mp->client_address));
9801 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
9803 mp->local_session_id = ntohl (local_session_id);
9804 mp->remote_session_id = ntohl (remote_session_id);
9805 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
9806 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
9807 mp->l2_sublayer_present = l2_sublayer_present;
9817 api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
9819 unformat_input_t *i = vam->input;
9821 u8 sw_if_index_set = 0;
9822 u64 new_local_cookie = 0;
9823 u64 new_remote_cookie = 0;
9824 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
9827 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9829 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9830 sw_if_index_set = 1;
9831 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9832 sw_if_index_set = 1;
9833 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
9835 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
9841 if (sw_if_index_set == 0)
9843 errmsg ("missing interface name or sw_if_index\n");
9847 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
9849 mp->sw_if_index = ntohl (sw_if_index);
9850 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
9851 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
9860 api_l2tpv3_interface_enable_disable (vat_main_t * vam)
9862 unformat_input_t *i = vam->input;
9863 vl_api_l2tpv3_interface_enable_disable_t *mp;
9866 u8 sw_if_index_set = 0;
9867 u8 enable_disable = 1;
9869 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9871 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9872 sw_if_index_set = 1;
9873 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9874 sw_if_index_set = 1;
9875 else if (unformat (i, "enable"))
9877 else if (unformat (i, "disable"))
9883 if (sw_if_index_set == 0)
9885 errmsg ("missing interface name or sw_if_index\n");
9889 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
9891 mp->sw_if_index = ntohl (sw_if_index);
9892 mp->enable_disable = enable_disable;
9901 api_l2tpv3_set_lookup_key (vat_main_t * vam)
9903 unformat_input_t *i = vam->input;
9904 vl_api_l2tpv3_set_lookup_key_t *mp;
9908 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9910 if (unformat (i, "lookup_v6_src"))
9911 key = L2T_LOOKUP_SRC_ADDRESS;
9912 else if (unformat (i, "lookup_v6_dst"))
9913 key = L2T_LOOKUP_DST_ADDRESS;
9914 else if (unformat (i, "lookup_session_id"))
9915 key = L2T_LOOKUP_SESSION_ID;
9920 if (key == (u8) ~ 0)
9922 errmsg ("l2tp session lookup key unset\n");
9926 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
9936 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
9937 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9939 vat_main_t *vam = &vat_main;
9941 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9942 format_ip6_address, mp->our_address,
9943 format_ip6_address, mp->client_address,
9944 clib_net_to_host_u32 (mp->sw_if_index));
9947 " local cookies %016llx %016llx remote cookie %016llx\n",
9948 clib_net_to_host_u64 (mp->local_cookie[0]),
9949 clib_net_to_host_u64 (mp->local_cookie[1]),
9950 clib_net_to_host_u64 (mp->remote_cookie));
9952 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9953 clib_net_to_host_u32 (mp->local_session_id),
9954 clib_net_to_host_u32 (mp->remote_session_id));
9956 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9957 mp->l2_sublayer_present ? "preset" : "absent");
9961 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
9962 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
9964 vat_main_t *vam = &vat_main;
9965 vat_json_node_t *node = NULL;
9966 struct in6_addr addr;
9968 if (VAT_JSON_ARRAY != vam->json_tree.type)
9970 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9971 vat_json_init_array (&vam->json_tree);
9973 node = vat_json_array_add (&vam->json_tree);
9975 vat_json_init_object (node);
9977 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9978 vat_json_object_add_ip6 (node, "our_address", addr);
9979 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9980 vat_json_object_add_ip6 (node, "client_address", addr);
9982 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9983 vat_json_init_array (lc);
9984 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9985 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9986 vat_json_object_add_uint (node, "remote_cookie",
9987 clib_net_to_host_u64 (mp->remote_cookie));
9989 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9990 vat_json_object_add_uint (node, "local_session_id",
9991 clib_net_to_host_u32 (mp->local_session_id));
9992 vat_json_object_add_uint (node, "remote_session_id",
9993 clib_net_to_host_u32 (mp->remote_session_id));
9994 vat_json_object_add_string_copy (node, "l2_sublayer",
9995 mp->l2_sublayer_present ? (u8 *) "present"
10000 api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
10002 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
10005 /* Get list of l2tpv3-tunnel interfaces */
10006 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
10009 /* Use a control ping for synchronization */
10011 vl_api_control_ping_t *mp;
10012 M (CONTROL_PING, control_ping);
10019 static void vl_api_sw_interface_tap_details_t_handler
10020 (vl_api_sw_interface_tap_details_t * mp)
10022 vat_main_t *vam = &vat_main;
10024 fformat (vam->ofp, "%-16s %d\n",
10025 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
10028 static void vl_api_sw_interface_tap_details_t_handler_json
10029 (vl_api_sw_interface_tap_details_t * mp)
10031 vat_main_t *vam = &vat_main;
10032 vat_json_node_t *node = NULL;
10034 if (VAT_JSON_ARRAY != vam->json_tree.type)
10036 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10037 vat_json_init_array (&vam->json_tree);
10039 node = vat_json_array_add (&vam->json_tree);
10041 vat_json_init_object (node);
10042 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10043 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
10047 api_sw_interface_tap_dump (vat_main_t * vam)
10049 vl_api_sw_interface_tap_dump_t *mp;
10052 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
10053 /* Get list of tap interfaces */
10054 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
10057 /* Use a control ping for synchronization */
10059 vl_api_control_ping_t *mp;
10060 M (CONTROL_PING, control_ping);
10066 static uword unformat_vxlan_decap_next
10067 (unformat_input_t * input, va_list * args)
10069 u32 *result = va_arg (*args, u32 *);
10072 if (unformat (input, "drop"))
10073 *result = VXLAN_INPUT_NEXT_DROP;
10074 else if (unformat (input, "ip4"))
10075 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
10076 else if (unformat (input, "ip6"))
10077 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
10078 else if (unformat (input, "l2"))
10079 *result = VXLAN_INPUT_NEXT_L2_INPUT;
10080 else if (unformat (input, "%d", &tmp))
10088 api_vxlan_add_del_tunnel (vat_main_t * vam)
10090 unformat_input_t *line_input = vam->input;
10091 vl_api_vxlan_add_del_tunnel_t *mp;
10093 ip4_address_t src4, dst4;
10094 ip6_address_t src6, dst6;
10096 u8 ipv4_set = 0, ipv6_set = 0;
10099 u32 encap_vrf_id = 0;
10100 u32 decap_next_index = ~0;
10103 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10105 if (unformat (line_input, "del"))
10107 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10112 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10117 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
10122 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
10127 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10129 else if (unformat (line_input, "decap-next %U",
10130 unformat_vxlan_decap_next, &decap_next_index))
10132 else if (unformat (line_input, "vni %d", &vni))
10136 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10143 errmsg ("tunnel src address not specified\n");
10148 errmsg ("tunnel dst address not specified\n");
10152 if (ipv4_set && ipv6_set)
10154 errmsg ("both IPv4 and IPv6 addresses specified");
10158 if ((vni == 0) || (vni >> 24))
10160 errmsg ("vni not specified or out of range\n");
10164 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
10168 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
10169 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
10173 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10174 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10176 mp->encap_vrf_id = ntohl (encap_vrf_id);
10177 mp->decap_next_index = ntohl (decap_next_index);
10178 mp->vni = ntohl (vni);
10179 mp->is_add = is_add;
10180 mp->is_ipv6 = ipv6_set;
10188 static void vl_api_vxlan_tunnel_details_t_handler
10189 (vl_api_vxlan_tunnel_details_t * mp)
10191 vat_main_t *vam = &vat_main;
10193 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
10194 ntohl (mp->sw_if_index),
10195 format_ip46_address, &(mp->src_address[0]),
10197 format_ip46_address, &(mp->dst_address[0]),
10199 ntohl (mp->encap_vrf_id),
10200 ntohl (mp->decap_next_index), ntohl (mp->vni));
10203 static void vl_api_vxlan_tunnel_details_t_handler_json
10204 (vl_api_vxlan_tunnel_details_t * mp)
10206 vat_main_t *vam = &vat_main;
10207 vat_json_node_t *node = NULL;
10208 struct in_addr ip4;
10209 struct in6_addr ip6;
10211 if (VAT_JSON_ARRAY != vam->json_tree.type)
10213 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10214 vat_json_init_array (&vam->json_tree);
10216 node = vat_json_array_add (&vam->json_tree);
10218 vat_json_init_object (node);
10219 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10222 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
10223 vat_json_object_add_ip6 (node, "src_address", ip6);
10224 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
10225 vat_json_object_add_ip6 (node, "dst_address", ip6);
10229 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
10230 vat_json_object_add_ip4 (node, "src_address", ip4);
10231 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
10232 vat_json_object_add_ip4 (node, "dst_address", ip4);
10234 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10235 vat_json_object_add_uint (node, "decap_next_index",
10236 ntohl (mp->decap_next_index));
10237 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10238 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10242 api_vxlan_tunnel_dump (vat_main_t * vam)
10244 unformat_input_t *i = vam->input;
10245 vl_api_vxlan_tunnel_dump_t *mp;
10248 u8 sw_if_index_set = 0;
10250 /* Parse args required to build the message */
10251 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10253 if (unformat (i, "sw_if_index %d", &sw_if_index))
10254 sw_if_index_set = 1;
10259 if (sw_if_index_set == 0)
10264 if (!vam->json_output)
10266 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
10267 "sw_if_index", "src_address", "dst_address",
10268 "encap_vrf_id", "decap_next_index", "vni");
10271 /* Get list of vxlan-tunnel interfaces */
10272 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
10274 mp->sw_if_index = htonl (sw_if_index);
10278 /* Use a control ping for synchronization */
10280 vl_api_control_ping_t *mp;
10281 M (CONTROL_PING, control_ping);
10288 api_gre_add_del_tunnel (vat_main_t * vam)
10290 unformat_input_t *line_input = vam->input;
10291 vl_api_gre_add_del_tunnel_t *mp;
10293 ip4_address_t src4, dst4;
10298 u32 outer_fib_id = 0;
10300 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10302 if (unformat (line_input, "del"))
10304 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10306 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10308 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
10310 else if (unformat (line_input, "teb"))
10314 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10321 errmsg ("tunnel src address not specified\n");
10326 errmsg ("tunnel dst address not specified\n");
10331 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
10333 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10334 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10335 mp->outer_fib_id = ntohl (outer_fib_id);
10336 mp->is_add = is_add;
10345 static void vl_api_gre_tunnel_details_t_handler
10346 (vl_api_gre_tunnel_details_t * mp)
10348 vat_main_t *vam = &vat_main;
10350 fformat (vam->ofp, "%11d%15U%15U%6d%14d\n",
10351 ntohl (mp->sw_if_index),
10352 format_ip4_address, &mp->src_address,
10353 format_ip4_address, &mp->dst_address,
10354 mp->teb, ntohl (mp->outer_fib_id));
10357 static void vl_api_gre_tunnel_details_t_handler_json
10358 (vl_api_gre_tunnel_details_t * mp)
10360 vat_main_t *vam = &vat_main;
10361 vat_json_node_t *node = NULL;
10362 struct in_addr ip4;
10364 if (VAT_JSON_ARRAY != vam->json_tree.type)
10366 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10367 vat_json_init_array (&vam->json_tree);
10369 node = vat_json_array_add (&vam->json_tree);
10371 vat_json_init_object (node);
10372 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10373 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
10374 vat_json_object_add_ip4 (node, "src_address", ip4);
10375 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
10376 vat_json_object_add_ip4 (node, "dst_address", ip4);
10377 vat_json_object_add_uint (node, "teb", mp->teb);
10378 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
10382 api_gre_tunnel_dump (vat_main_t * vam)
10384 unformat_input_t *i = vam->input;
10385 vl_api_gre_tunnel_dump_t *mp;
10388 u8 sw_if_index_set = 0;
10390 /* Parse args required to build the message */
10391 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10393 if (unformat (i, "sw_if_index %d", &sw_if_index))
10394 sw_if_index_set = 1;
10399 if (sw_if_index_set == 0)
10404 if (!vam->json_output)
10406 fformat (vam->ofp, "%11s%15s%15s%6s%14s\n",
10407 "sw_if_index", "src_address", "dst_address", "teb",
10411 /* Get list of gre-tunnel interfaces */
10412 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
10414 mp->sw_if_index = htonl (sw_if_index);
10418 /* Use a control ping for synchronization */
10420 vl_api_control_ping_t *mp;
10421 M (CONTROL_PING, control_ping);
10428 api_l2_fib_clear_table (vat_main_t * vam)
10430 // unformat_input_t * i = vam->input;
10431 vl_api_l2_fib_clear_table_t *mp;
10434 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
10443 api_l2_interface_efp_filter (vat_main_t * vam)
10445 unformat_input_t *i = vam->input;
10446 vl_api_l2_interface_efp_filter_t *mp;
10450 u8 sw_if_index_set = 0;
10452 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10454 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10455 sw_if_index_set = 1;
10456 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10457 sw_if_index_set = 1;
10458 else if (unformat (i, "enable"))
10460 else if (unformat (i, "disable"))
10464 clib_warning ("parse error '%U'", format_unformat_error, i);
10469 if (sw_if_index_set == 0)
10471 errmsg ("missing sw_if_index\n");
10475 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
10477 mp->sw_if_index = ntohl (sw_if_index);
10478 mp->enable_disable = enable;
10486 #define foreach_vtr_op \
10487 _("disable", L2_VTR_DISABLED) \
10488 _("push-1", L2_VTR_PUSH_1) \
10489 _("push-2", L2_VTR_PUSH_2) \
10490 _("pop-1", L2_VTR_POP_1) \
10491 _("pop-2", L2_VTR_POP_2) \
10492 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
10493 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
10494 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
10495 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
10498 api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
10500 unformat_input_t *i = vam->input;
10501 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
10504 u8 sw_if_index_set = 0;
10507 u32 push_dot1q = 1;
10511 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10513 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10514 sw_if_index_set = 1;
10515 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10516 sw_if_index_set = 1;
10517 else if (unformat (i, "vtr_op %d", &vtr_op))
10519 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
10522 else if (unformat (i, "push_dot1q %d", &push_dot1q))
10524 else if (unformat (i, "tag1 %d", &tag1))
10526 else if (unformat (i, "tag2 %d", &tag2))
10530 clib_warning ("parse error '%U'", format_unformat_error, i);
10535 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
10537 errmsg ("missing vtr operation or sw_if_index\n");
10541 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
10542 mp->sw_if_index = ntohl (sw_if_index);
10543 mp->vtr_op = ntohl (vtr_op);
10544 mp->push_dot1q = ntohl (push_dot1q);
10545 mp->tag1 = ntohl (tag1);
10546 mp->tag2 = ntohl (tag2);
10555 api_create_vhost_user_if (vat_main_t * vam)
10557 unformat_input_t *i = vam->input;
10558 vl_api_create_vhost_user_if_t *mp;
10562 u8 file_name_set = 0;
10563 u32 custom_dev_instance = ~0;
10565 u8 use_custom_mac = 0;
10567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10569 if (unformat (i, "socket %s", &file_name))
10573 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10575 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
10576 use_custom_mac = 1;
10577 else if (unformat (i, "server"))
10583 if (file_name_set == 0)
10585 errmsg ("missing socket file name\n");
10589 if (vec_len (file_name) > 255)
10591 errmsg ("socket file name too long\n");
10594 vec_add1 (file_name, 0);
10596 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
10598 mp->is_server = is_server;
10599 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10600 vec_free (file_name);
10601 if (custom_dev_instance != ~0)
10604 mp->custom_dev_instance = ntohl (custom_dev_instance);
10606 mp->use_custom_mac = use_custom_mac;
10607 clib_memcpy (mp->mac_address, hwaddr, 6);
10616 api_modify_vhost_user_if (vat_main_t * vam)
10618 unformat_input_t *i = vam->input;
10619 vl_api_modify_vhost_user_if_t *mp;
10623 u8 file_name_set = 0;
10624 u32 custom_dev_instance = ~0;
10625 u8 sw_if_index_set = 0;
10626 u32 sw_if_index = (u32) ~ 0;
10628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10630 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10631 sw_if_index_set = 1;
10632 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10633 sw_if_index_set = 1;
10634 else if (unformat (i, "socket %s", &file_name))
10638 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10640 else if (unformat (i, "server"))
10646 if (sw_if_index_set == 0)
10648 errmsg ("missing sw_if_index or interface name\n");
10652 if (file_name_set == 0)
10654 errmsg ("missing socket file name\n");
10658 if (vec_len (file_name) > 255)
10660 errmsg ("socket file name too long\n");
10663 vec_add1 (file_name, 0);
10665 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
10667 mp->sw_if_index = ntohl (sw_if_index);
10668 mp->is_server = is_server;
10669 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10670 vec_free (file_name);
10671 if (custom_dev_instance != ~0)
10674 mp->custom_dev_instance = ntohl (custom_dev_instance);
10684 api_delete_vhost_user_if (vat_main_t * vam)
10686 unformat_input_t *i = vam->input;
10687 vl_api_delete_vhost_user_if_t *mp;
10689 u32 sw_if_index = ~0;
10690 u8 sw_if_index_set = 0;
10692 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10694 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10695 sw_if_index_set = 1;
10696 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10697 sw_if_index_set = 1;
10702 if (sw_if_index_set == 0)
10704 errmsg ("missing sw_if_index or interface name\n");
10709 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
10711 mp->sw_if_index = ntohl (sw_if_index);
10719 static void vl_api_sw_interface_vhost_user_details_t_handler
10720 (vl_api_sw_interface_vhost_user_details_t * mp)
10722 vat_main_t *vam = &vat_main;
10724 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
10725 (char *) mp->interface_name,
10726 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
10727 clib_net_to_host_u64 (mp->features), mp->is_server,
10728 ntohl (mp->num_regions), (char *) mp->sock_filename);
10729 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
10732 static void vl_api_sw_interface_vhost_user_details_t_handler_json
10733 (vl_api_sw_interface_vhost_user_details_t * mp)
10735 vat_main_t *vam = &vat_main;
10736 vat_json_node_t *node = NULL;
10738 if (VAT_JSON_ARRAY != vam->json_tree.type)
10740 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10741 vat_json_init_array (&vam->json_tree);
10743 node = vat_json_array_add (&vam->json_tree);
10745 vat_json_init_object (node);
10746 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10747 vat_json_object_add_string_copy (node, "interface_name",
10748 mp->interface_name);
10749 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
10750 ntohl (mp->virtio_net_hdr_sz));
10751 vat_json_object_add_uint (node, "features",
10752 clib_net_to_host_u64 (mp->features));
10753 vat_json_object_add_uint (node, "is_server", mp->is_server);
10754 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
10755 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
10756 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
10760 api_sw_interface_vhost_user_dump (vat_main_t * vam)
10762 vl_api_sw_interface_vhost_user_dump_t *mp;
10765 "Interface name idx hdr_sz features server regions filename\n");
10767 /* Get list of vhost-user interfaces */
10768 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
10771 /* Use a control ping for synchronization */
10773 vl_api_control_ping_t *mp;
10774 M (CONTROL_PING, control_ping);
10781 api_show_version (vat_main_t * vam)
10783 vl_api_show_version_t *mp;
10786 M (SHOW_VERSION, show_version);
10796 api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
10798 unformat_input_t *line_input = vam->input;
10799 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
10801 ip4_address_t local4, remote4;
10802 ip6_address_t local6, remote6;
10804 u8 ipv4_set = 0, ipv6_set = 0;
10807 u32 encap_vrf_id = 0;
10808 u32 decap_vrf_id = 0;
10813 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10815 if (unformat (line_input, "del"))
10817 else if (unformat (line_input, "local %U",
10818 unformat_ip4_address, &local4))
10823 else if (unformat (line_input, "remote %U",
10824 unformat_ip4_address, &remote4))
10829 else if (unformat (line_input, "local %U",
10830 unformat_ip6_address, &local6))
10835 else if (unformat (line_input, "remote %U",
10836 unformat_ip6_address, &remote6))
10841 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10843 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
10845 else if (unformat (line_input, "vni %d", &vni))
10847 else if (unformat (line_input, "next-ip4"))
10849 else if (unformat (line_input, "next-ip6"))
10851 else if (unformat (line_input, "next-ethernet"))
10853 else if (unformat (line_input, "next-nsh"))
10857 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10862 if (local_set == 0)
10864 errmsg ("tunnel local address not specified\n");
10867 if (remote_set == 0)
10869 errmsg ("tunnel remote address not specified\n");
10872 if (ipv4_set && ipv6_set)
10874 errmsg ("both IPv4 and IPv6 addresses specified");
10880 errmsg ("vni not specified\n");
10884 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
10889 clib_memcpy (&mp->local, &local6, sizeof (local6));
10890 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10894 clib_memcpy (&mp->local, &local4, sizeof (local4));
10895 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
10898 mp->encap_vrf_id = ntohl (encap_vrf_id);
10899 mp->decap_vrf_id = ntohl (decap_vrf_id);
10900 mp->protocol = ntohl (protocol);
10901 mp->vni = ntohl (vni);
10902 mp->is_add = is_add;
10903 mp->is_ipv6 = ipv6_set;
10911 static void vl_api_vxlan_gpe_tunnel_details_t_handler
10912 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10914 vat_main_t *vam = &vat_main;
10916 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10917 ntohl (mp->sw_if_index),
10918 format_ip46_address, &(mp->local[0]),
10919 format_ip46_address, &(mp->remote[0]),
10921 ntohl (mp->protocol),
10922 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
10925 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
10926 (vl_api_vxlan_gpe_tunnel_details_t * mp)
10928 vat_main_t *vam = &vat_main;
10929 vat_json_node_t *node = NULL;
10930 struct in_addr ip4;
10931 struct in6_addr ip6;
10933 if (VAT_JSON_ARRAY != vam->json_tree.type)
10935 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10936 vat_json_init_array (&vam->json_tree);
10938 node = vat_json_array_add (&vam->json_tree);
10940 vat_json_init_object (node);
10941 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10944 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10945 vat_json_object_add_ip6 (node, "local", ip6);
10946 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10947 vat_json_object_add_ip6 (node, "remote", ip6);
10951 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10952 vat_json_object_add_ip4 (node, "local", ip4);
10953 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10954 vat_json_object_add_ip4 (node, "remote", ip4);
10956 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10957 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10958 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10959 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10960 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
10964 api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
10966 unformat_input_t *i = vam->input;
10967 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10970 u8 sw_if_index_set = 0;
10972 /* Parse args required to build the message */
10973 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10975 if (unformat (i, "sw_if_index %d", &sw_if_index))
10976 sw_if_index_set = 1;
10981 if (sw_if_index_set == 0)
10986 if (!vam->json_output)
10988 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10989 "sw_if_index", "local", "remote", "vni",
10990 "protocol", "encap_vrf_id", "decap_vrf_id");
10993 /* Get list of vxlan-tunnel interfaces */
10994 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10996 mp->sw_if_index = htonl (sw_if_index);
11000 /* Use a control ping for synchronization */
11002 vl_api_control_ping_t *mp;
11003 M (CONTROL_PING, control_ping);
11010 format_l2_fib_mac_address (u8 * s, va_list * args)
11012 u8 *a = va_arg (*args, u8 *);
11014 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
11015 a[2], a[3], a[4], a[5], a[6], a[7]);
11018 static void vl_api_l2_fib_table_entry_t_handler
11019 (vl_api_l2_fib_table_entry_t * mp)
11021 vat_main_t *vam = &vat_main;
11023 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
11025 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
11026 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
11030 static void vl_api_l2_fib_table_entry_t_handler_json
11031 (vl_api_l2_fib_table_entry_t * mp)
11033 vat_main_t *vam = &vat_main;
11034 vat_json_node_t *node = NULL;
11036 if (VAT_JSON_ARRAY != vam->json_tree.type)
11038 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11039 vat_json_init_array (&vam->json_tree);
11041 node = vat_json_array_add (&vam->json_tree);
11043 vat_json_init_object (node);
11044 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
11045 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
11046 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11047 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
11048 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
11049 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
11053 api_l2_fib_table_dump (vat_main_t * vam)
11055 unformat_input_t *i = vam->input;
11056 vl_api_l2_fib_table_dump_t *mp;
11061 /* Parse args required to build the message */
11062 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11064 if (unformat (i, "bd_id %d", &bd_id))
11070 if (bd_id_set == 0)
11072 errmsg ("missing bridge domain\n");
11077 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
11079 /* Get list of l2 fib entries */
11080 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
11082 mp->bd_id = ntohl (bd_id);
11085 /* Use a control ping for synchronization */
11087 vl_api_control_ping_t *mp;
11088 M (CONTROL_PING, control_ping);
11096 api_interface_name_renumber (vat_main_t * vam)
11098 unformat_input_t *line_input = vam->input;
11099 vl_api_interface_name_renumber_t *mp;
11100 u32 sw_if_index = ~0;
11102 u32 new_show_dev_instance = ~0;
11104 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11106 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
11109 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11111 else if (unformat (line_input, "new_show_dev_instance %d",
11112 &new_show_dev_instance))
11118 if (sw_if_index == ~0)
11120 errmsg ("missing interface name or sw_if_index\n");
11124 if (new_show_dev_instance == ~0)
11126 errmsg ("missing new_show_dev_instance\n");
11130 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
11132 mp->sw_if_index = ntohl (sw_if_index);
11133 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
11140 api_want_ip4_arp_events (vat_main_t * vam)
11142 unformat_input_t *line_input = vam->input;
11143 vl_api_want_ip4_arp_events_t *mp;
11145 ip4_address_t address;
11146 int address_set = 0;
11147 u32 enable_disable = 1;
11149 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11151 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
11153 else if (unformat (line_input, "del"))
11154 enable_disable = 0;
11159 if (address_set == 0)
11161 errmsg ("missing addresses\n");
11165 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
11166 mp->enable_disable = enable_disable;
11167 mp->pid = getpid ();
11168 mp->address = address.as_u32;
11175 api_want_ip6_nd_events (vat_main_t * vam)
11177 unformat_input_t *line_input = vam->input;
11178 vl_api_want_ip6_nd_events_t *mp;
11180 ip6_address_t address;
11181 int address_set = 0;
11182 u32 enable_disable = 1;
11184 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11186 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
11188 else if (unformat (line_input, "del"))
11189 enable_disable = 0;
11194 if (address_set == 0)
11196 errmsg ("missing addresses\n");
11200 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
11201 mp->enable_disable = enable_disable;
11202 mp->pid = getpid ();
11203 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
11210 api_input_acl_set_interface (vat_main_t * vam)
11212 unformat_input_t *i = vam->input;
11213 vl_api_input_acl_set_interface_t *mp;
11216 int sw_if_index_set;
11217 u32 ip4_table_index = ~0;
11218 u32 ip6_table_index = ~0;
11219 u32 l2_table_index = ~0;
11222 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11224 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11225 sw_if_index_set = 1;
11226 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11227 sw_if_index_set = 1;
11228 else if (unformat (i, "del"))
11230 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11232 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11234 else if (unformat (i, "l2-table %d", &l2_table_index))
11238 clib_warning ("parse error '%U'", format_unformat_error, i);
11243 if (sw_if_index_set == 0)
11245 errmsg ("missing interface name or sw_if_index\n");
11249 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
11251 mp->sw_if_index = ntohl (sw_if_index);
11252 mp->ip4_table_index = ntohl (ip4_table_index);
11253 mp->ip6_table_index = ntohl (ip6_table_index);
11254 mp->l2_table_index = ntohl (l2_table_index);
11255 mp->is_add = is_add;
11264 api_ip_address_dump (vat_main_t * vam)
11266 unformat_input_t *i = vam->input;
11267 vl_api_ip_address_dump_t *mp;
11268 u32 sw_if_index = ~0;
11269 u8 sw_if_index_set = 0;
11274 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11276 if (unformat (i, "sw_if_index %d", &sw_if_index))
11277 sw_if_index_set = 1;
11278 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11279 sw_if_index_set = 1;
11280 else if (unformat (i, "ipv4"))
11282 else if (unformat (i, "ipv6"))
11288 if (ipv4_set && ipv6_set)
11290 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11294 if ((!ipv4_set) && (!ipv6_set))
11296 errmsg ("no ipv4 nor ipv6 flag set\n");
11300 if (sw_if_index_set == 0)
11302 errmsg ("missing interface name or sw_if_index\n");
11306 vam->current_sw_if_index = sw_if_index;
11307 vam->is_ipv6 = ipv6_set;
11309 M (IP_ADDRESS_DUMP, ip_address_dump);
11310 mp->sw_if_index = ntohl (sw_if_index);
11311 mp->is_ipv6 = ipv6_set;
11314 /* Use a control ping for synchronization */
11316 vl_api_control_ping_t *mp;
11317 M (CONTROL_PING, control_ping);
11324 api_ip_dump (vat_main_t * vam)
11326 vl_api_ip_dump_t *mp;
11327 unformat_input_t *in = vam->input;
11334 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
11336 if (unformat (in, "ipv4"))
11338 else if (unformat (in, "ipv6"))
11344 if (ipv4_set && ipv6_set)
11346 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11350 if ((!ipv4_set) && (!ipv6_set))
11352 errmsg ("no ipv4 nor ipv6 flag set\n");
11356 is_ipv6 = ipv6_set;
11357 vam->is_ipv6 = is_ipv6;
11359 /* free old data */
11360 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
11362 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
11364 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
11366 M (IP_DUMP, ip_dump);
11367 mp->is_ipv6 = ipv6_set;
11370 /* Use a control ping for synchronization */
11372 vl_api_control_ping_t *mp;
11373 M (CONTROL_PING, control_ping);
11380 api_ipsec_spd_add_del (vat_main_t * vam)
11383 unformat_input_t *i = vam->input;
11384 vl_api_ipsec_spd_add_del_t *mp;
11389 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11391 if (unformat (i, "spd_id %d", &spd_id))
11393 else if (unformat (i, "del"))
11397 clib_warning ("parse error '%U'", format_unformat_error, i);
11403 errmsg ("spd_id must be set\n");
11407 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
11409 mp->spd_id = ntohl (spd_id);
11410 mp->is_add = is_add;
11417 clib_warning ("unsupported (no dpdk)");
11423 api_ipsec_interface_add_del_spd (vat_main_t * vam)
11426 unformat_input_t *i = vam->input;
11427 vl_api_ipsec_interface_add_del_spd_t *mp;
11430 u8 sw_if_index_set = 0;
11431 u32 spd_id = (u32) ~ 0;
11434 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11436 if (unformat (i, "del"))
11438 else if (unformat (i, "spd_id %d", &spd_id))
11440 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11441 sw_if_index_set = 1;
11442 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11443 sw_if_index_set = 1;
11446 clib_warning ("parse error '%U'", format_unformat_error, i);
11452 if (spd_id == (u32) ~ 0)
11454 errmsg ("spd_id must be set\n");
11458 if (sw_if_index_set == 0)
11460 errmsg ("missing interface name or sw_if_index\n");
11464 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
11466 mp->spd_id = ntohl (spd_id);
11467 mp->sw_if_index = ntohl (sw_if_index);
11468 mp->is_add = is_add;
11475 clib_warning ("unsupported (no dpdk)");
11481 api_ipsec_spd_add_del_entry (vat_main_t * vam)
11484 unformat_input_t *i = vam->input;
11485 vl_api_ipsec_spd_add_del_entry_t *mp;
11487 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
11488 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
11490 u32 rport_start = 0, rport_stop = (u32) ~ 0;
11491 u32 lport_start = 0, lport_stop = (u32) ~ 0;
11492 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
11493 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
11495 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
11496 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
11497 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
11498 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
11499 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
11500 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
11502 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11504 if (unformat (i, "del"))
11506 if (unformat (i, "outbound"))
11508 if (unformat (i, "inbound"))
11510 else if (unformat (i, "spd_id %d", &spd_id))
11512 else if (unformat (i, "sa_id %d", &sa_id))
11514 else if (unformat (i, "priority %d", &priority))
11516 else if (unformat (i, "protocol %d", &protocol))
11518 else if (unformat (i, "lport_start %d", &lport_start))
11520 else if (unformat (i, "lport_stop %d", &lport_stop))
11522 else if (unformat (i, "rport_start %d", &rport_start))
11524 else if (unformat (i, "rport_stop %d", &rport_stop))
11528 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
11534 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
11541 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
11547 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
11554 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
11560 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
11567 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
11573 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
11579 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
11581 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
11583 clib_warning ("unsupported action: 'resolve'");
11589 clib_warning ("parse error '%U'", format_unformat_error, i);
11595 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
11597 mp->spd_id = ntohl (spd_id);
11598 mp->priority = ntohl (priority);
11599 mp->is_outbound = is_outbound;
11601 mp->is_ipv6 = is_ipv6;
11602 if (is_ipv6 || is_ip_any)
11604 clib_memcpy (mp->remote_address_start, &raddr6_start,
11605 sizeof (ip6_address_t));
11606 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
11607 sizeof (ip6_address_t));
11608 clib_memcpy (mp->local_address_start, &laddr6_start,
11609 sizeof (ip6_address_t));
11610 clib_memcpy (mp->local_address_stop, &laddr6_stop,
11611 sizeof (ip6_address_t));
11615 clib_memcpy (mp->remote_address_start, &raddr4_start,
11616 sizeof (ip4_address_t));
11617 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
11618 sizeof (ip4_address_t));
11619 clib_memcpy (mp->local_address_start, &laddr4_start,
11620 sizeof (ip4_address_t));
11621 clib_memcpy (mp->local_address_stop, &laddr4_stop,
11622 sizeof (ip4_address_t));
11624 mp->protocol = (u8) protocol;
11625 mp->local_port_start = ntohs ((u16) lport_start);
11626 mp->local_port_stop = ntohs ((u16) lport_stop);
11627 mp->remote_port_start = ntohs ((u16) rport_start);
11628 mp->remote_port_stop = ntohs ((u16) rport_stop);
11629 mp->policy = (u8) policy;
11630 mp->sa_id = ntohl (sa_id);
11631 mp->is_add = is_add;
11632 mp->is_ip_any = is_ip_any;
11638 clib_warning ("unsupported (no dpdk)");
11644 api_ipsec_sad_add_del_entry (vat_main_t * vam)
11647 unformat_input_t *i = vam->input;
11648 vl_api_ipsec_sad_add_del_entry_t *mp;
11650 u32 sad_id = 0, spi = 0;
11651 u8 *ck = 0, *ik = 0;
11654 u8 protocol = IPSEC_PROTOCOL_AH;
11655 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
11656 u32 crypto_alg = 0, integ_alg = 0;
11657 ip4_address_t tun_src4;
11658 ip4_address_t tun_dst4;
11659 ip6_address_t tun_src6;
11660 ip6_address_t tun_dst6;
11662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11664 if (unformat (i, "del"))
11666 else if (unformat (i, "sad_id %d", &sad_id))
11668 else if (unformat (i, "spi %d", &spi))
11670 else if (unformat (i, "esp"))
11671 protocol = IPSEC_PROTOCOL_ESP;
11672 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
11675 is_tunnel_ipv6 = 0;
11677 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
11680 is_tunnel_ipv6 = 0;
11682 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
11685 is_tunnel_ipv6 = 1;
11687 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
11690 is_tunnel_ipv6 = 1;
11694 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
11696 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
11697 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
11699 clib_warning ("unsupported crypto-alg: '%U'",
11700 format_ipsec_crypto_alg, crypto_alg);
11704 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11708 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
11710 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
11711 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
11713 clib_warning ("unsupported integ-alg: '%U'",
11714 format_ipsec_integ_alg, integ_alg);
11718 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11722 clib_warning ("parse error '%U'", format_unformat_error, i);
11728 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
11730 mp->sad_id = ntohl (sad_id);
11731 mp->is_add = is_add;
11732 mp->protocol = protocol;
11733 mp->spi = ntohl (spi);
11734 mp->is_tunnel = is_tunnel;
11735 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
11736 mp->crypto_algorithm = crypto_alg;
11737 mp->integrity_algorithm = integ_alg;
11738 mp->crypto_key_length = vec_len (ck);
11739 mp->integrity_key_length = vec_len (ik);
11741 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11742 mp->crypto_key_length = sizeof (mp->crypto_key);
11744 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11745 mp->integrity_key_length = sizeof (mp->integrity_key);
11748 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11750 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
11754 if (is_tunnel_ipv6)
11756 clib_memcpy (mp->tunnel_src_address, &tun_src6,
11757 sizeof (ip6_address_t));
11758 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
11759 sizeof (ip6_address_t));
11763 clib_memcpy (mp->tunnel_src_address, &tun_src4,
11764 sizeof (ip4_address_t));
11765 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
11766 sizeof (ip4_address_t));
11775 clib_warning ("unsupported (no dpdk)");
11781 api_ipsec_sa_set_key (vat_main_t * vam)
11784 unformat_input_t *i = vam->input;
11785 vl_api_ipsec_sa_set_key_t *mp;
11788 u8 *ck = 0, *ik = 0;
11790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11792 if (unformat (i, "sa_id %d", &sa_id))
11794 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11796 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11800 clib_warning ("parse error '%U'", format_unformat_error, i);
11805 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
11807 mp->sa_id = ntohl (sa_id);
11808 mp->crypto_key_length = vec_len (ck);
11809 mp->integrity_key_length = vec_len (ik);
11811 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11812 mp->crypto_key_length = sizeof (mp->crypto_key);
11814 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11815 mp->integrity_key_length = sizeof (mp->integrity_key);
11818 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11820 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
11827 clib_warning ("unsupported (no dpdk)");
11833 api_ikev2_profile_add_del (vat_main_t * vam)
11836 unformat_input_t *i = vam->input;
11837 vl_api_ikev2_profile_add_del_t *mp;
11842 const char *valid_chars = "a-zA-Z0-9_";
11844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11846 if (unformat (i, "del"))
11848 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11849 vec_add1 (name, 0);
11852 errmsg ("parse error '%U'", format_unformat_error, i);
11857 if (!vec_len (name))
11859 errmsg ("profile name must be specified");
11863 if (vec_len (name) > 64)
11865 errmsg ("profile name too long");
11869 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
11871 clib_memcpy (mp->name, name, vec_len (name));
11872 mp->is_add = is_add;
11880 clib_warning ("unsupported (no dpdk)");
11886 api_ikev2_profile_set_auth (vat_main_t * vam)
11889 unformat_input_t *i = vam->input;
11890 vl_api_ikev2_profile_set_auth_t *mp;
11894 u32 auth_method = 0;
11897 const char *valid_chars = "a-zA-Z0-9_";
11899 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11901 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11902 vec_add1 (name, 0);
11903 else if (unformat (i, "auth_method %U",
11904 unformat_ikev2_auth_method, &auth_method))
11906 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11908 else if (unformat (i, "auth_data %v", &data))
11912 errmsg ("parse error '%U'", format_unformat_error, i);
11917 if (!vec_len (name))
11919 errmsg ("profile name must be specified");
11923 if (vec_len (name) > 64)
11925 errmsg ("profile name too long");
11929 if (!vec_len (data))
11931 errmsg ("auth_data must be specified");
11937 errmsg ("auth_method must be specified");
11941 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
11943 mp->is_hex = is_hex;
11944 mp->auth_method = (u8) auth_method;
11945 mp->data_len = vec_len (data);
11946 clib_memcpy (mp->name, name, vec_len (name));
11947 clib_memcpy (mp->data, data, vec_len (data));
11956 clib_warning ("unsupported (no dpdk)");
11962 api_ikev2_profile_set_id (vat_main_t * vam)
11965 unformat_input_t *i = vam->input;
11966 vl_api_ikev2_profile_set_id_t *mp;
11974 const char *valid_chars = "a-zA-Z0-9_";
11976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11978 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11979 vec_add1 (name, 0);
11980 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11982 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11984 data = vec_new (u8, 4);
11985 clib_memcpy (data, ip4.as_u8, 4);
11987 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11989 else if (unformat (i, "id_data %v", &data))
11991 else if (unformat (i, "local"))
11993 else if (unformat (i, "remote"))
11997 errmsg ("parse error '%U'", format_unformat_error, i);
12002 if (!vec_len (name))
12004 errmsg ("profile name must be specified");
12008 if (vec_len (name) > 64)
12010 errmsg ("profile name too long");
12014 if (!vec_len (data))
12016 errmsg ("id_data must be specified");
12022 errmsg ("id_type must be specified");
12026 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
12028 mp->is_local = is_local;
12029 mp->id_type = (u8) id_type;
12030 mp->data_len = vec_len (data);
12031 clib_memcpy (mp->name, name, vec_len (name));
12032 clib_memcpy (mp->data, data, vec_len (data));
12041 clib_warning ("unsupported (no dpdk)");
12047 api_ikev2_profile_set_ts (vat_main_t * vam)
12050 unformat_input_t *i = vam->input;
12051 vl_api_ikev2_profile_set_ts_t *mp;
12055 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
12056 ip4_address_t start_addr, end_addr;
12058 const char *valid_chars = "a-zA-Z0-9_";
12060 start_addr.as_u32 = 0;
12061 end_addr.as_u32 = (u32) ~ 0;
12063 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12065 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
12066 vec_add1 (name, 0);
12067 else if (unformat (i, "protocol %d", &proto))
12069 else if (unformat (i, "start_port %d", &start_port))
12071 else if (unformat (i, "end_port %d", &end_port))
12074 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
12076 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
12078 else if (unformat (i, "local"))
12080 else if (unformat (i, "remote"))
12084 errmsg ("parse error '%U'", format_unformat_error, i);
12089 if (!vec_len (name))
12091 errmsg ("profile name must be specified");
12095 if (vec_len (name) > 64)
12097 errmsg ("profile name too long");
12101 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
12103 mp->is_local = is_local;
12104 mp->proto = (u8) proto;
12105 mp->start_port = (u16) start_port;
12106 mp->end_port = (u16) end_port;
12107 mp->start_addr = start_addr.as_u32;
12108 mp->end_addr = end_addr.as_u32;
12109 clib_memcpy (mp->name, name, vec_len (name));
12117 clib_warning ("unsupported (no dpdk)");
12123 api_ikev2_set_local_key (vat_main_t * vam)
12126 unformat_input_t *i = vam->input;
12127 vl_api_ikev2_set_local_key_t *mp;
12131 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12133 if (unformat (i, "file %v", &file))
12134 vec_add1 (file, 0);
12137 errmsg ("parse error '%U'", format_unformat_error, i);
12142 if (!vec_len (file))
12144 errmsg ("RSA key file must be specified");
12148 if (vec_len (file) > 256)
12150 errmsg ("file name too long");
12154 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
12156 clib_memcpy (mp->key_file, file, vec_len (file));
12164 clib_warning ("unsupported (no dpdk)");
12173 api_map_add_domain (vat_main_t * vam)
12175 unformat_input_t *i = vam->input;
12176 vl_api_map_add_domain_t *mp;
12179 ip4_address_t ip4_prefix;
12180 ip6_address_t ip6_prefix;
12181 ip6_address_t ip6_src;
12182 u32 num_m_args = 0;
12183 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
12184 0, psid_length = 0;
12185 u8 is_translation = 0;
12187 u32 ip6_src_len = 128;
12189 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12191 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
12192 &ip4_prefix, &ip4_prefix_len))
12194 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
12195 &ip6_prefix, &ip6_prefix_len))
12199 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
12202 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
12204 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
12206 else if (unformat (i, "psid-offset %d", &psid_offset))
12208 else if (unformat (i, "psid-len %d", &psid_length))
12210 else if (unformat (i, "mtu %d", &mtu))
12212 else if (unformat (i, "map-t"))
12213 is_translation = 1;
12216 clib_warning ("parse error '%U'", format_unformat_error, i);
12221 if (num_m_args < 3)
12223 errmsg ("mandatory argument(s) missing\n");
12227 /* Construct the API message */
12228 M (MAP_ADD_DOMAIN, map_add_domain);
12230 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
12231 mp->ip4_prefix_len = ip4_prefix_len;
12233 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
12234 mp->ip6_prefix_len = ip6_prefix_len;
12236 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
12237 mp->ip6_src_prefix_len = ip6_src_len;
12239 mp->ea_bits_len = ea_bits_len;
12240 mp->psid_offset = psid_offset;
12241 mp->psid_length = psid_length;
12242 mp->is_translation = is_translation;
12243 mp->mtu = htons (mtu);
12248 /* Wait for a reply, return good/bad news */
12253 api_map_del_domain (vat_main_t * vam)
12255 unformat_input_t *i = vam->input;
12256 vl_api_map_del_domain_t *mp;
12259 u32 num_m_args = 0;
12262 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12264 if (unformat (i, "index %d", &index))
12268 clib_warning ("parse error '%U'", format_unformat_error, i);
12273 if (num_m_args != 1)
12275 errmsg ("mandatory argument(s) missing\n");
12279 /* Construct the API message */
12280 M (MAP_DEL_DOMAIN, map_del_domain);
12282 mp->index = ntohl (index);
12287 /* Wait for a reply, return good/bad news */
12292 api_map_add_del_rule (vat_main_t * vam)
12294 unformat_input_t *i = vam->input;
12295 vl_api_map_add_del_rule_t *mp;
12298 ip6_address_t ip6_dst;
12299 u32 num_m_args = 0, index, psid = 0;
12301 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12303 if (unformat (i, "index %d", &index))
12305 else if (unformat (i, "psid %d", &psid))
12307 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
12309 else if (unformat (i, "del"))
12315 clib_warning ("parse error '%U'", format_unformat_error, i);
12320 /* Construct the API message */
12321 M (MAP_ADD_DEL_RULE, map_add_del_rule);
12323 mp->index = ntohl (index);
12324 mp->is_add = is_add;
12325 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
12326 mp->psid = ntohs (psid);
12331 /* Wait for a reply, return good/bad news */
12336 api_map_domain_dump (vat_main_t * vam)
12338 vl_api_map_domain_dump_t *mp;
12341 /* Construct the API message */
12342 M (MAP_DOMAIN_DUMP, map_domain_dump);
12347 /* Use a control ping for synchronization */
12349 vl_api_control_ping_t *mp;
12350 M (CONTROL_PING, control_ping);
12357 api_map_rule_dump (vat_main_t * vam)
12359 unformat_input_t *i = vam->input;
12360 vl_api_map_rule_dump_t *mp;
12362 u32 domain_index = ~0;
12364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12366 if (unformat (i, "index %u", &domain_index))
12372 if (domain_index == ~0)
12374 clib_warning ("parse error: domain index expected");
12378 /* Construct the API message */
12379 M (MAP_RULE_DUMP, map_rule_dump);
12381 mp->domain_index = htonl (domain_index);
12386 /* Use a control ping for synchronization */
12388 vl_api_control_ping_t *mp;
12389 M (CONTROL_PING, control_ping);
12395 static void vl_api_map_add_domain_reply_t_handler
12396 (vl_api_map_add_domain_reply_t * mp)
12398 vat_main_t *vam = &vat_main;
12399 i32 retval = ntohl (mp->retval);
12401 if (vam->async_mode)
12403 vam->async_errors += (retval < 0);
12407 vam->retval = retval;
12408 vam->result_ready = 1;
12412 static void vl_api_map_add_domain_reply_t_handler_json
12413 (vl_api_map_add_domain_reply_t * mp)
12415 vat_main_t *vam = &vat_main;
12416 vat_json_node_t node;
12418 vat_json_init_object (&node);
12419 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
12420 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
12422 vat_json_print (vam->ofp, &node);
12423 vat_json_free (&node);
12425 vam->retval = ntohl (mp->retval);
12426 vam->result_ready = 1;
12430 api_get_first_msg_id (vat_main_t * vam)
12432 vl_api_get_first_msg_id_t *mp;
12434 unformat_input_t *i = vam->input;
12438 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12440 if (unformat (i, "client %s", &name))
12448 errmsg ("missing client name\n");
12451 vec_add1 (name, 0);
12453 if (vec_len (name) > 63)
12455 errmsg ("client name too long\n");
12459 M (GET_FIRST_MSG_ID, get_first_msg_id);
12460 clib_memcpy (mp->name, name, vec_len (name));
12468 api_cop_interface_enable_disable (vat_main_t * vam)
12470 unformat_input_t *line_input = vam->input;
12471 vl_api_cop_interface_enable_disable_t *mp;
12473 u32 sw_if_index = ~0;
12474 u8 enable_disable = 1;
12476 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12478 if (unformat (line_input, "disable"))
12479 enable_disable = 0;
12480 if (unformat (line_input, "enable"))
12481 enable_disable = 1;
12482 else if (unformat (line_input, "%U", unformat_sw_if_index,
12483 vam, &sw_if_index))
12485 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12491 if (sw_if_index == ~0)
12493 errmsg ("missing interface name or sw_if_index\n");
12497 /* Construct the API message */
12498 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
12499 mp->sw_if_index = ntohl (sw_if_index);
12500 mp->enable_disable = enable_disable;
12504 /* Wait for the reply */
12509 api_cop_whitelist_enable_disable (vat_main_t * vam)
12511 unformat_input_t *line_input = vam->input;
12512 vl_api_cop_whitelist_enable_disable_t *mp;
12514 u32 sw_if_index = ~0;
12515 u8 ip4 = 0, ip6 = 0, default_cop = 0;
12518 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12520 if (unformat (line_input, "ip4"))
12522 else if (unformat (line_input, "ip6"))
12524 else if (unformat (line_input, "default"))
12526 else if (unformat (line_input, "%U", unformat_sw_if_index,
12527 vam, &sw_if_index))
12529 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12531 else if (unformat (line_input, "fib-id %d", &fib_id))
12537 if (sw_if_index == ~0)
12539 errmsg ("missing interface name or sw_if_index\n");
12543 /* Construct the API message */
12544 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
12545 mp->sw_if_index = ntohl (sw_if_index);
12546 mp->fib_id = ntohl (fib_id);
12549 mp->default_cop = default_cop;
12553 /* Wait for the reply */
12558 api_get_node_graph (vat_main_t * vam)
12560 vl_api_get_node_graph_t *mp;
12563 M (GET_NODE_GRAPH, get_node_graph);
12567 /* Wait for the reply */
12572 /** Used for parsing LISP eids */
12573 typedef CLIB_PACKED(struct{
12574 u8 addr[16]; /**< eid address */
12575 u32 len; /**< prefix length if IP */
12576 u8 type; /**< type of eid */
12581 unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
12583 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
12585 memset (a, 0, sizeof (a[0]));
12587 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
12589 a->type = 0; /* ipv4 type */
12591 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
12593 a->type = 1; /* ipv6 type */
12595 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
12597 a->type = 2; /* mac type */
12604 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
12613 lisp_eid_size_vat (u8 type)
12628 lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
12630 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
12634 /** Used for transferring locators via VPP API */
12635 typedef CLIB_PACKED(struct
12637 u32 sw_if_index; /**< locator sw_if_index */
12638 u8 priority; /**< locator priority */
12639 u8 weight; /**< locator weight */
12644 api_lisp_add_del_locator_set (vat_main_t * vam)
12646 unformat_input_t *input = vam->input;
12647 vl_api_lisp_add_del_locator_set_t *mp;
12650 u8 *locator_set_name = NULL;
12651 u8 locator_set_name_set = 0;
12652 ls_locator_t locator, *locators = 0;
12653 u32 sw_if_index, priority, weight;
12656 /* Parse args required to build the message */
12657 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12659 if (unformat (input, "del"))
12663 else if (unformat (input, "locator-set %s", &locator_set_name))
12665 locator_set_name_set = 1;
12667 else if (unformat (input, "sw_if_index %u p %u w %u",
12668 &sw_if_index, &priority, &weight))
12670 locator.sw_if_index = htonl (sw_if_index);
12671 locator.priority = priority;
12672 locator.weight = weight;
12673 vec_add1 (locators, locator);
12675 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
12676 vam, &sw_if_index, &priority, &weight))
12678 locator.sw_if_index = htonl (sw_if_index);
12679 locator.priority = priority;
12680 locator.weight = weight;
12681 vec_add1 (locators, locator);
12687 if (locator_set_name_set == 0)
12689 errmsg ("missing locator-set name");
12690 vec_free (locators);
12694 if (vec_len (locator_set_name) > 64)
12696 errmsg ("locator-set name too long\n");
12697 vec_free (locator_set_name);
12698 vec_free (locators);
12701 vec_add1 (locator_set_name, 0);
12703 data_len = sizeof (ls_locator_t) * vec_len (locators);
12705 /* Construct the API message */
12706 M2 (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set, data_len);
12708 mp->is_add = is_add;
12709 clib_memcpy (mp->locator_set_name, locator_set_name,
12710 vec_len (locator_set_name));
12711 vec_free (locator_set_name);
12713 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
12715 clib_memcpy (mp->locators, locators, data_len);
12716 vec_free (locators);
12721 /* Wait for a reply... */
12729 api_lisp_add_del_locator (vat_main_t * vam)
12731 unformat_input_t *input = vam->input;
12732 vl_api_lisp_add_del_locator_t *mp;
12734 u32 tmp_if_index = ~0;
12735 u32 sw_if_index = ~0;
12736 u8 sw_if_index_set = 0;
12737 u8 sw_if_index_if_name_set = 0;
12739 u8 priority_set = 0;
12743 u8 *locator_set_name = NULL;
12744 u8 locator_set_name_set = 0;
12746 /* Parse args required to build the message */
12747 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12749 if (unformat (input, "del"))
12753 else if (unformat (input, "locator-set %s", &locator_set_name))
12755 locator_set_name_set = 1;
12757 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
12760 sw_if_index_if_name_set = 1;
12761 sw_if_index = tmp_if_index;
12763 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
12765 sw_if_index_set = 1;
12766 sw_if_index = tmp_if_index;
12768 else if (unformat (input, "p %d", &priority))
12772 else if (unformat (input, "w %d", &weight))
12780 if (locator_set_name_set == 0)
12782 errmsg ("missing locator-set name");
12786 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
12788 errmsg ("missing sw_if_index");
12789 vec_free (locator_set_name);
12793 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
12795 errmsg ("cannot use both params interface name and sw_if_index");
12796 vec_free (locator_set_name);
12800 if (priority_set == 0)
12802 errmsg ("missing locator-set priority\n");
12803 vec_free (locator_set_name);
12807 if (weight_set == 0)
12809 errmsg ("missing locator-set weight\n");
12810 vec_free (locator_set_name);
12814 if (vec_len (locator_set_name) > 64)
12816 errmsg ("locator-set name too long\n");
12817 vec_free (locator_set_name);
12820 vec_add1 (locator_set_name, 0);
12822 /* Construct the API message */
12823 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
12825 mp->is_add = is_add;
12826 mp->sw_if_index = ntohl (sw_if_index);
12827 mp->priority = priority;
12828 mp->weight = weight;
12829 clib_memcpy (mp->locator_set_name, locator_set_name,
12830 vec_len (locator_set_name));
12831 vec_free (locator_set_name);
12836 /* Wait for a reply... */
12844 api_lisp_add_del_local_eid (vat_main_t * vam)
12846 unformat_input_t *input = vam->input;
12847 vl_api_lisp_add_del_local_eid_t *mp;
12851 lisp_eid_vat_t _eid, *eid = &_eid;
12852 u8 *locator_set_name = 0;
12853 u8 locator_set_name_set = 0;
12856 /* Parse args required to build the message */
12857 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12859 if (unformat (input, "del"))
12863 else if (unformat (input, "vni %d", &vni))
12867 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
12871 else if (unformat (input, "locator-set %s", &locator_set_name))
12873 locator_set_name_set = 1;
12879 if (locator_set_name_set == 0)
12881 errmsg ("missing locator-set name\n");
12887 errmsg ("EID address not set!");
12888 vec_free (locator_set_name);
12892 if (vec_len (locator_set_name) > 64)
12894 errmsg ("locator-set name too long\n");
12895 vec_free (locator_set_name);
12898 vec_add1 (locator_set_name, 0);
12900 /* Construct the API message */
12901 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
12903 mp->is_add = is_add;
12904 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12905 mp->eid_type = eid->type;
12906 mp->prefix_len = eid->len;
12907 mp->vni = clib_host_to_net_u32 (vni);
12908 clib_memcpy (mp->locator_set_name, locator_set_name,
12909 vec_len (locator_set_name));
12911 vec_free (locator_set_name);
12916 /* Wait for a reply... */
12924 /** Used for transferring locators via VPP API */
12925 typedef CLIB_PACKED(struct
12927 u8 is_ip4; /**< is locator an IPv4 address? */
12928 u8 priority; /**< locator priority */
12929 u8 weight; /**< locator weight */
12930 u8 addr[16]; /**< IPv4/IPv6 address */
12935 api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
12937 unformat_input_t *input = vam->input;
12938 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12941 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12942 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12943 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12944 u32 action = ~0, p, w;
12945 ip4_address_t rmt_rloc4, lcl_rloc4;
12946 ip6_address_t rmt_rloc6, lcl_rloc6;
12947 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
12949 memset (&rloc, 0, sizeof (rloc));
12951 /* Parse args required to build the message */
12952 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12954 if (unformat (input, "del"))
12958 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12962 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12966 else if (unformat (input, "p %d w %d", &p, &w))
12970 errmsg ("No RLOC configured for setting priority/weight!");
12973 curr_rloc->priority = p;
12974 curr_rloc->weight = w;
12976 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12977 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12981 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
12982 rloc.priority = rloc.weight = 0;
12983 vec_add1 (lcl_locs, rloc);
12985 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12986 vec_add1 (rmt_locs, rloc);
12987 /* priority and weight saved in rmt loc */
12988 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12990 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
12991 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12994 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
12995 rloc.priority = rloc.weight = 0;
12996 vec_add1 (lcl_locs, rloc);
12998 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12999 vec_add1 (rmt_locs, rloc);
13000 /* priority and weight saved in rmt loc */
13001 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
13003 else if (unformat (input, "action %d", &action))
13009 clib_warning ("parse error '%U'", format_unformat_error, input);
13016 errmsg ("remote eid addresses not set\n");
13020 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
13022 errmsg ("eid types don't match\n");
13026 if (0 == rmt_locs && (u32) ~ 0 == action)
13028 errmsg ("action not set for negative mapping\n");
13032 /* Construct the API message */
13033 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
13035 mp->is_add = is_add;
13036 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
13037 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
13038 mp->eid_type = rmt_eid->type;
13039 mp->rmt_len = rmt_eid->len;
13040 mp->lcl_len = lcl_eid->len;
13041 mp->action = action;
13043 if (0 != rmt_locs && 0 != lcl_locs)
13045 mp->loc_num = vec_len (rmt_locs);
13046 clib_memcpy (mp->lcl_locs, lcl_locs,
13047 (sizeof (rloc_t) * vec_len (lcl_locs)));
13048 clib_memcpy (mp->rmt_locs, rmt_locs,
13049 (sizeof (rloc_t) * vec_len (rmt_locs)));
13051 vec_free (lcl_locs);
13052 vec_free (rmt_locs);
13057 /* Wait for a reply... */
13065 api_lisp_add_del_map_resolver (vat_main_t * vam)
13067 unformat_input_t *input = vam->input;
13068 vl_api_lisp_add_del_map_resolver_t *mp;
13073 ip4_address_t ipv4;
13074 ip6_address_t ipv6;
13076 /* Parse args required to build the message */
13077 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13079 if (unformat (input, "del"))
13083 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
13087 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
13095 if (ipv4_set && ipv6_set)
13097 errmsg ("both eid v4 and v6 addresses set\n");
13101 if (!ipv4_set && !ipv6_set)
13103 errmsg ("eid addresses not set\n");
13107 /* Construct the API message */
13108 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
13110 mp->is_add = is_add;
13114 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
13119 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
13125 /* Wait for a reply... */
13133 api_lisp_gpe_enable_disable (vat_main_t * vam)
13135 unformat_input_t *input = vam->input;
13136 vl_api_lisp_gpe_enable_disable_t *mp;
13141 /* Parse args required to build the message */
13142 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13144 if (unformat (input, "enable"))
13149 else if (unformat (input, "disable"))
13160 errmsg ("Value not set\n");
13164 /* Construct the API message */
13165 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
13172 /* Wait for a reply... */
13180 api_lisp_enable_disable (vat_main_t * vam)
13182 unformat_input_t *input = vam->input;
13183 vl_api_lisp_enable_disable_t *mp;
13188 /* Parse args required to build the message */
13189 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13191 if (unformat (input, "enable"))
13196 else if (unformat (input, "disable"))
13206 errmsg ("Value not set\n");
13210 /* Construct the API message */
13211 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
13218 /* Wait for a reply... */
13226 api_show_lisp_map_request_mode (vat_main_t * vam)
13229 vl_api_show_lisp_map_request_mode_t *mp;
13231 M (SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode);
13236 /* wait for reply */
13243 api_lisp_map_request_mode (vat_main_t * vam)
13246 unformat_input_t *input = vam->input;
13247 vl_api_lisp_map_request_mode_t *mp;
13250 /* Parse args required to build the message */
13251 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13253 if (unformat (input, "dst-only"))
13255 else if (unformat (input, "src-dst"))
13259 errmsg ("parse error '%U'", format_unformat_error, input);
13264 M (LISP_MAP_REQUEST_MODE, lisp_map_request_mode);
13271 /* wait for reply */
13279 * Enable/disable LISP proxy ITR.
13281 * @param vam vpp API test context
13282 * @return return code
13285 api_lisp_pitr_set_locator_set (vat_main_t * vam)
13288 u8 ls_name_set = 0;
13289 unformat_input_t *input = vam->input;
13290 vl_api_lisp_pitr_set_locator_set_t *mp;
13294 /* Parse args required to build the message */
13295 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13297 if (unformat (input, "del"))
13299 else if (unformat (input, "locator-set %s", &ls_name))
13303 errmsg ("parse error '%U'", format_unformat_error, input);
13310 errmsg ("locator-set name not set!");
13314 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
13316 mp->is_add = is_add;
13317 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
13318 vec_free (ls_name);
13323 /* wait for reply */
13331 api_show_lisp_pitr (vat_main_t * vam)
13333 vl_api_show_lisp_pitr_t *mp;
13336 if (!vam->json_output)
13338 fformat (vam->ofp, "%=20s\n", "lisp status:");
13341 M (SHOW_LISP_PITR, show_lisp_pitr);
13345 /* Wait for a reply... */
13353 * Add/delete mapping between vni and vrf
13356 api_lisp_eid_table_add_del_map (vat_main_t * vam)
13359 unformat_input_t *input = vam->input;
13360 vl_api_lisp_eid_table_add_del_map_t *mp;
13361 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
13362 u32 vni, vrf, bd_index;
13364 /* Parse args required to build the message */
13365 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13367 if (unformat (input, "del"))
13369 else if (unformat (input, "vrf %d", &vrf))
13371 else if (unformat (input, "bd_index %d", &bd_index))
13373 else if (unformat (input, "vni %d", &vni))
13379 if (!vni_set || (!vrf_set && !bd_index_set))
13381 errmsg ("missing arguments!");
13385 if (vrf_set && bd_index_set)
13387 errmsg ("error: both vrf and bd entered!");
13391 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
13393 mp->is_add = is_add;
13394 mp->vni = htonl (vni);
13395 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
13396 mp->is_l2 = bd_index_set;
13401 /* wait for reply */
13409 unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
13411 u32 *action = va_arg (*args, u32 *);
13414 if (unformat (input, "%s", &s))
13416 if (!strcmp ((char *) s, "no-action"))
13418 else if (!strcmp ((char *) s, "natively-forward"))
13420 else if (!strcmp ((char *) s, "send-map-request"))
13422 else if (!strcmp ((char *) s, "drop"))
13426 clib_warning ("invalid action: '%s'", s);
13438 * Add/del remote mapping to/from LISP control plane
13440 * @param vam vpp API test context
13441 * @return return code
13444 api_lisp_add_del_remote_mapping (vat_main_t * vam)
13446 unformat_input_t *input = vam->input;
13447 vl_api_lisp_add_del_remote_mapping_t *mp;
13450 lisp_eid_vat_t _eid, *eid = &_eid;
13451 lisp_eid_vat_t _seid, *seid = &_seid;
13452 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
13453 u32 action = ~0, p, w, data_len;
13454 ip4_address_t rloc4;
13455 ip6_address_t rloc6;
13456 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
13458 memset (&rloc, 0, sizeof (rloc));
13460 /* Parse args required to build the message */
13461 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13463 if (unformat (input, "del-all"))
13467 else if (unformat (input, "del"))
13471 else if (unformat (input, "add"))
13475 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
13479 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
13483 else if (unformat (input, "vni %d", &vni))
13487 else if (unformat (input, "p %d w %d", &p, &w))
13491 errmsg ("No RLOC configured for setting priority/weight!");
13494 curr_rloc->priority = p;
13495 curr_rloc->weight = w;
13497 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
13500 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
13501 vec_add1 (rlocs, rloc);
13502 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13504 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
13507 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
13508 vec_add1 (rlocs, rloc);
13509 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13511 else if (unformat (input, "action %U",
13512 unformat_negative_mapping_action, &action))
13518 clib_warning ("parse error '%U'", format_unformat_error, input);
13525 errmsg ("missing params!");
13529 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
13531 errmsg ("no action set for negative map-reply!");
13535 data_len = vec_len (rlocs) * sizeof (rloc_t);
13537 M2 (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping, data_len);
13538 mp->is_add = is_add;
13539 mp->vni = htonl (vni);
13540 mp->action = (u8) action;
13541 mp->is_src_dst = seid_set;
13542 mp->eid_len = eid->len;
13543 mp->seid_len = seid->len;
13544 mp->del_all = del_all;
13545 mp->eid_type = eid->type;
13546 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
13547 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
13549 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
13550 clib_memcpy (mp->rlocs, rlocs, data_len);
13556 /* Wait for a reply... */
13564 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
13565 * forwarding entries in data-plane accordingly.
13567 * @param vam vpp API test context
13568 * @return return code
13571 api_lisp_add_del_adjacency (vat_main_t * vam)
13573 unformat_input_t *input = vam->input;
13574 vl_api_lisp_add_del_adjacency_t *mp;
13577 ip4_address_t leid4, reid4;
13578 ip6_address_t leid6, reid6;
13579 u8 reid_mac[6] = { 0 };
13580 u8 leid_mac[6] = { 0 };
13581 u8 reid_type, leid_type;
13582 u32 leid_len = 0, reid_len = 0, len;
13585 leid_type = reid_type = (u8) ~ 0;
13587 /* Parse args required to build the message */
13588 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13590 if (unformat (input, "del"))
13594 else if (unformat (input, "add"))
13598 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
13601 reid_type = 0; /* ipv4 */
13604 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
13607 reid_type = 1; /* ipv6 */
13610 else if (unformat (input, "reid %U", unformat_ethernet_address,
13613 reid_type = 2; /* mac */
13615 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
13618 leid_type = 0; /* ipv4 */
13621 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
13624 leid_type = 1; /* ipv6 */
13627 else if (unformat (input, "leid %U", unformat_ethernet_address,
13630 leid_type = 2; /* mac */
13632 else if (unformat (input, "vni %d", &vni))
13638 errmsg ("parse error '%U'", format_unformat_error, input);
13643 if ((u8) ~ 0 == reid_type)
13645 errmsg ("missing params!");
13649 if (leid_type != reid_type)
13651 errmsg ("remote and local EIDs are of different types!");
13655 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
13656 mp->is_add = is_add;
13657 mp->vni = htonl (vni);
13658 mp->leid_len = leid_len;
13659 mp->reid_len = reid_len;
13660 mp->eid_type = reid_type;
13662 switch (mp->eid_type)
13665 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
13666 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
13669 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
13670 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
13673 clib_memcpy (mp->leid, leid_mac, 6);
13674 clib_memcpy (mp->reid, reid_mac, 6);
13677 errmsg ("unknown EID type %d!", mp->eid_type);
13684 /* Wait for a reply... */
13692 api_lisp_gpe_add_del_iface (vat_main_t * vam)
13694 unformat_input_t *input = vam->input;
13695 vl_api_lisp_gpe_add_del_iface_t *mp;
13697 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
13698 u32 dp_table = 0, vni = 0;
13700 /* Parse args required to build the message */
13701 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13703 if (unformat (input, "up"))
13708 else if (unformat (input, "down"))
13713 else if (unformat (input, "table_id %d", &dp_table))
13717 else if (unformat (input, "bd_id %d", &dp_table))
13722 else if (unformat (input, "vni %d", &vni))
13730 if (action_set == 0)
13732 errmsg ("Action not set\n");
13735 if (dp_table_set == 0 || vni_set == 0)
13737 errmsg ("vni and dp_table must be set\n");
13741 /* Construct the API message */
13742 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
13744 mp->is_add = is_add;
13745 mp->dp_table = dp_table;
13752 /* Wait for a reply... */
13760 * Add/del map request itr rlocs from LISP control plane and updates
13762 * @param vam vpp API test context
13763 * @return return code
13766 api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
13768 unformat_input_t *input = vam->input;
13769 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
13771 u8 *locator_set_name = 0;
13772 u8 locator_set_name_set = 0;
13775 /* Parse args required to build the message */
13776 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13778 if (unformat (input, "del"))
13782 else if (unformat (input, "%_%v%_", &locator_set_name))
13784 locator_set_name_set = 1;
13788 clib_warning ("parse error '%U'", format_unformat_error, input);
13793 if (is_add && !locator_set_name_set)
13795 errmsg ("itr-rloc is not set!");
13799 if (is_add && vec_len (locator_set_name) > 64)
13801 errmsg ("itr-rloc locator-set name too long\n");
13802 vec_free (locator_set_name);
13806 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
13807 mp->is_add = is_add;
13810 clib_memcpy (mp->locator_set_name, locator_set_name,
13811 vec_len (locator_set_name));
13815 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
13817 vec_free (locator_set_name);
13822 /* Wait for a reply... */
13830 api_lisp_locator_dump (vat_main_t * vam)
13832 unformat_input_t *input = vam->input;
13833 vl_api_lisp_locator_dump_t *mp;
13835 u8 is_index_set = 0, is_name_set = 0;
13839 /* Parse args required to build the message */
13840 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13842 if (unformat (input, "ls_name %_%v%_", &ls_name))
13846 else if (unformat (input, "ls_index %d", &ls_index))
13852 errmsg ("parse error '%U'", format_unformat_error, input);
13857 if (!is_index_set && !is_name_set)
13859 errmsg ("error: expected one of index or name!\n");
13863 if (is_index_set && is_name_set)
13865 errmsg ("error: only one param expected!\n");
13869 if (vec_len (ls_name) > 62)
13871 errmsg ("error: locator set name too long!");
13875 if (!vam->json_output)
13877 fformat (vam->ofp, "%=16s%=16s%=16s\n", "locator", "priority",
13881 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
13882 mp->is_index_set = is_index_set;
13885 mp->ls_index = clib_host_to_net_u32 (ls_index);
13888 vec_add1 (ls_name, 0);
13889 strncpy ((char *) mp->ls_name, (char *) ls_name,
13890 sizeof (mp->ls_name) - 1);
13896 /* Use a control ping for synchronization */
13898 vl_api_control_ping_t *mp;
13899 M (CONTROL_PING, control_ping);
13902 /* Wait for a reply... */
13910 api_lisp_locator_set_dump (vat_main_t * vam)
13912 vl_api_lisp_locator_set_dump_t *mp;
13913 unformat_input_t *input = vam->input;
13917 /* Parse args required to build the message */
13918 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13920 if (unformat (input, "local"))
13924 else if (unformat (input, "remote"))
13930 errmsg ("parse error '%U'", format_unformat_error, input);
13935 if (!vam->json_output)
13937 fformat (vam->ofp, "%=10s%=15s\n", "ls_index", "ls_name");
13940 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
13942 mp->filter = filter;
13947 /* Use a control ping for synchronization */
13949 vl_api_control_ping_t *mp;
13950 M (CONTROL_PING, control_ping);
13953 /* Wait for a reply... */
13961 api_lisp_eid_table_map_dump (vat_main_t * vam)
13965 unformat_input_t *input = vam->input;
13966 vl_api_lisp_eid_table_map_dump_t *mp;
13969 /* Parse args required to build the message */
13970 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13972 if (unformat (input, "l2"))
13977 else if (unformat (input, "l3"))
13984 errmsg ("parse error '%U'", format_unformat_error, input);
13991 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13995 if (!vam->json_output)
13997 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
14000 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
14006 /* Use a control ping for synchronization */
14008 vl_api_control_ping_t *mp;
14009 M (CONTROL_PING, control_ping);
14012 /* Wait for a reply... */
14020 api_lisp_eid_table_vni_dump (vat_main_t * vam)
14022 vl_api_lisp_eid_table_vni_dump_t *mp;
14025 if (!vam->json_output)
14027 fformat (vam->ofp, "VNI\n");
14030 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
14035 /* Use a control ping for synchronization */
14037 vl_api_control_ping_t *mp;
14038 M (CONTROL_PING, control_ping);
14041 /* Wait for a reply... */
14049 api_lisp_eid_table_dump (vat_main_t * vam)
14051 unformat_input_t *i = vam->input;
14052 vl_api_lisp_eid_table_dump_t *mp;
14054 struct in_addr ip4;
14055 struct in6_addr ip6;
14057 u8 eid_type = ~0, eid_set = 0;
14058 u32 prefix_length = ~0, t, vni = 0;
14061 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14063 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
14069 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
14075 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
14080 else if (unformat (i, "vni %d", &t))
14084 else if (unformat (i, "local"))
14088 else if (unformat (i, "remote"))
14094 errmsg ("parse error '%U'", format_unformat_error, i);
14099 if (!vam->json_output)
14101 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type",
14102 "ls_index", "ttl", "authoritative");
14105 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
14107 mp->filter = filter;
14111 mp->vni = htonl (vni);
14112 mp->eid_type = eid_type;
14116 mp->prefix_length = prefix_length;
14117 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
14120 mp->prefix_length = prefix_length;
14121 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
14124 clib_memcpy (mp->eid, mac, sizeof (mac));
14127 errmsg ("unknown EID type %d!", eid_type);
14135 /* Use a control ping for synchronization */
14137 vl_api_control_ping_t *mp;
14138 M (CONTROL_PING, control_ping);
14142 /* Wait for a reply... */
14150 api_lisp_gpe_tunnel_dump (vat_main_t * vam)
14152 vl_api_lisp_gpe_tunnel_dump_t *mp;
14155 if (!vam->json_output)
14157 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
14158 "%=16s%=16s%=16s%=16s%=16s\n",
14159 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
14160 "Decap next", "Lisp version", "Flags", "Next protocol",
14161 "ver_res", "res", "iid");
14164 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
14168 /* Use a control ping for synchronization */
14170 vl_api_control_ping_t *mp;
14171 M (CONTROL_PING, control_ping);
14174 /* Wait for a reply... */
14182 api_lisp_adjacencies_get (vat_main_t * vam)
14184 unformat_input_t *i = vam->input;
14185 vl_api_lisp_adjacencies_get_t *mp;
14190 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14192 if (unformat (i, "vni %d", &vni))
14198 errmsg ("parse error '%U'\n", format_unformat_error, i);
14205 errmsg ("vni not set!\n");
14209 if (!vam->json_output)
14211 fformat (vam->ofp, "%s %40s\n", "leid", "reid");
14214 M (LISP_ADJACENCIES_GET, lisp_adjacencies_get);
14215 mp->vni = clib_host_to_net_u32 (vni);
14220 /* Wait for a reply... */
14228 api_lisp_map_resolver_dump (vat_main_t * vam)
14230 vl_api_lisp_map_resolver_dump_t *mp;
14233 if (!vam->json_output)
14235 fformat (vam->ofp, "%=20s\n", "Map resolver");
14238 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
14242 /* Use a control ping for synchronization */
14244 vl_api_control_ping_t *mp;
14245 M (CONTROL_PING, control_ping);
14248 /* Wait for a reply... */
14256 api_show_lisp_status (vat_main_t * vam)
14258 vl_api_show_lisp_status_t *mp;
14261 if (!vam->json_output)
14263 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
14266 M (SHOW_LISP_STATUS, show_lisp_status);
14269 /* Wait for a reply... */
14277 api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
14279 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
14282 if (!vam->json_output)
14284 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
14287 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
14290 /* Wait for a reply... */
14298 api_af_packet_create (vat_main_t * vam)
14300 unformat_input_t *i = vam->input;
14301 vl_api_af_packet_create_t *mp;
14303 u8 *host_if_name = 0;
14305 u8 random_hw_addr = 1;
14307 memset (hw_addr, 0, sizeof (hw_addr));
14309 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14311 if (unformat (i, "name %s", &host_if_name))
14312 vec_add1 (host_if_name, 0);
14313 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14314 random_hw_addr = 0;
14319 if (!vec_len (host_if_name))
14321 errmsg ("host-interface name must be specified");
14325 if (vec_len (host_if_name) > 64)
14327 errmsg ("host-interface name too long");
14331 M (AF_PACKET_CREATE, af_packet_create);
14333 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14334 clib_memcpy (mp->hw_addr, hw_addr, 6);
14335 mp->use_random_hw_addr = random_hw_addr;
14336 vec_free (host_if_name);
14339 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14345 api_af_packet_delete (vat_main_t * vam)
14347 unformat_input_t *i = vam->input;
14348 vl_api_af_packet_delete_t *mp;
14350 u8 *host_if_name = 0;
14352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14354 if (unformat (i, "name %s", &host_if_name))
14355 vec_add1 (host_if_name, 0);
14360 if (!vec_len (host_if_name))
14362 errmsg ("host-interface name must be specified");
14366 if (vec_len (host_if_name) > 64)
14368 errmsg ("host-interface name too long");
14372 M (AF_PACKET_DELETE, af_packet_delete);
14374 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14375 vec_free (host_if_name);
14384 api_policer_add_del (vat_main_t * vam)
14386 unformat_input_t *i = vam->input;
14387 vl_api_policer_add_del_t *mp;
14398 u8 color_aware = 0;
14399 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
14401 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14402 conform_action.dscp = 0;
14403 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14404 exceed_action.dscp = 0;
14405 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14406 violate_action.dscp = 0;
14408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14410 if (unformat (i, "del"))
14412 else if (unformat (i, "name %s", &name))
14413 vec_add1 (name, 0);
14414 else if (unformat (i, "cir %u", &cir))
14416 else if (unformat (i, "eir %u", &eir))
14418 else if (unformat (i, "cb %u", &cb))
14420 else if (unformat (i, "eb %u", &eb))
14422 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14425 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14428 else if (unformat (i, "type %U", unformat_policer_type, &type))
14430 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14433 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14436 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14439 else if (unformat (i, "color-aware"))
14445 if (!vec_len (name))
14447 errmsg ("policer name must be specified");
14451 if (vec_len (name) > 64)
14453 errmsg ("policer name too long");
14457 M (POLICER_ADD_DEL, policer_add_del);
14459 clib_memcpy (mp->name, name, vec_len (name));
14461 mp->is_add = is_add;
14466 mp->rate_type = rate_type;
14467 mp->round_type = round_type;
14469 mp->conform_action_type = conform_action.action_type;
14470 mp->conform_dscp = conform_action.dscp;
14471 mp->exceed_action_type = exceed_action.action_type;
14472 mp->exceed_dscp = exceed_action.dscp;
14473 mp->violate_action_type = violate_action.action_type;
14474 mp->violate_dscp = violate_action.dscp;
14475 mp->color_aware = color_aware;
14484 api_policer_dump (vat_main_t * vam)
14486 unformat_input_t *i = vam->input;
14487 vl_api_policer_dump_t *mp;
14489 u8 *match_name = 0;
14490 u8 match_name_valid = 0;
14492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14494 if (unformat (i, "name %s", &match_name))
14496 vec_add1 (match_name, 0);
14497 match_name_valid = 1;
14503 M (POLICER_DUMP, policer_dump);
14504 mp->match_name_valid = match_name_valid;
14505 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14506 vec_free (match_name);
14510 /* Use a control ping for synchronization */
14512 vl_api_control_ping_t *mp;
14513 M (CONTROL_PING, control_ping);
14516 /* Wait for a reply... */
14524 api_policer_classify_set_interface (vat_main_t * vam)
14526 unformat_input_t *i = vam->input;
14527 vl_api_policer_classify_set_interface_t *mp;
14530 int sw_if_index_set;
14531 u32 ip4_table_index = ~0;
14532 u32 ip6_table_index = ~0;
14533 u32 l2_table_index = ~0;
14536 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14538 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14539 sw_if_index_set = 1;
14540 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14541 sw_if_index_set = 1;
14542 else if (unformat (i, "del"))
14544 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14546 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14548 else if (unformat (i, "l2-table %d", &l2_table_index))
14552 clib_warning ("parse error '%U'", format_unformat_error, i);
14557 if (sw_if_index_set == 0)
14559 errmsg ("missing interface name or sw_if_index\n");
14563 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
14565 mp->sw_if_index = ntohl (sw_if_index);
14566 mp->ip4_table_index = ntohl (ip4_table_index);
14567 mp->ip6_table_index = ntohl (ip6_table_index);
14568 mp->l2_table_index = ntohl (l2_table_index);
14569 mp->is_add = is_add;
14578 api_policer_classify_dump (vat_main_t * vam)
14580 unformat_input_t *i = vam->input;
14581 vl_api_policer_classify_dump_t *mp;
14583 u8 type = POLICER_CLASSIFY_N_TABLES;
14585 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
14589 errmsg ("classify table type must be specified\n");
14593 if (!vam->json_output)
14595 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14598 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14603 /* Use a control ping for synchronization */
14605 vl_api_control_ping_t *mp;
14606 M (CONTROL_PING, control_ping);
14609 /* Wait for a reply... */
14617 api_netmap_create (vat_main_t * vam)
14619 unformat_input_t *i = vam->input;
14620 vl_api_netmap_create_t *mp;
14624 u8 random_hw_addr = 1;
14628 memset (hw_addr, 0, sizeof (hw_addr));
14630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14632 if (unformat (i, "name %s", &if_name))
14633 vec_add1 (if_name, 0);
14634 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14635 random_hw_addr = 0;
14636 else if (unformat (i, "pipe"))
14638 else if (unformat (i, "master"))
14640 else if (unformat (i, "slave"))
14646 if (!vec_len (if_name))
14648 errmsg ("interface name must be specified");
14652 if (vec_len (if_name) > 64)
14654 errmsg ("interface name too long");
14658 M (NETMAP_CREATE, netmap_create);
14660 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14661 clib_memcpy (mp->hw_addr, hw_addr, 6);
14662 mp->use_random_hw_addr = random_hw_addr;
14663 mp->is_pipe = is_pipe;
14664 mp->is_master = is_master;
14665 vec_free (if_name);
14674 api_netmap_delete (vat_main_t * vam)
14676 unformat_input_t *i = vam->input;
14677 vl_api_netmap_delete_t *mp;
14681 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14683 if (unformat (i, "name %s", &if_name))
14684 vec_add1 (if_name, 0);
14689 if (!vec_len (if_name))
14691 errmsg ("interface name must be specified");
14695 if (vec_len (if_name) > 64)
14697 errmsg ("interface name too long");
14701 M (NETMAP_DELETE, netmap_delete);
14703 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14704 vec_free (if_name);
14712 static void vl_api_mpls_eth_tunnel_details_t_handler
14713 (vl_api_mpls_eth_tunnel_details_t * mp)
14715 vat_main_t *vam = &vat_main;
14717 i32 len = ntohl (mp->nlabels);
14719 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14720 ntohl (mp->tunnel_index),
14721 format_ethernet_address, &mp->tunnel_dst_mac,
14722 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14723 for (i = 0; i < len; i++)
14725 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14727 fformat (vam->ofp, "\n");
14728 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14729 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
14732 static void vl_api_mpls_eth_tunnel_details_t_handler_json
14733 (vl_api_mpls_eth_tunnel_details_t * mp)
14735 vat_main_t *vam = &vat_main;
14736 vat_json_node_t *node = NULL;
14737 struct in_addr ip4;
14739 i32 len = ntohl (mp->nlabels);
14741 if (VAT_JSON_ARRAY != vam->json_tree.type)
14743 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14744 vat_json_init_array (&vam->json_tree);
14746 node = vat_json_array_add (&vam->json_tree);
14748 vat_json_init_object (node);
14749 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14750 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14751 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14752 vat_json_object_add_uint (node, "inner_fib_index",
14753 ntohl (mp->inner_fib_index));
14754 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14755 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14756 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14757 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14758 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14759 format (0, "%U", format_ethernet_address,
14760 &mp->tunnel_dst_mac));
14761 vat_json_object_add_uint (node, "tx_sw_if_index",
14762 ntohl (mp->tx_sw_if_index));
14763 vat_json_object_add_uint (node, "label_count", len);
14764 for (i = 0; i < len; i++)
14766 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14771 api_mpls_eth_tunnel_dump (vat_main_t * vam)
14773 vl_api_mpls_eth_tunnel_dump_t *mp;
14777 /* Parse args required to build the message */
14778 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
14780 if (!unformat (vam->input, "tunnel_index %d", &index))
14787 fformat (vam->ofp, " tunnel_index %d\n", index);
14789 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14790 mp->tunnel_index = htonl (index);
14793 /* Use a control ping for synchronization */
14795 vl_api_control_ping_t *mp;
14796 M (CONTROL_PING, control_ping);
14802 static void vl_api_mpls_fib_encap_details_t_handler
14803 (vl_api_mpls_fib_encap_details_t * mp)
14805 vat_main_t *vam = &vat_main;
14807 i32 len = ntohl (mp->nlabels);
14809 fformat (vam->ofp, "table %d, dest %U, label ",
14810 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14811 for (i = 0; i < len; i++)
14813 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
14815 fformat (vam->ofp, "\n");
14818 static void vl_api_mpls_fib_encap_details_t_handler_json
14819 (vl_api_mpls_fib_encap_details_t * mp)
14821 vat_main_t *vam = &vat_main;
14822 vat_json_node_t *node = NULL;
14824 i32 len = ntohl (mp->nlabels);
14825 struct in_addr ip4;
14827 if (VAT_JSON_ARRAY != vam->json_tree.type)
14829 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14830 vat_json_init_array (&vam->json_tree);
14832 node = vat_json_array_add (&vam->json_tree);
14834 vat_json_init_object (node);
14835 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14836 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14837 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14838 vat_json_object_add_ip4 (node, "dest", ip4);
14839 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14840 vat_json_object_add_uint (node, "label_count", len);
14841 for (i = 0; i < len; i++)
14843 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
14848 api_mpls_fib_encap_dump (vat_main_t * vam)
14850 vl_api_mpls_fib_encap_dump_t *mp;
14853 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14856 /* Use a control ping for synchronization */
14858 vl_api_control_ping_t *mp;
14859 M (CONTROL_PING, control_ping);
14866 vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
14868 vat_main_t *vam = &vat_main;
14871 "table-id %d, label %u, ess_bit %u\n",
14872 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
14875 static void vl_api_mpls_fib_details_t_handler_json
14876 (vl_api_mpls_fib_details_t * mp)
14878 vat_main_t *vam = &vat_main;
14879 vat_json_node_t *node = NULL;
14881 if (VAT_JSON_ARRAY != vam->json_tree.type)
14883 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14884 vat_json_init_array (&vam->json_tree);
14886 node = vat_json_array_add (&vam->json_tree);
14888 vat_json_init_object (node);
14889 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
14890 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
14891 vat_json_object_add_uint (node, "label", ntohl (mp->label));
14895 api_mpls_fib_dump (vat_main_t * vam)
14897 vl_api_mpls_fib_dump_t *mp;
14900 M (MPLS_FIB_DUMP, mpls_fib_dump);
14903 /* Use a control ping for synchronization */
14905 vl_api_control_ping_t *mp;
14906 M (CONTROL_PING, control_ping);
14913 api_classify_table_ids (vat_main_t * vam)
14915 vl_api_classify_table_ids_t *mp;
14918 /* Construct the API message */
14919 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14929 api_classify_table_by_interface (vat_main_t * vam)
14931 unformat_input_t *input = vam->input;
14932 vl_api_classify_table_by_interface_t *mp;
14935 u32 sw_if_index = ~0;
14936 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14938 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14940 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14945 if (sw_if_index == ~0)
14947 errmsg ("missing interface name or sw_if_index\n");
14951 /* Construct the API message */
14952 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14954 mp->sw_if_index = ntohl (sw_if_index);
14963 api_classify_table_info (vat_main_t * vam)
14965 unformat_input_t *input = vam->input;
14966 vl_api_classify_table_info_t *mp;
14970 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14972 if (unformat (input, "table_id %d", &table_id))
14977 if (table_id == ~0)
14979 errmsg ("missing table id\n");
14983 /* Construct the API message */
14984 M (CLASSIFY_TABLE_INFO, classify_table_info);
14986 mp->table_id = ntohl (table_id);
14995 api_classify_session_dump (vat_main_t * vam)
14997 unformat_input_t *input = vam->input;
14998 vl_api_classify_session_dump_t *mp;
15002 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15004 if (unformat (input, "table_id %d", &table_id))
15009 if (table_id == ~0)
15011 errmsg ("missing table id\n");
15015 /* Construct the API message */
15016 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
15018 mp->table_id = ntohl (table_id);
15021 /* Use a control ping for synchronization */
15023 vl_api_control_ping_t *mp;
15024 M (CONTROL_PING, control_ping);
15033 vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
15035 vat_main_t *vam = &vat_main;
15037 fformat (vam->ofp, "collector_address %U, collector_port %d, "
15038 "src_address %U, vrf_id %d, path_mtu %u, "
15039 "template_interval %u, udp_checksum %d\n",
15040 format_ip4_address, mp->collector_address,
15041 ntohs (mp->collector_port),
15042 format_ip4_address, mp->src_address,
15043 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
15044 ntohl (mp->template_interval), mp->udp_checksum);
15047 vam->result_ready = 1;
15051 vl_api_ipfix_exporter_details_t_handler_json
15052 (vl_api_ipfix_exporter_details_t * mp)
15054 vat_main_t *vam = &vat_main;
15055 vat_json_node_t node;
15056 struct in_addr collector_address;
15057 struct in_addr src_address;
15059 vat_json_init_object (&node);
15060 clib_memcpy (&collector_address, &mp->collector_address,
15061 sizeof (collector_address));
15062 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
15063 vat_json_object_add_uint (&node, "collector_port",
15064 ntohs (mp->collector_port));
15065 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
15066 vat_json_object_add_ip4 (&node, "src_address", src_address);
15067 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
15068 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
15069 vat_json_object_add_uint (&node, "template_interval",
15070 ntohl (mp->template_interval));
15071 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
15073 vat_json_print (vam->ofp, &node);
15074 vat_json_free (&node);
15076 vam->result_ready = 1;
15080 api_ipfix_exporter_dump (vat_main_t * vam)
15082 vl_api_ipfix_exporter_dump_t *mp;
15085 /* Construct the API message */
15086 M (IPFIX_EXPORTER_DUMP, ipfix_exporter_dump);
15096 api_ipfix_classify_stream_dump (vat_main_t * vam)
15098 vl_api_ipfix_classify_stream_dump_t *mp;
15101 /* Construct the API message */
15102 M (IPFIX_CLASSIFY_STREAM_DUMP, ipfix_classify_stream_dump);
15112 vl_api_ipfix_classify_stream_details_t_handler
15113 (vl_api_ipfix_classify_stream_details_t * mp)
15115 vat_main_t *vam = &vat_main;
15116 fformat (vam->ofp, "domain_id %d, src_port %d\n",
15117 ntohl (mp->domain_id), ntohs (mp->src_port));
15119 vam->result_ready = 1;
15123 vl_api_ipfix_classify_stream_details_t_handler_json
15124 (vl_api_ipfix_classify_stream_details_t * mp)
15126 vat_main_t *vam = &vat_main;
15127 vat_json_node_t node;
15129 vat_json_init_object (&node);
15130 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
15131 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
15133 vat_json_print (vam->ofp, &node);
15134 vat_json_free (&node);
15136 vam->result_ready = 1;
15140 api_ipfix_classify_table_dump (vat_main_t * vam)
15142 vl_api_ipfix_classify_table_dump_t *mp;
15145 if (!vam->json_output)
15147 fformat (vam->ofp, "%15s%15s%20s\n", "table_id", "ip_version",
15148 "transport_protocol");
15151 /* Construct the API message */
15152 M (IPFIX_CLASSIFY_TABLE_DUMP, ipfix_classify_table_dump);
15157 /* Use a control ping for synchronization */
15159 vl_api_control_ping_t *mp;
15160 M (CONTROL_PING, control_ping);
15167 vl_api_ipfix_classify_table_details_t_handler
15168 (vl_api_ipfix_classify_table_details_t * mp)
15170 vat_main_t *vam = &vat_main;
15171 fformat (vam->ofp, "%15d%15d%20d\n", ntohl (mp->table_id), mp->ip_version,
15172 mp->transport_protocol);
15176 vl_api_ipfix_classify_table_details_t_handler_json
15177 (vl_api_ipfix_classify_table_details_t * mp)
15179 vat_json_node_t *node = NULL;
15180 vat_main_t *vam = &vat_main;
15182 if (VAT_JSON_ARRAY != vam->json_tree.type)
15184 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15185 vat_json_init_array (&vam->json_tree);
15188 node = vat_json_array_add (&vam->json_tree);
15189 vat_json_init_object (node);
15191 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
15192 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
15193 vat_json_object_add_uint (node, "transport_protocol",
15194 mp->transport_protocol);
15198 api_pg_create_interface (vat_main_t * vam)
15200 unformat_input_t *input = vam->input;
15201 vl_api_pg_create_interface_t *mp;
15205 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15207 if (unformat (input, "if_id %d", &if_id))
15214 errmsg ("missing pg interface index\n");
15218 /* Construct the API message */
15219 M (PG_CREATE_INTERFACE, pg_create_interface);
15221 mp->interface_id = ntohl (if_id);
15230 api_pg_capture (vat_main_t * vam)
15232 unformat_input_t *input = vam->input;
15233 vl_api_pg_capture_t *mp;
15239 u8 pcap_file_set = 0;
15241 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15243 if (unformat (input, "if_id %d", &if_id))
15245 else if (unformat (input, "pcap %s", &pcap_file))
15247 else if (unformat (input, "count %d", &count))
15249 else if (unformat (input, "disable"))
15256 errmsg ("missing pg interface index\n");
15259 if (pcap_file_set > 0)
15261 if (vec_len (pcap_file) > 255)
15263 errmsg ("pcap file name is too long\n");
15268 u32 name_len = vec_len (pcap_file);
15269 /* Construct the API message */
15270 M (PG_CAPTURE, pg_capture);
15272 mp->interface_id = ntohl (if_id);
15273 mp->is_enabled = enable;
15274 mp->count = ntohl (count);
15275 mp->pcap_name_length = ntohl (name_len);
15276 if (pcap_file_set != 0)
15278 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
15280 vec_free (pcap_file);
15289 api_pg_enable_disable (vat_main_t * vam)
15291 unformat_input_t *input = vam->input;
15292 vl_api_pg_enable_disable_t *mp;
15296 u8 stream_name_set = 0;
15297 u8 *stream_name = 0;
15298 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15300 if (unformat (input, "stream %s", &stream_name))
15301 stream_name_set = 1;
15302 else if (unformat (input, "disable"))
15308 if (stream_name_set > 0)
15310 if (vec_len (stream_name) > 255)
15312 errmsg ("stream name too long\n");
15317 u32 name_len = vec_len (stream_name);
15318 /* Construct the API message */
15319 M (PG_ENABLE_DISABLE, pg_enable_disable);
15321 mp->is_enabled = enable;
15322 if (stream_name_set != 0)
15324 mp->stream_name_length = ntohl (name_len);
15325 clib_memcpy (mp->stream_name, stream_name, name_len);
15327 vec_free (stream_name);
15336 api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15338 unformat_input_t *input = vam->input;
15339 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15342 u16 *low_ports = 0;
15343 u16 *high_ports = 0;
15346 ip4_address_t ip4_addr;
15347 ip6_address_t ip6_addr;
15355 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15357 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15363 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15368 else if (unformat (input, "vrf %d", &vrf_id))
15370 else if (unformat (input, "del"))
15372 else if (unformat (input, "port %d", &tmp))
15374 if (tmp == 0 || tmp > 65535)
15376 errmsg ("port %d out of range", tmp);
15380 this_hi = this_low + 1;
15381 vec_add1 (low_ports, this_low);
15382 vec_add1 (high_ports, this_hi);
15384 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15386 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15388 errmsg ("incorrect range parameters\n");
15392 /* Note: in debug CLI +1 is added to high before
15393 passing to real fn that does "the work"
15394 (ip_source_and_port_range_check_add_del).
15395 This fn is a wrapper around the binary API fn a
15396 control plane will call, which expects this increment
15397 to have occurred. Hence letting the binary API control
15398 plane fn do the increment for consistency between VAT
15399 and other control planes.
15402 vec_add1 (low_ports, this_low);
15403 vec_add1 (high_ports, this_hi);
15409 if (prefix_set == 0)
15411 errmsg ("<address>/<mask> not specified\n");
15417 errmsg ("VRF ID required, not specified\n");
15424 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15428 if (vec_len (low_ports) == 0)
15430 errmsg ("At least one port or port range required\n");
15434 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15435 ip_source_and_port_range_check_add_del);
15437 mp->is_add = is_add;
15442 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15447 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15450 mp->mask_length = length;
15451 mp->number_of_ranges = vec_len (low_ports);
15453 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15454 vec_free (low_ports);
15456 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15457 vec_free (high_ports);
15459 mp->vrf_id = ntohl (vrf_id);
15468 api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15470 unformat_input_t *input = vam->input;
15471 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15473 u32 sw_if_index = ~0;
15475 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15476 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15479 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15481 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15483 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15485 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15487 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15489 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15491 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15493 else if (unformat (input, "del"))
15499 if (sw_if_index == ~0)
15501 errmsg ("Interface required but not specified\n");
15507 errmsg ("VRF ID required but not specified\n");
15511 if (tcp_out_vrf_id == 0
15512 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15515 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15519 /* Construct the API message */
15520 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15521 ip_source_and_port_range_check_interface_add_del);
15523 mp->sw_if_index = ntohl (sw_if_index);
15524 mp->is_add = is_add;
15525 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15526 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15527 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15528 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15533 /* Wait for a reply... */
15538 api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15540 unformat_input_t *i = vam->input;
15541 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15543 u32 local_sa_id = 0;
15544 u32 remote_sa_id = 0;
15545 ip4_address_t src_address;
15546 ip4_address_t dst_address;
15549 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15551 if (unformat (i, "local_sa %d", &local_sa_id))
15553 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15555 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15557 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15559 else if (unformat (i, "del"))
15563 clib_warning ("parse error '%U'", format_unformat_error, i);
15568 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15570 mp->local_sa_id = ntohl (local_sa_id);
15571 mp->remote_sa_id = ntohl (remote_sa_id);
15572 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15573 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15574 mp->is_add = is_add;
15583 api_punt (vat_main_t * vam)
15585 unformat_input_t *i = vam->input;
15593 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15595 if (unformat (i, "ip %d", &ipv))
15597 else if (unformat (i, "protocol %d", &protocol))
15599 else if (unformat (i, "port %d", &port))
15601 else if (unformat (i, "del"))
15605 clib_warning ("parse error '%U'", format_unformat_error, i);
15612 mp->is_add = (u8) is_add;
15613 mp->ipv = (u8) ipv;
15614 mp->l4_protocol = (u8) protocol;
15615 mp->l4_port = htons ((u16) port);
15623 static void vl_api_ipsec_gre_tunnel_details_t_handler
15624 (vl_api_ipsec_gre_tunnel_details_t * mp)
15626 vat_main_t *vam = &vat_main;
15628 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15629 ntohl (mp->sw_if_index),
15630 format_ip4_address, &mp->src_address,
15631 format_ip4_address, &mp->dst_address,
15632 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15635 static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15636 (vl_api_ipsec_gre_tunnel_details_t * mp)
15638 vat_main_t *vam = &vat_main;
15639 vat_json_node_t *node = NULL;
15640 struct in_addr ip4;
15642 if (VAT_JSON_ARRAY != vam->json_tree.type)
15644 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15645 vat_json_init_array (&vam->json_tree);
15647 node = vat_json_array_add (&vam->json_tree);
15649 vat_json_init_object (node);
15650 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15651 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15652 vat_json_object_add_ip4 (node, "src_address", ip4);
15653 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15654 vat_json_object_add_ip4 (node, "dst_address", ip4);
15655 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15656 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15660 api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15662 unformat_input_t *i = vam->input;
15663 vl_api_ipsec_gre_tunnel_dump_t *mp;
15666 u8 sw_if_index_set = 0;
15668 /* Parse args required to build the message */
15669 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15671 if (unformat (i, "sw_if_index %d", &sw_if_index))
15672 sw_if_index_set = 1;
15677 if (sw_if_index_set == 0)
15682 if (!vam->json_output)
15684 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15685 "sw_if_index", "src_address", "dst_address",
15686 "local_sa_id", "remote_sa_id");
15689 /* Get list of gre-tunnel interfaces */
15690 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15692 mp->sw_if_index = htonl (sw_if_index);
15696 /* Use a control ping for synchronization */
15698 vl_api_control_ping_t *mp;
15699 M (CONTROL_PING, control_ping);
15706 api_delete_subif (vat_main_t * vam)
15708 unformat_input_t *i = vam->input;
15709 vl_api_delete_subif_t *mp;
15711 u32 sw_if_index = ~0;
15713 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15715 if (unformat (i, "sw_if_index %d", &sw_if_index))
15721 if (sw_if_index == ~0)
15723 errmsg ("missing sw_if_index\n");
15727 /* Construct the API message */
15728 M (DELETE_SUBIF, delete_subif);
15729 mp->sw_if_index = ntohl (sw_if_index);
15735 #define foreach_pbb_vtr_op \
15736 _("disable", L2_VTR_DISABLED) \
15737 _("pop", L2_VTR_POP_2) \
15738 _("push", L2_VTR_PUSH_2)
15741 api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
15743 unformat_input_t *i = vam->input;
15744 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
15746 u32 sw_if_index = ~0, vtr_op = ~0;
15747 u16 outer_tag = ~0;
15748 u8 dmac[6], smac[6];
15749 u8 dmac_set = 0, smac_set = 0;
15754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15756 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15758 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15760 else if (unformat (i, "vtr_op %d", &vtr_op))
15762 #define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
15765 else if (unformat (i, "translate_pbb_stag"))
15767 if (unformat (i, "%d", &tmp))
15769 vtr_op = L2_VTR_TRANSLATE_2_1;
15775 ("translate_pbb_stag operation requires outer tag definition\n");
15779 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
15781 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
15783 else if (unformat (i, "sid %d", &sid))
15785 else if (unformat (i, "vlanid %d", &tmp))
15789 clib_warning ("parse error '%U'", format_unformat_error, i);
15794 if ((sw_if_index == ~0) || (vtr_op == ~0))
15796 errmsg ("missing sw_if_index or vtr operation\n");
15799 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
15800 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
15803 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid\n");
15807 M (L2_INTERFACE_PBB_TAG_REWRITE, l2_interface_pbb_tag_rewrite);
15808 mp->sw_if_index = ntohl (sw_if_index);
15809 mp->vtr_op = ntohl (vtr_op);
15810 mp->outer_tag = ntohs (outer_tag);
15811 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
15812 clib_memcpy (mp->b_smac, smac, sizeof (smac));
15813 mp->b_vlanid = ntohs (vlanid);
15814 mp->i_sid = ntohl (sid);
15823 api_flow_classify_set_interface (vat_main_t * vam)
15825 unformat_input_t *i = vam->input;
15826 vl_api_flow_classify_set_interface_t *mp;
15829 int sw_if_index_set;
15830 u32 ip4_table_index = ~0;
15831 u32 ip6_table_index = ~0;
15834 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15836 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15837 sw_if_index_set = 1;
15838 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15839 sw_if_index_set = 1;
15840 else if (unformat (i, "del"))
15842 else if (unformat (i, "ip4-table %d", &ip4_table_index))
15844 else if (unformat (i, "ip6-table %d", &ip6_table_index))
15848 clib_warning ("parse error '%U'", format_unformat_error, i);
15853 if (sw_if_index_set == 0)
15855 errmsg ("missing interface name or sw_if_index\n");
15859 M (FLOW_CLASSIFY_SET_INTERFACE, flow_classify_set_interface);
15861 mp->sw_if_index = ntohl (sw_if_index);
15862 mp->ip4_table_index = ntohl (ip4_table_index);
15863 mp->ip6_table_index = ntohl (ip6_table_index);
15864 mp->is_add = is_add;
15873 api_flow_classify_dump (vat_main_t * vam)
15875 unformat_input_t *i = vam->input;
15876 vl_api_flow_classify_dump_t *mp;
15878 u8 type = FLOW_CLASSIFY_N_TABLES;
15880 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
15884 errmsg ("classify table type must be specified\n");
15888 if (!vam->json_output)
15890 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
15893 M (FLOW_CLASSIFY_DUMP, flow_classify_dump);
15898 /* Use a control ping for synchronization */
15900 vl_api_control_ping_t *mp;
15901 M (CONTROL_PING, control_ping);
15904 /* Wait for a reply... */
15912 q_or_quit (vat_main_t * vam)
15914 longjmp (vam->jump_buf, 1);
15915 return 0; /* not so much */
15919 q (vat_main_t * vam)
15921 return q_or_quit (vam);
15925 quit (vat_main_t * vam)
15927 return q_or_quit (vam);
15931 comment (vat_main_t * vam)
15937 cmd_cmp (void *a1, void *a2)
15942 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15946 help (vat_main_t * vam)
15951 unformat_input_t *i = vam->input;
15954 if (unformat (i, "%s", &name))
15958 vec_add1 (name, 0);
15960 hs = hash_get_mem (vam->help_by_name, name);
15962 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15964 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15969 fformat (vam->ofp, "Help is available for the following:\n");
15972 hash_foreach_pair (p, vam->function_by_name,
15974 vec_add1 (cmds, (u8 *)(p->key));
15978 vec_sort_with_function (cmds, cmd_cmp);
15980 for (j = 0; j < vec_len (cmds); j++)
15981 fformat (vam->ofp, "%s\n", cmds[j]);
15988 set (vat_main_t * vam)
15990 u8 *name = 0, *value = 0;
15991 unformat_input_t *i = vam->input;
15993 if (unformat (i, "%s", &name))
15995 /* The input buffer is a vector, not a string. */
15996 value = vec_dup (i->buffer);
15997 vec_delete (value, i->index, 0);
15998 /* Almost certainly has a trailing newline */
15999 if (value[vec_len (value) - 1] == '\n')
16000 value[vec_len (value) - 1] = 0;
16001 /* Make sure it's a proper string, one way or the other */
16002 vec_add1 (value, 0);
16003 (void) clib_macro_set_value (&vam->macro_main,
16004 (char *) name, (char *) value);
16007 errmsg ("usage: set <name> <value>\n");
16015 unset (vat_main_t * vam)
16019 if (unformat (vam->input, "%s", &name))
16020 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
16021 errmsg ("unset: %s wasn't set\n", name);
16034 macro_sort_cmp (void *a1, void *a2)
16036 macro_sort_t *s1 = a1;
16037 macro_sort_t *s2 = a2;
16039 return strcmp ((char *) (s1->name), (char *) (s2->name));
16043 dump_macro_table (vat_main_t * vam)
16045 macro_sort_t *sort_me = 0, *sm;
16050 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
16052 vec_add2 (sort_me, sm, 1);
16053 sm->name = (u8 *)(p->key);
16054 sm->value = (u8 *) (p->value[0]);
16058 vec_sort_with_function (sort_me, macro_sort_cmp);
16060 if (vec_len (sort_me))
16061 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
16063 fformat (vam->ofp, "The macro table is empty...\n");
16065 for (i = 0; i < vec_len (sort_me); i++)
16066 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
16071 dump_node_table (vat_main_t * vam)
16074 vlib_node_t *node, *next_node;
16076 if (vec_len (vam->graph_nodes) == 0)
16078 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16082 for (i = 0; i < vec_len (vam->graph_nodes); i++)
16084 node = vam->graph_nodes[i];
16085 fformat (vam->ofp, "[%d] %s\n", i, node->name);
16086 for (j = 0; j < vec_len (node->next_nodes); j++)
16088 if (node->next_nodes[j] != ~0)
16090 next_node = vam->graph_nodes[node->next_nodes[j]];
16091 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16099 search_node_table (vat_main_t * vam)
16101 unformat_input_t *line_input = vam->input;
16104 vlib_node_t *node, *next_node;
16107 if (vam->graph_node_index_by_name == 0)
16109 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16113 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16115 if (unformat (line_input, "%s", &node_to_find))
16117 vec_add1 (node_to_find, 0);
16118 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
16121 fformat (vam->ofp, "%s not found...\n", node_to_find);
16124 node = vam->graph_nodes[p[0]];
16125 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
16126 for (j = 0; j < vec_len (node->next_nodes); j++)
16128 if (node->next_nodes[j] != ~0)
16130 next_node = vam->graph_nodes[node->next_nodes[j]];
16131 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16138 clib_warning ("parse error '%U'", format_unformat_error,
16144 vec_free (node_to_find);
16153 script (vat_main_t * vam)
16156 char *save_current_file;
16157 unformat_input_t save_input;
16158 jmp_buf save_jump_buf;
16159 u32 save_line_number;
16161 FILE *new_fp, *save_ifp;
16163 if (unformat (vam->input, "%s", &s))
16165 new_fp = fopen ((char *) s, "r");
16168 errmsg ("Couldn't open script file %s\n", s);
16175 errmsg ("Missing script name\n");
16179 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
16180 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
16181 save_ifp = vam->ifp;
16182 save_line_number = vam->input_line_number;
16183 save_current_file = (char *) vam->current_file;
16185 vam->input_line_number = 0;
16187 vam->current_file = s;
16190 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
16191 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
16192 vam->ifp = save_ifp;
16193 vam->input_line_number = save_line_number;
16194 vam->current_file = (u8 *) save_current_file;
16201 echo (vat_main_t * vam)
16203 fformat (vam->ofp, "%v", vam->input->buffer);
16207 /* List of API message constructors, CLI names map to api_xxx */
16208 #define foreach_vpe_api_msg \
16209 _(create_loopback,"[mac <mac-addr>]") \
16210 _(sw_interface_dump,"") \
16211 _(sw_interface_set_flags, \
16212 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
16213 _(sw_interface_add_del_address, \
16214 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
16215 _(sw_interface_set_table, \
16216 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
16217 _(sw_interface_set_mpls_enable, \
16218 "<intfc> | sw_if_index [disable | dis]") \
16219 _(sw_interface_set_vpath, \
16220 "<intfc> | sw_if_index <id> enable | disable") \
16221 _(sw_interface_set_l2_xconnect, \
16222 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16223 "enable | disable") \
16224 _(sw_interface_set_l2_bridge, \
16225 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
16226 "[shg <split-horizon-group>] [bvi]\n" \
16227 "enable | disable") \
16228 _(sw_interface_set_dpdk_hqos_pipe, \
16229 "rx <intfc> | sw_if_index <id> subport <subport-id> pipe <pipe-id>\n" \
16230 "profile <profile-id>\n") \
16231 _(sw_interface_set_dpdk_hqos_subport, \
16232 "rx <intfc> | sw_if_index <id> subport <subport-id> [rate <n>]\n" \
16233 "[bktsize <n>] [tc0 <n>] [tc1 <n>] [tc2 <n>] [tc3 <n>] [period <n>]\n") \
16234 _(sw_interface_set_dpdk_hqos_tctbl, \
16235 "rx <intfc> | sw_if_index <id> entry <n> tc <n> queue <n>\n") \
16236 _(bridge_domain_add_del, \
16237 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
16238 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
16240 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
16242 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
16244 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
16246 "tapname <name> mac <mac-addr> | random-mac") \
16248 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
16250 "<vpp-if-name> | sw_if_index <id>") \
16251 _(sw_interface_tap_dump, "") \
16252 _(ip_add_del_route, \
16253 "<addr>/<mask> via <addr> [table-id <n>]\n" \
16254 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16255 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16256 "[multipath] [count <n>]") \
16257 _(mpls_route_add_del, \
16258 "<label> <eos> via <addr> [table-id <n>]\n" \
16259 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16260 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16261 "[multipath] [count <n>]") \
16262 _(mpls_ip_bind_unbind, \
16263 "<label> <addr/len>") \
16264 _(proxy_arp_add_del, \
16265 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
16266 _(proxy_arp_intfc_enable_disable, \
16267 "<intfc> | sw_if_index <id> enable | disable") \
16268 _(mpls_add_del_encap, \
16269 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
16270 _(sw_interface_set_unnumbered, \
16271 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
16272 _(ip_neighbor_add_del, \
16273 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
16274 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
16275 _(reset_vrf, "vrf <id> [ipv6]") \
16276 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
16277 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
16278 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
16279 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
16280 "[outer_vlan_id_any][inner_vlan_id_any]") \
16281 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
16282 _(reset_fib, "vrf <n> [ipv6]") \
16283 _(dhcp_proxy_config, \
16284 "svr <v46-address> src <v46-address>\n" \
16285 "insert-cid <n> [del]") \
16286 _(dhcp_proxy_config_2, \
16287 "svr <v46-address> src <v46-address>\n" \
16288 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
16289 _(dhcp_proxy_set_vss, \
16290 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
16291 _(dhcp_client_config, \
16292 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
16293 _(set_ip_flow_hash, \
16294 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
16295 _(sw_interface_ip6_enable_disable, \
16296 "<intfc> | sw_if_index <id> enable | disable") \
16297 _(sw_interface_ip6_set_link_local_address, \
16298 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
16299 _(sw_interface_ip6nd_ra_prefix, \
16300 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
16301 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
16302 "[nolink] [isno]") \
16303 _(sw_interface_ip6nd_ra_config, \
16304 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
16305 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
16306 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
16307 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
16308 _(l2_patch_add_del, \
16309 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16310 "enable | disable") \
16311 _(mpls_ethernet_add_del_tunnel, \
16312 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
16313 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
16314 _(mpls_ethernet_add_del_tunnel_2, \
16315 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
16316 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
16317 _(sr_tunnel_add_del, \
16318 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
16319 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
16320 "[policy <policy_name>]") \
16321 _(sr_policy_add_del, \
16322 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
16323 _(sr_multicast_map_add_del, \
16324 "address [ip6 multicast address] sr-policy [policy name] [del]") \
16325 _(classify_add_del_table, \
16326 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
16327 "[del] mask <mask-value>\n" \
16328 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
16329 _(classify_add_del_session, \
16330 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
16331 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
16332 " [l3 [ip4|ip6]]") \
16333 _(classify_set_interface_ip_table, \
16334 "<intfc> | sw_if_index <nn> table <nn>") \
16335 _(classify_set_interface_l2_tables, \
16336 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16337 " [other-table <nn>]") \
16338 _(get_node_index, "node <node-name") \
16339 _(add_node_next, "node <node-name> next <next-node-name>") \
16340 _(l2tpv3_create_tunnel, \
16341 "client_address <ip6-addr> our_address <ip6-addr>\n" \
16342 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
16343 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
16344 _(l2tpv3_set_tunnel_cookies, \
16345 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
16346 "[new_remote_cookie <nn>]\n") \
16347 _(l2tpv3_interface_enable_disable, \
16348 "<intfc> | sw_if_index <nn> enable | disable") \
16349 _(l2tpv3_set_lookup_key, \
16350 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
16351 _(sw_if_l2tpv3_tunnel_dump, "") \
16352 _(vxlan_add_del_tunnel, \
16353 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
16354 " [decap-next l2|ip4|ip6] [del]") \
16355 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16356 _(gre_add_del_tunnel, \
16357 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [teb] [del]\n") \
16358 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16359 _(l2_fib_clear_table, "") \
16360 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
16361 _(l2_interface_vlan_tag_rewrite, \
16362 "<intfc> | sw_if_index <nn> \n" \
16363 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
16364 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
16365 _(create_vhost_user_if, \
16366 "socket <filename> [server] [renumber <dev_instance>] " \
16367 "[mac <mac_address>]") \
16368 _(modify_vhost_user_if, \
16369 "<intfc> | sw_if_index <nn> socket <filename>\n" \
16370 "[server] [renumber <dev_instance>]") \
16371 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
16372 _(sw_interface_vhost_user_dump, "") \
16373 _(show_version, "") \
16374 _(vxlan_gpe_add_del_tunnel, \
16375 "local <addr> remote <addr> vni <nn>\n" \
16376 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
16377 "[next-ethernet] [next-nsh]\n") \
16378 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
16379 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
16380 _(interface_name_renumber, \
16381 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
16382 _(input_acl_set_interface, \
16383 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16384 " [l2-table <nn>] [del]") \
16385 _(want_ip4_arp_events, "address <ip4-address> [del]") \
16386 _(want_ip6_nd_events, "address <ip6-address> [del]") \
16387 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
16388 _(ip_dump, "ipv4 | ipv6") \
16389 _(ipsec_spd_add_del, "spd_id <n> [del]") \
16390 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
16392 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
16393 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
16394 " integ_alg <alg> integ_key <hex>") \
16395 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
16396 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
16397 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
16398 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
16399 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
16400 _(ikev2_profile_add_del, "name <profile_name> [del]") \
16401 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
16402 "(auth_data 0x<data> | auth_data <data>)") \
16403 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
16404 "(id_data 0x<data> | id_data <data>) (local|remote)") \
16405 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
16406 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
16407 "(local|remote)") \
16408 _(ikev2_set_local_key, "file <absolute_file_path>") \
16409 _(delete_loopback,"sw_if_index <nn>") \
16410 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
16411 _(map_add_domain, \
16412 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
16413 "ip6-src <ip6addr> " \
16414 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
16415 _(map_del_domain, "index <n>") \
16416 _(map_add_del_rule, \
16417 "index <n> psid <n> dst <ip6addr> [del]") \
16418 _(map_domain_dump, "") \
16419 _(map_rule_dump, "index <map-domain>") \
16420 _(want_interface_events, "enable|disable") \
16421 _(want_stats,"enable|disable") \
16422 _(get_first_msg_id, "client <name>") \
16423 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
16424 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
16425 "fib-id <nn> [ip4][ip6][default]") \
16426 _(get_node_graph, " ") \
16427 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
16428 _(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
16429 _(ioam_disable, "") \
16430 _(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
16431 " sw_if_index <sw_if_index> p <priority> " \
16432 "w <weight>] [del]") \
16433 _(lisp_add_del_locator, "locator-set <locator_name> " \
16434 "iface <intf> | sw_if_index <sw_if_index> " \
16435 "p <priority> w <weight> [del]") \
16436 _(lisp_add_del_local_eid,"vni <vni> eid " \
16437 "<ipv4|ipv6>/<prefix> | <L2 address> " \
16438 "locator-set <locator_name> [del]") \
16439 _(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
16440 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
16441 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
16442 _(lisp_gpe_enable_disable, "enable|disable") \
16443 _(lisp_enable_disable, "enable|disable") \
16444 _(lisp_gpe_add_del_iface, "up|down") \
16445 _(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
16447 "rloc <locator> p <prio> " \
16448 "w <weight> [rloc <loc> ... ] " \
16449 "action <action> [del-all]") \
16450 _(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
16452 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
16453 _(lisp_map_request_mode, "src-dst|dst-only") \
16454 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
16455 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
16456 _(lisp_locator_set_dump, "[local | remote]") \
16457 _(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
16458 _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
16459 "[local] | [remote]") \
16460 _(lisp_eid_table_vni_dump, "") \
16461 _(lisp_eid_table_map_dump, "l2|l3") \
16462 _(lisp_gpe_tunnel_dump, "") \
16463 _(lisp_map_resolver_dump, "") \
16464 _(lisp_adjacencies_get, "vni <vni>") \
16465 _(show_lisp_status, "") \
16466 _(lisp_get_map_request_itr_rlocs, "") \
16467 _(show_lisp_pitr, "") \
16468 _(show_lisp_map_request_mode, "") \
16469 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
16470 _(af_packet_delete, "name <host interface name>") \
16471 _(policer_add_del, "name <policer name> <params> [del]") \
16472 _(policer_dump, "[name <policer name>]") \
16473 _(policer_classify_set_interface, \
16474 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16475 " [l2-table <nn>] [del]") \
16476 _(policer_classify_dump, "type [ip4|ip6|l2]") \
16477 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
16478 "[master|slave]") \
16479 _(netmap_delete, "name <interface name>") \
16480 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
16481 _(mpls_fib_encap_dump, "") \
16482 _(mpls_fib_dump, "") \
16483 _(classify_table_ids, "") \
16484 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
16485 _(classify_table_info, "table_id <nn>") \
16486 _(classify_session_dump, "table_id <nn>") \
16487 _(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
16488 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
16489 "[template_interval <nn>] [udp_checksum]") \
16490 _(ipfix_exporter_dump, "") \
16491 _(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
16492 _(ipfix_classify_stream_dump, "") \
16493 _(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]")\
16494 _(ipfix_classify_table_dump, "") \
16495 _(get_next_index, "node-name <node-name> next-node-name <node-name>") \
16496 _(pg_create_interface, "if_id <nn>") \
16497 _(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
16498 _(pg_enable_disable, "[stream <id>] disable") \
16499 _(ip_source_and_port_range_check_add_del, \
16500 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
16501 _(ip_source_and_port_range_check_interface_add_del, \
16502 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
16503 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
16504 _(ipsec_gre_add_del_tunnel, \
16505 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
16506 _(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
16507 _(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>") \
16508 _(l2_interface_pbb_tag_rewrite, \
16509 "<intfc> | sw_if_index <nn> \n" \
16510 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
16511 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
16512 _(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
16513 _(flow_classify_set_interface, \
16514 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
16515 _(flow_classify_dump, "type [ip4|ip6]")
16517 /* List of command functions, CLI names map directly to functions */
16518 #define foreach_cli_function \
16519 _(comment, "usage: comment <ignore-rest-of-line>") \
16520 _(dump_interface_table, "usage: dump_interface_table") \
16521 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
16522 _(dump_ipv4_table, "usage: dump_ipv4_table") \
16523 _(dump_ipv6_table, "usage: dump_ipv6_table") \
16524 _(dump_stats_table, "usage: dump_stats_table") \
16525 _(dump_macro_table, "usage: dump_macro_table ") \
16526 _(dump_node_table, "usage: dump_node_table") \
16527 _(echo, "usage: echo <message>") \
16528 _(exec, "usage: exec <vpe-debug-CLI-command>") \
16529 _(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
16530 _(help, "usage: help") \
16531 _(q, "usage: quit") \
16532 _(quit, "usage: quit") \
16533 _(search_node_table, "usage: search_node_table <name>...") \
16534 _(set, "usage: set <variable-name> <value>") \
16535 _(script, "usage: script <file-name>") \
16536 _(unset, "usage: unset <variable-name>")
16539 static void vl_api_##n##_t_handler_uni \
16540 (vl_api_##n##_t * mp) \
16542 vat_main_t * vam = &vat_main; \
16543 if (vam->json_output) { \
16544 vl_api_##n##_t_handler_json(mp); \
16546 vl_api_##n##_t_handler(mp); \
16549 foreach_vpe_api_reply_msg;
16553 vat_api_hookup (vat_main_t * vam)
16556 vl_msg_api_set_handlers(VL_API_##N, #n, \
16557 vl_api_##n##_t_handler_uni, \
16559 vl_api_##n##_t_endian, \
16560 vl_api_##n##_t_print, \
16561 sizeof(vl_api_##n##_t), 1);
16562 foreach_vpe_api_reply_msg;
16565 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
16567 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
16569 vam->function_by_name = hash_create_string (0, sizeof (uword));
16571 vam->help_by_name = hash_create_string (0, sizeof (uword));
16573 /* API messages we can send */
16574 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
16575 foreach_vpe_api_msg;
16579 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16580 foreach_vpe_api_msg;
16583 /* CLI functions */
16584 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
16585 foreach_cli_function;
16589 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
16590 foreach_cli_function;
16594 #undef vl_api_version
16595 #define vl_api_version(n,v) static u32 vpe_api_version = v;
16596 #include <vpp-api/vpe.api.h>
16597 #undef vl_api_version
16600 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
16603 * Send the main API signature in slot 0. This bit of code must
16604 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16606 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
16610 * fd.io coding-style-patch-verification: ON
16613 * eval: (c-set-style "gnu")