2 *------------------------------------------------------------------
5 * Copyright (c) 2014 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
21 #include <vlibapi/api.h>
22 #include <vlibmemory/api.h>
23 #include <vlibsocket/api.h>
24 #include <vnet/ip/ip.h>
25 #include <vnet/sr/sr_packet.h>
26 #include <vnet/l2/l2_input.h>
27 #include <vnet/l2tp/l2tp.h>
28 #include <vnet/vxlan/vxlan.h>
29 #include <vnet/gre/gre.h>
30 #include <vnet/vxlan-gpe/vxlan_gpe.h>
31 #include <vnet/lisp-gpe/lisp_gpe.h>
33 #include <vpp-api/vpe_msg_enum.h>
34 #include <vnet/l2/l2_classify.h>
35 #include <vnet/l2/l2_vtr.h>
36 #include <vnet/classify/input_acl.h>
37 #include <vnet/mpls-gre/mpls.h>
39 #include <vnet/ipsec/ipsec.h>
40 #include <vnet/ipsec/ikev2.h>
44 #include <vnet/map/map.h>
45 #include <vnet/cop/cop.h>
46 #include <vnet/ip/ip6_hop_by_hop.h>
47 #include <vnet/policer/xlate.h>
49 #include "vat/json_format.h"
51 #define vl_typedefs /* define message structures */
52 #include <vpp-api/vpe_all_api_h.h>
55 /* declare message handlers for each api */
57 #define vl_endianfun /* define message structures */
58 #include <vpp-api/vpe_all_api_h.h>
61 /* instantiate all the print functions we know about */
62 #define vl_print(handle, ...)
64 #include <vpp-api/vpe_all_api_h.h>
67 uword unformat_sw_if_index (unformat_input_t * input, va_list * args)
69 vat_main_t * vam = va_arg (*args, vat_main_t *);
70 u32 * result = va_arg (*args, u32 *);
74 if (!unformat (input, "%s", &if_name))
77 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
84 /* Parse an IP4 address %d.%d.%d.%d. */
85 uword unformat_ip4_address (unformat_input_t * input, va_list * args)
87 u8 * result = va_arg (*args, u8 *);
90 if (! unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
93 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
106 unformat_ethernet_address (unformat_input_t * input, va_list * args)
108 u8 * result = va_arg (*args, u8 *);
111 if (! unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
112 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
116 for (i = 0; i < 6; i++)
117 if (a[i] >= (1 << 8))
120 for (i = 0; i < 6; i++)
126 /* Returns ethernet type as an int in host byte order. */
128 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
131 u16 * result = va_arg (*args, u16 *);
135 if (unformat (input, "0x%x", &type)
136 || unformat (input, "%d", &type))
138 if (type >= (1 << 16))
146 /* Parse an IP6 address. */
147 uword unformat_ip6_address (unformat_input_t * input, va_list * args)
149 ip6_address_t * result = va_arg (*args, ip6_address_t *);
151 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
152 uword c, n_colon, double_colon_index;
154 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
155 double_colon_index = ARRAY_LEN (hex_quads);
156 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
159 if (c >= '0' && c <= '9')
161 else if (c >= 'a' && c <= 'f')
162 hex_digit = c + 10 - 'a';
163 else if (c >= 'A' && c <= 'F')
164 hex_digit = c + 10 - 'A';
165 else if (c == ':' && n_colon < 2)
169 unformat_put_input (input);
173 /* Too many hex quads. */
174 if (n_hex_quads >= ARRAY_LEN (hex_quads))
179 hex_quad = (hex_quad << 4) | hex_digit;
181 /* Hex quad must fit in 16 bits. */
182 if (n_hex_digits >= 4)
189 /* Save position of :: */
192 /* More than one :: ? */
193 if (double_colon_index < ARRAY_LEN (hex_quads))
195 double_colon_index = n_hex_quads;
198 if (n_colon > 0 && n_hex_digits > 0)
200 hex_quads[n_hex_quads++] = hex_quad;
206 if (n_hex_digits > 0)
207 hex_quads[n_hex_quads++] = hex_quad;
212 /* Expand :: to appropriate number of zero hex quads. */
213 if (double_colon_index < ARRAY_LEN (hex_quads))
215 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
217 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
218 hex_quads[n_zero + i] = hex_quads[i];
220 for (i = 0; i < n_zero; i++)
221 hex_quads[double_colon_index + i] = 0;
223 n_hex_quads = ARRAY_LEN (hex_quads);
226 /* Too few hex quads given. */
227 if (n_hex_quads < ARRAY_LEN (hex_quads))
230 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
231 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
238 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
241 u32 * r = va_arg (*args, u32 *);
244 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
245 foreach_ipsec_policy_action
256 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
259 u32 * r = va_arg (*args, u32 *);
262 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
263 foreach_ipsec_crypto_alg
274 format_ipsec_crypto_alg (u8 * s, va_list * args)
277 u32 i = va_arg (*args, u32);
282 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
283 foreach_ipsec_crypto_alg
286 return format (s, "unknown");
288 return format (s, "%s", t);
290 return format (s, "Unimplemented");
295 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
298 u32 * r = va_arg (*args, u32 *);
301 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
302 foreach_ipsec_integ_alg
313 format_ipsec_integ_alg (u8 * s, va_list * args)
316 u32 i = va_arg (*args, u32);
321 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
322 foreach_ipsec_integ_alg
325 return format (s, "unknown");
327 return format (s, "%s", t);
329 return format (s, "Unsupported");
334 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
337 u32 * r = va_arg (*args, u32 *);
340 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
341 foreach_ikev2_auth_method
352 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
355 u32 * r = va_arg (*args, u32 *);
358 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
359 foreach_ikev2_id_type
370 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
372 u8 * r = va_arg (*args, u8 *);
374 if (unformat (input, "kbps"))
375 *r = SSE2_QOS_RATE_KBPS;
376 else if (unformat(input, "pps"))
377 *r = SSE2_QOS_RATE_PPS;
384 unformat_policer_round_type (unformat_input_t * input, va_list * args)
386 u8 * r = va_arg (*args, u8 *);
388 if (unformat(input, "closest"))
389 *r = SSE2_QOS_ROUND_TO_CLOSEST;
390 else if (unformat (input, "up"))
391 *r = SSE2_QOS_ROUND_TO_UP;
392 else if (unformat (input, "down"))
393 *r = SSE2_QOS_ROUND_TO_DOWN;
400 unformat_policer_type (unformat_input_t * input, va_list * args)
402 u8 * r = va_arg (*args, u8 *);
404 if (unformat (input, "1r2c"))
405 *r = SSE2_QOS_POLICER_TYPE_1R2C;
406 else if (unformat (input, "1r3c"))
407 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
408 else if (unformat (input, "2r3c-2698"))
409 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
410 else if (unformat (input, "2r3c-4115"))
411 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
412 else if (unformat (input, "2r3c-mef5cf1"))
413 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
419 u8 * format_ip4_address (u8 * s, va_list * args)
421 u8 * a = va_arg (*args, u8 *);
422 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
425 u8 * format_ip6_address (u8 * s, va_list * args)
427 ip6_address_t * a = va_arg (*args, ip6_address_t *);
428 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
430 i_max_n_zero = ARRAY_LEN (a->as_u16);
432 i_first_zero = i_max_n_zero;
434 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
436 u32 is_zero = a->as_u16[i] == 0;
437 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
443 if ((! is_zero && n_zeros > max_n_zeros)
444 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
446 i_max_n_zero = i_first_zero;
447 max_n_zeros = n_zeros;
448 i_first_zero = ARRAY_LEN (a->as_u16);
453 last_double_colon = 0;
454 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
456 if (i == i_max_n_zero && max_n_zeros > 1)
458 s = format (s, "::");
459 i += max_n_zeros - 1;
460 last_double_colon = 1;
464 s = format (s, "%s%x",
465 (last_double_colon || i == 0) ? "" : ":",
466 clib_net_to_host_u16 (a->as_u16[i]));
467 last_double_colon = 0;
474 /* Format an IP46 address. */
475 u8 * format_ip46_address (u8 * s, va_list * args)
477 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
478 ip46_type_t type = va_arg (*args, ip46_type_t);
484 is_ip4 = ip46_address_is_ip4(ip46);
495 format(s, "%U", format_ip4_address, &ip46->ip4):
496 format(s, "%U", format_ip6_address, &ip46->ip6);
499 u8 * format_ethernet_address (u8 * s, va_list * args)
501 u8 * a = va_arg (*args, u8 *);
503 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
504 a[0], a[1], a[2], a[3], a[4], a[5]);
507 void increment_v4_address (ip4_address_t * a)
511 v = ntohl(a->as_u32) + 1;
512 a->as_u32 = ntohl(v);
515 void increment_v6_address (ip6_address_t * a)
519 v0 = clib_net_to_host_u64 (a->as_u64[0]);
520 v1 = clib_net_to_host_u64 (a->as_u64[1]);
525 a->as_u64[0] = clib_net_to_host_u64 (v0);
526 a->as_u64[1] = clib_net_to_host_u64 (v1);
530 static void vl_api_create_loopback_reply_t_handler
531 (vl_api_create_loopback_reply_t * mp)
533 vat_main_t * vam = &vat_main;
534 i32 retval = ntohl(mp->retval);
536 vam->retval = retval;
537 vam->regenerate_interface_table = 1;
538 vam->sw_if_index = ntohl (mp->sw_if_index);
539 vam->result_ready = 1;
542 static void vl_api_create_loopback_reply_t_handler_json
543 (vl_api_create_loopback_reply_t * mp)
545 vat_main_t * vam = &vat_main;
546 vat_json_node_t node;
548 vat_json_init_object(&node);
549 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
550 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
552 vat_json_print(vam->ofp, &node);
553 vat_json_free(&node);
554 vam->retval = ntohl(mp->retval);
555 vam->result_ready = 1;
558 static void vl_api_af_packet_create_reply_t_handler
559 (vl_api_af_packet_create_reply_t * mp)
561 vat_main_t * vam = &vat_main;
562 i32 retval = ntohl(mp->retval);
564 vam->retval = retval;
565 vam->regenerate_interface_table = 1;
566 vam->sw_if_index = ntohl (mp->sw_if_index);
567 vam->result_ready = 1;
570 static void vl_api_af_packet_create_reply_t_handler_json
571 (vl_api_af_packet_create_reply_t * mp)
573 vat_main_t * vam = &vat_main;
574 vat_json_node_t node;
576 vat_json_init_object(&node);
577 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
578 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
580 vat_json_print(vam->ofp, &node);
581 vat_json_free(&node);
583 vam->retval = ntohl(mp->retval);
584 vam->result_ready = 1;
587 static void vl_api_create_vlan_subif_reply_t_handler
588 (vl_api_create_vlan_subif_reply_t * mp)
590 vat_main_t * vam = &vat_main;
591 i32 retval = ntohl(mp->retval);
593 vam->retval = retval;
594 vam->regenerate_interface_table = 1;
595 vam->sw_if_index = ntohl (mp->sw_if_index);
596 vam->result_ready = 1;
599 static void vl_api_create_vlan_subif_reply_t_handler_json
600 (vl_api_create_vlan_subif_reply_t * mp)
602 vat_main_t * vam = &vat_main;
603 vat_json_node_t node;
605 vat_json_init_object(&node);
606 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
607 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
609 vat_json_print(vam->ofp, &node);
610 vat_json_free(&node);
612 vam->retval = ntohl(mp->retval);
613 vam->result_ready = 1;
616 static void vl_api_create_subif_reply_t_handler
617 (vl_api_create_subif_reply_t * mp)
619 vat_main_t * vam = &vat_main;
620 i32 retval = ntohl(mp->retval);
622 vam->retval = retval;
623 vam->regenerate_interface_table = 1;
624 vam->sw_if_index = ntohl (mp->sw_if_index);
625 vam->result_ready = 1;
628 static void vl_api_create_subif_reply_t_handler_json
629 (vl_api_create_subif_reply_t * mp)
631 vat_main_t * vam = &vat_main;
632 vat_json_node_t node;
634 vat_json_init_object(&node);
635 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
636 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
638 vat_json_print(vam->ofp, &node);
639 vat_json_free(&node);
641 vam->retval = ntohl(mp->retval);
642 vam->result_ready = 1;
645 static void vl_api_interface_name_renumber_reply_t_handler
646 (vl_api_interface_name_renumber_reply_t * mp)
648 vat_main_t * vam = &vat_main;
649 i32 retval = ntohl(mp->retval);
651 vam->retval = retval;
652 vam->regenerate_interface_table = 1;
653 vam->result_ready = 1;
656 static void vl_api_interface_name_renumber_reply_t_handler_json
657 (vl_api_interface_name_renumber_reply_t * mp)
659 vat_main_t * vam = &vat_main;
660 vat_json_node_t node;
662 vat_json_init_object(&node);
663 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
665 vat_json_print(vam->ofp, &node);
666 vat_json_free(&node);
668 vam->retval = ntohl(mp->retval);
669 vam->result_ready = 1;
673 * Special-case: build the interface table, maintain
674 * the next loopback sw_if_index vbl.
676 static void vl_api_sw_interface_details_t_handler
677 (vl_api_sw_interface_details_t * mp)
679 vat_main_t * vam = &vat_main;
680 u8 * s = format (0, "%s%c", mp->interface_name, 0);
682 hash_set_mem (vam->sw_if_index_by_interface_name, s,
683 ntohl(mp->sw_if_index));
685 /* In sub interface case, fill the sub interface table entry */
686 if (mp->sw_if_index != mp->sup_sw_if_index) {
687 sw_interface_subif_t * sub = NULL;
689 vec_add2(vam->sw_if_subif_table, sub, 1);
691 vec_validate(sub->interface_name, strlen((char *)s) + 1);
692 strncpy((char *)sub->interface_name, (char *)s,
693 vec_len(sub->interface_name));
694 sub->sw_if_index = ntohl(mp->sw_if_index);
695 sub->sub_id = ntohl(mp->sub_id);
697 sub->sub_dot1ad = mp->sub_dot1ad;
698 sub->sub_number_of_tags = mp->sub_number_of_tags;
699 sub->sub_outer_vlan_id = ntohs(mp->sub_outer_vlan_id);
700 sub->sub_inner_vlan_id = ntohs(mp->sub_inner_vlan_id);
701 sub->sub_exact_match = mp->sub_exact_match;
702 sub->sub_default = mp->sub_default;
703 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
704 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
706 /* vlan tag rewrite */
707 sub->vtr_op = ntohl(mp->vtr_op);
708 sub->vtr_push_dot1q = ntohl(mp->vtr_push_dot1q);
709 sub->vtr_tag1 = ntohl(mp->vtr_tag1);
710 sub->vtr_tag2 = ntohl(mp->vtr_tag2);
714 static void vl_api_sw_interface_details_t_handler_json
715 (vl_api_sw_interface_details_t * mp)
717 vat_main_t * vam = &vat_main;
718 vat_json_node_t *node = NULL;
720 if (VAT_JSON_ARRAY != vam->json_tree.type) {
721 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
722 vat_json_init_array(&vam->json_tree);
724 node = vat_json_array_add(&vam->json_tree);
726 vat_json_init_object(node);
727 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
728 vat_json_object_add_uint(node, "sup_sw_if_index", ntohl(mp->sup_sw_if_index));
729 vat_json_object_add_uint(node, "l2_address_length", ntohl(mp->l2_address_length));
730 vat_json_object_add_bytes(node, "l2_address", mp->l2_address, sizeof(mp->l2_address));
731 vat_json_object_add_string_copy(node, "interface_name", mp->interface_name);
732 vat_json_object_add_uint(node, "admin_up_down", mp->admin_up_down);
733 vat_json_object_add_uint(node, "link_up_down", mp->link_up_down);
734 vat_json_object_add_uint(node, "link_duplex", mp->link_duplex);
735 vat_json_object_add_uint(node, "link_speed", mp->link_speed);
736 vat_json_object_add_uint(node, "mtu", ntohs(mp->link_mtu));
737 vat_json_object_add_uint(node, "sub_id", ntohl(mp->sub_id));
738 vat_json_object_add_uint(node, "sub_dot1ad", mp->sub_dot1ad);
739 vat_json_object_add_uint(node, "sub_number_of_tags", mp->sub_number_of_tags);
740 vat_json_object_add_uint(node, "sub_outer_vlan_id", ntohs(mp->sub_outer_vlan_id));
741 vat_json_object_add_uint(node, "sub_inner_vlan_id", ntohs(mp->sub_inner_vlan_id));
742 vat_json_object_add_uint(node, "sub_exact_match", mp->sub_exact_match);
743 vat_json_object_add_uint(node, "sub_default", mp->sub_default);
744 vat_json_object_add_uint(node, "sub_outer_vlan_id_any", mp->sub_outer_vlan_id_any);
745 vat_json_object_add_uint(node, "sub_inner_vlan_id_any", mp->sub_inner_vlan_id_any);
746 vat_json_object_add_uint(node, "vtr_op", ntohl(mp->vtr_op));
747 vat_json_object_add_uint(node, "vtr_push_dot1q", ntohl(mp->vtr_push_dot1q));
748 vat_json_object_add_uint(node, "vtr_tag1", ntohl(mp->vtr_tag1));
749 vat_json_object_add_uint(node, "vtr_tag2", ntohl(mp->vtr_tag2));
752 static void vl_api_sw_interface_set_flags_t_handler
753 (vl_api_sw_interface_set_flags_t * mp)
755 vat_main_t * vam = &vat_main;
756 if (vam->interface_event_display)
757 errmsg ("interface flags: sw_if_index %d %s %s\n",
758 ntohl(mp->sw_if_index),
759 mp->admin_up_down ? "admin-up" : "admin-down",
760 mp->link_up_down ? "link-up" : "link-down");
763 static void vl_api_sw_interface_set_flags_t_handler_json
764 (vl_api_sw_interface_set_flags_t * mp)
766 /* JSON output not supported */
769 static void vl_api_cli_reply_t_handler
770 (vl_api_cli_reply_t * mp)
772 vat_main_t * vam = &vat_main;
773 i32 retval = ntohl(mp->retval);
775 vam->retval = retval;
776 vam->shmem_result = (u8 *) mp->reply_in_shmem;
777 vam->result_ready = 1;
780 static void vl_api_cli_reply_t_handler_json
781 (vl_api_cli_reply_t * mp)
783 vat_main_t * vam = &vat_main;
784 vat_json_node_t node;
785 api_main_t * am = &api_main;
789 vat_json_init_object(&node);
790 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
791 vat_json_object_add_uint(&node, "reply_in_shmem",
792 ntohl(mp->reply_in_shmem));
793 /* Toss the shared-memory original... */
794 pthread_mutex_lock (&am->vlib_rp->mutex);
795 oldheap = svm_push_data_heap (am->vlib_rp);
797 reply = (u8 *)(mp->reply_in_shmem);
800 svm_pop_heap (oldheap);
801 pthread_mutex_unlock (&am->vlib_rp->mutex);
803 vat_json_print(vam->ofp, &node);
804 vat_json_free(&node);
806 vam->retval = ntohl(mp->retval);
807 vam->result_ready = 1;
810 static void vl_api_classify_add_del_table_reply_t_handler
811 (vl_api_classify_add_del_table_reply_t * mp)
813 vat_main_t * vam = &vat_main;
814 i32 retval = ntohl(mp->retval);
815 if (vam->async_mode) {
816 vam->async_errors += (retval < 0);
818 vam->retval = retval;
820 ((mp->new_table_index != 0xFFFFFFFF) ||
821 (mp->skip_n_vectors != 0xFFFFFFFF) ||
822 (mp->match_n_vectors != 0xFFFFFFFF)))
824 * Note: this is just barely thread-safe, depends on
825 * the main thread spinning waiting for an answer...
827 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
828 ntohl(mp->new_table_index),
829 ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
830 vam->result_ready = 1;
834 static void vl_api_classify_add_del_table_reply_t_handler_json
835 (vl_api_classify_add_del_table_reply_t * mp)
837 vat_main_t * vam = &vat_main;
838 vat_json_node_t node;
840 vat_json_init_object(&node);
841 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
842 vat_json_object_add_uint(&node, "new_table_index", ntohl(mp->new_table_index));
843 vat_json_object_add_uint(&node, "skip_n_vectors", ntohl(mp->skip_n_vectors));
844 vat_json_object_add_uint(&node, "match_n_vectors", ntohl(mp->match_n_vectors));
846 vat_json_print(vam->ofp, &node);
847 vat_json_free(&node);
849 vam->retval = ntohl(mp->retval);
850 vam->result_ready = 1;
853 static void vl_api_get_node_index_reply_t_handler
854 (vl_api_get_node_index_reply_t * mp)
856 vat_main_t * vam = &vat_main;
857 i32 retval = ntohl(mp->retval);
858 if (vam->async_mode) {
859 vam->async_errors += (retval < 0);
861 vam->retval = retval;
863 errmsg ("node index %d\n", ntohl(mp->node_index));
864 vam->result_ready = 1;
868 static void vl_api_get_node_index_reply_t_handler_json
869 (vl_api_get_node_index_reply_t * mp)
871 vat_main_t * vam = &vat_main;
872 vat_json_node_t node;
874 vat_json_init_object(&node);
875 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
876 vat_json_object_add_uint(&node, "node_index", ntohl(mp->node_index));
878 vat_json_print(vam->ofp, &node);
879 vat_json_free(&node);
881 vam->retval = ntohl(mp->retval);
882 vam->result_ready = 1;
885 static void vl_api_add_node_next_reply_t_handler
886 (vl_api_add_node_next_reply_t * mp)
888 vat_main_t * vam = &vat_main;
889 i32 retval = ntohl(mp->retval);
890 if (vam->async_mode) {
891 vam->async_errors += (retval < 0);
893 vam->retval = retval;
895 errmsg ("next index %d\n", ntohl(mp->next_index));
896 vam->result_ready = 1;
900 static void vl_api_add_node_next_reply_t_handler_json
901 (vl_api_add_node_next_reply_t * mp)
903 vat_main_t * vam = &vat_main;
904 vat_json_node_t node;
906 vat_json_init_object(&node);
907 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
908 vat_json_object_add_uint(&node, "next_index", ntohl(mp->next_index));
910 vat_json_print(vam->ofp, &node);
911 vat_json_free(&node);
913 vam->retval = ntohl(mp->retval);
914 vam->result_ready = 1;
917 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
918 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
920 vat_main_t * vam = &vat_main;
921 i32 retval = ntohl(mp->retval);
922 u32 sw_if_index = ntohl(mp->tunnel_sw_if_index);
924 if (retval >= 0 && sw_if_index != (u32)~0) {
925 errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
927 vam->retval = retval;
928 vam->result_ready = 1;
931 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
932 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
934 vat_main_t * vam = &vat_main;
935 vat_json_node_t node;
937 vat_json_init_object(&node);
938 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
939 vat_json_object_add_uint(&node, "tunnel_sw_if_index", ntohl(mp->tunnel_sw_if_index));
941 vat_json_print(vam->ofp, &node);
942 vat_json_free(&node);
944 vam->retval = ntohl(mp->retval);
945 vam->result_ready = 1;
949 static void vl_api_show_version_reply_t_handler
950 (vl_api_show_version_reply_t * mp)
952 vat_main_t * vam = &vat_main;
953 i32 retval = ntohl(mp->retval);
956 errmsg (" program: %s\n", mp->program);
957 errmsg (" version: %s\n", mp->version);
958 errmsg (" build date: %s\n", mp->build_date);
959 errmsg ("build directory: %s\n", mp->build_directory);
961 vam->retval = retval;
962 vam->result_ready = 1;
965 static void vl_api_show_version_reply_t_handler_json
966 (vl_api_show_version_reply_t * mp)
968 vat_main_t * vam = &vat_main;
969 vat_json_node_t node;
971 vat_json_init_object(&node);
972 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
973 vat_json_object_add_string_copy(&node, "program", mp->program);
974 vat_json_object_add_string_copy(&node, "version", mp->version);
975 vat_json_object_add_string_copy(&node, "build_date", mp->build_date);
976 vat_json_object_add_string_copy(&node, "build_directory", mp->build_directory);
978 vat_json_print(vam->ofp, &node);
979 vat_json_free(&node);
981 vam->retval = ntohl(mp->retval);
982 vam->result_ready = 1;
985 static void vl_api_ip4_arp_event_t_handler
986 (vl_api_ip4_arp_event_t * mp)
988 vat_main_t * vam = &vat_main;
989 errmsg ("arp event: address %U new mac %U sw_if_index %d\n",
990 format_ip4_address, &mp->address,
991 format_ethernet_address, mp->new_mac, mp->sw_if_index);
994 static void vl_api_ip4_arp_event_t_handler_json
995 (vl_api_ip4_arp_event_t * mp)
997 /* JSON output not supported */
1001 * Special-case: build the bridge domain table, maintain
1002 * the next bd id vbl.
1004 static void vl_api_bridge_domain_details_t_handler
1005 (vl_api_bridge_domain_details_t * mp)
1007 vat_main_t * vam = &vat_main;
1008 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1010 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1011 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
1013 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1014 ntohl (mp->bd_id), mp->learn, mp->forward,
1015 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
1018 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1022 static void vl_api_bridge_domain_details_t_handler_json
1023 (vl_api_bridge_domain_details_t * mp)
1025 vat_main_t * vam = &vat_main;
1026 vat_json_node_t *node, *array = NULL;
1028 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1029 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1030 vat_json_init_array(&vam->json_tree);
1032 node = vat_json_array_add(&vam->json_tree);
1034 vat_json_init_object(node);
1035 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
1036 vat_json_object_add_uint(node, "flood", mp->flood);
1037 vat_json_object_add_uint(node, "forward", mp->forward);
1038 vat_json_object_add_uint(node, "learn", mp->learn);
1039 vat_json_object_add_uint(node, "bvi_sw_if_index", ntohl(mp->bvi_sw_if_index));
1040 vat_json_object_add_uint(node, "n_sw_ifs", ntohl(mp->n_sw_ifs));
1041 array = vat_json_object_add(node, "sw_if");
1042 vat_json_init_array(array);
1046 * Special-case: build the bridge domain sw if table.
1048 static void vl_api_bridge_domain_sw_if_details_t_handler
1049 (vl_api_bridge_domain_sw_if_details_t * mp)
1051 vat_main_t * vam = &vat_main;
1053 u8 * sw_if_name = 0;
1056 sw_if_index = ntohl (mp->sw_if_index);
1057 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1059 if ((u32) p->value[0] == sw_if_index) {
1060 sw_if_name = (u8 *)(p->key);
1065 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1066 mp->shg, sw_if_name ? (char *)sw_if_name :
1067 "sw_if_index not found!");
1070 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1071 (vl_api_bridge_domain_sw_if_details_t * mp)
1073 vat_main_t * vam = &vat_main;
1074 vat_json_node_t *node = NULL;
1075 uword last_index = 0;
1077 ASSERT(VAT_JSON_ARRAY == vam->json_tree.type);
1078 ASSERT(vec_len(vam->json_tree.array) >= 1);
1079 last_index = vec_len(vam->json_tree.array) - 1;
1080 node = &vam->json_tree.array[last_index];
1081 node = vat_json_object_get_element(node, "sw_if");
1082 ASSERT(NULL != node);
1083 node = vat_json_array_add(node);
1085 vat_json_init_object(node);
1086 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
1087 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
1088 vat_json_object_add_uint(node, "shg", mp->shg);
1091 static void vl_api_control_ping_reply_t_handler
1092 (vl_api_control_ping_reply_t * mp)
1094 vat_main_t * vam = &vat_main;
1095 i32 retval = ntohl(mp->retval);
1096 if (vam->async_mode) {
1097 vam->async_errors += (retval < 0);
1099 vam->retval = retval;
1100 vam->result_ready = 1;
1104 static void vl_api_control_ping_reply_t_handler_json
1105 (vl_api_control_ping_reply_t * mp)
1107 vat_main_t * vam = &vat_main;
1108 i32 retval = ntohl(mp->retval);
1110 if (VAT_JSON_NONE != vam->json_tree.type) {
1111 vat_json_print(vam->ofp, &vam->json_tree);
1112 vat_json_free(&vam->json_tree);
1113 vam->json_tree.type = VAT_JSON_NONE;
1116 vat_json_init_array(&vam->json_tree);
1117 vat_json_print(vam->ofp, &vam->json_tree);
1118 vam->json_tree.type = VAT_JSON_NONE;
1121 vam->retval = retval;
1122 vam->result_ready = 1;
1125 static void vl_api_l2_flags_reply_t_handler
1126 (vl_api_l2_flags_reply_t * mp)
1128 vat_main_t * vam = &vat_main;
1129 i32 retval = ntohl(mp->retval);
1130 if (vam->async_mode) {
1131 vam->async_errors += (retval < 0);
1133 vam->retval = retval;
1134 vam->result_ready = 1;
1138 static void vl_api_l2_flags_reply_t_handler_json
1139 (vl_api_l2_flags_reply_t * mp)
1141 vat_main_t * vam = &vat_main;
1142 vat_json_node_t node;
1144 vat_json_init_object(&node);
1145 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1146 vat_json_object_add_uint(&node, "resulting_feature_bitmap", ntohl(mp->resulting_feature_bitmap));
1148 vat_json_print(vam->ofp, &node);
1149 vat_json_free(&node);
1151 vam->retval = ntohl(mp->retval);
1152 vam->result_ready = 1;
1155 static void vl_api_bridge_flags_reply_t_handler
1156 (vl_api_bridge_flags_reply_t * mp)
1158 vat_main_t * vam = &vat_main;
1159 i32 retval = ntohl(mp->retval);
1160 if (vam->async_mode) {
1161 vam->async_errors += (retval < 0);
1163 vam->retval = retval;
1164 vam->result_ready = 1;
1168 static void vl_api_bridge_flags_reply_t_handler_json
1169 (vl_api_bridge_flags_reply_t * mp)
1171 vat_main_t * vam = &vat_main;
1172 vat_json_node_t node;
1174 vat_json_init_object(&node);
1175 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1176 vat_json_object_add_uint(&node, "resulting_feature_bitmap", ntohl(mp->resulting_feature_bitmap));
1178 vat_json_print(vam->ofp, &node);
1179 vat_json_free(&node);
1181 vam->retval = ntohl(mp->retval);
1182 vam->result_ready = 1;
1185 static void vl_api_tap_connect_reply_t_handler
1186 (vl_api_tap_connect_reply_t * mp)
1188 vat_main_t * vam = &vat_main;
1189 i32 retval = ntohl(mp->retval);
1190 if (vam->async_mode) {
1191 vam->async_errors += (retval < 0);
1193 vam->retval = retval;
1194 vam->sw_if_index = ntohl (mp->sw_if_index);
1195 vam->result_ready = 1;
1200 static void vl_api_tap_connect_reply_t_handler_json
1201 (vl_api_tap_connect_reply_t * mp)
1203 vat_main_t * vam = &vat_main;
1204 vat_json_node_t node;
1206 vat_json_init_object(&node);
1207 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1208 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1210 vat_json_print(vam->ofp, &node);
1211 vat_json_free(&node);
1213 vam->retval = ntohl(mp->retval);
1214 vam->result_ready = 1;
1218 static void vl_api_tap_modify_reply_t_handler
1219 (vl_api_tap_modify_reply_t * mp)
1221 vat_main_t * vam = &vat_main;
1222 i32 retval = ntohl(mp->retval);
1223 if (vam->async_mode) {
1224 vam->async_errors += (retval < 0);
1226 vam->retval = retval;
1227 vam->sw_if_index = ntohl (mp->sw_if_index);
1228 vam->result_ready = 1;
1232 static void vl_api_tap_modify_reply_t_handler_json
1233 (vl_api_tap_modify_reply_t * mp)
1235 vat_main_t * vam = &vat_main;
1236 vat_json_node_t node;
1238 vat_json_init_object(&node);
1239 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1240 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1242 vat_json_print(vam->ofp, &node);
1243 vat_json_free(&node);
1245 vam->retval = ntohl(mp->retval);
1246 vam->result_ready = 1;
1249 static void vl_api_tap_delete_reply_t_handler
1250 (vl_api_tap_delete_reply_t * mp)
1252 vat_main_t * vam = &vat_main;
1253 i32 retval = ntohl(mp->retval);
1254 if (vam->async_mode) {
1255 vam->async_errors += (retval < 0);
1257 vam->retval = retval;
1258 vam->result_ready = 1;
1262 static void vl_api_tap_delete_reply_t_handler_json
1263 (vl_api_tap_delete_reply_t * mp)
1265 vat_main_t * vam = &vat_main;
1266 vat_json_node_t node;
1268 vat_json_init_object(&node);
1269 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1271 vat_json_print(vam->ofp, &node);
1272 vat_json_free(&node);
1274 vam->retval = ntohl(mp->retval);
1275 vam->result_ready = 1;
1278 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1279 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1281 vat_main_t * vam = &vat_main;
1282 i32 retval = ntohl(mp->retval);
1283 if (vam->async_mode) {
1284 vam->async_errors += (retval < 0);
1286 vam->retval = retval;
1287 vam->result_ready = 1;
1291 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1292 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1294 vat_main_t * vam = &vat_main;
1295 vat_json_node_t node;
1297 vat_json_init_object(&node);
1298 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1299 vat_json_object_add_uint(&node, "tunnel_sw_if_index", ntohl(mp->tunnel_sw_if_index));
1301 vat_json_print(vam->ofp, &node);
1302 vat_json_free(&node);
1304 vam->retval = ntohl(mp->retval);
1305 vam->result_ready = 1;
1308 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1309 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1311 vat_main_t * vam = &vat_main;
1312 i32 retval = ntohl(mp->retval);
1313 if (vam->async_mode) {
1314 vam->async_errors += (retval < 0);
1316 vam->retval = retval;
1317 vam->sw_if_index = ntohl (mp->sw_if_index);
1318 vam->result_ready = 1;
1322 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1323 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1325 vat_main_t * vam = &vat_main;
1326 vat_json_node_t node;
1328 vat_json_init_object(&node);
1329 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1330 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1332 vat_json_print(vam->ofp, &node);
1333 vat_json_free(&node);
1335 vam->retval = ntohl(mp->retval);
1336 vam->result_ready = 1;
1339 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1340 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1342 vat_main_t * vam = &vat_main;
1343 i32 retval = ntohl(mp->retval);
1344 if (vam->async_mode) {
1345 vam->async_errors += (retval < 0);
1347 vam->retval = retval;
1348 vam->sw_if_index = ntohl (mp->sw_if_index);
1349 vam->result_ready = 1;
1353 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1354 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1356 vat_main_t * vam = &vat_main;
1357 vat_json_node_t node;
1359 vat_json_init_object(&node);
1360 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1361 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
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_gre_add_del_tunnel_reply_t_handler
1371 (vl_api_gre_add_del_tunnel_reply_t * mp)
1373 vat_main_t * vam = &vat_main;
1374 i32 retval = ntohl(mp->retval);
1375 if (vam->async_mode) {
1376 vam->async_errors += (retval < 0);
1378 vam->retval = retval;
1379 vam->sw_if_index = ntohl (mp->sw_if_index);
1380 vam->result_ready = 1;
1384 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1385 (vl_api_gre_add_del_tunnel_reply_t * mp)
1387 vat_main_t * vam = &vat_main;
1388 vat_json_node_t node;
1390 vat_json_init_object(&node);
1391 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1392 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1394 vat_json_print(vam->ofp, &node);
1395 vat_json_free(&node);
1397 vam->retval = ntohl(mp->retval);
1398 vam->result_ready = 1;
1401 static void vl_api_create_vhost_user_if_reply_t_handler
1402 (vl_api_create_vhost_user_if_reply_t * mp)
1404 vat_main_t * vam = &vat_main;
1405 i32 retval = ntohl(mp->retval);
1406 if (vam->async_mode) {
1407 vam->async_errors += (retval < 0);
1409 vam->retval = retval;
1410 vam->sw_if_index = ntohl (mp->sw_if_index);
1411 vam->result_ready = 1;
1415 static void vl_api_create_vhost_user_if_reply_t_handler_json
1416 (vl_api_create_vhost_user_if_reply_t * mp)
1418 vat_main_t * vam = &vat_main;
1419 vat_json_node_t node;
1421 vat_json_init_object(&node);
1422 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1423 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1425 vat_json_print(vam->ofp, &node);
1426 vat_json_free(&node);
1428 vam->retval = ntohl(mp->retval);
1429 vam->result_ready = 1;
1432 static void vl_api_ip_address_details_t_handler
1433 (vl_api_ip_address_details_t * mp)
1435 vat_main_t * vam = &vat_main;
1436 static ip_address_details_t empty_ip_address_details = {{0}};
1437 ip_address_details_t * address = NULL;
1438 ip_details_t * current_ip_details = NULL;
1439 ip_details_t * details = NULL;
1441 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1443 if (!details || vam->current_sw_if_index >= vec_len(details)
1444 || !details[vam->current_sw_if_index].present) {
1445 errmsg ("ip address details arrived but not stored\n");
1446 errmsg ("ip_dump should be called first\n");
1450 current_ip_details = vec_elt_at_index(details,
1451 vam->current_sw_if_index);
1453 #define addresses (current_ip_details->addr)
1455 vec_validate_init_empty(addresses, vec_len(addresses),
1456 empty_ip_address_details);
1458 address = vec_elt_at_index(addresses, vec_len(addresses) - 1);
1460 clib_memcpy(&address->ip, &mp->ip, sizeof(address->ip));
1461 address->prefix_length = mp->prefix_length;
1465 static void vl_api_ip_address_details_t_handler_json
1466 (vl_api_ip_address_details_t * mp)
1468 vat_main_t * vam = &vat_main;
1469 vat_json_node_t *node = NULL;
1470 struct in6_addr ip6;
1473 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1474 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1475 vat_json_init_array(&vam->json_tree);
1477 node = vat_json_array_add(&vam->json_tree);
1479 vat_json_init_object(node);
1481 clib_memcpy(&ip6, mp->ip, sizeof(ip6));
1482 vat_json_object_add_ip6(node, "ip", ip6);
1484 clib_memcpy(&ip4, mp->ip, sizeof(ip4));
1485 vat_json_object_add_ip4(node, "ip", ip4);
1487 vat_json_object_add_uint(node, "prefix_length", mp->prefix_length);
1490 static void vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1492 vat_main_t * vam = &vat_main;
1493 static ip_details_t empty_ip_details = {0};
1494 ip_details_t * ip = NULL;
1495 u32 sw_if_index = ~0;
1497 sw_if_index = ntohl(mp->sw_if_index);
1499 vec_validate_init_empty(vam->ip_details_by_sw_if_index[vam->is_ipv6],
1500 sw_if_index, empty_ip_details);
1502 ip = vec_elt_at_index(vam->ip_details_by_sw_if_index[vam->is_ipv6],
1508 static void vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1510 vat_main_t * vam = &vat_main;
1512 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1513 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1514 vat_json_init_array(&vam->json_tree);
1516 vat_json_array_add_uint(&vam->json_tree, clib_net_to_host_u32(mp->sw_if_index));
1519 static void vl_api_map_domain_details_t_handler_json
1520 (vl_api_map_domain_details_t * mp)
1522 vat_json_node_t * node = NULL;
1523 vat_main_t * vam = &vat_main;
1524 struct in6_addr ip6;
1527 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1528 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1529 vat_json_init_array(&vam->json_tree);
1532 node = vat_json_array_add(&vam->json_tree);
1533 vat_json_init_object(node);
1535 vat_json_object_add_uint(node, "domain_index", clib_net_to_host_u32(mp->domain_index));
1536 clib_memcpy(&ip6, mp->ip6_prefix, sizeof(ip6));
1537 vat_json_object_add_ip6(node, "ip6_prefix", ip6);
1538 clib_memcpy(&ip4, mp->ip4_prefix, sizeof(ip4));
1539 vat_json_object_add_ip4(node, "ip4_prefix", ip4);
1540 clib_memcpy(&ip6, mp->ip6_src, sizeof(ip6));
1541 vat_json_object_add_ip6(node, "ip6_src", ip6);
1542 vat_json_object_add_int(node, "ip6_prefix_len", mp->ip6_prefix_len);
1543 vat_json_object_add_int(node, "ip4_prefix_len", mp->ip4_prefix_len);
1544 vat_json_object_add_int(node, "ip6_src_len", mp->ip6_src_len);
1545 vat_json_object_add_int(node, "ea_bits_len", mp->ea_bits_len);
1546 vat_json_object_add_int(node, "psid_offset", mp->psid_offset);
1547 vat_json_object_add_int(node, "psid_length", mp->psid_length);
1548 vat_json_object_add_uint(node, "flags", mp->flags);
1549 vat_json_object_add_uint(node, "mtu", clib_net_to_host_u16(mp->mtu));
1550 vat_json_object_add_int(node, "is_translation", mp->is_translation);
1553 static void vl_api_map_domain_details_t_handler
1554 (vl_api_map_domain_details_t * mp)
1556 vat_main_t * vam = &vat_main;
1558 if (mp->is_translation) {
1559 fformat(vam->ofp, "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1560 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1561 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1562 format_ip6_address, mp->ip6_src, mp->ip6_src_len, clib_net_to_host_u32(mp->domain_index));
1564 fformat(vam->ofp, "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1565 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1566 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1567 format_ip6_address, mp->ip6_src, clib_net_to_host_u32(mp->domain_index));
1569 fformat(vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1570 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu, mp->is_translation? "map-t":"");
1573 static void vl_api_map_rule_details_t_handler_json
1574 (vl_api_map_rule_details_t * mp)
1576 struct in6_addr ip6;
1577 vat_json_node_t * node = NULL;
1578 vat_main_t * vam = &vat_main;
1580 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1581 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1582 vat_json_init_array(&vam->json_tree);
1585 node = vat_json_array_add(&vam->json_tree);
1586 vat_json_init_object(node);
1588 vat_json_object_add_uint(node, "psid", clib_net_to_host_u16(mp->psid));
1589 clib_memcpy(&ip6, mp->ip6_dst, sizeof(ip6));
1590 vat_json_object_add_ip6(node, "ip6_dst", ip6);
1593 static void vl_api_map_rule_details_t_handler
1594 (vl_api_map_rule_details_t * mp)
1596 vat_main_t * vam = &vat_main;
1597 fformat(vam->ofp, " %d (psid) %U (ip6-dst)\n", clib_net_to_host_u16(mp->psid),
1598 format_ip6_address, mp->ip6_dst);
1601 static void vl_api_dhcp_compl_event_t_handler
1602 (vl_api_dhcp_compl_event_t * mp)
1604 vat_main_t * vam = &vat_main;
1605 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1606 "router_addr %U host_mac %U\n",
1607 mp->pid, mp->is_ipv6 ? "ipv6":"ipv4", mp->hostname,
1608 format_ip4_address, &mp->host_address,
1609 format_ip4_address, &mp->router_address,
1610 format_ethernet_address, mp->host_mac);
1613 static void vl_api_dhcp_compl_event_t_handler_json
1614 (vl_api_dhcp_compl_event_t * mp)
1616 /* JSON output not supported */
1619 static void set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1622 vat_main_t * vam = &vat_main;
1623 static u64 default_counter = 0;
1625 vec_validate_init_empty(vam->simple_interface_counters, vnet_counter_type, NULL);
1626 vec_validate_init_empty(vam->simple_interface_counters[vnet_counter_type],
1627 sw_if_index, default_counter);
1628 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1631 static void set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1632 interface_counter_t counter)
1634 vat_main_t * vam = &vat_main;
1635 static interface_counter_t default_counter = {0, };
1637 vec_validate_init_empty(vam->combined_interface_counters, vnet_counter_type, NULL);
1638 vec_validate_init_empty(vam->combined_interface_counters[vnet_counter_type],
1639 sw_if_index, default_counter);
1640 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1643 static void vl_api_vnet_interface_counters_t_handler
1644 (vl_api_vnet_interface_counters_t *mp)
1649 static void vl_api_vnet_interface_counters_t_handler_json
1650 (vl_api_vnet_interface_counters_t *mp)
1652 interface_counter_t counter;
1657 u32 first_sw_if_index;
1660 count = ntohl(mp->count);
1661 first_sw_if_index = ntohl(mp->first_sw_if_index);
1663 if (!mp->is_combined) {
1664 v_packets = (u64*)&mp->data;
1665 for (i = 0; i < count; i++) {
1666 packets = clib_net_to_host_u64(clib_mem_unaligned(v_packets, u64));
1667 set_simple_interface_counter(mp->vnet_counter_type,
1668 first_sw_if_index + i, packets);
1672 v = (vlib_counter_t*)&mp->data;
1673 for (i = 0; i < count; i++) {
1674 counter.packets = clib_net_to_host_u64(
1675 clib_mem_unaligned(&v->packets, u64));
1676 counter.bytes = clib_net_to_host_u64(
1677 clib_mem_unaligned(&v->bytes, u64));
1678 set_combined_interface_counter(mp->vnet_counter_type,
1679 first_sw_if_index + i, counter);
1685 static u32 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1687 vat_main_t * vam = &vat_main;
1690 for (i = 0; i < vec_len(vam->ip4_fib_counters_vrf_id_by_index); i++) {
1691 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id) {
1698 static u32 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1700 vat_main_t * vam = &vat_main;
1703 for (i = 0; i < vec_len(vam->ip6_fib_counters_vrf_id_by_index); i++) {
1704 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id) {
1711 static void vl_api_vnet_ip4_fib_counters_t_handler
1712 (vl_api_vnet_ip4_fib_counters_t *mp)
1717 static void vl_api_vnet_ip4_fib_counters_t_handler_json
1718 (vl_api_vnet_ip4_fib_counters_t *mp)
1720 vat_main_t * vam = &vat_main;
1721 vl_api_ip4_fib_counter_t *v;
1722 ip4_fib_counter_t *counter;
1729 vrf_id = ntohl(mp->vrf_id);
1730 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id(vrf_id);
1731 if (~0 == vrf_index) {
1732 vrf_index = vec_len(vam->ip4_fib_counters_vrf_id_by_index);
1733 vec_validate(vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
1734 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
1735 vec_validate(vam->ip4_fib_counters, vrf_index);
1736 vam->ip4_fib_counters[vrf_index] = NULL;
1739 vec_free(vam->ip4_fib_counters[vrf_index]);
1740 v = (vl_api_ip4_fib_counter_t*)&mp->c;
1741 count = ntohl(mp->count);
1742 for (i = 0; i < count; i++) {
1743 vec_validate(vam->ip4_fib_counters[vrf_index], i);
1744 counter = &vam->ip4_fib_counters[vrf_index][i];
1745 clib_memcpy(&ip4, &v->address, sizeof(ip4));
1746 counter->address = ip4;
1747 counter->address_length = v->address_length;
1748 counter->packets = clib_net_to_host_u64(v->packets);
1749 counter->bytes = clib_net_to_host_u64(v->bytes);
1754 static void vl_api_vnet_ip6_fib_counters_t_handler
1755 (vl_api_vnet_ip6_fib_counters_t *mp)
1760 static void vl_api_vnet_ip6_fib_counters_t_handler_json
1761 (vl_api_vnet_ip6_fib_counters_t *mp)
1763 vat_main_t * vam = &vat_main;
1764 vl_api_ip6_fib_counter_t *v;
1765 ip6_fib_counter_t *counter;
1766 struct in6_addr ip6;
1772 vrf_id = ntohl(mp->vrf_id);
1773 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id(vrf_id);
1774 if (~0 == vrf_index) {
1775 vrf_index = vec_len(vam->ip6_fib_counters_vrf_id_by_index);
1776 vec_validate(vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
1777 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
1778 vec_validate(vam->ip6_fib_counters, vrf_index);
1779 vam->ip6_fib_counters[vrf_index] = NULL;
1782 vec_free(vam->ip6_fib_counters[vrf_index]);
1783 v = (vl_api_ip6_fib_counter_t*)&mp->c;
1784 count = ntohl(mp->count);
1785 for (i = 0; i < count; i++) {
1786 vec_validate(vam->ip6_fib_counters[vrf_index], i);
1787 counter = &vam->ip6_fib_counters[vrf_index][i];
1788 clib_memcpy(&ip6, &v->address, sizeof(ip6));
1789 counter->address = ip6;
1790 counter->address_length = v->address_length;
1791 counter->packets = clib_net_to_host_u64(v->packets);
1792 counter->bytes = clib_net_to_host_u64(v->bytes);
1797 static void vl_api_get_first_msg_id_reply_t_handler
1798 (vl_api_get_first_msg_id_reply_t * mp)
1800 vat_main_t * vam = &vat_main;
1801 i32 retval = ntohl(mp->retval);
1803 if (vam->async_mode) {
1804 vam->async_errors += (retval < 0);
1806 vam->retval = retval;
1807 vam->result_ready = 1;
1810 errmsg ("first message id %d\n", ntohs(mp->first_msg_id));
1814 static void vl_api_get_first_msg_id_reply_t_handler_json
1815 (vl_api_get_first_msg_id_reply_t * mp)
1817 vat_main_t * vam = &vat_main;
1818 vat_json_node_t node;
1820 vat_json_init_object(&node);
1821 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1822 vat_json_object_add_uint(&node, "first_msg_id",
1823 (uint) ntohs(mp->first_msg_id));
1825 vat_json_print(vam->ofp, &node);
1826 vat_json_free(&node);
1828 vam->retval = ntohl(mp->retval);
1829 vam->result_ready = 1;
1832 static void vl_api_get_node_graph_reply_t_handler
1833 (vl_api_get_node_graph_reply_t * mp)
1835 vat_main_t * vam = &vat_main;
1836 api_main_t * am = &api_main;
1837 i32 retval = ntohl(mp->retval);
1838 u8 * pvt_copy, * reply;
1843 if (vam->async_mode) {
1844 vam->async_errors += (retval < 0);
1846 vam->retval = retval;
1847 vam->result_ready = 1;
1850 /* "Should never happen..." */
1854 reply = (u8 *)(mp->reply_in_shmem);
1855 pvt_copy = vec_dup (reply);
1857 /* Toss the shared-memory original... */
1858 pthread_mutex_lock (&am->vlib_rp->mutex);
1859 oldheap = svm_push_data_heap (am->vlib_rp);
1863 svm_pop_heap (oldheap);
1864 pthread_mutex_unlock (&am->vlib_rp->mutex);
1866 if (vam->graph_nodes) {
1867 hash_free (vam->graph_node_index_by_name);
1869 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
1870 node = vam->graph_nodes[i];
1871 vec_free (node->name);
1872 vec_free (node->next_nodes);
1875 vec_free(vam->graph_nodes);
1878 vam->graph_node_index_by_name = hash_create_string (0, sizeof(uword));
1879 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
1880 vec_free (pvt_copy);
1882 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
1883 node = vam->graph_nodes[i];
1884 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
1888 static void vl_api_get_node_graph_reply_t_handler_json
1889 (vl_api_get_node_graph_reply_t * mp)
1891 vat_main_t * vam = &vat_main;
1892 api_main_t * am = &api_main;
1894 vat_json_node_t node;
1897 /* $$$$ make this real? */
1898 vat_json_init_object(&node);
1899 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1900 vat_json_object_add_uint(&node, "reply_in_shmem", mp->reply_in_shmem);
1902 reply = (u8 *)(mp->reply_in_shmem);
1904 /* Toss the shared-memory original... */
1905 pthread_mutex_lock (&am->vlib_rp->mutex);
1906 oldheap = svm_push_data_heap (am->vlib_rp);
1910 svm_pop_heap (oldheap);
1911 pthread_mutex_unlock (&am->vlib_rp->mutex);
1913 vat_json_print(vam->ofp, &node);
1914 vat_json_free(&node);
1916 vam->retval = ntohl(mp->retval);
1917 vam->result_ready = 1;
1921 vl_api_lisp_locator_set_details_t_handler (
1922 vl_api_lisp_locator_set_details_t *mp)
1924 vat_main_t *vam = &vat_main;
1925 u8 * tmp_str = NULL;
1928 fformat(vam->ofp, "%=20s%=16d%=16d%=16d\n",
1929 mp->locator_set_name,
1930 ntohl(mp->sw_if_index),
1934 tmp_str = format(0,"%U/%d",
1935 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
1939 fformat(vam->ofp, "%=20s%=16s%=16d%=16d\n",
1940 mp->locator_set_name,
1949 vl_api_lisp_locator_set_details_t_handler_json (
1950 vl_api_lisp_locator_set_details_t *mp)
1952 vat_main_t *vam = &vat_main;
1953 vat_json_node_t *node = NULL;
1954 struct in6_addr ip6;
1957 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1958 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1959 vat_json_init_array(&vam->json_tree);
1961 node = vat_json_array_add(&vam->json_tree);
1963 vat_json_init_object(node);
1964 vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
1966 vat_json_object_add_uint(node, "locator", ntohl(mp->sw_if_index));
1969 clib_memcpy(&ip6, mp->ip_address, sizeof(ip6));
1970 vat_json_object_add_ip6(node, "locator", ip6);
1972 clib_memcpy(&ip4, mp->ip_address, sizeof(ip4));
1973 vat_json_object_add_ip4(node, "locator", ip4);
1975 vat_json_object_add_uint(node, "prefix-length", mp->prefix_len);
1977 vat_json_object_add_uint(node, "priority", mp->priority);
1978 vat_json_object_add_uint(node, "weight", mp->weight);
1982 vl_api_lisp_local_eid_table_details_t_handler (
1983 vl_api_lisp_local_eid_table_details_t *mp)
1985 vat_main_t *vam = &vat_main;
1987 u8 * (*format_eid)(u8 *, va_list *) = 0;
1989 switch (mp->eid_type)
1991 case 0: format_eid = format_ip4_address; break;
1992 case 1: format_eid = format_ip6_address; break;
1993 case 2: format_eid = format_ethernet_address; break;
1995 errmsg ("unknown EID type %d!", mp->eid_type);
1999 prefix = format(0, "[%d] %U/%d",
2000 clib_net_to_host_u32 (mp->vni),
2001 format_eid, mp->eid, mp->eid_prefix_len);
2003 fformat(vam->ofp, "%=20s%=30s\n",
2004 mp->locator_set_name, prefix);
2010 vl_api_lisp_local_eid_table_details_t_handler_json (
2011 vl_api_lisp_local_eid_table_details_t *mp)
2013 vat_main_t *vam = &vat_main;
2014 vat_json_node_t *node = NULL;
2015 struct in6_addr ip6;
2019 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2020 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2021 vat_json_init_array(&vam->json_tree);
2023 node = vat_json_array_add(&vam->json_tree);
2025 vat_json_init_object(node);
2026 vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
2027 switch (mp->eid_type)
2030 clib_memcpy(&ip4, mp->eid, sizeof(ip4));
2031 vat_json_object_add_ip4(node, "eid-address", ip4);
2034 clib_memcpy(&ip6, mp->eid, sizeof(ip6));
2035 vat_json_object_add_ip6(node, "eid-address", ip6);
2038 s = format (0, "%U", format_ethernet_address, mp->eid);
2040 vat_json_object_add_string_copy(node, "eid-address", s);
2044 errmsg ("unknown EID type %d!", mp->eid_type);
2047 vat_json_object_add_uint(node, "vni", clib_net_to_host_u32 (mp->vni));
2048 vat_json_object_add_uint(node, "eid-prefix-len", mp->eid_prefix_len);
2052 format_decap_next (u8 * s, va_list * args)
2054 u32 next_index = va_arg (*args, u32);
2058 case LISP_GPE_INPUT_NEXT_DROP:
2059 return format (s, "drop");
2060 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2061 return format (s, "ip4");
2062 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2063 return format (s, "ip6");
2065 return format (s, "unknown %d", next_index);
2071 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *mp)
2073 vat_main_t *vam = &vat_main;
2075 u8 *flag_str = NULL;
2077 iid_str = format(0, "%d (0x%x)", ntohl(mp->iid), ntohl(mp->iid));
2079 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2080 foreach_lisp_gpe_flag_bit;
2083 fformat(vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2084 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2086 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2088 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2090 ntohl(mp->encap_fib_id),
2091 ntohl(mp->decap_fib_id),
2092 format_decap_next, ntohl(mp->dcap_next),
2104 vl_api_lisp_gpe_tunnel_details_t_handler_json (
2105 vl_api_lisp_gpe_tunnel_details_t *mp)
2107 vat_main_t *vam = &vat_main;
2108 vat_json_node_t *node = NULL;
2109 struct in6_addr ip6;
2113 next_decap_str = format(0, "%U", format_decap_next, htonl(mp->dcap_next));
2115 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2116 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2117 vat_json_init_array(&vam->json_tree);
2119 node = vat_json_array_add(&vam->json_tree);
2121 vat_json_init_object(node);
2122 vat_json_object_add_uint(node, "tunel", mp->tunnels);
2124 clib_memcpy(&ip6, mp->source_ip, sizeof(ip6));
2125 vat_json_object_add_ip6(node, "source address", ip6);
2126 clib_memcpy(&ip6, mp->destination_ip, sizeof(ip6));
2127 vat_json_object_add_ip6(node, "destination address", ip6);
2129 clib_memcpy(&ip4, mp->source_ip, sizeof(ip4));
2130 vat_json_object_add_ip4(node, "source address", ip4);
2131 clib_memcpy(&ip4, mp->destination_ip, sizeof(ip4));
2132 vat_json_object_add_ip4(node, "destination address", ip4);
2134 vat_json_object_add_uint(node, "fib encap", ntohl(mp->encap_fib_id));
2135 vat_json_object_add_uint(node, "fib decap", ntohl(mp->decap_fib_id));
2136 vat_json_object_add_string_copy(node, "decap next", next_decap_str);
2137 vat_json_object_add_uint(node, "lisp version", mp->ver_res >> 6);
2138 vat_json_object_add_uint(node, "flags", mp->flags);
2139 vat_json_object_add_uint(node, "next protocol", mp->next_protocol);
2140 vat_json_object_add_uint(node, "ver_res", mp->ver_res);
2141 vat_json_object_add_uint(node, "res", mp->res);
2142 vat_json_object_add_uint(node, "iid", ntohl(mp->iid));
2144 vec_free(next_decap_str);
2148 vl_api_lisp_map_resolver_details_t_handler (
2149 vl_api_lisp_map_resolver_details_t *mp)
2151 vat_main_t *vam = &vat_main;
2153 fformat(vam->ofp, "%=20U\n",
2154 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2159 vl_api_lisp_map_resolver_details_t_handler_json (
2160 vl_api_lisp_map_resolver_details_t *mp)
2162 vat_main_t *vam = &vat_main;
2163 vat_json_node_t *node = NULL;
2164 struct in6_addr ip6;
2167 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2168 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2169 vat_json_init_array(&vam->json_tree);
2171 node = vat_json_array_add(&vam->json_tree);
2173 vat_json_init_object(node);
2175 clib_memcpy(&ip6, mp->ip_address, sizeof(ip6));
2176 vat_json_object_add_ip6(node, "map resolver", ip6);
2178 clib_memcpy(&ip4, mp->ip_address, sizeof(ip4));
2179 vat_json_object_add_ip4(node, "map resolver", ip4);
2184 vl_api_lisp_enable_disable_status_details_t_handler
2185 (vl_api_lisp_enable_disable_status_details_t *mp)
2187 vat_main_t *vam = &vat_main;
2189 fformat(vam->ofp, "feature: %s\ngpe: %s\n",
2190 mp->feature_status ? "enabled" : "disabled",
2191 mp->gpe_status ? "enabled" : "disabled");
2195 vl_api_lisp_enable_disable_status_details_t_handler_json
2196 (vl_api_lisp_enable_disable_status_details_t *mp)
2198 vat_main_t *vam = &vat_main;
2199 vat_json_node_t *node = NULL;
2200 u8 * gpe_status = NULL;
2201 u8 * feature_status = NULL;
2203 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2204 feature_status = format (0, "%s",
2205 mp->feature_status ? "enabled" : "disabled");
2206 vec_add1 (gpe_status, 0);
2207 vec_add1 (feature_status, 0);
2209 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2210 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2211 vat_json_init_array(&vam->json_tree);
2213 node = vat_json_array_add(&vam->json_tree);
2215 vat_json_init_object(node);
2216 vat_json_object_add_string_copy(node, "gpe_status", gpe_status);
2217 vat_json_object_add_string_copy(node, "feature_status", feature_status);
2219 vec_free (gpe_status);
2220 vec_free (feature_status);
2224 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler (
2225 vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2227 vat_main_t * vam = &vat_main;
2228 i32 retval = ntohl(mp->retval);
2231 fformat(vam->ofp, "%=20s\n",
2232 mp->locator_set_name);
2235 vam->retval = retval;
2236 vam->result_ready = 1;
2240 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json (
2241 vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
2243 vat_main_t * vam = &vat_main;
2244 vat_json_node_t * node = NULL;
2246 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);
2252 vat_json_init_object(node);
2253 vat_json_object_add_string_copy(node, "itr-rlocs", mp->locator_set_name);
2255 vat_json_print(vam->ofp, node);
2256 vat_json_free(node);
2258 vam->retval = ntohl(mp->retval);
2259 vam->result_ready = 1;
2262 static u8 * format_policer_type (u8 * s, va_list * va)
2264 u32 i = va_arg (*va, u32);
2266 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2267 s = format (s, "1r2c");
2268 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2269 s = format (s, "1r3c");
2270 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2271 s = format (s, "2r3c-2698");
2272 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2273 s = format (s, "2r3c-4115");
2274 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2275 s = format (s, "2r3c-mef5cf1");
2277 s = format (s, "ILLEGAL");
2281 static u8 * format_policer_rate_type (u8 * s, va_list * va)
2283 u32 i = va_arg (*va, u32);
2285 if (i == SSE2_QOS_RATE_KBPS)
2286 s = format (s, "kbps");
2287 else if (i == SSE2_QOS_RATE_PPS)
2288 s = format(s, "pps");
2290 s = format (s, "ILLEGAL");
2294 static u8 * format_policer_round_type (u8 * s, va_list * va)
2296 u32 i = va_arg (*va, u32);
2298 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2299 s = format(s, "closest");
2300 else if (i == SSE2_QOS_ROUND_TO_UP)
2301 s = format (s, "up");
2302 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2303 s = format (s, "down");
2305 s = format (s, "ILLEGAL");
2309 static void vl_api_policer_details_t_handler
2310 (vl_api_policer_details_t * mp)
2312 vat_main_t * vam = &vat_main;
2314 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2315 "rate type %U, round type %U, %s rate, %s color-aware, "
2316 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2317 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu\n",
2319 format_policer_type, mp->type,
2324 format_policer_rate_type, mp->rate_type,
2325 format_policer_round_type, mp->round_type,
2326 mp->single_rate ? "single" : "dual",
2327 mp->color_aware ? "is" : "not",
2328 ntohl(mp->cir_tokens_per_period),
2329 ntohl(mp->pir_tokens_per_period),
2331 ntohl(mp->current_limit),
2332 ntohl(mp->current_bucket),
2333 ntohl(mp->extended_limit),
2334 ntohl(mp->extended_bucket),
2335 clib_net_to_host_u64(mp->last_update_time));
2338 static void vl_api_policer_details_t_handler_json
2339 (vl_api_policer_details_t * mp)
2341 vat_main_t * vam = &vat_main;
2342 vat_json_node_t *node;
2343 u8 *rate_type_str, *round_type_str, *type_str;
2345 rate_type_str = format(0, "%U", format_policer_rate_type, mp->rate_type);
2346 round_type_str = format(0, "%U", format_policer_round_type, mp->round_type);
2347 type_str = format(0, "%U", format_policer_type, mp->type);
2349 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2350 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2351 vat_json_init_array(&vam->json_tree);
2353 node = vat_json_array_add(&vam->json_tree);
2355 vat_json_init_object(node);
2356 vat_json_object_add_string_copy(node, "name", mp->name);
2357 vat_json_object_add_uint(node, "cir", ntohl(mp->cir));
2358 vat_json_object_add_uint(node, "eir", ntohl(mp->eir));
2359 vat_json_object_add_uint(node, "cb", ntohl(mp->cb));
2360 vat_json_object_add_uint(node, "eb", ntohl(mp->eb));
2361 vat_json_object_add_string_copy(node, "rate_type", rate_type_str);
2362 vat_json_object_add_string_copy(node, "round_type", round_type_str);
2363 vat_json_object_add_string_copy(node, "type", type_str);
2364 vat_json_object_add_uint(node, "single_rate", mp->single_rate);
2365 vat_json_object_add_uint(node, "color_aware", mp->color_aware);
2366 vat_json_object_add_uint(node, "scale", ntohl(mp->scale));
2367 vat_json_object_add_uint(node, "cir_tokens_per_period",
2368 ntohl(mp->cir_tokens_per_period));
2369 vat_json_object_add_uint(node, "eir_tokens_per_period",
2370 ntohl(mp->pir_tokens_per_period));
2371 vat_json_object_add_uint(node, "current_limit", ntohl(mp->current_limit));
2372 vat_json_object_add_uint(node, "current_bucket", ntohl(mp->current_bucket));
2373 vat_json_object_add_uint(node, "extended_limit", ntohl(mp->extended_limit));
2374 vat_json_object_add_uint(node, "extended_bucket",
2375 ntohl(mp->extended_bucket));
2376 vat_json_object_add_uint(node, "last_update_time",
2377 ntohl(mp->last_update_time));
2379 vec_free(rate_type_str);
2380 vec_free(round_type_str);
2384 static void vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t * mp)
2386 vat_main_t * vam = &vat_main;
2387 int i, count = ntohl(mp->count);
2390 fformat (vam->ofp, "classify table ids (%d) : ", count);
2391 for (i = 0; i < count; i++)
2393 fformat (vam->ofp, "%d", ntohl(mp->ids[i]));
2394 fformat (vam->ofp, (i<count-1)?",":"\n");
2396 vam->retval = ntohl(mp->retval);
2397 vam->result_ready = 1;
2400 static void vl_api_classify_table_ids_reply_t_handler_json (vl_api_classify_table_ids_reply_t * mp)
2402 vat_main_t * vam = &vat_main;
2403 int i, count = ntohl(mp->count);
2406 vat_json_node_t node;
2408 vat_json_init_object(&node);
2409 for (i = 0; i < count; i++)
2411 vat_json_object_add_uint(&node, "table_id", ntohl(mp->ids[i]));
2413 vat_json_print(vam->ofp, &node);
2414 vat_json_free(&node);
2416 vam->retval = ntohl(mp->retval);
2417 vam->result_ready = 1;
2420 static void vl_api_classify_table_by_interface_reply_t_handler (vl_api_classify_table_by_interface_reply_t * mp)
2422 vat_main_t * vam = &vat_main;
2425 table_id = ntohl(mp->l2_table_id);
2427 fformat (vam->ofp, "l2 table id : %d\n", table_id);
2429 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
2430 table_id = ntohl(mp->ip4_table_id);
2432 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
2434 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
2435 table_id = ntohl(mp->ip6_table_id);
2437 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
2439 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
2440 vam->retval = ntohl(mp->retval);
2441 vam->result_ready = 1;
2444 static void vl_api_classify_table_by_interface_reply_t_handler_json (vl_api_classify_table_by_interface_reply_t * mp)
2446 vat_main_t * vam = &vat_main;
2447 vat_json_node_t node;
2449 vat_json_init_object(&node);
2451 vat_json_object_add_int(&node, "l2_table_id", ntohl(mp->l2_table_id));
2452 vat_json_object_add_int(&node, "ip4_table_id", ntohl(mp->ip4_table_id));
2453 vat_json_object_add_int(&node, "ip6_table_id", ntohl(mp->ip6_table_id));
2455 vat_json_print(vam->ofp, &node);
2456 vat_json_free(&node);
2458 vam->retval = ntohl(mp->retval);
2459 vam->result_ready = 1;
2462 /* Format hex dump. */
2463 u8 * format_hex_bytes (u8 * s, va_list * va)
2465 u8 * bytes = va_arg (*va, u8 *);
2466 int n_bytes = va_arg (*va, int);
2469 /* Print short or long form depending on byte count. */
2470 uword short_form = n_bytes <= 32;
2471 uword indent = format_get_indent (s);
2476 for (i = 0; i < n_bytes; i++)
2478 if (! short_form && (i % 32) == 0)
2479 s = format (s, "%08x: ", i);
2480 s = format (s, "%02x", bytes[i]);
2481 if (! short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
2482 s = format (s, "\n%U", format_white_space, indent);
2488 static void vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t * mp)
2490 vat_main_t * vam = &vat_main;
2491 i32 retval = ntohl(mp->retval);
2493 fformat (vam->ofp, "classify table info :\n");
2494 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n", ntohl(mp->active_sessions), ntohl(mp->next_table_index), ntohl(mp->miss_next_index));
2495 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n", ntohl(mp->nbuckets), ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
2496 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask, ntohl(mp->mask_length));
2498 vam->retval = retval;
2499 vam->result_ready = 1;
2502 static void vl_api_classify_table_info_reply_t_handler_json (vl_api_classify_table_info_reply_t * mp)
2504 vat_main_t * vam = &vat_main;
2505 vat_json_node_t node;
2507 i32 retval = ntohl(mp->retval);
2509 vat_json_init_object(&node);
2511 vat_json_object_add_int(&node, "sessions", ntohl(mp->active_sessions));
2512 vat_json_object_add_int(&node, "nexttbl", ntohl(mp->next_table_index));
2513 vat_json_object_add_int(&node, "nextnode", ntohl(mp->miss_next_index));
2514 vat_json_object_add_int(&node, "nbuckets", ntohl(mp->nbuckets));
2515 vat_json_object_add_int(&node, "skip", ntohl(mp->skip_n_vectors));
2516 vat_json_object_add_int(&node, "match", ntohl(mp->match_n_vectors));
2517 u8 * s = format (0, "%U%c",format_hex_bytes, mp->mask, ntohl(mp->mask_length), 0);
2518 vat_json_object_add_string_copy(&node, "mask", s);
2520 vat_json_print(vam->ofp, &node);
2521 vat_json_free(&node);
2523 vam->retval = ntohl(mp->retval);
2524 vam->result_ready = 1;
2527 static void vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t * mp)
2529 vat_main_t * vam = &vat_main;
2531 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ", ntohl(mp->hit_next_index), ntohl(mp->advance), ntohl(mp->opaque_index));
2532 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match, ntohl(mp->match_length));
2535 static void vl_api_classify_session_details_t_handler_json (vl_api_classify_session_details_t * mp)
2537 vat_main_t * vam = &vat_main;
2538 vat_json_node_t *node = NULL;
2540 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2541 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2542 vat_json_init_array(&vam->json_tree);
2544 node = vat_json_array_add(&vam->json_tree);
2546 vat_json_init_object(node);
2547 vat_json_object_add_int(node, "next_index", ntohl(mp->hit_next_index));
2548 vat_json_object_add_int(node, "advance", ntohl(mp->advance));
2549 vat_json_object_add_int(node, "opaque", ntohl(mp->opaque_index));
2550 u8 * s = format (0, "%U%c",format_hex_bytes, mp->match, ntohl(mp->match_length), 0);
2551 vat_json_object_add_string_copy(node, "match", s);
2554 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
2555 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
2556 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
2557 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
2560 * Generate boilerplate reply handlers, which
2561 * dig the return value out of the xxx_reply_t API message,
2562 * stick it into vam->retval, and set vam->result_ready
2564 * Could also do this by pointing N message decode slots at
2565 * a single function, but that could break in subtle ways.
2568 #define foreach_standard_reply_retval_handler \
2569 _(sw_interface_set_flags_reply) \
2570 _(sw_interface_add_del_address_reply) \
2571 _(sw_interface_set_table_reply) \
2572 _(sw_interface_set_vpath_reply) \
2573 _(sw_interface_set_l2_bridge_reply) \
2574 _(bridge_domain_add_del_reply) \
2575 _(sw_interface_set_l2_xconnect_reply) \
2576 _(l2fib_add_del_reply) \
2577 _(ip_add_del_route_reply) \
2578 _(proxy_arp_add_del_reply) \
2579 _(proxy_arp_intfc_enable_disable_reply) \
2580 _(mpls_add_del_encap_reply) \
2581 _(mpls_add_del_decap_reply) \
2582 _(mpls_ethernet_add_del_tunnel_2_reply) \
2583 _(sw_interface_set_unnumbered_reply) \
2584 _(ip_neighbor_add_del_reply) \
2585 _(reset_vrf_reply) \
2586 _(oam_add_del_reply) \
2587 _(reset_fib_reply) \
2588 _(dhcp_proxy_config_reply) \
2589 _(dhcp_proxy_config_2_reply) \
2590 _(dhcp_proxy_set_vss_reply) \
2591 _(dhcp_client_config_reply) \
2592 _(set_ip_flow_hash_reply) \
2593 _(sw_interface_ip6_enable_disable_reply) \
2594 _(sw_interface_ip6_set_link_local_address_reply) \
2595 _(sw_interface_ip6nd_ra_prefix_reply) \
2596 _(sw_interface_ip6nd_ra_config_reply) \
2597 _(set_arp_neighbor_limit_reply) \
2598 _(l2_patch_add_del_reply) \
2599 _(sr_tunnel_add_del_reply) \
2600 _(sr_policy_add_del_reply) \
2601 _(sr_multicast_map_add_del_reply) \
2602 _(classify_add_del_session_reply) \
2603 _(classify_set_interface_ip_table_reply) \
2604 _(classify_set_interface_l2_tables_reply) \
2605 _(l2tpv3_set_tunnel_cookies_reply) \
2606 _(l2tpv3_interface_enable_disable_reply) \
2607 _(l2tpv3_set_lookup_key_reply) \
2608 _(l2_fib_clear_table_reply) \
2609 _(l2_interface_efp_filter_reply) \
2610 _(l2_interface_vlan_tag_rewrite_reply) \
2611 _(modify_vhost_user_if_reply) \
2612 _(delete_vhost_user_if_reply) \
2613 _(want_ip4_arp_events_reply) \
2614 _(input_acl_set_interface_reply) \
2615 _(ipsec_spd_add_del_reply) \
2616 _(ipsec_interface_add_del_spd_reply) \
2617 _(ipsec_spd_add_del_entry_reply) \
2618 _(ipsec_sad_add_del_entry_reply) \
2619 _(ipsec_sa_set_key_reply) \
2620 _(ikev2_profile_add_del_reply) \
2621 _(ikev2_profile_set_auth_reply) \
2622 _(ikev2_profile_set_id_reply) \
2623 _(ikev2_profile_set_ts_reply) \
2624 _(ikev2_set_local_key_reply) \
2625 _(delete_loopback_reply) \
2626 _(bd_ip_mac_add_del_reply) \
2627 _(map_del_domain_reply) \
2628 _(map_add_del_rule_reply) \
2629 _(want_interface_events_reply) \
2630 _(want_stats_reply) \
2631 _(cop_interface_enable_disable_reply) \
2632 _(cop_whitelist_enable_disable_reply) \
2633 _(sw_interface_clear_stats_reply) \
2634 _(trace_profile_add_reply) \
2635 _(trace_profile_apply_reply) \
2636 _(trace_profile_del_reply) \
2637 _(lisp_add_del_locator_set_reply) \
2638 _(lisp_add_del_locator_reply) \
2639 _(lisp_add_del_local_eid_reply) \
2640 _(lisp_add_del_remote_mapping_reply) \
2641 _(lisp_add_del_adjacency_reply) \
2642 _(lisp_gpe_add_del_fwd_entry_reply) \
2643 _(lisp_add_del_map_resolver_reply) \
2644 _(lisp_gpe_enable_disable_reply) \
2645 _(lisp_gpe_add_del_iface_reply) \
2646 _(lisp_enable_disable_reply) \
2647 _(lisp_pitr_set_locator_set_reply) \
2648 _(lisp_add_del_map_request_itr_rlocs_reply) \
2649 _(lisp_eid_table_add_del_map_reply) \
2650 _(vxlan_gpe_add_del_tunnel_reply) \
2651 _(af_packet_delete_reply) \
2652 _(policer_add_del_reply) \
2653 _(netmap_create_reply) \
2654 _(netmap_delete_reply) \
2655 _(ipfix_enable_reply)
2658 static void vl_api_##n##_t_handler \
2659 (vl_api_##n##_t * mp) \
2661 vat_main_t * vam = &vat_main; \
2662 i32 retval = ntohl(mp->retval); \
2663 if (vam->async_mode) { \
2664 vam->async_errors += (retval < 0); \
2666 vam->retval = retval; \
2667 vam->result_ready = 1; \
2670 foreach_standard_reply_retval_handler;
2674 static void vl_api_##n##_t_handler_json \
2675 (vl_api_##n##_t * mp) \
2677 vat_main_t * vam = &vat_main; \
2678 vat_json_node_t node; \
2679 vat_json_init_object(&node); \
2680 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
2681 vat_json_print(vam->ofp, &node); \
2682 vam->retval = ntohl(mp->retval); \
2683 vam->result_ready = 1; \
2685 foreach_standard_reply_retval_handler;
2689 * Table of message reply handlers, must include boilerplate handlers
2693 #define foreach_vpe_api_reply_msg \
2694 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
2695 _(SW_INTERFACE_DETAILS, sw_interface_details) \
2696 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
2697 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
2698 _(CONTROL_PING_REPLY, control_ping_reply) \
2699 _(CLI_REPLY, cli_reply) \
2700 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
2701 sw_interface_add_del_address_reply) \
2702 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
2703 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
2704 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
2705 sw_interface_set_l2_xconnect_reply) \
2706 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
2707 sw_interface_set_l2_bridge_reply) \
2708 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
2709 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
2710 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
2711 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
2712 _(L2_FLAGS_REPLY, l2_flags_reply) \
2713 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
2714 _(TAP_CONNECT_REPLY, tap_connect_reply) \
2715 _(TAP_MODIFY_REPLY, tap_modify_reply) \
2716 _(TAP_DELETE_REPLY, tap_delete_reply) \
2717 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
2718 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
2719 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
2720 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
2721 proxy_arp_intfc_enable_disable_reply) \
2722 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
2723 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
2724 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
2725 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
2726 mpls_ethernet_add_del_tunnel_reply) \
2727 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
2728 mpls_ethernet_add_del_tunnel_2_reply) \
2729 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
2730 sw_interface_set_unnumbered_reply) \
2731 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
2732 _(RESET_VRF_REPLY, reset_vrf_reply) \
2733 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
2734 _(CREATE_SUBIF_REPLY, create_subif_reply) \
2735 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
2736 _(RESET_FIB_REPLY, reset_fib_reply) \
2737 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
2738 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
2739 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
2740 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
2741 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
2742 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
2743 sw_interface_ip6_enable_disable_reply) \
2744 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
2745 sw_interface_ip6_set_link_local_address_reply) \
2746 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
2747 sw_interface_ip6nd_ra_prefix_reply) \
2748 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
2749 sw_interface_ip6nd_ra_config_reply) \
2750 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
2751 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
2752 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
2753 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
2754 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
2755 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
2756 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
2757 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
2758 classify_set_interface_ip_table_reply) \
2759 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
2760 classify_set_interface_l2_tables_reply) \
2761 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
2762 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
2763 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
2764 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
2765 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
2766 l2tpv3_interface_enable_disable_reply) \
2767 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
2768 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
2769 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
2770 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
2771 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
2772 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
2773 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
2774 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
2775 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
2776 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
2777 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
2778 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
2779 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
2780 _(SHOW_VERSION_REPLY, show_version_reply) \
2781 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
2782 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
2783 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
2784 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
2785 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
2786 _(IP4_ARP_EVENT, ip4_arp_event) \
2787 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
2788 _(IP_ADDRESS_DETAILS, ip_address_details) \
2789 _(IP_DETAILS, ip_details) \
2790 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
2791 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
2792 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
2793 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
2794 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
2795 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
2796 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
2797 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
2798 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
2799 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
2800 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
2801 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
2802 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
2803 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
2804 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
2805 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
2806 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
2807 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
2808 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
2809 _(MAP_DOMAIN_DETAILS, map_domain_details) \
2810 _(MAP_RULE_DETAILS, map_rule_details) \
2811 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
2812 _(WANT_STATS_REPLY, want_stats_reply) \
2813 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
2814 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
2815 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
2816 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
2817 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
2818 _(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
2819 _(TRACE_PROFILE_APPLY_REPLY, trace_profile_apply_reply) \
2820 _(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
2821 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
2822 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
2823 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
2824 _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
2825 _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
2826 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
2827 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
2828 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
2829 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
2830 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
2831 _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
2832 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
2833 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
2834 _(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details) \
2835 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
2836 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
2837 _(LISP_ENABLE_DISABLE_STATUS_DETAILS, \
2838 lisp_enable_disable_status_details) \
2839 _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
2840 lisp_add_del_map_request_itr_rlocs_reply) \
2841 _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
2842 lisp_get_map_request_itr_rlocs_reply) \
2843 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
2844 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
2845 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
2846 _(POLICER_DETAILS, policer_details) \
2847 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
2848 _(NETMAP_DELETE_REPLY, netmap_delete_reply) \
2849 _(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
2850 _(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
2851 _(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
2852 _(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
2853 _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
2854 _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
2855 _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
2856 _(CLASSIFY_SESSION_DETAILS, classify_session_details) \
2857 _(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \
2858 _(IPFIX_DETAILS, ipfix_details)
2860 /* M: construct, but don't yet send a message */
2864 vam->result_ready = 0; \
2865 mp = vl_msg_api_alloc(sizeof(*mp)); \
2866 memset (mp, 0, sizeof (*mp)); \
2867 mp->_vl_msg_id = ntohs (VL_API_##T); \
2868 mp->client_index = vam->my_client_index; \
2873 vam->result_ready = 0; \
2874 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
2875 memset (mp, 0, sizeof (*mp)); \
2876 mp->_vl_msg_id = ntohs (VL_API_##T); \
2877 mp->client_index = vam->my_client_index; \
2881 /* S: send a message */
2882 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
2884 /* W: wait for results, with timeout */
2887 timeout = vat_time_now (vam) + 1.0; \
2889 while (vat_time_now (vam) < timeout) { \
2890 if (vam->result_ready == 1) { \
2891 return (vam->retval); \
2897 /* W2: wait for results, with timeout */
2900 timeout = vat_time_now (vam) + 1.0; \
2902 while (vat_time_now (vam) < timeout) { \
2903 if (vam->result_ready == 1) { \
2905 return (vam->retval); \
2917 #define STR_VTR_OP_CASE(op) \
2918 case L2_VTR_ ## op: \
2921 static const char *str_vtr_op(u32 vtr_op)
2924 STR_VTR_OP_CASE(DISABLED);
2925 STR_VTR_OP_CASE(PUSH_1);
2926 STR_VTR_OP_CASE(PUSH_2);
2927 STR_VTR_OP_CASE(POP_1);
2928 STR_VTR_OP_CASE(POP_2);
2929 STR_VTR_OP_CASE(TRANSLATE_1_1);
2930 STR_VTR_OP_CASE(TRANSLATE_1_2);
2931 STR_VTR_OP_CASE(TRANSLATE_2_1);
2932 STR_VTR_OP_CASE(TRANSLATE_2_2);
2938 static int dump_sub_interface_table (vat_main_t * vam)
2940 const sw_interface_subif_t * sub = NULL;
2942 if (vam->json_output) {
2943 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2948 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
2949 "Interface", "sw_if_index",
2950 "sub id", "dot1ad", "tags", "outer id",
2951 "inner id", "exact", "default",
2952 "outer any", "inner any");
2954 vec_foreach (sub, vam->sw_if_subif_table) {
2956 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
2957 sub->interface_name,
2959 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
2960 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
2961 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
2962 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
2963 if (sub->vtr_op != L2_VTR_DISABLED) {
2965 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
2966 "tag1: %d tag2: %d ]\n",
2967 str_vtr_op(sub->vtr_op), sub->vtr_push_dot1q,
2968 sub->vtr_tag1, sub->vtr_tag2);
2975 static int name_sort_cmp (void * a1, void * a2)
2977 name_sort_t * n1 = a1;
2978 name_sort_t * n2 = a2;
2980 return strcmp ((char *)n1->name, (char *)n2->name);
2983 static int dump_interface_table (vat_main_t * vam)
2986 name_sort_t * nses = 0, * ns;
2988 if (vam->json_output) {
2989 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2993 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2995 vec_add2 (nses, ns, 1);
2996 ns->name = (u8 *)(p->key);
2997 ns->value = (u32) p->value[0];
3000 vec_sort_with_function (nses, name_sort_cmp);
3002 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3003 vec_foreach (ns, nses) {
3004 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3010 static int dump_ip_table (vat_main_t * vam, int is_ipv6)
3012 const ip_details_t * det = NULL;
3013 const ip_address_details_t * address = NULL;
3024 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6]) {
3026 if (!det->present) {
3034 "Address", "Prefix length");
3038 vec_foreach (address, det->addr) {
3041 is_ipv6 ? format_ip6_address : format_ip4_address,
3043 address->prefix_length);
3050 static int dump_ipv4_table (vat_main_t * vam)
3052 if (vam->json_output) {
3053 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
3057 return dump_ip_table (vam, 0);
3060 static int dump_ipv6_table (vat_main_t * vam)
3062 if (vam->json_output) {
3063 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
3067 return dump_ip_table (vam, 1);
3070 static char* counter_type_to_str (u8 counter_type, u8 is_combined)
3073 switch(counter_type) {
3074 case VNET_INTERFACE_COUNTER_DROP:
3076 case VNET_INTERFACE_COUNTER_PUNT:
3078 case VNET_INTERFACE_COUNTER_IP4:
3080 case VNET_INTERFACE_COUNTER_IP6:
3082 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
3084 case VNET_INTERFACE_COUNTER_RX_MISS:
3086 case VNET_INTERFACE_COUNTER_RX_ERROR:
3088 case VNET_INTERFACE_COUNTER_TX_ERROR:
3091 return "INVALID-COUNTER-TYPE";
3094 switch(counter_type) {
3095 case VNET_INTERFACE_COUNTER_RX:
3097 case VNET_INTERFACE_COUNTER_TX:
3100 return "INVALID-COUNTER-TYPE";
3105 static int dump_stats_table (vat_main_t * vam)
3107 vat_json_node_t node;
3108 vat_json_node_t *msg_array;
3109 vat_json_node_t *msg;
3110 vat_json_node_t *counter_array;
3111 vat_json_node_t *counter;
3112 interface_counter_t c;
3114 ip4_fib_counter_t *c4;
3115 ip6_fib_counter_t *c6;
3118 if (!vam->json_output) {
3119 clib_warning ("dump_stats_table supported only in JSON format");
3123 vat_json_init_object(&node);
3125 /* interface counters */
3126 msg_array = vat_json_object_add(&node, "interface_counters");
3127 vat_json_init_array(msg_array);
3128 for (i = 0; i < vec_len(vam->simple_interface_counters); i++) {
3129 msg = vat_json_array_add(msg_array);
3130 vat_json_init_object(msg);
3131 vat_json_object_add_string_copy(msg, "vnet_counter_type",
3132 (u8*)counter_type_to_str(i, 0));
3133 vat_json_object_add_int(msg, "is_combined", 0);
3134 counter_array = vat_json_object_add(msg, "data");
3135 vat_json_init_array(counter_array);
3136 for (j = 0; j < vec_len(vam->simple_interface_counters[i]); j++) {
3137 packets = vam->simple_interface_counters[i][j];
3138 vat_json_array_add_uint(counter_array, packets);
3141 for (i = 0; i < vec_len(vam->combined_interface_counters); i++) {
3142 msg = vat_json_array_add(msg_array);
3143 vat_json_init_object(msg);
3144 vat_json_object_add_string_copy(msg, "vnet_counter_type",
3145 (u8*)counter_type_to_str(i, 1));
3146 vat_json_object_add_int(msg, "is_combined", 1);
3147 counter_array = vat_json_object_add(msg, "data");
3148 vat_json_init_array(counter_array);
3149 for (j = 0; j < vec_len(vam->combined_interface_counters[i]); j++) {
3150 c = vam->combined_interface_counters[i][j];
3151 counter = vat_json_array_add(counter_array);
3152 vat_json_init_object(counter);
3153 vat_json_object_add_uint(counter, "packets", c.packets);
3154 vat_json_object_add_uint(counter, "bytes", c.bytes);
3158 /* ip4 fib counters */
3159 msg_array = vat_json_object_add(&node, "ip4_fib_counters");
3160 vat_json_init_array(msg_array);
3161 for (i = 0; i < vec_len(vam->ip4_fib_counters); i++) {
3162 msg = vat_json_array_add(msg_array);
3163 vat_json_init_object(msg);
3164 vat_json_object_add_uint(msg, "vrf_id", vam->ip4_fib_counters_vrf_id_by_index[i]);
3165 counter_array = vat_json_object_add(msg, "c");
3166 vat_json_init_array(counter_array);
3167 for (j = 0; j < vec_len(vam->ip4_fib_counters[i]); j++) {
3168 counter = vat_json_array_add(counter_array);
3169 vat_json_init_object(counter);
3170 c4 = &vam->ip4_fib_counters[i][j];
3171 vat_json_object_add_ip4(counter, "address", c4->address);
3172 vat_json_object_add_uint(counter, "address_length", c4->address_length);
3173 vat_json_object_add_uint(counter, "packets", c4->packets);
3174 vat_json_object_add_uint(counter, "bytes", c4->bytes);
3178 /* ip6 fib counters */
3179 msg_array = vat_json_object_add(&node, "ip6_fib_counters");
3180 vat_json_init_array(msg_array);
3181 for (i = 0; i < vec_len(vam->ip6_fib_counters); i++) {
3182 msg = vat_json_array_add(msg_array);
3183 vat_json_init_object(msg);
3184 vat_json_object_add_uint(msg, "vrf_id", vam->ip6_fib_counters_vrf_id_by_index[i]);
3185 counter_array = vat_json_object_add(msg, "c");
3186 vat_json_init_array(counter_array);
3187 for (j = 0; j < vec_len(vam->ip6_fib_counters[i]); j++) {
3188 counter = vat_json_array_add(counter_array);
3189 vat_json_init_object(counter);
3190 c6 = &vam->ip6_fib_counters[i][j];
3191 vat_json_object_add_ip6(counter, "address", c6->address);
3192 vat_json_object_add_uint(counter, "address_length", c6->address_length);
3193 vat_json_object_add_uint(counter, "packets", c6->packets);
3194 vat_json_object_add_uint(counter, "bytes", c6->bytes);
3198 vat_json_print(vam->ofp, &node);
3199 vat_json_free(&node);
3204 int exec (vat_main_t * vam)
3206 api_main_t * am = &api_main;
3207 vl_api_cli_request_t *mp;
3211 unformat_input_t * i = vam->input;
3213 if (vec_len(i->buffer) == 0)
3216 if (vam->exec_mode == 0 && unformat (i, "mode")) {
3220 if (vam->exec_mode == 1 &&
3221 (unformat (i, "exit") || unformat (i, "quit"))) {
3227 M(CLI_REQUEST, cli_request);
3230 * Copy cmd into shared memory.
3231 * In order for the CLI command to work, it
3232 * must be a vector ending in \n, not a C-string ending
3235 pthread_mutex_lock (&am->vlib_rp->mutex);
3236 oldheap = svm_push_data_heap (am->vlib_rp);
3238 vec_validate (cmd, vec_len(vam->input->buffer)-1);
3239 clib_memcpy (cmd, vam->input->buffer, vec_len(vam->input->buffer));
3241 svm_pop_heap (oldheap);
3242 pthread_mutex_unlock (&am->vlib_rp->mutex);
3244 mp->cmd_in_shmem = (u64) cmd;
3246 timeout = vat_time_now (vam) + 10.0;
3248 while (vat_time_now (vam) < timeout) {
3249 if (vam->result_ready == 1) {
3251 if (vam->shmem_result != NULL)
3252 fformat (vam->ofp, "%s", vam->shmem_result);
3253 pthread_mutex_lock (&am->vlib_rp->mutex);
3254 oldheap = svm_push_data_heap (am->vlib_rp);
3256 free_me = (u8 *)vam->shmem_result;
3259 svm_pop_heap (oldheap);
3260 pthread_mutex_unlock (&am->vlib_rp->mutex);
3267 static int api_create_loopback (vat_main_t * vam)
3269 unformat_input_t * i = vam->input;
3270 vl_api_create_loopback_t *mp;
3275 memset (mac_address, 0, sizeof (mac_address));
3277 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3279 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
3285 /* Construct the API message */
3286 M(CREATE_LOOPBACK, create_loopback);
3288 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
3293 static int api_delete_loopback (vat_main_t * vam)
3295 unformat_input_t * i = vam->input;
3296 vl_api_delete_loopback_t *mp;
3298 u32 sw_if_index = ~0;
3300 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3302 if (unformat (i, "sw_if_index %d", &sw_if_index))
3308 if (sw_if_index == ~0)
3310 errmsg ("missing sw_if_index\n");
3314 /* Construct the API message */
3315 M(DELETE_LOOPBACK, delete_loopback);
3316 mp->sw_if_index = ntohl (sw_if_index);
3321 static int api_want_stats (vat_main_t * vam)
3323 unformat_input_t * i = vam->input;
3324 vl_api_want_stats_t * mp;
3328 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3330 if (unformat (i, "enable"))
3332 else if (unformat (i, "disable"))
3340 errmsg ("missing enable|disable\n");
3344 M(WANT_STATS, want_stats);
3345 mp->enable_disable = enable;
3350 static int api_want_interface_events (vat_main_t * vam)
3352 unformat_input_t * i = vam->input;
3353 vl_api_want_interface_events_t * mp;
3357 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3359 if (unformat (i, "enable"))
3361 else if (unformat (i, "disable"))
3369 errmsg ("missing enable|disable\n");
3373 M(WANT_INTERFACE_EVENTS, want_interface_events);
3374 mp->enable_disable = enable;
3376 vam->interface_event_display = enable;
3382 /* Note: non-static, called once to set up the initial intfc table */
3383 int api_sw_interface_dump (vat_main_t * vam)
3385 vl_api_sw_interface_dump_t *mp;
3388 name_sort_t * nses = 0, * ns;
3389 sw_interface_subif_t * sub = NULL;
3391 /* Toss the old name table */
3392 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3394 vec_add2 (nses, ns, 1);
3395 ns->name = (u8 *)(p->key);
3396 ns->value = (u32) p->value[0];
3399 hash_free (vam->sw_if_index_by_interface_name);
3401 vec_foreach (ns, nses)
3402 vec_free (ns->name);
3406 vec_foreach (sub, vam->sw_if_subif_table) {
3407 vec_free (sub->interface_name);
3409 vec_free (vam->sw_if_subif_table);
3411 /* recreate the interface name hash table */
3412 vam->sw_if_index_by_interface_name
3413 = hash_create_string (0, sizeof(uword));
3415 /* Get list of ethernets */
3416 M(SW_INTERFACE_DUMP, sw_interface_dump);
3417 mp->name_filter_valid = 1;
3418 strncpy ((char *) mp->name_filter, "Ether", sizeof(mp->name_filter)-1);
3421 /* and local / loopback interfaces */
3422 M(SW_INTERFACE_DUMP, sw_interface_dump);
3423 mp->name_filter_valid = 1;
3424 strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
3428 /* and vxlan-gpe tunnel interfaces */
3429 M(SW_INTERFACE_DUMP, sw_interface_dump);
3430 mp->name_filter_valid = 1;
3431 strncpy ((char *) mp->name_filter, "vxlan_gpe", sizeof(mp->name_filter)-1);
3434 /* and vxlan tunnel interfaces */
3435 M(SW_INTERFACE_DUMP, sw_interface_dump);
3436 mp->name_filter_valid = 1;
3437 strncpy ((char *) mp->name_filter, "vxlan", sizeof(mp->name_filter)-1);
3440 /* and host (af_packet) interfaces */
3441 M(SW_INTERFACE_DUMP, sw_interface_dump);
3442 mp->name_filter_valid = 1;
3443 strncpy ((char *) mp->name_filter, "host", sizeof(mp->name_filter)-1);
3446 /* and l2tpv3 tunnel interfaces */
3447 M(SW_INTERFACE_DUMP, sw_interface_dump);
3448 mp->name_filter_valid = 1;
3449 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel", sizeof(mp->name_filter)-1);
3452 /* and GRE tunnel interfaces */
3453 M(SW_INTERFACE_DUMP, sw_interface_dump);
3454 mp->name_filter_valid = 1;
3455 strncpy ((char *) mp->name_filter, "gre", sizeof(mp->name_filter)-1);
3458 /* Use a control ping for synchronization */
3460 vl_api_control_ping_t * mp;
3461 M(CONTROL_PING, control_ping);
3467 static int api_sw_interface_set_flags (vat_main_t * vam)
3469 unformat_input_t * i = vam->input;
3470 vl_api_sw_interface_set_flags_t *mp;
3473 u8 sw_if_index_set = 0;
3474 u8 admin_up = 0, link_up = 0;
3476 /* Parse args required to build the message */
3477 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3478 if (unformat (i, "admin-up"))
3480 else if (unformat (i, "admin-down"))
3482 else if (unformat (i, "link-up"))
3484 else if (unformat (i, "link-down"))
3486 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3487 sw_if_index_set = 1;
3488 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3489 sw_if_index_set = 1;
3494 if (sw_if_index_set == 0) {
3495 errmsg ("missing interface name or sw_if_index\n");
3499 /* Construct the API message */
3500 M(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
3501 mp->sw_if_index = ntohl (sw_if_index);
3502 mp->admin_up_down = admin_up;
3503 mp->link_up_down = link_up;
3508 /* Wait for a reply, return the good/bad news... */
3512 static int api_sw_interface_clear_stats (vat_main_t * vam)
3514 unformat_input_t * i = vam->input;
3515 vl_api_sw_interface_clear_stats_t *mp;
3518 u8 sw_if_index_set = 0;
3520 /* Parse args required to build the message */
3521 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3522 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3523 sw_if_index_set = 1;
3524 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3525 sw_if_index_set = 1;
3530 /* Construct the API message */
3531 M(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
3533 if (sw_if_index_set == 1)
3534 mp->sw_if_index = ntohl (sw_if_index);
3536 mp->sw_if_index = ~0;
3541 /* Wait for a reply, return the good/bad news... */
3545 static int api_sw_interface_add_del_address (vat_main_t * vam)
3547 unformat_input_t * i = vam->input;
3548 vl_api_sw_interface_add_del_address_t *mp;
3551 u8 sw_if_index_set = 0;
3552 u8 is_add = 1, del_all = 0;
3553 u32 address_length = 0;
3554 u8 v4_address_set = 0;
3555 u8 v6_address_set = 0;
3556 ip4_address_t v4address;
3557 ip6_address_t v6address;
3559 /* Parse args required to build the message */
3560 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3561 if (unformat (i, "del-all"))
3563 else if (unformat (i, "del"))
3565 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3566 sw_if_index_set = 1;
3567 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3568 sw_if_index_set = 1;
3569 else if (unformat (i, "%U/%d",
3570 unformat_ip4_address, &v4address,
3573 else if (unformat (i, "%U/%d",
3574 unformat_ip6_address, &v6address,
3581 if (sw_if_index_set == 0) {
3582 errmsg ("missing interface name or sw_if_index\n");
3585 if (v4_address_set && v6_address_set) {
3586 errmsg ("both v4 and v6 addresses set\n");
3589 if (!v4_address_set && !v6_address_set && !del_all) {
3590 errmsg ("no addresses set\n");
3594 /* Construct the API message */
3595 M(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
3597 mp->sw_if_index = ntohl (sw_if_index);
3598 mp->is_add = is_add;
3599 mp->del_all = del_all;
3600 if (v6_address_set) {
3602 clib_memcpy (mp->address, &v6address, sizeof (v6address));
3604 clib_memcpy (mp->address, &v4address, sizeof (v4address));
3606 mp->address_length = address_length;
3611 /* Wait for a reply, return good/bad news */
3615 static int api_sw_interface_set_table (vat_main_t * vam)
3617 unformat_input_t * i = vam->input;
3618 vl_api_sw_interface_set_table_t *mp;
3620 u32 sw_if_index, vrf_id = 0;
3621 u8 sw_if_index_set = 0;
3624 /* Parse args required to build the message */
3625 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3626 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3627 sw_if_index_set = 1;
3628 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3629 sw_if_index_set = 1;
3630 else if (unformat (i, "vrf %d", &vrf_id))
3632 else if (unformat (i, "ipv6"))
3638 if (sw_if_index_set == 0) {
3639 errmsg ("missing interface name or sw_if_index\n");
3643 /* Construct the API message */
3644 M(SW_INTERFACE_SET_TABLE, sw_interface_set_table);
3646 mp->sw_if_index = ntohl (sw_if_index);
3647 mp->is_ipv6 = is_ipv6;
3648 mp->vrf_id = ntohl (vrf_id);
3653 /* Wait for a reply... */
3657 static int api_sw_interface_set_vpath (vat_main_t * vam)
3659 unformat_input_t * i = vam->input;
3660 vl_api_sw_interface_set_vpath_t *mp;
3662 u32 sw_if_index = 0;
3663 u8 sw_if_index_set = 0;
3666 /* Parse args required to build the message */
3667 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3668 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3669 sw_if_index_set = 1;
3670 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3671 sw_if_index_set = 1;
3672 else if (unformat (i, "enable"))
3674 else if (unformat (i, "disable"))
3680 if (sw_if_index_set == 0) {
3681 errmsg ("missing interface name or sw_if_index\n");
3685 /* Construct the API message */
3686 M(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
3688 mp->sw_if_index = ntohl (sw_if_index);
3689 mp->enable = is_enable;
3694 /* Wait for a reply... */
3698 static int api_sw_interface_set_l2_xconnect (vat_main_t * vam)
3700 unformat_input_t * i = vam->input;
3701 vl_api_sw_interface_set_l2_xconnect_t *mp;
3704 u8 rx_sw_if_index_set = 0;
3706 u8 tx_sw_if_index_set = 0;
3709 /* Parse args required to build the message */
3710 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3711 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
3712 rx_sw_if_index_set = 1;
3713 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
3714 tx_sw_if_index_set = 1;
3715 else if (unformat (i, "rx")) {
3716 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3717 if (unformat (i, "%U", unformat_sw_if_index, vam,
3719 rx_sw_if_index_set = 1;
3722 } else if (unformat (i, "tx")) {
3723 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3724 if (unformat (i, "%U", unformat_sw_if_index, vam,
3726 tx_sw_if_index_set = 1;
3729 } else if (unformat (i, "enable"))
3731 else if (unformat (i, "disable"))
3737 if (rx_sw_if_index_set == 0) {
3738 errmsg ("missing rx interface name or rx_sw_if_index\n");
3742 if (enable && (tx_sw_if_index_set == 0)) {
3743 errmsg ("missing tx interface name or tx_sw_if_index\n");
3747 M(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
3749 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
3750 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
3751 mp->enable = enable;
3758 static int api_sw_interface_set_l2_bridge (vat_main_t * vam)
3760 unformat_input_t * i = vam->input;
3761 vl_api_sw_interface_set_l2_bridge_t *mp;
3764 u8 rx_sw_if_index_set = 0;
3771 /* Parse args required to build the message */
3772 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3773 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
3774 rx_sw_if_index_set = 1;
3775 else if (unformat (i, "bd_id %d", &bd_id))
3777 else if (unformat (i, "%U", unformat_sw_if_index, vam,
3779 rx_sw_if_index_set = 1;
3780 else if (unformat (i, "shg %d", &shg))
3782 else if (unformat (i, "bvi"))
3784 else if (unformat (i, "enable"))
3786 else if (unformat (i, "disable"))
3792 if (rx_sw_if_index_set == 0) {
3793 errmsg ("missing rx interface name or sw_if_index\n");
3797 if (enable && (bd_id_set == 0)) {
3798 errmsg ("missing bridge domain\n");
3802 M(SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
3804 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
3805 mp->bd_id = ntohl(bd_id);
3808 mp->enable = enable;
3815 static int api_bridge_domain_dump (vat_main_t * vam)
3817 unformat_input_t * i = vam->input;
3818 vl_api_bridge_domain_dump_t *mp;
3822 /* Parse args required to build the message */
3823 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3824 if (unformat (i, "bd_id %d", &bd_id))
3830 M(BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
3831 mp->bd_id = ntohl(bd_id);
3834 /* Use a control ping for synchronization */
3836 vl_api_control_ping_t * mp;
3837 M(CONTROL_PING, control_ping);
3846 static int api_bridge_domain_add_del (vat_main_t * vam)
3848 unformat_input_t * i = vam->input;
3849 vl_api_bridge_domain_add_del_t *mp;
3853 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
3855 /* Parse args required to build the message */
3856 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3857 if (unformat (i, "bd_id %d", &bd_id))
3859 else if (unformat (i, "flood %d", &flood))
3861 else if (unformat (i, "uu-flood %d", &uu_flood))
3863 else if (unformat (i, "forward %d", &forward))
3865 else if (unformat (i, "learn %d", &learn))
3867 else if (unformat (i, "arp-term %d", &arp_term))
3869 else if (unformat (i, "del")) {
3871 flood = uu_flood = forward = learn = 0;
3878 errmsg ("missing bridge domain\n");
3882 M(BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
3884 mp->bd_id = ntohl(bd_id);
3886 mp->uu_flood = uu_flood;
3887 mp->forward = forward;
3889 mp->arp_term = arp_term;
3890 mp->is_add = is_add;
3897 static int api_l2fib_add_del (vat_main_t * vam)
3899 unformat_input_t * i = vam->input;
3900 vl_api_l2fib_add_del_t *mp;
3907 u8 sw_if_index_set = 0;
3913 /* Parse args required to build the message */
3914 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3915 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
3917 else if (unformat (i, "bd_id %d", &bd_id))
3919 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3920 sw_if_index_set = 1;
3921 else if (unformat (i, "sw_if")) {
3922 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3923 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3924 sw_if_index_set = 1;
3927 } else if (unformat (i, "static"))
3929 else if (unformat (i, "filter")) {
3932 } else if (unformat (i, "bvi")) {
3935 } else if (unformat (i, "del"))
3942 errmsg ("missing mac address\n");
3946 if (bd_id_set == 0) {
3947 errmsg ("missing bridge domain\n");
3951 if (is_add && (sw_if_index_set == 0)) {
3952 errmsg ("missing interface name or sw_if_index\n");
3956 M(L2FIB_ADD_DEL, l2fib_add_del);
3959 mp->bd_id = ntohl(bd_id);
3960 mp->is_add = is_add;
3963 mp->sw_if_index = ntohl(sw_if_index);
3964 mp->static_mac = static_mac;
3965 mp->filter_mac = filter_mac;
3966 mp->bvi_mac = bvi_mac;
3974 static int api_l2_flags (vat_main_t * vam)
3976 unformat_input_t * i = vam->input;
3977 vl_api_l2_flags_t *mp;
3980 u32 feature_bitmap = 0;
3981 u8 sw_if_index_set = 0;
3983 /* Parse args required to build the message */
3984 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3985 if (unformat (i, "sw_if_index %d", &sw_if_index))
3986 sw_if_index_set = 1;
3987 else if (unformat (i, "sw_if")) {
3988 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3989 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3990 sw_if_index_set = 1;
3993 } else if (unformat (i, "learn"))
3994 feature_bitmap |= L2INPUT_FEAT_LEARN;
3995 else if (unformat (i, "forward"))
3996 feature_bitmap |= L2INPUT_FEAT_FWD;
3997 else if (unformat (i, "flood"))
3998 feature_bitmap |= L2INPUT_FEAT_FLOOD;
3999 else if (unformat (i, "uu-flood"))
4000 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
4005 if (sw_if_index_set == 0) {
4006 errmsg ("missing interface name or sw_if_index\n");
4010 M(L2_FLAGS, l2_flags);
4012 mp->sw_if_index = ntohl(sw_if_index);
4013 mp->feature_bitmap = ntohl(feature_bitmap);
4020 static int api_bridge_flags (vat_main_t * vam)
4022 unformat_input_t * i = vam->input;
4023 vl_api_bridge_flags_t *mp;
4030 /* Parse args required to build the message */
4031 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4032 if (unformat (i, "bd_id %d", &bd_id))
4034 else if (unformat (i, "learn"))
4036 else if (unformat (i, "forward"))
4038 else if (unformat (i, "flood"))
4040 else if (unformat (i, "uu-flood"))
4041 flags |= L2_UU_FLOOD;
4042 else if (unformat (i, "arp-term"))
4043 flags |= L2_ARP_TERM;
4044 else if (unformat (i, "off"))
4046 else if (unformat (i, "disable"))
4052 if (bd_id_set == 0) {
4053 errmsg ("missing bridge domain\n");
4057 M(BRIDGE_FLAGS, bridge_flags);
4059 mp->bd_id = ntohl(bd_id);
4060 mp->feature_bitmap = ntohl(flags);
4061 mp->is_set = is_set;
4068 static int api_bd_ip_mac_add_del (vat_main_t * vam)
4070 unformat_input_t * i = vam->input;
4071 vl_api_bd_ip_mac_add_del_t *mp;
4079 ip4_address_t v4addr;
4080 ip6_address_t v6addr;
4084 /* Parse args required to build the message */
4085 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4086 if (unformat (i, "bd_id %d", &bd_id)) {
4088 } else if (unformat (i, "%U", unformat_ip4_address, &v4addr)) {
4090 } else if (unformat (i, "%U", unformat_ip6_address, &v6addr)) {
4093 } else if (unformat (i, "%U", unformat_ethernet_address, macaddr)) {
4095 } else if (unformat (i, "del"))
4101 if (bd_id_set == 0) {
4102 errmsg ("missing bridge domain\n");
4104 } else if (ip_set == 0) {
4105 errmsg ("missing IP address\n");
4107 } else if (mac_set == 0) {
4108 errmsg ("missing MAC address\n");
4112 M(BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
4114 mp->bd_id = ntohl(bd_id);
4115 mp->is_ipv6 = is_ipv6;
4116 mp->is_add = is_add;
4118 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
4119 else clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
4120 clib_memcpy (mp->mac_address, macaddr, 6);
4126 static int api_tap_connect (vat_main_t * vam)
4128 unformat_input_t * i = vam->input;
4129 vl_api_tap_connect_t *mp;
4136 memset (mac_address, 0, sizeof (mac_address));
4138 /* Parse args required to build the message */
4139 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4140 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
4143 else if (unformat (i, "random-mac"))
4145 else if (unformat (i, "tapname %s", &tap_name))
4151 if (name_set == 0) {
4152 errmsg ("missing tap name\n");
4155 if (vec_len (tap_name) > 63) {
4156 errmsg ("tap name too long\n");
4158 vec_add1 (tap_name, 0);
4160 /* Construct the API message */
4161 M(TAP_CONNECT, tap_connect);
4163 mp->use_random_mac = random_mac;
4164 clib_memcpy (mp->mac_address, mac_address, 6);
4165 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
4166 vec_free (tap_name);
4171 /* Wait for a reply... */
4175 static int api_tap_modify (vat_main_t * vam)
4177 unformat_input_t * i = vam->input;
4178 vl_api_tap_modify_t *mp;
4184 u32 sw_if_index = ~0;
4185 u8 sw_if_index_set = 0;
4187 memset (mac_address, 0, sizeof (mac_address));
4189 /* Parse args required to build the message */
4190 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4191 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4192 sw_if_index_set = 1;
4193 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4194 sw_if_index_set = 1;
4195 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
4198 else if (unformat (i, "random-mac"))
4200 else if (unformat (i, "tapname %s", &tap_name))
4206 if (sw_if_index_set == 0) {
4207 errmsg ("missing vpp interface name");
4210 if (name_set == 0) {
4211 errmsg ("missing tap name\n");
4214 if (vec_len (tap_name) > 63) {
4215 errmsg ("tap name too long\n");
4217 vec_add1 (tap_name, 0);
4219 /* Construct the API message */
4220 M(TAP_MODIFY, tap_modify);
4222 mp->use_random_mac = random_mac;
4223 mp->sw_if_index = ntohl(sw_if_index);
4224 clib_memcpy (mp->mac_address, mac_address, 6);
4225 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
4226 vec_free (tap_name);
4231 /* Wait for a reply... */
4235 static int api_tap_delete (vat_main_t * vam)
4237 unformat_input_t * i = vam->input;
4238 vl_api_tap_delete_t *mp;
4240 u32 sw_if_index = ~0;
4241 u8 sw_if_index_set = 0;
4243 /* Parse args required to build the message */
4244 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4245 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4246 sw_if_index_set = 1;
4247 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4248 sw_if_index_set = 1;
4253 if (sw_if_index_set == 0) {
4254 errmsg ("missing vpp interface name");
4258 /* Construct the API message */
4259 M(TAP_DELETE, tap_delete);
4261 mp->sw_if_index = ntohl(sw_if_index);
4266 /* Wait for a reply... */
4270 static int api_ip_add_del_route (vat_main_t * vam)
4272 unformat_input_t * i = vam->input;
4273 vl_api_ip_add_del_route_t *mp;
4275 u32 sw_if_index = ~0, vrf_id = 0;
4276 u8 sw_if_index_set = 0;
4278 u8 is_local = 0, is_drop = 0;
4279 u8 create_vrf_if_needed = 0;
4281 u8 next_hop_weight = 1;
4283 u8 is_multipath = 0;
4285 u8 address_length_set = 0;
4286 u32 lookup_in_vrf = 0;
4287 u32 resolve_attempts = 0;
4288 u32 dst_address_length = 0;
4289 u8 next_hop_set = 0;
4290 ip4_address_t v4_dst_address, v4_next_hop_address;
4291 ip6_address_t v6_dst_address, v6_next_hop_address;
4295 u32 random_add_del = 0;
4296 u32 * random_vector = 0;
4297 uword * random_hash;
4298 u32 random_seed = 0xdeaddabe;
4299 u32 classify_table_index = ~0;
4302 /* Parse args required to build the message */
4303 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4304 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4305 sw_if_index_set = 1;
4306 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4307 sw_if_index_set = 1;
4308 else if (unformat (i, "%U", unformat_ip4_address,
4313 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address)) {
4317 else if (unformat (i, "/%d", &dst_address_length)) {
4318 address_length_set = 1;
4321 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
4322 &v4_next_hop_address)) {
4325 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
4326 &v6_next_hop_address)) {
4329 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
4331 else if (unformat (i, "weight %d", &next_hop_weight))
4333 else if (unformat (i, "drop")) {
4335 } else if (unformat (i, "local")) {
4337 } else if (unformat (i, "classify %d", &classify_table_index)) {
4339 } else if (unformat (i, "del"))
4341 else if (unformat (i, "add"))
4343 else if (unformat (i, "not-last"))
4345 else if (unformat (i, "multipath"))
4347 else if (unformat (i, "vrf %d", &vrf_id))
4349 else if (unformat (i, "create-vrf"))
4350 create_vrf_if_needed = 1;
4351 else if (unformat (i, "count %d", &count))
4353 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
4355 else if (unformat (i, "random"))
4357 else if (unformat (i, "seed %d", &random_seed))
4360 clib_warning ("parse error '%U'", format_unformat_error, i);
4365 if (resolve_attempts > 0 && sw_if_index_set == 0) {
4366 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
4370 if (!next_hop_set && !is_drop && !is_local && !is_classify) {
4371 errmsg ("next hop / local / drop / classify not set\n");
4375 if (address_set == 0) {
4376 errmsg ("missing addresses\n");
4380 if (address_length_set == 0) {
4381 errmsg ("missing address length\n");
4385 /* Generate a pile of unique, random routes */
4386 if (random_add_del) {
4387 u32 this_random_address;
4388 random_hash = hash_create (count, sizeof(uword));
4390 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
4391 for (j = 0; j <= count; j++) {
4393 this_random_address = random_u32 (&random_seed);
4394 this_random_address =
4395 clib_host_to_net_u32 (this_random_address);
4396 } while (hash_get (random_hash, this_random_address));
4397 vec_add1 (random_vector, this_random_address);
4398 hash_set (random_hash, this_random_address, 1);
4400 hash_free (random_hash);
4401 v4_dst_address.as_u32 = random_vector[0];
4405 /* Turn on async mode */
4406 vam->async_mode = 1;
4407 vam->async_errors = 0;
4408 before = vat_time_now(vam);
4411 for (j = 0; j < count; j++) {
4412 /* Construct the API message */
4413 M(IP_ADD_DEL_ROUTE, ip_add_del_route);
4415 mp->next_hop_sw_if_index = ntohl (sw_if_index);
4416 mp->vrf_id = ntohl (vrf_id);
4417 if (resolve_attempts > 0) {
4418 mp->resolve_attempts = ntohl (resolve_attempts);
4419 mp->resolve_if_needed = 1;
4421 mp->create_vrf_if_needed = create_vrf_if_needed;
4423 mp->is_add = is_add;
4424 mp->is_drop = is_drop;
4425 mp->is_ipv6 = is_ipv6;
4426 mp->is_local = is_local;
4427 mp->is_classify = is_classify;
4428 mp->is_multipath = is_multipath;
4429 mp->not_last = not_last;
4430 mp->next_hop_weight = next_hop_weight;
4431 mp->dst_address_length = dst_address_length;
4432 mp->lookup_in_vrf = ntohl(lookup_in_vrf);
4433 mp->classify_table_index = ntohl(classify_table_index);
4436 clib_memcpy (mp->dst_address, &v6_dst_address, sizeof (v6_dst_address));
4438 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
4439 sizeof (v6_next_hop_address));
4440 increment_v6_address (&v6_dst_address);
4442 clib_memcpy (mp->dst_address, &v4_dst_address, sizeof (v4_dst_address));
4444 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
4445 sizeof (v4_next_hop_address));
4447 v4_dst_address.as_u32 = random_vector[j+1];
4449 increment_v4_address (&v4_dst_address);
4455 /* When testing multiple add/del ops, use a control-ping to sync */
4457 vl_api_control_ping_t * mp;
4460 /* Shut off async mode */
4461 vam->async_mode = 0;
4463 M(CONTROL_PING, control_ping);
4466 timeout = vat_time_now(vam) + 1.0;
4467 while (vat_time_now (vam) < timeout)
4468 if (vam->result_ready == 1)
4473 if (vam->retval == -99)
4474 errmsg ("timeout\n");
4476 if (vam->async_errors > 0) {
4477 errmsg ("%d asynchronous errors\n", vam->async_errors);
4480 vam->async_errors = 0;
4481 after = vat_time_now(vam);
4483 fformat(vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4484 count, after - before, count / (after - before));
4486 /* Wait for a reply... */
4490 /* Return the good/bad news */
4491 return (vam->retval);
4494 static int api_proxy_arp_add_del (vat_main_t * vam)
4496 unformat_input_t * i = vam->input;
4497 vl_api_proxy_arp_add_del_t *mp;
4501 ip4_address_t lo, hi;
4504 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4505 if (unformat (i, "vrf %d", &vrf_id))
4507 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
4508 unformat_ip4_address, &hi))
4510 else if (unformat (i, "del"))
4513 clib_warning ("parse error '%U'", format_unformat_error, i);
4518 if (range_set == 0) {
4519 errmsg ("address range not set\n");
4523 M(PROXY_ARP_ADD_DEL, proxy_arp_add_del);
4525 mp->vrf_id = ntohl(vrf_id);
4526 mp->is_add = is_add;
4527 clib_memcpy(mp->low_address, &lo, sizeof (mp->low_address));
4528 clib_memcpy(mp->hi_address, &hi, sizeof (mp->hi_address));
4535 static int api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
4537 unformat_input_t * i = vam->input;
4538 vl_api_proxy_arp_intfc_enable_disable_t *mp;
4542 u8 sw_if_index_set = 0;
4544 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4545 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4546 sw_if_index_set = 1;
4547 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4548 sw_if_index_set = 1;
4549 else if (unformat (i, "enable"))
4551 else if (unformat (i, "disable"))
4554 clib_warning ("parse error '%U'", format_unformat_error, i);
4559 if (sw_if_index_set == 0) {
4560 errmsg ("missing interface name or sw_if_index\n");
4564 M(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
4566 mp->sw_if_index = ntohl(sw_if_index);
4567 mp->enable_disable = enable;
4574 static int api_mpls_add_del_decap (vat_main_t * vam)
4576 unformat_input_t * i = vam->input;
4577 vl_api_mpls_add_del_decap_t *mp;
4586 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4587 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
4589 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
4591 else if (unformat (i, "label %d", &label))
4593 else if (unformat (i, "next-index %d", &next_index))
4595 else if (unformat (i, "del"))
4597 else if (unformat (i, "s-bit-clear"))
4600 clib_warning ("parse error '%U'", format_unformat_error, i);
4605 M(MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
4607 mp->rx_vrf_id = ntohl(rx_vrf_id);
4608 mp->tx_vrf_id = ntohl(tx_vrf_id);
4609 mp->label = ntohl(label);
4610 mp->next_index = ntohl(next_index);
4612 mp->is_add = is_add;
4619 static int api_mpls_add_del_encap (vat_main_t * vam)
4621 unformat_input_t * i = vam->input;
4622 vl_api_mpls_add_del_encap_t *mp;
4627 ip4_address_t dst_address;
4630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4631 if (unformat (i, "vrf %d", &vrf_id))
4633 else if (unformat (i, "label %d", &label))
4634 vec_add1 (labels, ntohl(label));
4635 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
4637 else if (unformat (i, "del"))
4640 clib_warning ("parse error '%U'", format_unformat_error, i);
4645 if (vec_len (labels) == 0) {
4646 errmsg ("missing encap label stack\n");
4650 M2(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
4651 sizeof (u32) * vec_len (labels));
4653 mp->vrf_id = ntohl(vrf_id);
4654 clib_memcpy(mp->dst_address, &dst_address, sizeof (dst_address));
4655 mp->is_add = is_add;
4656 mp->nlabels = vec_len (labels);
4657 clib_memcpy(mp->labels, labels, sizeof(u32)*mp->nlabels);
4666 static int api_mpls_gre_add_del_tunnel (vat_main_t * vam)
4668 unformat_input_t * i = vam->input;
4669 vl_api_mpls_gre_add_del_tunnel_t *mp;
4671 u32 inner_vrf_id = 0;
4672 u32 outer_vrf_id = 0;
4673 ip4_address_t src_address;
4674 ip4_address_t dst_address;
4675 ip4_address_t intfc_address;
4677 u8 intfc_address_length = 0;
4681 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4682 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
4684 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
4686 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
4688 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
4690 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4691 &intfc_address, &tmp))
4692 intfc_address_length = tmp;
4693 else if (unformat (i, "l2-only"))
4695 else if (unformat (i, "del"))
4698 clib_warning ("parse error '%U'", format_unformat_error, i);
4703 M(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
4705 mp->inner_vrf_id = ntohl(inner_vrf_id);
4706 mp->outer_vrf_id = ntohl(outer_vrf_id);
4707 clib_memcpy(mp->src_address, &src_address, sizeof (src_address));
4708 clib_memcpy(mp->dst_address, &dst_address, sizeof (dst_address));
4709 clib_memcpy(mp->intfc_address, &intfc_address, sizeof (intfc_address));
4710 mp->intfc_address_length = intfc_address_length;
4711 mp->l2_only = l2_only;
4712 mp->is_add = is_add;
4719 static int api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
4721 unformat_input_t * i = vam->input;
4722 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
4724 u32 inner_vrf_id = 0;
4725 ip4_address_t intfc_address;
4726 u8 dst_mac_address[6];
4729 u8 intfc_address_length = 0;
4733 int tx_sw_if_index_set = 0;
4735 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4736 if (unformat (i, "vrf %d", &inner_vrf_id))
4738 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4739 &intfc_address, &tmp))
4740 intfc_address_length = tmp;
4741 else if (unformat (i, "%U",
4742 unformat_sw_if_index, vam, &tx_sw_if_index))
4743 tx_sw_if_index_set = 1;
4744 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4745 tx_sw_if_index_set = 1;
4746 else if (unformat (i, "dst %U", unformat_ethernet_address,
4749 else if (unformat (i, "l2-only"))
4751 else if (unformat (i, "del"))
4754 clib_warning ("parse error '%U'", format_unformat_error, i);
4760 errmsg ("dst (mac address) not set\n");
4763 if (!tx_sw_if_index_set) {
4764 errmsg ("tx-intfc not set\n");
4768 M(MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
4770 mp->vrf_id = ntohl(inner_vrf_id);
4771 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
4772 mp->adj_address_length = intfc_address_length;
4773 clib_memcpy (mp->dst_mac_address, dst_mac_address, sizeof (dst_mac_address));
4774 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
4775 mp->l2_only = l2_only;
4776 mp->is_add = is_add;
4783 static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
4785 unformat_input_t * i = vam->input;
4786 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
4788 u32 inner_vrf_id = 0;
4789 u32 outer_vrf_id = 0;
4790 ip4_address_t adj_address;
4791 int adj_address_set = 0;
4792 ip4_address_t next_hop_address;
4793 int next_hop_address_set = 0;
4795 u8 adj_address_length = 0;
4798 u32 resolve_attempts = 5;
4799 u8 resolve_if_needed = 1;
4801 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4802 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
4804 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
4806 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4807 &adj_address, &tmp)) {
4808 adj_address_length = tmp;
4809 adj_address_set = 1;
4811 else if (unformat (i, "next-hop %U", unformat_ip4_address,
4813 next_hop_address_set = 1;
4814 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
4816 else if (unformat (i, "resolve-if-needed %d", &tmp))
4817 resolve_if_needed = tmp;
4818 else if (unformat (i, "l2-only"))
4820 else if (unformat (i, "del"))
4823 clib_warning ("parse error '%U'", format_unformat_error, i);
4828 if (!adj_address_set) {
4829 errmsg ("adjacency address/mask not set\n");
4832 if (!next_hop_address_set) {
4833 errmsg ("ip4 next hop address (in outer fib) not set\n");
4837 M(MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
4839 mp->inner_vrf_id = ntohl(inner_vrf_id);
4840 mp->outer_vrf_id = ntohl(outer_vrf_id);
4841 mp->resolve_attempts = ntohl(resolve_attempts);
4842 mp->resolve_if_needed = resolve_if_needed;
4843 mp->is_add = is_add;
4844 mp->l2_only = l2_only;
4845 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
4846 mp->adj_address_length = adj_address_length;
4847 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
4848 sizeof (next_hop_address));
4855 static int api_sw_interface_set_unnumbered (vat_main_t * vam)
4857 unformat_input_t * i = vam->input;
4858 vl_api_sw_interface_set_unnumbered_t *mp;
4863 u8 sw_if_index_set = 0;
4865 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4866 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4867 sw_if_index_set = 1;
4868 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4869 sw_if_index_set = 1;
4870 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
4872 else if (unformat (i, "del"))
4875 clib_warning ("parse error '%U'", format_unformat_error, i);
4880 if (sw_if_index_set == 0) {
4881 errmsg ("missing interface name or sw_if_index\n");
4885 M(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
4887 mp->sw_if_index = ntohl(sw_if_index);
4888 mp->unnumbered_sw_if_index = ntohl(unnum_sw_index);
4889 mp->is_add = is_add;
4896 static int api_ip_neighbor_add_del (vat_main_t * vam)
4898 unformat_input_t * i = vam->input;
4899 vl_api_ip_neighbor_add_del_t *mp;
4902 u8 sw_if_index_set = 0;
4908 u8 v4_address_set = 0;
4909 u8 v6_address_set = 0;
4910 ip4_address_t v4address;
4911 ip6_address_t v6address;
4913 memset (mac_address, 0, sizeof (mac_address));
4915 /* Parse args required to build the message */
4916 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4917 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
4920 else if (unformat (i, "del"))
4922 else 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, "is_static"))
4928 else if (unformat (i, "vrf %d", &vrf_id))
4930 else if (unformat (i, "dst %U",
4931 unformat_ip4_address, &v4address))
4933 else if (unformat (i, "dst %U",
4934 unformat_ip6_address, &v6address))
4937 clib_warning ("parse error '%U'", format_unformat_error, i);
4942 if (sw_if_index_set == 0) {
4943 errmsg ("missing interface name or sw_if_index\n");
4946 if (v4_address_set && v6_address_set) {
4947 errmsg ("both v4 and v6 addresses set\n");
4950 if (!v4_address_set && !v6_address_set) {
4951 errmsg ("no addresses set\n");
4955 /* Construct the API message */
4956 M(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
4958 mp->sw_if_index = ntohl (sw_if_index);
4959 mp->is_add = is_add;
4960 mp->vrf_id = ntohl (vrf_id);
4961 mp->is_static = is_static;
4963 clib_memcpy (mp->mac_address, mac_address, 6);
4964 if (v6_address_set) {
4966 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
4968 /* mp->is_ipv6 = 0; via memset in M macro above */
4969 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
4975 /* Wait for a reply, return good/bad news */
4982 static int api_reset_vrf (vat_main_t * vam)
4984 unformat_input_t * i = vam->input;
4985 vl_api_reset_vrf_t *mp;
4991 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4992 if (unformat (i, "vrf %d", &vrf_id))
4994 else if (unformat (i, "ipv6"))
4997 clib_warning ("parse error '%U'", format_unformat_error, i);
5002 if (vrf_id_set == 0) {
5003 errmsg ("missing vrf id\n");
5007 M(RESET_VRF, reset_vrf);
5009 mp->vrf_id = ntohl(vrf_id);
5010 mp->is_ipv6 = is_ipv6;
5017 static int api_create_vlan_subif (vat_main_t * vam)
5019 unformat_input_t * i = vam->input;
5020 vl_api_create_vlan_subif_t *mp;
5023 u8 sw_if_index_set = 0;
5027 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5028 if (unformat (i, "sw_if_index %d", &sw_if_index))
5029 sw_if_index_set = 1;
5030 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5031 sw_if_index_set = 1;
5032 else if (unformat (i, "vlan %d", &vlan_id))
5035 clib_warning ("parse error '%U'", format_unformat_error, i);
5040 if (sw_if_index_set == 0) {
5041 errmsg ("missing interface name or sw_if_index\n");
5045 if (vlan_id_set == 0) {
5046 errmsg ("missing vlan_id\n");
5049 M(CREATE_VLAN_SUBIF, create_vlan_subif);
5051 mp->sw_if_index = ntohl(sw_if_index);
5052 mp->vlan_id = ntohl(vlan_id);
5059 #define foreach_create_subif_bit \
5066 _(outer_vlan_id_any) \
5067 _(inner_vlan_id_any)
5069 static int api_create_subif (vat_main_t * vam)
5071 unformat_input_t * i = vam->input;
5072 vl_api_create_subif_t *mp;
5075 u8 sw_if_index_set = 0;
5082 u32 exact_match = 0;
5083 u32 default_sub = 0;
5084 u32 outer_vlan_id_any = 0;
5085 u32 inner_vlan_id_any = 0;
5087 u16 outer_vlan_id = 0;
5088 u16 inner_vlan_id = 0;
5090 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5091 if (unformat (i, "sw_if_index %d", &sw_if_index))
5092 sw_if_index_set = 1;
5093 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5094 sw_if_index_set = 1;
5095 else if (unformat (i, "sub_id %d", &sub_id))
5097 else if (unformat (i, "outer_vlan_id %d", &tmp))
5098 outer_vlan_id = tmp;
5099 else if (unformat (i, "inner_vlan_id %d", &tmp))
5100 inner_vlan_id = tmp;
5102 #define _(a) else if (unformat (i, #a)) a = 1 ;
5103 foreach_create_subif_bit
5107 clib_warning ("parse error '%U'", format_unformat_error, i);
5112 if (sw_if_index_set == 0) {
5113 errmsg ("missing interface name or sw_if_index\n");
5117 if (sub_id_set == 0) {
5118 errmsg ("missing sub_id\n");
5121 M(CREATE_SUBIF, create_subif);
5123 mp->sw_if_index = ntohl(sw_if_index);
5124 mp->sub_id = ntohl(sub_id);
5126 #define _(a) mp->a = a;
5127 foreach_create_subif_bit;
5130 mp->outer_vlan_id = ntohs (outer_vlan_id);
5131 mp->inner_vlan_id = ntohs (inner_vlan_id);
5138 static int api_oam_add_del (vat_main_t * vam)
5140 unformat_input_t * i = vam->input;
5141 vl_api_oam_add_del_t *mp;
5145 ip4_address_t src, dst;
5149 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5150 if (unformat (i, "vrf %d", &vrf_id))
5152 else if (unformat (i, "src %U", unformat_ip4_address, &src))
5154 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
5156 else if (unformat (i, "del"))
5159 clib_warning ("parse error '%U'", format_unformat_error, i);
5165 errmsg ("missing src addr\n");
5170 errmsg ("missing dst addr\n");
5174 M(OAM_ADD_DEL, oam_add_del);
5176 mp->vrf_id = ntohl(vrf_id);
5177 mp->is_add = is_add;
5178 clib_memcpy(mp->src_address, &src, sizeof (mp->src_address));
5179 clib_memcpy(mp->dst_address, &dst, sizeof (mp->dst_address));
5186 static int api_reset_fib (vat_main_t * vam)
5188 unformat_input_t * i = vam->input;
5189 vl_api_reset_fib_t *mp;
5195 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5196 if (unformat (i, "vrf %d", &vrf_id))
5198 else if (unformat (i, "ipv6"))
5201 clib_warning ("parse error '%U'", format_unformat_error, i);
5206 if (vrf_id_set == 0) {
5207 errmsg ("missing vrf id\n");
5211 M(RESET_FIB, reset_fib);
5213 mp->vrf_id = ntohl(vrf_id);
5214 mp->is_ipv6 = is_ipv6;
5221 static int api_dhcp_proxy_config (vat_main_t * vam)
5223 unformat_input_t * i = vam->input;
5224 vl_api_dhcp_proxy_config_t *mp;
5229 u8 v4_address_set = 0;
5230 u8 v6_address_set = 0;
5231 ip4_address_t v4address;
5232 ip6_address_t v6address;
5233 u8 v4_src_address_set = 0;
5234 u8 v6_src_address_set = 0;
5235 ip4_address_t v4srcaddress;
5236 ip6_address_t v6srcaddress;
5238 /* Parse args required to build the message */
5239 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5240 if (unformat (i, "del"))
5242 else if (unformat (i, "vrf %d", &vrf_id))
5244 else if (unformat (i, "insert-cid %d", &insert_cid))
5246 else if (unformat (i, "svr %U",
5247 unformat_ip4_address, &v4address))
5249 else if (unformat (i, "svr %U",
5250 unformat_ip6_address, &v6address))
5252 else if (unformat (i, "src %U",
5253 unformat_ip4_address, &v4srcaddress))
5254 v4_src_address_set = 1;
5255 else if (unformat (i, "src %U",
5256 unformat_ip6_address, &v6srcaddress))
5257 v6_src_address_set = 1;
5262 if (v4_address_set && v6_address_set) {
5263 errmsg ("both v4 and v6 server addresses set\n");
5266 if (!v4_address_set && !v6_address_set) {
5267 errmsg ("no server addresses set\n");
5271 if (v4_src_address_set && v6_src_address_set) {
5272 errmsg ("both v4 and v6 src addresses set\n");
5275 if (!v4_src_address_set && !v6_src_address_set) {
5276 errmsg ("no src addresses set\n");
5280 if (!(v4_src_address_set && v4_address_set) &&
5281 !(v6_src_address_set && v6_address_set)) {
5282 errmsg ("no matching server and src addresses set\n");
5286 /* Construct the API message */
5287 M(DHCP_PROXY_CONFIG, dhcp_proxy_config);
5289 mp->insert_circuit_id = insert_cid;
5290 mp->is_add = is_add;
5291 mp->vrf_id = ntohl (vrf_id);
5292 if (v6_address_set) {
5294 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
5295 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
5297 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
5298 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
5304 /* Wait for a reply, return good/bad news */
5310 static int api_dhcp_proxy_config_2 (vat_main_t * vam)
5312 unformat_input_t * i = vam->input;
5313 vl_api_dhcp_proxy_config_2_t *mp;
5316 u32 server_vrf_id = 0;
5319 u8 v4_address_set = 0;
5320 u8 v6_address_set = 0;
5321 ip4_address_t v4address;
5322 ip6_address_t v6address;
5323 u8 v4_src_address_set = 0;
5324 u8 v6_src_address_set = 0;
5325 ip4_address_t v4srcaddress;
5326 ip6_address_t v6srcaddress;
5328 /* Parse args required to build the message */
5329 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5330 if (unformat (i, "del"))
5332 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
5334 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
5336 else if (unformat (i, "insert-cid %d", &insert_cid))
5338 else if (unformat (i, "svr %U",
5339 unformat_ip4_address, &v4address))
5341 else if (unformat (i, "svr %U",
5342 unformat_ip6_address, &v6address))
5344 else if (unformat (i, "src %U",
5345 unformat_ip4_address, &v4srcaddress))
5346 v4_src_address_set = 1;
5347 else if (unformat (i, "src %U",
5348 unformat_ip6_address, &v6srcaddress))
5349 v6_src_address_set = 1;
5354 if (v4_address_set && v6_address_set) {
5355 errmsg ("both v4 and v6 server addresses set\n");
5358 if (!v4_address_set && !v6_address_set) {
5359 errmsg ("no server addresses set\n");
5363 if (v4_src_address_set && v6_src_address_set) {
5364 errmsg ("both v4 and v6 src addresses set\n");
5367 if (!v4_src_address_set && !v6_src_address_set) {
5368 errmsg ("no src addresses set\n");
5372 if (!(v4_src_address_set && v4_address_set) &&
5373 !(v6_src_address_set && v6_address_set)) {
5374 errmsg ("no matching server and src addresses set\n");
5378 /* Construct the API message */
5379 M(DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
5381 mp->insert_circuit_id = insert_cid;
5382 mp->is_add = is_add;
5383 mp->rx_vrf_id = ntohl (rx_vrf_id);
5384 mp->server_vrf_id = ntohl (server_vrf_id);
5385 if (v6_address_set) {
5387 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
5388 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
5390 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
5391 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
5397 /* Wait for a reply, return good/bad news */
5403 static int api_dhcp_proxy_set_vss (vat_main_t * vam)
5405 unformat_input_t * i = vam->input;
5406 vl_api_dhcp_proxy_set_vss_t *mp;
5417 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5418 if (unformat (i, "tbl_id %d", &tbl_id))
5420 if (unformat (i, "fib_id %d", &fib_id))
5422 if (unformat (i, "oui %d", &oui))
5424 else if (unformat (i, "ipv6"))
5426 else if (unformat (i, "del"))
5429 clib_warning ("parse error '%U'", format_unformat_error, i);
5434 if (tbl_id_set == 0) {
5435 errmsg ("missing tbl id\n");
5439 if (fib_id_set == 0) {
5440 errmsg ("missing fib id\n");
5444 errmsg ("missing oui\n");
5448 M(DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
5449 mp->tbl_id = ntohl(tbl_id);
5450 mp->fib_id = ntohl(fib_id);
5451 mp->oui = ntohl(oui);
5452 mp->is_ipv6 = is_ipv6;
5453 mp->is_add = is_add;
5460 static int api_dhcp_client_config (vat_main_t * vam)
5462 unformat_input_t * i = vam->input;
5463 vl_api_dhcp_client_config_t *mp;
5466 u8 sw_if_index_set = 0;
5469 u8 disable_event = 0;
5471 /* Parse args required to build the message */
5472 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5473 if (unformat (i, "del"))
5475 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5476 sw_if_index_set = 1;
5477 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5478 sw_if_index_set = 1;
5479 else if (unformat (i, "hostname %s", &hostname))
5481 else if (unformat (i, "disable_event"))
5487 if (sw_if_index_set == 0) {
5488 errmsg ("missing interface name or sw_if_index\n");
5492 if (vec_len (hostname) > 63) {
5493 errmsg ("hostname too long\n");
5495 vec_add1 (hostname, 0);
5497 /* Construct the API message */
5498 M(DHCP_CLIENT_CONFIG, dhcp_client_config);
5500 mp->sw_if_index = ntohl (sw_if_index);
5501 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
5502 vec_free (hostname);
5503 mp->is_add = is_add;
5504 mp->want_dhcp_event = disable_event ? 0 : 1;
5510 /* Wait for a reply, return good/bad news */
5516 static int api_set_ip_flow_hash (vat_main_t * vam)
5518 unformat_input_t * i = vam->input;
5519 vl_api_set_ip_flow_hash_t *mp;
5531 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5532 if (unformat (i, "vrf %d", &vrf_id))
5534 else if (unformat (i, "ipv6"))
5536 else if (unformat (i, "src"))
5538 else if (unformat (i, "dst"))
5540 else if (unformat (i, "sport"))
5542 else if (unformat (i, "dport"))
5544 else if (unformat (i, "proto"))
5546 else if (unformat (i, "reverse"))
5550 clib_warning ("parse error '%U'", format_unformat_error, i);
5555 if (vrf_id_set == 0) {
5556 errmsg ("missing vrf id\n");
5560 M(SET_IP_FLOW_HASH, set_ip_flow_hash);
5566 mp->reverse = reverse;
5567 mp->vrf_id = ntohl(vrf_id);
5568 mp->is_ipv6 = is_ipv6;
5575 static int api_sw_interface_ip6_enable_disable (vat_main_t * vam)
5577 unformat_input_t * i = vam->input;
5578 vl_api_sw_interface_ip6_enable_disable_t *mp;
5581 u8 sw_if_index_set = 0;
5584 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5585 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5586 sw_if_index_set = 1;
5587 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5588 sw_if_index_set = 1;
5589 else if (unformat (i, "enable"))
5591 else if (unformat (i, "disable"))
5594 clib_warning ("parse error '%U'", format_unformat_error, i);
5599 if (sw_if_index_set == 0) {
5600 errmsg ("missing interface name or sw_if_index\n");
5604 M(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
5606 mp->sw_if_index = ntohl(sw_if_index);
5607 mp->enable = enable;
5614 static int api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
5616 unformat_input_t * i = vam->input;
5617 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
5620 u8 sw_if_index_set = 0;
5621 u32 address_length = 0;
5622 u8 v6_address_set = 0;
5623 ip6_address_t v6address;
5625 /* Parse args required to build the message */
5626 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5627 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5628 sw_if_index_set = 1;
5629 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5630 sw_if_index_set = 1;
5631 else if (unformat (i, "%U/%d",
5632 unformat_ip6_address, &v6address,
5639 if (sw_if_index_set == 0) {
5640 errmsg ("missing interface name or sw_if_index\n");
5643 if (!v6_address_set) {
5644 errmsg ("no address set\n");
5648 /* Construct the API message */
5649 M(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, \
5650 sw_interface_ip6_set_link_local_address);
5652 mp->sw_if_index = ntohl (sw_if_index);
5653 clib_memcpy (mp->address, &v6address, sizeof (v6address));
5654 mp->address_length = address_length;
5659 /* Wait for a reply, return good/bad news */
5667 static int api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
5669 unformat_input_t * i = vam->input;
5670 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
5673 u8 sw_if_index_set = 0;
5674 u32 address_length = 0;
5675 u8 v6_address_set = 0;
5676 ip6_address_t v6address;
5678 u8 no_advertise = 0;
5680 u8 no_autoconfig = 0;
5683 u32 val_lifetime = 0;
5684 u32 pref_lifetime = 0;
5686 /* Parse args required to build the message */
5687 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5688 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5689 sw_if_index_set = 1;
5690 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5691 sw_if_index_set = 1;
5692 else if (unformat (i, "%U/%d",
5693 unformat_ip6_address, &v6address,
5696 else if (unformat (i, "val_life %d", &val_lifetime))
5698 else if (unformat (i, "pref_life %d", &pref_lifetime))
5700 else if (unformat (i, "def"))
5702 else if (unformat (i, "noadv"))
5704 else if (unformat (i, "offl"))
5706 else if (unformat (i, "noauto"))
5708 else if (unformat (i, "nolink"))
5710 else if (unformat (i, "isno"))
5713 clib_warning ("parse error '%U'", format_unformat_error, i);
5718 if (sw_if_index_set == 0) {
5719 errmsg ("missing interface name or sw_if_index\n");
5722 if (!v6_address_set) {
5723 errmsg ("no address set\n");
5727 /* Construct the API message */
5728 M(SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
5730 mp->sw_if_index = ntohl (sw_if_index);
5731 clib_memcpy (mp->address, &v6address, sizeof (v6address));
5732 mp->address_length = address_length;
5733 mp->use_default = use_default;
5734 mp->no_advertise = no_advertise;
5735 mp->off_link = off_link;
5736 mp->no_autoconfig = no_autoconfig;
5737 mp->no_onlink = no_onlink;
5739 mp->val_lifetime = ntohl(val_lifetime);
5740 mp->pref_lifetime = ntohl(pref_lifetime);
5745 /* Wait for a reply, return good/bad news */
5752 static int api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
5754 unformat_input_t * i = vam->input;
5755 vl_api_sw_interface_ip6nd_ra_config_t *mp;
5758 u8 sw_if_index_set = 0;
5763 u8 send_unicast = 0;
5766 u8 default_router = 0;
5767 u32 max_interval = 0;
5768 u32 min_interval = 0;
5770 u32 initial_count = 0;
5771 u32 initial_interval = 0;
5774 /* Parse args required to build the message */
5775 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5776 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5777 sw_if_index_set = 1;
5778 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5779 sw_if_index_set = 1;
5780 else if (unformat (i, "maxint %d", &max_interval))
5782 else if (unformat (i, "minint %d", &min_interval))
5784 else if (unformat (i, "life %d", &lifetime))
5786 else if (unformat (i, "count %d", &initial_count))
5788 else if (unformat (i, "interval %d", &initial_interval))
5790 else if (unformat (i, "suppress") || unformat (i, "surpress"))
5792 else if (unformat (i, "managed"))
5794 else if (unformat (i, "other"))
5796 else if (unformat (i, "ll"))
5798 else if (unformat (i, "send"))
5800 else if (unformat (i, "cease"))
5802 else if (unformat (i, "isno"))
5804 else if (unformat (i, "def"))
5807 clib_warning ("parse error '%U'", format_unformat_error, i);
5812 if (sw_if_index_set == 0) {
5813 errmsg ("missing interface name or sw_if_index\n");
5817 /* Construct the API message */
5818 M(SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
5820 mp->sw_if_index = ntohl (sw_if_index);
5821 mp->max_interval = ntohl(max_interval);
5822 mp->min_interval = ntohl(min_interval);
5823 mp->lifetime = ntohl(lifetime);
5824 mp->initial_count = ntohl(initial_count);
5825 mp->initial_interval = ntohl(initial_interval);
5826 mp->suppress = suppress;
5827 mp->managed = managed;
5829 mp->ll_option = ll_option;
5830 mp->send_unicast = send_unicast;
5833 mp->default_router = default_router;
5838 /* Wait for a reply, return good/bad news */
5845 static int api_set_arp_neighbor_limit (vat_main_t * vam)
5847 unformat_input_t * i = vam->input;
5848 vl_api_set_arp_neighbor_limit_t *mp;
5854 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5855 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
5857 else if (unformat (i, "ipv6"))
5860 clib_warning ("parse error '%U'", format_unformat_error, i);
5865 if (limit_set == 0) {
5866 errmsg ("missing limit value\n");
5870 M(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
5872 mp->arp_neighbor_limit = ntohl(arp_nbr_limit);
5873 mp->is_ipv6 = is_ipv6;
5880 static int api_l2_patch_add_del (vat_main_t * vam)
5882 unformat_input_t * i = vam->input;
5883 vl_api_l2_patch_add_del_t *mp;
5886 u8 rx_sw_if_index_set = 0;
5888 u8 tx_sw_if_index_set = 0;
5891 /* Parse args required to build the message */
5892 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5893 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5894 rx_sw_if_index_set = 1;
5895 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5896 tx_sw_if_index_set = 1;
5897 else if (unformat (i, "rx")) {
5898 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5899 if (unformat (i, "%U", unformat_sw_if_index, vam,
5901 rx_sw_if_index_set = 1;
5904 } else if (unformat (i, "tx")) {
5905 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5906 if (unformat (i, "%U", unformat_sw_if_index, vam,
5908 tx_sw_if_index_set = 1;
5911 } else if (unformat (i, "del"))
5917 if (rx_sw_if_index_set == 0) {
5918 errmsg ("missing rx interface name or rx_sw_if_index\n");
5922 if (tx_sw_if_index_set == 0) {
5923 errmsg ("missing tx interface name or tx_sw_if_index\n");
5927 M(L2_PATCH_ADD_DEL, l2_patch_add_del);
5929 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
5930 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
5931 mp->is_add = is_add;
5937 static int api_trace_profile_add (vat_main_t *vam)
5939 unformat_input_t * input = vam->input;
5940 vl_api_trace_profile_add_t *mp;
5943 u32 trace_option_elts = 0;
5944 u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
5945 int has_pow_option = 0;
5946 int has_ppc_option = 0;
5948 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5950 if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
5951 "trace-tsp %d node-id 0x%x app-data 0x%x",
5952 &id, &trace_type, &trace_option_elts, &trace_tsp,
5953 &node_id, &app_data))
5955 else if (unformat (input, "pow"))
5957 else if (unformat (input, "ppc encap"))
5958 has_ppc_option = PPC_ENCAP;
5959 else if (unformat (input, "ppc decap"))
5960 has_ppc_option = PPC_DECAP;
5961 else if (unformat (input, "ppc none"))
5962 has_ppc_option = PPC_NONE;
5966 M(TRACE_PROFILE_ADD, trace_profile_add);
5968 mp->trace_type = trace_type;
5969 mp->trace_num_elt = trace_option_elts;
5970 mp->trace_ppc = has_ppc_option;
5971 mp->trace_app_data = htonl(app_data);
5972 mp->pow_enable = has_pow_option;
5973 mp->trace_tsp = trace_tsp;
5974 mp->node_id = htonl(node_id);
5981 static int api_trace_profile_apply (vat_main_t *vam)
5983 unformat_input_t * input = vam->input;
5984 vl_api_trace_profile_apply_t *mp;
5987 u32 mask_width = ~0;
5994 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5996 if (unformat (input, "%U/%d",
5997 unformat_ip6_address, &addr, &mask_width))
5999 else if (unformat (input, "id %d", &id))
6001 else if (unformat (input, "vrf-id %d", &vrf_id))
6003 else if (unformat (input, "add"))
6005 else if (unformat (input, "pop"))
6007 else if (unformat (input, "none"))
6013 if ((is_add + is_pop + is_none) != 1) {
6014 errmsg("One of (add, pop, none) required");
6017 if (mask_width == ~0) {
6018 errmsg("<address>/<mask-width> required");
6021 M(TRACE_PROFILE_APPLY, trace_profile_apply);
6022 clib_memcpy(mp->dest_ipv6, &addr, sizeof(mp->dest_ipv6));
6024 mp->prefix_length = htonl(mask_width);
6025 mp->vrf_id = htonl(vrf_id);
6027 mp->trace_op = IOAM_HBYH_ADD;
6029 mp->trace_op = IOAM_HBYH_POP;
6031 mp->trace_op = IOAM_HBYH_MOD;
6043 static int api_trace_profile_del (vat_main_t *vam)
6045 vl_api_trace_profile_del_t *mp;
6048 M(TRACE_PROFILE_DEL, trace_profile_del);
6053 static int api_sr_tunnel_add_del (vat_main_t * vam)
6055 unformat_input_t * i = vam->input;
6056 vl_api_sr_tunnel_add_del_t *mp;
6060 ip6_address_t src_address;
6061 int src_address_set = 0;
6062 ip6_address_t dst_address;
6064 int dst_address_set = 0;
6066 u32 rx_table_id = 0;
6067 u32 tx_table_id = 0;
6068 ip6_address_t * segments = 0;
6069 ip6_address_t * this_seg;
6070 ip6_address_t * tags = 0;
6071 ip6_address_t * this_tag;
6072 ip6_address_t next_address, tag;
6074 u8 * policy_name = 0;
6076 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6078 if (unformat (i, "del"))
6080 else if (unformat (i, "name %s", &name))
6082 else if (unformat (i, "policy %s", &policy_name))
6084 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
6086 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
6088 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
6089 src_address_set = 1;
6090 else if (unformat (i, "dst %U/%d",
6091 unformat_ip6_address, &dst_address,
6093 dst_address_set = 1;
6094 else if (unformat (i, "next %U", unformat_ip6_address,
6097 vec_add2 (segments, this_seg, 1);
6098 clib_memcpy (this_seg->as_u8, next_address.as_u8, sizeof (*this_seg));
6100 else if (unformat (i, "tag %U", unformat_ip6_address,
6103 vec_add2 (tags, this_tag, 1);
6104 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
6106 else if (unformat (i, "clean"))
6107 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
6108 else if (unformat (i, "protected"))
6109 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
6110 else if (unformat (i, "InPE %d", &pl_index))
6112 if (pl_index <= 0 || pl_index > 4)
6114 pl_index_range_error:
6115 errmsg ("pl index %d out of range\n", pl_index);
6118 flags |= IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3*(pl_index - 1));
6120 else if (unformat (i, "EgPE %d", &pl_index))
6122 if (pl_index <= 0 || pl_index > 4)
6123 goto pl_index_range_error;
6124 flags |= IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3*(pl_index - 1));
6126 else if (unformat (i, "OrgSrc %d", &pl_index))
6128 if (pl_index <= 0 || pl_index > 4)
6129 goto pl_index_range_error;
6130 flags |= IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3*(pl_index - 1));
6136 if (!src_address_set)
6138 errmsg ("src address required\n");
6142 if (!dst_address_set)
6144 errmsg ("dst address required\n");
6150 errmsg ("at least one sr segment required\n");
6154 M2(SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
6155 vec_len(segments) * sizeof (ip6_address_t)
6156 + vec_len(tags) * sizeof (ip6_address_t));
6158 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
6159 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
6160 mp->dst_mask_width = dst_mask_width;
6161 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
6162 mp->n_segments = vec_len (segments);
6163 mp->n_tags = vec_len (tags);
6164 mp->is_add = is_del == 0;
6165 clib_memcpy (mp->segs_and_tags, segments,
6166 vec_len(segments)* sizeof (ip6_address_t));
6167 clib_memcpy (mp->segs_and_tags + vec_len(segments)*sizeof (ip6_address_t),
6168 tags, vec_len(tags)* sizeof (ip6_address_t));
6170 mp->outer_vrf_id = ntohl (rx_table_id);
6171 mp->inner_vrf_id = ntohl (tx_table_id);
6172 memcpy (mp->name, name, vec_len(name));
6173 memcpy (mp->policy_name, policy_name, vec_len(policy_name));
6175 vec_free (segments);
6182 static int api_sr_policy_add_del (vat_main_t * vam)
6184 unformat_input_t * input = vam->input;
6185 vl_api_sr_policy_add_del_t *mp;
6189 u8 * tunnel_name = 0;
6190 u8 ** tunnel_names = 0;
6195 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
6196 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
6198 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6200 if (unformat (input, "del"))
6202 else if (unformat (input, "name %s", &name))
6204 else if (unformat (input, "tunnel %s", &tunnel_name))
6208 vec_add1 (tunnel_names, tunnel_name);
6210 - length = #bytes to store in serial vector
6211 - +1 = byte to store that length
6213 tunnel_names_length += (vec_len (tunnel_name) + 1);
6224 errmsg ("policy name required\n");
6228 if ((!tunnel_set) && (!is_del))
6230 errmsg ("tunnel name required\n");
6234 M2(SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
6238 mp->is_add = !is_del;
6240 memcpy (mp->name, name, vec_len(name));
6241 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
6242 u8 * serial_orig = 0;
6243 vec_validate (serial_orig, tunnel_names_length);
6244 *serial_orig = vec_len(tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
6245 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
6247 for (j=0; j < vec_len(tunnel_names); j++)
6249 tun_name_len = vec_len (tunnel_names[j]);
6250 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
6251 serial_orig += 1; // Move along one byte to store the actual tunnel name
6252 memcpy (serial_orig, tunnel_names[j], tun_name_len);
6253 serial_orig += tun_name_len; // Advance past the copy
6255 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
6257 vec_free (tunnel_names);
6258 vec_free (tunnel_name);
6264 static int api_sr_multicast_map_add_del (vat_main_t * vam)
6266 unformat_input_t * input = vam->input;
6267 vl_api_sr_multicast_map_add_del_t *mp;
6270 ip6_address_t multicast_address;
6271 u8 * policy_name = 0;
6272 int multicast_address_set = 0;
6274 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6276 if (unformat (input, "del"))
6278 else if (unformat (input, "address %U", unformat_ip6_address, &multicast_address))
6279 multicast_address_set = 1;
6280 else if (unformat (input, "sr-policy %s", &policy_name))
6286 if (!is_del && !policy_name)
6288 errmsg ("sr-policy name required\n");
6293 if (!multicast_address_set)
6295 errmsg ("address required\n");
6299 M(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
6301 mp->is_add = !is_del;
6302 memcpy (mp->policy_name, policy_name, vec_len(policy_name));
6303 clib_memcpy (mp->multicast_address, &multicast_address, sizeof (mp->multicast_address));
6306 vec_free (policy_name);
6313 #define foreach_ip4_proto_field \
6323 uword unformat_ip4_mask (unformat_input_t * input, va_list * args)
6325 u8 ** maskp = va_arg (*args, u8 **);
6327 u8 found_something = 0;
6330 #define _(a) u8 a=0;
6331 foreach_ip4_proto_field;
6337 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6339 if (unformat (input, "version"))
6341 else if (unformat (input, "hdr_length"))
6343 else if (unformat (input, "src"))
6345 else if (unformat (input, "dst"))
6347 else if (unformat (input, "proto"))
6350 #define _(a) else if (unformat (input, #a)) a=1;
6351 foreach_ip4_proto_field
6357 #define _(a) found_something += a;
6358 foreach_ip4_proto_field;
6361 if (found_something == 0)
6364 vec_validate (mask, sizeof (*ip) - 1);
6366 ip = (ip4_header_t *) mask;
6368 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
6369 foreach_ip4_proto_field;
6372 ip->ip_version_and_header_length = 0;
6375 ip->ip_version_and_header_length |= 0xF0;
6378 ip->ip_version_and_header_length |= 0x0F;
6384 #define foreach_ip6_proto_field \
6391 uword unformat_ip6_mask (unformat_input_t * input, va_list * args)
6393 u8 ** maskp = va_arg (*args, u8 **);
6395 u8 found_something = 0;
6397 u32 ip_version_traffic_class_and_flow_label;
6399 #define _(a) u8 a=0;
6400 foreach_ip6_proto_field;
6403 u8 traffic_class = 0;
6406 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6408 if (unformat (input, "version"))
6410 else if (unformat (input, "traffic-class"))
6412 else if (unformat (input, "flow-label"))
6414 else if (unformat (input, "src"))
6416 else if (unformat (input, "dst"))
6418 else if (unformat (input, "proto"))
6421 #define _(a) else if (unformat (input, #a)) a=1;
6422 foreach_ip6_proto_field
6428 #define _(a) found_something += a;
6429 foreach_ip6_proto_field;
6432 if (found_something == 0)
6435 vec_validate (mask, sizeof (*ip) - 1);
6437 ip = (ip6_header_t *) mask;
6439 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
6440 foreach_ip6_proto_field;
6443 ip_version_traffic_class_and_flow_label = 0;
6446 ip_version_traffic_class_and_flow_label |= 0xF0000000;
6449 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
6452 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
6454 ip->ip_version_traffic_class_and_flow_label =
6455 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
6461 uword unformat_l3_mask (unformat_input_t * input, va_list * args)
6463 u8 ** maskp = va_arg (*args, u8 **);
6465 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6466 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
6468 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
6476 uword unformat_l2_mask (unformat_input_t * input, va_list * args)
6478 u8 ** maskp = va_arg (*args, u8 **);
6493 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6494 if (unformat (input, "src"))
6496 else if (unformat (input, "dst"))
6498 else if (unformat (input, "proto"))
6500 else if (unformat (input, "tag1"))
6502 else if (unformat (input, "tag2"))
6504 else if (unformat (input, "ignore-tag1"))
6506 else if (unformat (input, "ignore-tag2"))
6508 else if (unformat (input, "cos1"))
6510 else if (unformat (input, "cos2"))
6512 else if (unformat (input, "dot1q"))
6514 else if (unformat (input, "dot1ad"))
6519 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
6520 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
6523 if (tag1 || ignore_tag1 || cos1 || dot1q)
6525 if (tag2 || ignore_tag2 || cos2 || dot1ad)
6528 vec_validate (mask, len-1);
6531 memset (mask, 0xff, 6);
6534 memset (mask + 6, 0xff, 6);
6538 /* inner vlan tag */
6547 mask[21] = mask [20] = 0xff;
6568 mask[16] = mask [17] = 0xff;
6578 mask[12] = mask [13] = 0xff;
6584 uword unformat_classify_mask (unformat_input_t * input, va_list * args)
6586 u8 ** maskp = va_arg (*args, u8 **);
6587 u32 * skipp = va_arg (*args, u32 *);
6588 u32 * matchp = va_arg (*args, u32 *);
6595 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6596 if (unformat (input, "hex %U", unformat_hex_string, &mask))
6598 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
6600 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
6606 if (mask || l2 || l3)
6610 /* "With a free Ethernet header in every package" */
6612 vec_validate (l2, 13);
6614 vec_append (mask, l3);
6618 /* Scan forward looking for the first significant mask octet */
6619 for (i = 0; i < vec_len (mask); i++)
6623 /* compute (skip, match) params */
6624 *skipp = i / sizeof(u32x4);
6625 vec_delete (mask, *skipp * sizeof(u32x4), 0);
6627 /* Pad mask to an even multiple of the vector size */
6628 while (vec_len (mask) % sizeof (u32x4))
6631 match = vec_len (mask) / sizeof (u32x4);
6633 for (i = match*sizeof(u32x4); i > 0; i-= sizeof(u32x4))
6635 u64 *tmp = (u64 *)(mask + (i-sizeof(u32x4)));
6636 if (*tmp || *(tmp+1))
6641 clib_warning ("BUG: match 0");
6643 _vec_len (mask) = match * sizeof(u32x4);
6654 #define foreach_l2_next \
6656 _(ethernet, ETHERNET_INPUT) \
6660 uword unformat_l2_next_index (unformat_input_t * input, va_list * args)
6662 u32 * miss_next_indexp = va_arg (*args, u32 *);
6667 if (unformat (input, #n)) { next_index = L2_CLASSIFY_NEXT_##N; goto out;}
6671 if (unformat (input, "%d", &tmp))
6680 *miss_next_indexp = next_index;
6684 #define foreach_ip_next \
6690 uword unformat_ip_next_index (unformat_input_t * input, va_list * args)
6692 u32 * miss_next_indexp = va_arg (*args, u32 *);
6697 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
6701 if (unformat (input, "%d", &tmp))
6710 *miss_next_indexp = next_index;
6714 #define foreach_acl_next \
6717 uword unformat_acl_next_index (unformat_input_t * input, va_list * args)
6719 u32 * miss_next_indexp = va_arg (*args, u32 *);
6724 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
6728 if (unformat (input, "permit"))
6733 else if (unformat (input, "%d", &tmp))
6742 *miss_next_indexp = next_index;
6746 static int api_classify_add_del_table (vat_main_t * vam)
6748 unformat_input_t * i = vam->input;
6749 vl_api_classify_add_del_table_t *mp;
6755 u32 table_index = ~0;
6756 u32 next_table_index = ~0;
6757 u32 miss_next_index = ~0;
6758 u32 memory_size = 32<<20;
6762 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
6763 if (unformat (i, "del"))
6765 else if (unformat (i, "buckets %d", &nbuckets))
6767 else if (unformat (i, "memory_size %d", &memory_size))
6769 else if (unformat (i, "skip %d", &skip))
6771 else if (unformat (i, "match %d", &match))
6773 else if (unformat (i, "table %d", &table_index))
6775 else if (unformat (i, "mask %U", unformat_classify_mask,
6776 &mask, &skip, &match))
6778 else if (unformat (i, "next-table %d", &next_table_index))
6780 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
6783 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
6786 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
6793 if (is_add && mask == 0) {
6794 errmsg ("Mask required\n");
6798 if (is_add && skip == ~0) {
6799 errmsg ("skip count required\n");
6803 if (is_add && match == ~0) {
6804 errmsg ("match count required\n");
6808 if (!is_add && table_index == ~0) {
6809 errmsg ("table index required for delete\n");
6813 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table,
6816 mp->is_add = is_add;
6817 mp->table_index = ntohl(table_index);
6818 mp->nbuckets = ntohl(nbuckets);
6819 mp->memory_size = ntohl(memory_size);
6820 mp->skip_n_vectors = ntohl(skip);
6821 mp->match_n_vectors = ntohl(match);
6822 mp->next_table_index = ntohl(next_table_index);
6823 mp->miss_next_index = ntohl(miss_next_index);
6824 clib_memcpy (mp->mask, mask, vec_len(mask));
6832 uword unformat_ip4_match (unformat_input_t * input, va_list * args)
6834 u8 ** matchp = va_arg (*args, u8 **);
6841 int src = 0, dst = 0;
6842 ip4_address_t src_val, dst_val;
6849 int fragment_id = 0;
6850 u32 fragment_id_val;
6856 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6858 if (unformat (input, "version %d", &version_val))
6860 else if (unformat (input, "hdr_length %d", &hdr_length_val))
6862 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
6864 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
6866 else if (unformat (input, "proto %d", &proto_val))
6868 else if (unformat (input, "tos %d", &tos_val))
6870 else if (unformat (input, "length %d", &length_val))
6872 else if (unformat (input, "fragment_id %d", &fragment_id_val))
6874 else if (unformat (input, "ttl %d", &ttl_val))
6876 else if (unformat (input, "checksum %d", &checksum_val))
6882 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
6883 + ttl + checksum == 0)
6887 * Aligned because we use the real comparison functions
6889 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
6891 ip = (ip4_header_t *) match;
6893 /* These are realistically matched in practice */
6895 ip->src_address.as_u32 = src_val.as_u32;
6898 ip->dst_address.as_u32 = dst_val.as_u32;
6901 ip->protocol = proto_val;
6904 /* These are not, but they're included for completeness */
6906 ip->ip_version_and_header_length |= (version_val & 0xF)<<4;
6909 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
6915 ip->length = length_val;
6921 ip->checksum = checksum_val;
6927 uword unformat_ip6_match (unformat_input_t * input, va_list * args)
6929 u8 ** matchp = va_arg (*args, u8 **);
6935 u32 traffic_class_val;
6938 int src = 0, dst = 0;
6939 ip6_address_t src_val, dst_val;
6942 int payload_length = 0;
6943 u32 payload_length_val;
6946 u32 ip_version_traffic_class_and_flow_label;
6948 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6950 if (unformat (input, "version %d", &version_val))
6952 else if (unformat (input, "traffic_class %d", &traffic_class_val))
6954 else if (unformat (input, "flow_label %d", &flow_label_val))
6956 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
6958 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
6960 else if (unformat (input, "proto %d", &proto_val))
6962 else if (unformat (input, "payload_length %d", &payload_length_val))
6964 else if (unformat (input, "hop_limit %d", &hop_limit_val))
6970 if (version + traffic_class + flow_label + src + dst + proto +
6971 payload_length + hop_limit == 0)
6975 * Aligned because we use the real comparison functions
6977 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
6979 ip = (ip6_header_t *) match;
6982 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
6985 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
6988 ip->protocol = proto_val;
6990 ip_version_traffic_class_and_flow_label = 0;
6993 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
6996 ip_version_traffic_class_and_flow_label |= (traffic_class_val & 0xFF) << 20;
6999 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
7001 ip->ip_version_traffic_class_and_flow_label =
7002 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
7005 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
7008 ip->hop_limit = hop_limit_val;
7014 uword unformat_l3_match (unformat_input_t * input, va_list * args)
7016 u8 ** matchp = va_arg (*args, u8 **);
7018 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
7019 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
7021 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
7029 uword unformat_vlan_tag (unformat_input_t * input, va_list * args)
7031 u8 * tagp = va_arg (*args, u8 *);
7034 if (unformat(input, "%d", &tag))
7036 tagp[0] = (tag>>8) & 0x0F;
7037 tagp[1] = tag & 0xFF;
7044 uword unformat_l2_match (unformat_input_t * input, va_list * args)
7046 u8 ** matchp = va_arg (*args, u8 **);
7066 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
7067 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
7069 else if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
7071 else if (unformat (input, "proto %U",
7072 unformat_ethernet_type_host_byte_order, &proto_val))
7074 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
7076 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
7078 else if (unformat (input, "ignore-tag1"))
7080 else if (unformat (input, "ignore-tag2"))
7082 else if (unformat (input, "cos1 %d", &cos1_val))
7084 else if (unformat (input, "cos2 %d", &cos2_val))
7089 if ((src + dst + proto + tag1 + tag2 +
7090 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
7093 if (tag1 || ignore_tag1 || cos1)
7095 if (tag2 || ignore_tag2 || cos2)
7098 vec_validate_aligned (match, len-1, sizeof(u32x4));
7101 clib_memcpy (match, dst_val, 6);
7104 clib_memcpy (match + 6, src_val, 6);
7108 /* inner vlan tag */
7109 match[19] = tag2_val[1];
7110 match[18] = tag2_val[0];
7112 match [18] |= (cos2_val & 0x7) << 5;
7115 match[21] = proto_val & 0xff;
7116 match[20] = proto_val >> 8;
7120 match [15] = tag1_val[1];
7121 match [14] = tag1_val[0];
7124 match [14] |= (cos1_val & 0x7) << 5;
7130 match [15] = tag1_val[1];
7131 match [14] = tag1_val[0];
7134 match[17] = proto_val & 0xff;
7135 match[16] = proto_val >> 8;
7138 match [14] |= (cos1_val & 0x7) << 5;
7144 match [18] |= (cos2_val & 0x7) << 5;
7146 match [14] |= (cos1_val & 0x7) << 5;
7149 match[13] = proto_val & 0xff;
7150 match[12] = proto_val >> 8;
7158 uword unformat_classify_match (unformat_input_t * input, va_list * args)
7160 u8 ** matchp = va_arg (*args, u8 **);
7161 u32 skip_n_vectors = va_arg (*args, u32);
7162 u32 match_n_vectors = va_arg (*args, u32);
7168 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
7169 if (unformat (input, "hex %U", unformat_hex_string, &match))
7171 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
7173 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
7179 if (match || l2 || l3)
7183 /* "Win a free Ethernet header in every packet" */
7185 vec_validate_aligned (l2, 13, sizeof(u32x4));
7187 vec_append_aligned (match, l3, sizeof(u32x4));
7191 /* Make sure the vector is big enough even if key is all 0's */
7192 vec_validate_aligned
7193 (match, ((match_n_vectors + skip_n_vectors) * sizeof(u32x4)) - 1,
7196 /* Set size, include skipped vectors*/
7197 _vec_len (match) = (match_n_vectors+skip_n_vectors) * sizeof(u32x4);
7207 static int api_classify_add_del_session (vat_main_t * vam)
7209 unformat_input_t * i = vam->input;
7210 vl_api_classify_add_del_session_t *mp;
7212 u32 table_index = ~0;
7213 u32 hit_next_index = ~0;
7214 u32 opaque_index = ~0;
7218 u32 skip_n_vectors = 0;
7219 u32 match_n_vectors = 0;
7222 * Warning: you have to supply skip_n and match_n
7223 * because the API client cant simply look at the classify
7227 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7228 if (unformat (i, "del"))
7230 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
7233 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
7236 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
7239 else if (unformat (i, "opaque-index %d", &opaque_index))
7241 else if (unformat (i, "skip_n %d", &skip_n_vectors))
7243 else if (unformat (i, "match_n %d", &match_n_vectors))
7245 else if (unformat (i, "match %U", unformat_classify_match,
7246 &match, skip_n_vectors, match_n_vectors))
7248 else if (unformat (i, "advance %d", &advance))
7250 else if (unformat (i, "table-index %d", &table_index))
7256 if (table_index == ~0) {
7257 errmsg ("Table index required\n");
7261 if (is_add && match == 0) {
7262 errmsg ("Match value required\n");
7266 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session,
7269 mp->is_add = is_add;
7270 mp->table_index = ntohl(table_index);
7271 mp->hit_next_index = ntohl(hit_next_index);
7272 mp->opaque_index = ntohl(opaque_index);
7273 mp->advance = ntohl(advance);
7274 clib_memcpy (mp->match, match, vec_len(match));
7281 static int api_classify_set_interface_ip_table (vat_main_t * vam)
7283 unformat_input_t * i = vam->input;
7284 vl_api_classify_set_interface_ip_table_t *mp;
7287 int sw_if_index_set;
7288 u32 table_index = ~0;
7291 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7292 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7293 sw_if_index_set = 1;
7294 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7295 sw_if_index_set = 1;
7296 else if (unformat (i, "table %d", &table_index))
7299 clib_warning ("parse error '%U'", format_unformat_error, i);
7304 if (sw_if_index_set == 0) {
7305 errmsg ("missing interface name or sw_if_index\n");
7310 M(CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
7312 mp->sw_if_index = ntohl(sw_if_index);
7313 mp->table_index = ntohl(table_index);
7314 mp->is_ipv6 = is_ipv6;
7321 static int api_classify_set_interface_l2_tables (vat_main_t * vam)
7323 unformat_input_t * i = vam->input;
7324 vl_api_classify_set_interface_l2_tables_t *mp;
7327 int sw_if_index_set;
7328 u32 ip4_table_index = ~0;
7329 u32 ip6_table_index = ~0;
7330 u32 other_table_index = ~0;
7332 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7333 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7334 sw_if_index_set = 1;
7335 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7336 sw_if_index_set = 1;
7337 else if (unformat (i, "ip4-table %d", &ip4_table_index))
7339 else if (unformat (i, "ip6-table %d", &ip6_table_index))
7341 else if (unformat (i, "other-table %d", &other_table_index))
7344 clib_warning ("parse error '%U'", format_unformat_error, i);
7349 if (sw_if_index_set == 0) {
7350 errmsg ("missing interface name or sw_if_index\n");
7355 M(CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
7357 mp->sw_if_index = ntohl(sw_if_index);
7358 mp->ip4_table_index = ntohl(ip4_table_index);
7359 mp->ip6_table_index = ntohl(ip6_table_index);
7360 mp->other_table_index = ntohl(other_table_index);
7368 static int api_ipfix_enable (vat_main_t * vam)
7370 unformat_input_t * i = vam->input;
7371 vl_api_ipfix_enable_t *mp;
7372 ip4_address_t collector_address;
7373 u8 collector_address_set = 0;
7374 u32 collector_port = ~0;
7375 ip4_address_t src_address;
7376 u8 src_address_set = 0;
7379 u32 template_interval = ~0;
7382 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7383 if (unformat (i, "collector_address %U", unformat_ip4_address,
7384 &collector_address))
7385 collector_address_set = 1;
7386 else if (unformat (i, "collector_port %d", &collector_port))
7388 else if (unformat (i, "src_address %U", unformat_ip4_address,
7390 src_address_set = 1;
7391 else if (unformat (i, "vrf_id %d", &vrf_id))
7393 else if (unformat (i, "path_mtu %d", &path_mtu))
7395 else if (unformat (i, "template_interval %d", &template_interval))
7401 if (collector_address_set == 0) {
7402 errmsg ("collector_address required\n");
7406 if (src_address_set == 0) {
7407 errmsg ("src_address required\n");
7411 M (IPFIX_ENABLE, ipfix_enable);
7413 memcpy(mp->collector_address, collector_address.data,
7414 sizeof(collector_address.data));
7415 mp->collector_port = htons((u16)collector_port);
7416 memcpy(mp->src_address, src_address.data,
7417 sizeof(src_address.data));
7418 mp->vrf_id = htonl(vrf_id);
7419 mp->path_mtu = htonl(path_mtu);
7420 mp->template_interval = htonl(template_interval);
7426 static int api_get_node_index (vat_main_t * vam)
7428 unformat_input_t * i = vam->input;
7429 vl_api_get_node_index_t * mp;
7433 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7434 if (unformat (i, "node %s", &name))
7440 errmsg ("node name required\n");
7443 if (vec_len (name) >= ARRAY_LEN(mp->node_name)) {
7444 errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name));
7448 M(GET_NODE_INDEX, get_node_index);
7449 clib_memcpy (mp->node_name, name, vec_len(name));
7457 static int api_add_node_next (vat_main_t * vam)
7459 unformat_input_t * i = vam->input;
7460 vl_api_add_node_next_t * mp;
7465 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7466 if (unformat (i, "node %s", &name))
7468 else if (unformat (i, "next %s", &next))
7474 errmsg ("node name required\n");
7477 if (vec_len (name) >= ARRAY_LEN(mp->node_name)) {
7478 errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name));
7482 errmsg ("next node required\n");
7485 if (vec_len (next) >= ARRAY_LEN(mp->next_name)) {
7486 errmsg ("next name too long, max %d\n", ARRAY_LEN(mp->next_name));
7490 M(ADD_NODE_NEXT, add_node_next);
7491 clib_memcpy (mp->node_name, name, vec_len(name));
7492 clib_memcpy (mp->next_name, next, vec_len(next));
7501 static int api_l2tpv3_create_tunnel (vat_main_t * vam)
7503 unformat_input_t * i = vam->input;
7504 ip6_address_t client_address, our_address;
7505 int client_address_set = 0;
7506 int our_address_set = 0;
7507 u32 local_session_id = 0;
7508 u32 remote_session_id = 0;
7509 u64 local_cookie = 0;
7510 u64 remote_cookie = 0;
7511 u8 l2_sublayer_present = 0;
7512 vl_api_l2tpv3_create_tunnel_t * mp;
7515 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7516 if (unformat (i, "client_address %U", unformat_ip6_address,
7518 client_address_set = 1;
7519 else if (unformat (i, "our_address %U", unformat_ip6_address,
7521 our_address_set = 1;
7522 else if (unformat (i, "local_session_id %d", &local_session_id))
7524 else if (unformat (i, "remote_session_id %d", &remote_session_id))
7526 else if (unformat (i, "local_cookie %lld", &local_cookie))
7528 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
7530 else if (unformat (i, "l2-sublayer-present"))
7531 l2_sublayer_present = 1;
7536 if (client_address_set == 0) {
7537 errmsg ("client_address required\n");
7541 if (our_address_set == 0) {
7542 errmsg ("our_address required\n");
7546 M(L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
7548 clib_memcpy (mp->client_address, client_address.as_u8,
7549 sizeof (mp->client_address));
7551 clib_memcpy (mp->our_address, our_address.as_u8,
7552 sizeof (mp->our_address));
7554 mp->local_session_id = ntohl (local_session_id);
7555 mp->remote_session_id = ntohl (remote_session_id);
7556 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
7557 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
7558 mp->l2_sublayer_present = l2_sublayer_present;
7566 static int api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
7568 unformat_input_t * i = vam->input;
7570 u8 sw_if_index_set = 0;
7571 u64 new_local_cookie = 0;
7572 u64 new_remote_cookie = 0;
7573 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
7576 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7577 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7578 sw_if_index_set = 1;
7579 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7580 sw_if_index_set = 1;
7581 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
7583 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
7589 if (sw_if_index_set == 0) {
7590 errmsg ("missing interface name or sw_if_index\n");
7594 M(L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
7596 mp->sw_if_index = ntohl(sw_if_index);
7597 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
7598 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
7605 static int api_l2tpv3_interface_enable_disable (vat_main_t * vam)
7607 unformat_input_t * i = vam->input;
7608 vl_api_l2tpv3_interface_enable_disable_t *mp;
7611 u8 sw_if_index_set = 0;
7612 u8 enable_disable = 1;
7614 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7615 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7616 sw_if_index_set = 1;
7617 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7618 sw_if_index_set = 1;
7619 else if (unformat (i, "enable"))
7621 else if (unformat (i, "disable"))
7627 if (sw_if_index_set == 0) {
7628 errmsg ("missing interface name or sw_if_index\n");
7632 M(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
7634 mp->sw_if_index = ntohl(sw_if_index);
7635 mp->enable_disable = enable_disable;
7642 static int api_l2tpv3_set_lookup_key (vat_main_t * vam)
7644 unformat_input_t * i = vam->input;
7645 vl_api_l2tpv3_set_lookup_key_t * mp;
7649 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7650 if (unformat (i, "lookup_v6_src"))
7651 key = L2T_LOOKUP_SRC_ADDRESS;
7652 else if (unformat (i, "lookup_v6_dst"))
7653 key = L2T_LOOKUP_DST_ADDRESS;
7654 else if (unformat (i, "lookup_session_id"))
7655 key = L2T_LOOKUP_SESSION_ID;
7660 if (key == (u8) ~0) {
7661 errmsg ("l2tp session lookup key unset\n");
7665 M(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
7674 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
7675 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
7677 vat_main_t * vam = &vat_main;
7679 fformat(vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
7680 format_ip6_address, mp->our_address,
7681 format_ip6_address, mp->client_address,
7682 clib_net_to_host_u32(mp->sw_if_index));
7684 fformat (vam->ofp, " local cookies %016llx %016llx remote cookie %016llx\n",
7685 clib_net_to_host_u64 (mp->local_cookie[0]),
7686 clib_net_to_host_u64 (mp->local_cookie[1]),
7687 clib_net_to_host_u64 (mp->remote_cookie));
7689 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
7690 clib_net_to_host_u32 (mp->local_session_id),
7691 clib_net_to_host_u32 (mp->remote_session_id));
7693 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
7694 mp->l2_sublayer_present ? "preset" : "absent");
7698 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
7699 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
7701 vat_main_t * vam = &vat_main;
7702 vat_json_node_t *node = NULL;
7703 struct in6_addr addr;
7705 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7706 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7707 vat_json_init_array(&vam->json_tree);
7709 node = vat_json_array_add(&vam->json_tree);
7711 vat_json_init_object(node);
7713 clib_memcpy(&addr, mp->our_address, sizeof(addr));
7714 vat_json_object_add_ip6(node, "our_address", addr);
7715 clib_memcpy(&addr, mp->client_address, sizeof(addr));
7716 vat_json_object_add_ip6(node, "client_address", addr);
7718 vat_json_node_t * lc = vat_json_object_add(node, "local_cookie");
7719 vat_json_init_array(lc);
7720 vat_json_array_add_uint(lc, clib_net_to_host_u64(mp->local_cookie[0]));
7721 vat_json_array_add_uint(lc, clib_net_to_host_u64(mp->local_cookie[1]));
7722 vat_json_object_add_uint(node, "remote_cookie", clib_net_to_host_u64(mp->remote_cookie));
7724 printf("local id: %u", clib_net_to_host_u32(mp->local_session_id));
7725 vat_json_object_add_uint(node, "local_session_id", clib_net_to_host_u32(mp->local_session_id));
7726 vat_json_object_add_uint(node, "remote_session_id", clib_net_to_host_u32(mp->remote_session_id));
7727 vat_json_object_add_string_copy(node, "l2_sublayer", mp->l2_sublayer_present ?
7728 (u8*)"present" : (u8*)"absent");
7731 static int api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
7733 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
7736 /* Get list of l2tpv3-tunnel interfaces */
7737 M(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
7740 /* Use a control ping for synchronization */
7742 vl_api_control_ping_t * mp;
7743 M(CONTROL_PING, control_ping);
7750 static void vl_api_sw_interface_tap_details_t_handler
7751 (vl_api_sw_interface_tap_details_t * mp)
7753 vat_main_t * vam = &vat_main;
7755 fformat(vam->ofp, "%-16s %d\n",
7757 clib_net_to_host_u32(mp->sw_if_index));
7760 static void vl_api_sw_interface_tap_details_t_handler_json
7761 (vl_api_sw_interface_tap_details_t * mp)
7763 vat_main_t * vam = &vat_main;
7764 vat_json_node_t *node = NULL;
7766 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7767 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7768 vat_json_init_array(&vam->json_tree);
7770 node = vat_json_array_add(&vam->json_tree);
7772 vat_json_init_object(node);
7773 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
7774 vat_json_object_add_string_copy(node, "dev_name", mp->dev_name);
7777 static int api_sw_interface_tap_dump (vat_main_t * vam)
7779 vl_api_sw_interface_tap_dump_t *mp;
7782 fformat(vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
7783 /* Get list of tap interfaces */
7784 M(SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
7787 /* Use a control ping for synchronization */
7789 vl_api_control_ping_t * mp;
7790 M(CONTROL_PING, control_ping);
7796 static uword unformat_vxlan_decap_next
7797 (unformat_input_t * input, va_list * args)
7799 u32 * result = va_arg (*args, u32 *);
7802 if (unformat (input, "drop"))
7803 *result = VXLAN_INPUT_NEXT_DROP;
7804 else if (unformat (input, "ip4"))
7805 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
7806 else if (unformat (input, "ip6"))
7807 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
7808 else if (unformat (input, "l2"))
7809 *result = VXLAN_INPUT_NEXT_L2_INPUT;
7810 else if (unformat (input, "%d", &tmp))
7817 static int api_vxlan_add_del_tunnel (vat_main_t * vam)
7819 unformat_input_t * line_input = vam->input;
7820 vl_api_vxlan_add_del_tunnel_t *mp;
7822 ip4_address_t src4, dst4;
7823 ip6_address_t src6, dst6;
7825 u8 ipv4_set = 0, ipv6_set = 0;
7828 u32 encap_vrf_id = 0;
7829 u32 decap_next_index = ~0;
7832 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
7833 if (unformat (line_input, "del"))
7835 else if (unformat (line_input, "src %U",
7836 unformat_ip4_address, &src4))
7841 else if (unformat (line_input, "dst %U",
7842 unformat_ip4_address, &dst4))
7847 else if (unformat (line_input, "src %U",
7848 unformat_ip6_address, &src6))
7853 else if (unformat (line_input, "dst %U",
7854 unformat_ip6_address, &dst6))
7859 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
7861 else if (unformat (line_input, "decap-next %U",
7862 unformat_vxlan_decap_next, &decap_next_index))
7864 else if (unformat (line_input, "vni %d", &vni))
7867 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
7873 errmsg ("tunnel src address not specified\n");
7877 errmsg ("tunnel dst address not specified\n");
7881 if (ipv4_set && ipv6_set) {
7882 errmsg ("both IPv4 and IPv6 addresses specified");
7886 if ((vni == 0) || (vni>>24)) {
7887 errmsg ("vni not specified or out of range\n");
7891 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
7894 clib_memcpy(&mp->src_address, &src6, sizeof(src6));
7895 clib_memcpy(&mp->dst_address, &dst6, sizeof(dst6));
7897 clib_memcpy(&mp->src_address, &src4, sizeof(src4));
7898 clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
7900 mp->encap_vrf_id = ntohl(encap_vrf_id);
7901 mp->decap_next_index = ntohl(decap_next_index);
7902 mp->vni = ntohl(vni);
7903 mp->is_add = is_add;
7904 mp->is_ipv6 = ipv6_set;
7911 static void vl_api_vxlan_tunnel_details_t_handler
7912 (vl_api_vxlan_tunnel_details_t * mp)
7914 vat_main_t * vam = &vat_main;
7916 fformat(vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
7917 ntohl(mp->sw_if_index),
7918 format_ip46_address, &(mp->src_address[0]),
7920 format_ip46_address, &(mp->dst_address[0]),
7922 ntohl(mp->encap_vrf_id),
7923 ntohl(mp->decap_next_index),
7927 static void vl_api_vxlan_tunnel_details_t_handler_json
7928 (vl_api_vxlan_tunnel_details_t * mp)
7930 vat_main_t * vam = &vat_main;
7931 vat_json_node_t *node = NULL;
7933 struct in6_addr ip6;
7935 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7936 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7937 vat_json_init_array(&vam->json_tree);
7939 node = vat_json_array_add(&vam->json_tree);
7941 vat_json_init_object(node);
7942 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
7944 clib_memcpy(&ip6, &(mp->src_address[0]), sizeof(ip6));
7945 vat_json_object_add_ip6(node, "src_address", ip6);
7946 clib_memcpy(&ip6, &(mp->dst_address[0]), sizeof(ip6));
7947 vat_json_object_add_ip6(node, "dst_address", ip6);
7949 clib_memcpy(&ip4, &(mp->src_address[0]), sizeof(ip4));
7950 vat_json_object_add_ip4(node, "src_address", ip4);
7951 clib_memcpy(&ip4, &(mp->dst_address[0]), sizeof(ip4));
7952 vat_json_object_add_ip4(node, "dst_address", ip4);
7954 vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
7955 vat_json_object_add_uint(node, "decap_next_index", ntohl(mp->decap_next_index));
7956 vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
7957 vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
7960 static int api_vxlan_tunnel_dump (vat_main_t * vam)
7962 unformat_input_t * i = vam->input;
7963 vl_api_vxlan_tunnel_dump_t *mp;
7966 u8 sw_if_index_set = 0;
7968 /* Parse args required to build the message */
7969 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7970 if (unformat (i, "sw_if_index %d", &sw_if_index))
7971 sw_if_index_set = 1;
7976 if (sw_if_index_set == 0) {
7980 if (!vam->json_output) {
7981 fformat(vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
7982 "sw_if_index", "src_address", "dst_address",
7983 "encap_vrf_id", "decap_next_index", "vni");
7986 /* Get list of vxlan-tunnel interfaces */
7987 M(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
7989 mp->sw_if_index = htonl(sw_if_index);
7993 /* Use a control ping for synchronization */
7995 vl_api_control_ping_t * mp;
7996 M(CONTROL_PING, control_ping);
8002 static int api_gre_add_del_tunnel (vat_main_t * vam)
8004 unformat_input_t * line_input = vam->input;
8005 vl_api_gre_add_del_tunnel_t *mp;
8007 ip4_address_t src4, dst4;
8011 u32 outer_fib_id = 0;
8013 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8014 if (unformat (line_input, "del"))
8016 else if (unformat (line_input, "src %U",
8017 unformat_ip4_address, &src4))
8019 else if (unformat (line_input, "dst %U",
8020 unformat_ip4_address, &dst4))
8022 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
8025 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
8031 errmsg ("tunnel src address not specified\n");
8035 errmsg ("tunnel dst address not specified\n");
8040 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
8042 clib_memcpy(&mp->src_address, &src4, sizeof(src4));
8043 clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
8044 mp->outer_table_id = ntohl(outer_fib_id);
8045 mp->is_add = is_add;
8052 static void vl_api_gre_tunnel_details_t_handler
8053 (vl_api_gre_tunnel_details_t * mp)
8055 vat_main_t * vam = &vat_main;
8057 fformat(vam->ofp, "%11d%15U%15U%14d\n",
8058 ntohl(mp->sw_if_index),
8059 format_ip4_address, &mp->src_address,
8060 format_ip4_address, &mp->dst_address,
8061 ntohl(mp->outer_table_id));
8064 static void vl_api_gre_tunnel_details_t_handler_json
8065 (vl_api_gre_tunnel_details_t * mp)
8067 vat_main_t * vam = &vat_main;
8068 vat_json_node_t *node = NULL;
8071 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8072 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8073 vat_json_init_array(&vam->json_tree);
8075 node = vat_json_array_add(&vam->json_tree);
8077 vat_json_init_object(node);
8078 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8079 clib_memcpy(&ip4, &mp->src_address, sizeof(ip4));
8080 vat_json_object_add_ip4(node, "src_address", ip4);
8081 clib_memcpy(&ip4, &mp->dst_address, sizeof(ip4));
8082 vat_json_object_add_ip4(node, "dst_address", ip4);
8083 vat_json_object_add_uint(node, "outer_fib_id", ntohl(mp->outer_table_id));
8086 static int api_gre_tunnel_dump (vat_main_t * vam)
8088 unformat_input_t * i = vam->input;
8089 vl_api_gre_tunnel_dump_t *mp;
8092 u8 sw_if_index_set = 0;
8094 /* Parse args required to build the message */
8095 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8096 if (unformat (i, "sw_if_index %d", &sw_if_index))
8097 sw_if_index_set = 1;
8102 if (sw_if_index_set == 0) {
8106 if (!vam->json_output) {
8107 fformat(vam->ofp, "%11s%15s%15s%14s\n",
8108 "sw_if_index", "src_address", "dst_address",
8112 /* Get list of gre-tunnel interfaces */
8113 M(GRE_TUNNEL_DUMP, gre_tunnel_dump);
8115 mp->sw_if_index = htonl(sw_if_index);
8119 /* Use a control ping for synchronization */
8121 vl_api_control_ping_t * mp;
8122 M(CONTROL_PING, control_ping);
8128 static int api_l2_fib_clear_table (vat_main_t * vam)
8130 // unformat_input_t * i = vam->input;
8131 vl_api_l2_fib_clear_table_t *mp;
8134 M(L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
8141 static int api_l2_interface_efp_filter (vat_main_t * vam)
8143 unformat_input_t * i = vam->input;
8144 vl_api_l2_interface_efp_filter_t *mp;
8148 u8 sw_if_index_set = 0;
8150 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8151 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8152 sw_if_index_set = 1;
8153 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8154 sw_if_index_set = 1;
8155 else if (unformat (i, "enable"))
8157 else if (unformat (i, "disable"))
8160 clib_warning ("parse error '%U'", format_unformat_error, i);
8165 if (sw_if_index_set == 0) {
8166 errmsg ("missing sw_if_index\n");
8170 M(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
8172 mp->sw_if_index = ntohl(sw_if_index);
8173 mp->enable_disable = enable;
8180 #define foreach_vtr_op \
8181 _("disable", L2_VTR_DISABLED) \
8182 _("push-1", L2_VTR_PUSH_1) \
8183 _("push-2", L2_VTR_PUSH_2) \
8184 _("pop-1", L2_VTR_POP_1) \
8185 _("pop-2", L2_VTR_POP_2) \
8186 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
8187 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
8188 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
8189 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
8191 static int api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
8193 unformat_input_t * i = vam->input;
8194 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
8197 u8 sw_if_index_set = 0;
8204 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8205 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8206 sw_if_index_set = 1;
8207 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8208 sw_if_index_set = 1;
8209 else if (unformat (i, "vtr_op %d", &vtr_op))
8211 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
8215 else if (unformat (i, "push_dot1q %d", &push_dot1q))
8217 else if (unformat (i, "tag1 %d", &tag1))
8219 else if (unformat (i, "tag2 %d", &tag2))
8222 clib_warning ("parse error '%U'", format_unformat_error, i);
8227 if ((sw_if_index_set == 0)||(vtr_op_set == 0)) {
8228 errmsg ("missing vtr operation or sw_if_index\n");
8232 M(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
8234 mp->sw_if_index = ntohl(sw_if_index);
8235 mp->vtr_op = ntohl(vtr_op);
8236 mp->push_dot1q = ntohl(push_dot1q);
8237 mp->tag1 = ntohl(tag1);
8238 mp->tag2 = ntohl(tag2);
8245 static int api_create_vhost_user_if (vat_main_t * vam)
8247 unformat_input_t * i = vam->input;
8248 vl_api_create_vhost_user_if_t *mp;
8252 u8 file_name_set = 0;
8253 u32 custom_dev_instance = ~0;
8255 u8 use_custom_mac = 0;
8257 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8258 if (unformat (i, "socket %s", &file_name)) {
8261 else if (unformat (i, "renumber %"PRIu32, &custom_dev_instance))
8263 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
8265 else if (unformat (i, "server"))
8271 if (file_name_set == 0) {
8272 errmsg ("missing socket file name\n");
8276 if (vec_len (file_name) > 255) {
8277 errmsg ("socket file name too long\n");
8280 vec_add1 (file_name, 0);
8282 M(CREATE_VHOST_USER_IF, create_vhost_user_if);
8284 mp->is_server = is_server;
8285 clib_memcpy(mp->sock_filename, file_name, vec_len(file_name));
8286 vec_free(file_name);
8287 if (custom_dev_instance != ~0) {
8289 mp->custom_dev_instance = ntohl(custom_dev_instance);
8291 mp->use_custom_mac = use_custom_mac;
8292 clib_memcpy(mp->mac_address, hwaddr, 6);
8299 static int api_modify_vhost_user_if (vat_main_t * vam)
8301 unformat_input_t * i = vam->input;
8302 vl_api_modify_vhost_user_if_t *mp;
8306 u8 file_name_set = 0;
8307 u32 custom_dev_instance = ~0;
8308 u8 sw_if_index_set = 0;
8309 u32 sw_if_index = (u32)~0;
8311 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8312 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8313 sw_if_index_set = 1;
8314 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8315 sw_if_index_set = 1;
8316 else if (unformat (i, "socket %s", &file_name)) {
8319 else if (unformat (i, "renumber %"PRIu32, &custom_dev_instance))
8321 else if (unformat (i, "server"))
8327 if (sw_if_index_set == 0) {
8328 errmsg ("missing sw_if_index or interface name\n");
8332 if (file_name_set == 0) {
8333 errmsg ("missing socket file name\n");
8337 if (vec_len (file_name) > 255) {
8338 errmsg ("socket file name too long\n");
8341 vec_add1 (file_name, 0);
8343 M(MODIFY_VHOST_USER_IF, modify_vhost_user_if);
8345 mp->sw_if_index = ntohl(sw_if_index);
8346 mp->is_server = is_server;
8347 clib_memcpy(mp->sock_filename, file_name, vec_len(file_name));
8348 vec_free(file_name);
8349 if (custom_dev_instance != ~0) {
8351 mp->custom_dev_instance = ntohl(custom_dev_instance);
8359 static int api_delete_vhost_user_if (vat_main_t * vam)
8361 unformat_input_t * i = vam->input;
8362 vl_api_delete_vhost_user_if_t *mp;
8364 u32 sw_if_index = ~0;
8365 u8 sw_if_index_set = 0;
8367 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8368 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8369 sw_if_index_set = 1;
8370 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8371 sw_if_index_set = 1;
8376 if (sw_if_index_set == 0) {
8377 errmsg ("missing sw_if_index or interface name\n");
8382 M(DELETE_VHOST_USER_IF, delete_vhost_user_if);
8384 mp->sw_if_index = ntohl(sw_if_index);
8391 static void vl_api_sw_interface_vhost_user_details_t_handler
8392 (vl_api_sw_interface_vhost_user_details_t * mp)
8394 vat_main_t * vam = &vat_main;
8396 fformat(vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
8397 (char *)mp->interface_name,
8398 ntohl(mp->sw_if_index), ntohl(mp->virtio_net_hdr_sz),
8399 clib_net_to_host_u64(mp->features), mp->is_server,
8400 ntohl(mp->num_regions), (char *)mp->sock_filename);
8401 fformat(vam->ofp, " Status: '%s'\n", strerror(ntohl(mp->sock_errno)));
8404 static void vl_api_sw_interface_vhost_user_details_t_handler_json
8405 (vl_api_sw_interface_vhost_user_details_t * mp)
8407 vat_main_t * vam = &vat_main;
8408 vat_json_node_t *node = NULL;
8410 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8411 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8412 vat_json_init_array(&vam->json_tree);
8414 node = vat_json_array_add(&vam->json_tree);
8416 vat_json_init_object(node);
8417 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8418 vat_json_object_add_string_copy(node, "interface_name", mp->interface_name);
8419 vat_json_object_add_uint(node, "virtio_net_hdr_sz", ntohl(mp->virtio_net_hdr_sz));
8420 vat_json_object_add_uint(node, "features", clib_net_to_host_u64(mp->features));
8421 vat_json_object_add_uint(node, "is_server", mp->is_server);
8422 vat_json_object_add_string_copy(node, "sock_filename", mp->sock_filename);
8423 vat_json_object_add_uint(node, "num_regions", ntohl(mp->num_regions));
8424 vat_json_object_add_uint(node, "sock_errno", ntohl(mp->sock_errno));
8427 static int api_sw_interface_vhost_user_dump (vat_main_t * vam)
8429 vl_api_sw_interface_vhost_user_dump_t *mp;
8431 fformat(vam->ofp, "Interface name idx hdr_sz features server regions filename\n");
8433 /* Get list of vhost-user interfaces */
8434 M(SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
8437 /* Use a control ping for synchronization */
8439 vl_api_control_ping_t * mp;
8440 M(CONTROL_PING, control_ping);
8446 static int api_show_version (vat_main_t * vam)
8448 vl_api_show_version_t *mp;
8451 M(SHOW_VERSION, show_version);
8459 static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
8461 unformat_input_t * line_input = vam->input;
8462 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
8464 ip4_address_t local4, remote4;
8465 ip6_address_t local6, remote6;
8467 u8 ipv4_set = 0, ipv6_set = 0;
8470 u32 encap_vrf_id = 0;
8471 u32 decap_vrf_id = 0;
8476 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8477 if (unformat (line_input, "del"))
8479 else if (unformat (line_input, "local %U",
8480 unformat_ip4_address, &local4))
8485 else if (unformat (line_input, "remote %U",
8486 unformat_ip4_address, &remote4))
8491 else if (unformat (line_input, "local %U",
8492 unformat_ip6_address, &local6))
8497 else if (unformat (line_input, "remote %U",
8498 unformat_ip6_address, &remote6))
8503 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
8505 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
8507 else if (unformat (line_input, "vni %d", &vni))
8509 else if (unformat(line_input, "next-ip4"))
8511 else if (unformat(line_input, "next-ip6"))
8513 else if (unformat(line_input, "next-ethernet"))
8515 else if (unformat(line_input, "next-nsh"))
8518 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
8523 if (local_set == 0) {
8524 errmsg ("tunnel local address not specified\n");
8527 if (remote_set == 0) {
8528 errmsg ("tunnel remote address not specified\n");
8531 if (ipv4_set && ipv6_set) {
8532 errmsg ("both IPv4 and IPv6 addresses specified");
8537 errmsg ("vni not specified\n");
8541 M(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
8545 clib_memcpy(&mp->local, &local6, sizeof(local6));
8546 clib_memcpy(&mp->remote, &remote6, sizeof(remote6));
8548 clib_memcpy(&mp->local, &local4, sizeof(local4));
8549 clib_memcpy(&mp->remote, &remote4, sizeof(remote4));
8552 mp->encap_vrf_id = ntohl(encap_vrf_id);
8553 mp->decap_vrf_id = ntohl(decap_vrf_id);
8554 mp->protocol = ntohl(protocol);
8555 mp->vni = ntohl(vni);
8556 mp->is_add = is_add;
8557 mp->is_ipv6 = ipv6_set;
8564 static void vl_api_vxlan_gpe_tunnel_details_t_handler
8565 (vl_api_vxlan_gpe_tunnel_details_t * mp)
8567 vat_main_t * vam = &vat_main;
8569 fformat(vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
8570 ntohl(mp->sw_if_index),
8571 format_ip46_address, &(mp->local[0]),
8572 format_ip46_address, &(mp->remote[0]),
8574 ntohl(mp->protocol),
8575 ntohl(mp->encap_vrf_id),
8576 ntohl(mp->decap_vrf_id));
8579 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
8580 (vl_api_vxlan_gpe_tunnel_details_t * mp)
8582 vat_main_t * vam = &vat_main;
8583 vat_json_node_t *node = NULL;
8585 struct in6_addr ip6;
8587 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8588 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8589 vat_json_init_array(&vam->json_tree);
8591 node = vat_json_array_add(&vam->json_tree);
8593 vat_json_init_object(node);
8594 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8596 clib_memcpy(&ip6, &(mp->local[0]), sizeof(ip6));
8597 vat_json_object_add_ip6(node, "local", ip6);
8598 clib_memcpy(&ip6, &(mp->remote[0]), sizeof(ip6));
8599 vat_json_object_add_ip6(node, "remote", ip6);
8601 clib_memcpy(&ip4, &(mp->local[0]), sizeof(ip4));
8602 vat_json_object_add_ip4(node, "local", ip4);
8603 clib_memcpy(&ip4, &(mp->remote[0]), sizeof(ip4));
8604 vat_json_object_add_ip4(node, "remote", ip4);
8606 vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
8607 vat_json_object_add_uint(node, "protocol", ntohl(mp->protocol));
8608 vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
8609 vat_json_object_add_uint(node, "decap_vrf_id", ntohl(mp->decap_vrf_id));
8610 vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
8613 static int api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
8615 unformat_input_t * i = vam->input;
8616 vl_api_vxlan_gpe_tunnel_dump_t *mp;
8619 u8 sw_if_index_set = 0;
8621 /* Parse args required to build the message */
8622 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8623 if (unformat (i, "sw_if_index %d", &sw_if_index))
8624 sw_if_index_set = 1;
8629 if (sw_if_index_set == 0) {
8633 if (!vam->json_output) {
8634 fformat(vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
8635 "sw_if_index", "local", "remote", "vni",
8636 "protocol","encap_vrf_id", "decap_vrf_id");
8639 /* Get list of vxlan-tunnel interfaces */
8640 M(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
8642 mp->sw_if_index = htonl(sw_if_index);
8646 /* Use a control ping for synchronization */
8648 vl_api_control_ping_t * mp;
8649 M(CONTROL_PING, control_ping);
8655 u8 * format_l2_fib_mac_address (u8 * s, va_list * args)
8657 u8 * a = va_arg (*args, u8 *);
8659 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
8660 a[2], a[3], a[4], a[5], a[6], a[7]);
8663 static void vl_api_l2_fib_table_entry_t_handler
8664 (vl_api_l2_fib_table_entry_t * mp)
8666 vat_main_t * vam = &vat_main;
8668 fformat(vam->ofp, "%3" PRIu32 " %U %3" PRIu32
8670 ntohl(mp->bd_id), format_l2_fib_mac_address, &mp->mac,
8671 ntohl(mp->sw_if_index), mp->static_mac, mp->filter_mac,
8675 static void vl_api_l2_fib_table_entry_t_handler_json
8676 (vl_api_l2_fib_table_entry_t * mp)
8678 vat_main_t * vam = &vat_main;
8679 vat_json_node_t *node = NULL;
8681 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8682 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8683 vat_json_init_array(&vam->json_tree);
8685 node = vat_json_array_add(&vam->json_tree);
8687 vat_json_init_object(node);
8688 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
8689 vat_json_object_add_uint(node, "mac", clib_net_to_host_u64(mp->mac));
8690 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8691 vat_json_object_add_uint(node, "static_mac", mp->static_mac);
8692 vat_json_object_add_uint(node, "filter_mac", mp->filter_mac);
8693 vat_json_object_add_uint(node, "bvi_mac", mp->bvi_mac);
8696 static int api_l2_fib_table_dump (vat_main_t * vam)
8698 unformat_input_t * i = vam->input;
8699 vl_api_l2_fib_table_dump_t *mp;
8704 /* Parse args required to build the message */
8705 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8706 if (unformat (i, "bd_id %d", &bd_id))
8712 if (bd_id_set == 0) {
8713 errmsg ("missing bridge domain\n");
8717 fformat(vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI\n");
8719 /* Get list of l2 fib entries */
8720 M(L2_FIB_TABLE_DUMP, l2_fib_table_dump);
8722 mp->bd_id = ntohl(bd_id);
8725 /* Use a control ping for synchronization */
8727 vl_api_control_ping_t * mp;
8728 M(CONTROL_PING, control_ping);
8736 api_interface_name_renumber (vat_main_t * vam)
8738 unformat_input_t * line_input = vam->input;
8739 vl_api_interface_name_renumber_t *mp;
8740 u32 sw_if_index = ~0;
8742 u32 new_show_dev_instance = ~0;
8744 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8745 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
8748 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
8750 else if (unformat (line_input, "new_show_dev_instance %d",
8751 &new_show_dev_instance))
8757 if (sw_if_index == ~0) {
8758 errmsg ("missing interface name or sw_if_index\n");
8762 if (new_show_dev_instance == ~0) {
8763 errmsg ("missing new_show_dev_instance\n");
8767 M(INTERFACE_NAME_RENUMBER, interface_name_renumber);
8769 mp->sw_if_index = ntohl (sw_if_index);
8770 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
8776 api_want_ip4_arp_events (vat_main_t * vam)
8778 unformat_input_t * line_input = vam->input;
8779 vl_api_want_ip4_arp_events_t * mp;
8781 ip4_address_t address;
8782 int address_set = 0;
8783 u32 enable_disable = 1;
8785 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8786 if (unformat (line_input, "address %U",
8787 unformat_ip4_address, &address))
8789 else if (unformat (line_input, "del"))
8795 if (address_set == 0) {
8796 errmsg ("missing addresses\n");
8800 M(WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
8801 mp->enable_disable = enable_disable;
8803 mp->address = address.as_u32;
8808 static int api_input_acl_set_interface (vat_main_t * vam)
8810 unformat_input_t * i = vam->input;
8811 vl_api_input_acl_set_interface_t *mp;
8814 int sw_if_index_set;
8815 u32 ip4_table_index = ~0;
8816 u32 ip6_table_index = ~0;
8817 u32 l2_table_index = ~0;
8820 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8821 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8822 sw_if_index_set = 1;
8823 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8824 sw_if_index_set = 1;
8825 else if (unformat (i, "del"))
8827 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8829 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8831 else if (unformat (i, "l2-table %d", &l2_table_index))
8834 clib_warning ("parse error '%U'", format_unformat_error, i);
8839 if (sw_if_index_set == 0) {
8840 errmsg ("missing interface name or sw_if_index\n");
8844 M(INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
8846 mp->sw_if_index = ntohl(sw_if_index);
8847 mp->ip4_table_index = ntohl(ip4_table_index);
8848 mp->ip6_table_index = ntohl(ip6_table_index);
8849 mp->l2_table_index = ntohl(l2_table_index);
8850 mp->is_add = is_add;
8858 api_ip_address_dump (vat_main_t * vam)
8860 unformat_input_t * i = vam->input;
8861 vl_api_ip_address_dump_t * mp;
8862 u32 sw_if_index = ~0;
8863 u8 sw_if_index_set = 0;
8868 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8869 if (unformat (i, "sw_if_index %d", &sw_if_index))
8870 sw_if_index_set = 1;
8871 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8872 sw_if_index_set = 1;
8873 else if (unformat (i, "ipv4"))
8875 else if (unformat (i, "ipv6"))
8881 if (ipv4_set && ipv6_set) {
8882 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
8886 if ((!ipv4_set) && (!ipv6_set)) {
8887 errmsg ("no ipv4 nor ipv6 flag set\n");
8891 if (sw_if_index_set == 0) {
8892 errmsg ("missing interface name or sw_if_index\n");
8896 vam->current_sw_if_index = sw_if_index;
8897 vam->is_ipv6 = ipv6_set;
8899 M(IP_ADDRESS_DUMP, ip_address_dump);
8900 mp->sw_if_index = ntohl(sw_if_index);
8901 mp->is_ipv6 = ipv6_set;
8904 /* Use a control ping for synchronization */
8906 vl_api_control_ping_t * mp;
8907 M(CONTROL_PING, control_ping);
8914 api_ip_dump (vat_main_t * vam)
8916 vl_api_ip_dump_t * mp;
8917 unformat_input_t * in = vam->input;
8924 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT) {
8925 if (unformat (in, "ipv4"))
8927 else if (unformat (in, "ipv6"))
8933 if (ipv4_set && ipv6_set) {
8934 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
8938 if ((!ipv4_set) && (!ipv6_set)) {
8939 errmsg ("no ipv4 nor ipv6 flag set\n");
8944 vam->is_ipv6 = is_ipv6;
8947 for (i = 0; i < vec_len(vam->ip_details_by_sw_if_index[is_ipv6]); i++) {
8948 vec_free(vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
8950 vec_free(vam->ip_details_by_sw_if_index[is_ipv6]);
8952 M(IP_DUMP, ip_dump);
8953 mp->is_ipv6 = ipv6_set;
8956 /* Use a control ping for synchronization */
8958 vl_api_control_ping_t * mp;
8959 M(CONTROL_PING, control_ping);
8966 api_ipsec_spd_add_del (vat_main_t * vam)
8969 unformat_input_t * i = vam->input;
8970 vl_api_ipsec_spd_add_del_t *mp;
8975 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8976 if (unformat (i, "spd_id %d", &spd_id))
8978 else if (unformat (i, "del"))
8981 clib_warning ("parse error '%U'", format_unformat_error, i);
8986 errmsg ("spd_id must be set\n");
8990 M(IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
8992 mp->spd_id = ntohl(spd_id);
8993 mp->is_add = is_add;
8999 clib_warning ("unsupported (no dpdk)");
9005 api_ipsec_interface_add_del_spd (vat_main_t * vam)
9008 unformat_input_t * i = vam->input;
9009 vl_api_ipsec_interface_add_del_spd_t *mp;
9012 u8 sw_if_index_set = 0;
9013 u32 spd_id = (u32) ~0;
9016 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9017 if (unformat (i, "del"))
9019 else if (unformat (i, "spd_id %d", &spd_id))
9021 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9022 sw_if_index_set = 1;
9023 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9024 sw_if_index_set = 1;
9026 clib_warning ("parse error '%U'", format_unformat_error, i);
9032 if (spd_id == (u32) ~0) {
9033 errmsg ("spd_id must be set\n");
9037 if (sw_if_index_set == 0) {
9038 errmsg ("missing interface name or sw_if_index\n");
9042 M(IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
9044 mp->spd_id = ntohl(spd_id);
9045 mp->sw_if_index = ntohl (sw_if_index);
9046 mp->is_add = is_add;
9052 clib_warning ("unsupported (no dpdk)");
9058 api_ipsec_spd_add_del_entry (vat_main_t * vam)
9061 unformat_input_t * i = vam->input;
9062 vl_api_ipsec_spd_add_del_entry_t *mp;
9064 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
9065 u32 spd_id, sa_id, protocol = 0, policy = 0;
9067 u32 rport_start = 0, rport_stop = (u32) ~0;
9068 u32 lport_start = 0, lport_stop = (u32) ~0;
9069 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
9070 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
9072 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
9073 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~0;
9074 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
9075 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
9076 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~0;
9077 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~0;
9079 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9080 if (unformat (i, "del"))
9082 if (unformat (i, "outbound"))
9084 if (unformat (i, "inbound"))
9086 else if (unformat (i, "spd_id %d", &spd_id))
9088 else if (unformat (i, "sa_id %d", &sa_id))
9090 else if (unformat (i, "priority %d", &priority))
9092 else if (unformat (i, "protocol %d", &protocol))
9094 else if (unformat (i, "lport_start %d", &lport_start))
9096 else if (unformat (i, "lport_stop %d", &lport_stop))
9098 else if (unformat (i, "rport_start %d", &rport_start))
9100 else if (unformat (i, "rport_stop %d", &rport_stop))
9102 else if (unformat (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
9107 else if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
9112 else if (unformat (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
9117 else if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
9122 else if (unformat (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
9127 else if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
9132 else if (unformat (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
9137 else if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
9142 else if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
9144 if (policy == IPSEC_POLICY_ACTION_RESOLVE) {
9145 clib_warning ("unsupported action: 'resolve'");
9150 clib_warning ("parse error '%U'", format_unformat_error, i);
9156 M(IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
9158 mp->spd_id = ntohl(spd_id);
9159 mp->priority = ntohl(priority);
9160 mp->is_outbound = is_outbound;
9162 mp->is_ipv6 = is_ipv6;
9163 if (is_ipv6 || is_ip_any) {
9164 clib_memcpy (mp->remote_address_start, &raddr6_start, sizeof(ip6_address_t));
9165 clib_memcpy (mp->remote_address_stop, &raddr6_stop, sizeof(ip6_address_t));
9166 clib_memcpy (mp->local_address_start, &laddr6_start, sizeof(ip6_address_t));
9167 clib_memcpy (mp->local_address_stop, &laddr6_stop, sizeof(ip6_address_t));
9169 clib_memcpy (mp->remote_address_start, &raddr4_start, sizeof(ip4_address_t));
9170 clib_memcpy (mp->remote_address_stop, &raddr4_stop, sizeof(ip4_address_t));
9171 clib_memcpy (mp->local_address_start, &laddr4_start, sizeof(ip4_address_t));
9172 clib_memcpy (mp->local_address_stop, &laddr4_stop, sizeof(ip4_address_t));
9174 mp->protocol = (u8) protocol;
9175 mp->local_port_start = ntohs((u16) lport_start);
9176 mp->local_port_stop = ntohs((u16) lport_stop);
9177 mp->remote_port_start = ntohs((u16) rport_start);
9178 mp->remote_port_stop = ntohs((u16) rport_stop);
9179 mp->policy = (u8) policy;
9180 mp->sa_id = ntohl(sa_id);
9181 mp->is_add = is_add;
9182 mp->is_ip_any = is_ip_any;
9187 clib_warning ("unsupported (no dpdk)");
9193 api_ipsec_sad_add_del_entry (vat_main_t * vam)
9196 unformat_input_t * i = vam->input;
9197 vl_api_ipsec_sad_add_del_entry_t *mp;
9203 u8 protocol = IPSEC_PROTOCOL_AH;
9204 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
9205 u32 crypto_alg = 0, integ_alg = 0;
9206 ip4_address_t tun_src4;
9207 ip4_address_t tun_dst4;
9208 ip6_address_t tun_src6;
9209 ip6_address_t tun_dst6;
9211 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9212 if (unformat (i, "del"))
9214 else if (unformat (i, "sad_id %d", &sad_id))
9216 else if (unformat (i, "spi %d", &spi))
9218 else if (unformat (i, "esp"))
9219 protocol = IPSEC_PROTOCOL_ESP;
9220 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4)) {
9224 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4)) {
9228 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6)) {
9232 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6)) {
9236 else if (unformat (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg)) {
9237 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
9238 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256) {
9239 clib_warning ("unsupported crypto-alg: '%U'",
9240 format_ipsec_crypto_alg, crypto_alg);
9244 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
9246 else if (unformat (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg)) {
9247 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
9248 integ_alg > IPSEC_INTEG_ALG_SHA_512_256) {
9249 clib_warning ("unsupported integ-alg: '%U'",
9250 format_ipsec_integ_alg, integ_alg);
9254 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
9257 clib_warning ("parse error '%U'", format_unformat_error, i);
9263 M(IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
9265 mp->sad_id = ntohl(sad_id);
9266 mp->is_add = is_add;
9267 mp->protocol = protocol;
9268 mp->spi = ntohl(spi);
9269 mp->is_tunnel = is_tunnel;
9270 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
9271 mp->crypto_algorithm = crypto_alg;
9272 mp->integrity_algorithm = integ_alg;
9273 mp->crypto_key_length = vec_len(ck);
9274 mp->integrity_key_length = vec_len(ik);
9276 if (mp->crypto_key_length > sizeof(mp->crypto_key))
9277 mp->crypto_key_length = sizeof(mp->crypto_key);
9279 if (mp->integrity_key_length > sizeof(mp->integrity_key))
9280 mp->integrity_key_length = sizeof(mp->integrity_key);
9282 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
9283 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
9286 if (is_tunnel_ipv6) {
9287 clib_memcpy (mp->tunnel_src_address, &tun_src6, sizeof(ip6_address_t));
9288 clib_memcpy (mp->tunnel_dst_address, &tun_dst6, sizeof(ip6_address_t));
9290 clib_memcpy (mp->tunnel_src_address, &tun_src4, sizeof(ip4_address_t));
9291 clib_memcpy (mp->tunnel_dst_address, &tun_dst4, sizeof(ip4_address_t));
9299 clib_warning ("unsupported (no dpdk)");
9305 api_ipsec_sa_set_key (vat_main_t * vam)
9308 unformat_input_t * i = vam->input;
9309 vl_api_ipsec_sa_set_key_t *mp;
9314 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9315 if (unformat (i, "sa_id %d", &sa_id))
9317 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
9319 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
9322 clib_warning ("parse error '%U'", format_unformat_error, i);
9327 M(IPSEC_SA_SET_KEY, ipsec_set_sa_key);
9329 mp->sa_id = ntohl(sa_id);
9330 mp->crypto_key_length = vec_len(ck);
9331 mp->integrity_key_length = vec_len(ik);
9333 if (mp->crypto_key_length > sizeof(mp->crypto_key))
9334 mp->crypto_key_length = sizeof(mp->crypto_key);
9336 if (mp->integrity_key_length > sizeof(mp->integrity_key))
9337 mp->integrity_key_length = sizeof(mp->integrity_key);
9339 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
9340 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
9346 clib_warning ("unsupported (no dpdk)");
9352 api_ikev2_profile_add_del (vat_main_t * vam)
9355 unformat_input_t * i = vam->input;
9356 vl_api_ikev2_profile_add_del_t * mp;
9361 const char * valid_chars = "a-zA-Z0-9_";
9363 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9364 if (unformat (i, "del"))
9366 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9369 errmsg ("parse error '%U'", format_unformat_error, i);
9374 if (!vec_len (name)) {
9375 errmsg ("profile name must be specified");
9379 if (vec_len (name) > 64) {
9380 errmsg ("profile name too long");
9384 M(IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
9386 clib_memcpy(mp->name, name, vec_len (name));
9387 mp->is_add = is_add;
9394 clib_warning ("unsupported (no dpdk)");
9400 api_ikev2_profile_set_auth (vat_main_t * vam)
9403 unformat_input_t * i = vam->input;
9404 vl_api_ikev2_profile_set_auth_t * mp;
9408 u32 auth_method = 0;
9411 const char * valid_chars = "a-zA-Z0-9_";
9413 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9414 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9416 else if (unformat (i, "auth_method %U",
9417 unformat_ikev2_auth_method, &auth_method))
9419 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
9421 else if (unformat (i, "auth_data %v", &data))
9424 errmsg ("parse error '%U'", format_unformat_error, i);
9429 if (!vec_len (name)) {
9430 errmsg ("profile name must be specified");
9434 if (vec_len (name) > 64) {
9435 errmsg ("profile name too long");
9439 if (!vec_len(data)) {
9440 errmsg ("auth_data must be specified");
9445 errmsg ("auth_method must be specified");
9449 M(IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
9451 mp->is_hex = is_hex;
9452 mp->auth_method = (u8) auth_method;
9453 mp->data_len = vec_len (data);
9454 clib_memcpy (mp->name, name, vec_len (name));
9455 clib_memcpy (mp->data, data, vec_len (data));
9463 clib_warning ("unsupported (no dpdk)");
9469 api_ikev2_profile_set_id (vat_main_t * vam)
9472 unformat_input_t * i = vam->input;
9473 vl_api_ikev2_profile_set_id_t * mp;
9481 const char * valid_chars = "a-zA-Z0-9_";
9483 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9484 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9486 else if (unformat (i, "id_type %U",
9487 unformat_ikev2_id_type, &id_type))
9489 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
9491 data = vec_new(u8, 4);
9492 clib_memcpy(data, ip4.as_u8, 4);
9494 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
9496 else if (unformat (i, "id_data %v", &data))
9498 else if (unformat (i, "local"))
9500 else if (unformat (i, "remote"))
9503 errmsg ("parse error '%U'", format_unformat_error, i);
9508 if (!vec_len (name)) {
9509 errmsg ("profile name must be specified");
9513 if (vec_len (name) > 64) {
9514 errmsg ("profile name too long");
9518 if (!vec_len(data)) {
9519 errmsg ("id_data must be specified");
9524 errmsg ("id_type must be specified");
9528 M(IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
9530 mp->is_local = is_local;
9531 mp->id_type = (u8) id_type;
9532 mp->data_len = vec_len (data);
9533 clib_memcpy (mp->name, name, vec_len (name));
9534 clib_memcpy (mp->data, data, vec_len (data));
9542 clib_warning ("unsupported (no dpdk)");
9548 api_ikev2_profile_set_ts (vat_main_t * vam)
9551 unformat_input_t * i = vam->input;
9552 vl_api_ikev2_profile_set_ts_t * mp;
9556 u32 proto = 0, start_port = 0, end_port = (u32) ~0;
9557 ip4_address_t start_addr, end_addr;
9559 const char * valid_chars = "a-zA-Z0-9_";
9561 start_addr.as_u32 = 0;
9562 end_addr.as_u32 = (u32) ~0;
9564 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9565 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9567 else if (unformat (i, "protocol %d", &proto))
9569 else if (unformat (i, "start_port %d", &start_port))
9571 else if (unformat (i, "end_port %d", &end_port))
9573 else if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
9575 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
9577 else if (unformat (i, "local"))
9579 else if (unformat (i, "remote"))
9582 errmsg ("parse error '%U'", format_unformat_error, i);
9587 if (!vec_len (name)) {
9588 errmsg ("profile name must be specified");
9592 if (vec_len (name) > 64) {
9593 errmsg ("profile name too long");
9597 M(IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
9599 mp->is_local = is_local;
9600 mp->proto = (u8) proto;
9601 mp->start_port = (u16) start_port;
9602 mp->end_port = (u16) end_port;
9603 mp->start_addr = start_addr.as_u32;
9604 mp->end_addr = end_addr.as_u32;
9605 clib_memcpy (mp->name, name, vec_len (name));
9612 clib_warning ("unsupported (no dpdk)");
9618 api_ikev2_set_local_key (vat_main_t * vam)
9621 unformat_input_t * i = vam->input;
9622 vl_api_ikev2_set_local_key_t * mp;
9626 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9627 if (unformat (i, "file %v", &file))
9630 errmsg ("parse error '%U'", format_unformat_error, i);
9635 if (!vec_len (file)) {
9636 errmsg ("RSA key file must be specified");
9640 if (vec_len (file) > 256) {
9641 errmsg ("file name too long");
9645 M(IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
9647 clib_memcpy (mp->key_file, file, vec_len (file));
9654 clib_warning ("unsupported (no dpdk)");
9662 static int api_map_add_domain (vat_main_t * vam)
9664 unformat_input_t *i = vam->input;
9665 vl_api_map_add_domain_t *mp;
9668 ip4_address_t ip4_prefix;
9669 ip6_address_t ip6_prefix;
9670 ip6_address_t ip6_src;
9672 u32 ip6_prefix_len, ip4_prefix_len, ea_bits_len, psid_offset,
9674 u8 is_translation = 0;
9676 u8 ip6_src_len = 128;
9678 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9679 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
9680 &ip4_prefix, &ip4_prefix_len))
9682 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
9683 &ip6_prefix, &ip6_prefix_len))
9685 else if (unformat (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src, &ip6_src_len))
9687 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
9689 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
9691 else if (unformat (i, "psid-offset %d", &psid_offset))
9693 else if (unformat (i, "psid-len %d", &psid_length))
9695 else if (unformat (i, "mtu %d", &mtu))
9697 else if (unformat (i, "map-t"))
9700 clib_warning ("parse error '%U'", format_unformat_error, i);
9705 if (num_m_args != 6) {
9706 errmsg("mandatory argument(s) missing\n");
9710 /* Construct the API message */
9711 M(MAP_ADD_DOMAIN, map_add_domain);
9713 clib_memcpy(mp->ip4_prefix, &ip4_prefix, sizeof(ip4_prefix));
9714 mp->ip4_prefix_len = ip4_prefix_len;
9716 clib_memcpy(mp->ip6_prefix, &ip6_prefix, sizeof(ip6_prefix));
9717 mp->ip6_prefix_len = ip6_prefix_len;
9719 clib_memcpy(mp->ip6_src, &ip6_src, sizeof(ip6_src));
9720 mp->ip6_src_prefix_len = ip6_src_len;
9722 mp->ea_bits_len = ea_bits_len;
9723 mp->psid_offset = psid_offset;
9724 mp->psid_length = psid_length;
9725 mp->is_translation = is_translation;
9726 mp->mtu = htons(mtu);
9731 /* Wait for a reply, return good/bad news */
9735 static int api_map_del_domain (vat_main_t * vam)
9737 unformat_input_t *i = vam->input;
9738 vl_api_map_del_domain_t *mp;
9744 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9745 if (unformat (i, "index %d", &index))
9748 clib_warning ("parse error '%U'", format_unformat_error, i);
9753 if (num_m_args != 1) {
9754 errmsg("mandatory argument(s) missing\n");
9758 /* Construct the API message */
9759 M(MAP_DEL_DOMAIN, map_del_domain);
9761 mp->index = ntohl(index);
9766 /* Wait for a reply, return good/bad news */
9770 static int api_map_add_del_rule (vat_main_t * vam)
9772 unformat_input_t *i = vam->input;
9773 vl_api_map_add_del_rule_t *mp;
9776 ip6_address_t ip6_dst;
9777 u32 num_m_args = 0, index, psid;
9779 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9780 if (unformat (i, "index %d", &index))
9782 else if (unformat (i, "psid %d", &psid))
9784 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
9786 else if (unformat (i, "del")) {
9789 clib_warning ("parse error '%U'", format_unformat_error, i);
9794 /* Construct the API message */
9795 M(MAP_ADD_DEL_RULE, map_add_del_rule);
9797 mp->index = ntohl(index);
9798 mp->is_add = is_add;
9799 clib_memcpy(mp->ip6_dst, &ip6_dst, sizeof(ip6_dst));
9800 mp->psid = ntohs(psid);
9805 /* Wait for a reply, return good/bad news */
9809 static int api_map_domain_dump (vat_main_t * vam)
9811 vl_api_map_domain_dump_t *mp;
9814 /* Construct the API message */
9815 M(MAP_DOMAIN_DUMP, map_domain_dump);
9820 /* Use a control ping for synchronization */
9822 vl_api_control_ping_t * mp;
9823 M(CONTROL_PING, control_ping);
9829 static int api_map_rule_dump (vat_main_t * vam)
9831 unformat_input_t *i = vam->input;
9832 vl_api_map_rule_dump_t *mp;
9834 u32 domain_index = ~0;
9836 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9837 if (unformat (i, "index %u", &domain_index))
9843 if (domain_index == ~0) {
9844 clib_warning("parse error: domain index expected");
9848 /* Construct the API message */
9849 M(MAP_RULE_DUMP, map_rule_dump);
9851 mp->domain_index = htonl(domain_index);
9856 /* Use a control ping for synchronization */
9858 vl_api_control_ping_t * mp;
9859 M(CONTROL_PING, control_ping);
9865 static void vl_api_map_add_domain_reply_t_handler
9866 (vl_api_map_add_domain_reply_t * mp)
9868 vat_main_t * vam = &vat_main;
9869 i32 retval = ntohl(mp->retval);
9871 if (vam->async_mode) {
9872 vam->async_errors += (retval < 0);
9874 vam->retval = retval;
9875 vam->result_ready = 1;
9879 static void vl_api_map_add_domain_reply_t_handler_json
9880 (vl_api_map_add_domain_reply_t * mp)
9882 vat_main_t * vam = &vat_main;
9883 vat_json_node_t node;
9885 vat_json_init_object(&node);
9886 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
9887 vat_json_object_add_uint(&node, "index", ntohl(mp->index));
9889 vat_json_print(vam->ofp, &node);
9890 vat_json_free(&node);
9892 vam->retval = ntohl(mp->retval);
9893 vam->result_ready = 1;
9897 api_get_first_msg_id (vat_main_t * vam)
9899 vl_api_get_first_msg_id_t * mp;
9901 unformat_input_t * i = vam->input;
9905 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9906 if (unformat (i, "client %s", &name))
9912 if (name_set == 0) {
9913 errmsg ("missing client name\n");
9918 if (vec_len (name) > 63) {
9919 errmsg ("client name too long\n");
9923 M(GET_FIRST_MSG_ID, get_first_msg_id);
9924 clib_memcpy (mp->name, name, vec_len(name));
9930 static int api_cop_interface_enable_disable (vat_main_t * vam)
9932 unformat_input_t * line_input = vam->input;
9933 vl_api_cop_interface_enable_disable_t * mp;
9935 u32 sw_if_index = ~0;
9936 u8 enable_disable = 1;
9938 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
9939 if (unformat (line_input, "disable"))
9941 if (unformat (line_input, "enable"))
9943 else if (unformat (line_input, "%U", unformat_sw_if_index,
9946 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
9952 if (sw_if_index == ~0) {
9953 errmsg ("missing interface name or sw_if_index\n");
9957 /* Construct the API message */
9958 M(COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
9959 mp->sw_if_index = ntohl(sw_if_index);
9960 mp->enable_disable = enable_disable;
9964 /* Wait for the reply */
9968 static int api_cop_whitelist_enable_disable (vat_main_t * vam)
9970 unformat_input_t * line_input = vam->input;
9971 vl_api_cop_whitelist_enable_disable_t * mp;
9973 u32 sw_if_index = ~0;
9974 u8 ip4=0, ip6=0, default_cop=0;
9977 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
9978 if (unformat (line_input, "ip4"))
9980 else if (unformat (line_input, "ip6"))
9982 else if (unformat (line_input, "default"))
9984 else if (unformat (line_input, "%U", unformat_sw_if_index,
9987 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
9989 else if (unformat (line_input, "fib-id %d", &fib_id))
9995 if (sw_if_index == ~0) {
9996 errmsg ("missing interface name or sw_if_index\n");
10000 /* Construct the API message */
10001 M(COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
10002 mp->sw_if_index = ntohl(sw_if_index);
10003 mp->fib_id = ntohl(fib_id);
10006 mp->default_cop = default_cop;
10010 /* Wait for the reply */
10014 static int api_get_node_graph (vat_main_t * vam)
10016 vl_api_get_node_graph_t * mp;
10019 M(GET_NODE_GRAPH, get_node_graph);
10023 /* Wait for the reply */
10028 api_lisp_add_del_locator_set(vat_main_t * vam)
10030 unformat_input_t * input = vam->input;
10031 vl_api_lisp_add_del_locator_set_t *mp;
10034 u8 *locator_set_name = NULL;
10035 u8 locator_set_name_set = 0;
10037 /* Parse args required to build the message */
10038 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10039 if (unformat(input, "del")) {
10041 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
10042 locator_set_name_set = 1;
10047 if (locator_set_name_set == 0) {
10048 errmsg ("missing locator-set name");
10052 if (vec_len(locator_set_name) > 64) {
10053 errmsg ("locator-set name too long\n");
10054 vec_free(locator_set_name);
10057 vec_add1(locator_set_name, 0);
10059 /* Construct the API message */
10060 M(LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
10062 mp->is_add = is_add;
10063 clib_memcpy(mp->locator_set_name, locator_set_name,
10064 vec_len(locator_set_name));
10065 vec_free(locator_set_name);
10070 /* Wait for a reply... */
10078 api_lisp_add_del_locator(vat_main_t * vam)
10080 unformat_input_t * input = vam->input;
10081 vl_api_lisp_add_del_locator_t *mp;
10083 u32 tmp_if_index = ~0;
10084 u32 sw_if_index = ~0;
10085 u8 sw_if_index_set = 0;
10086 u8 sw_if_index_if_name_set = 0;
10088 u8 priority_set = 0;
10092 u8 *locator_set_name = NULL;
10093 u8 locator_set_name_set = 0;
10095 /* Parse args required to build the message */
10096 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10097 if (unformat(input, "del")) {
10099 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
10100 locator_set_name_set = 1;
10101 } else if (unformat(input, "iface %U", unformat_sw_if_index, vam,
10103 sw_if_index_if_name_set = 1;
10104 sw_if_index = tmp_if_index;
10105 } else if (unformat(input,"sw_if_index %d", &tmp_if_index)) {
10106 sw_if_index_set = 1;
10107 sw_if_index = tmp_if_index;
10108 } else if (unformat(input, "p %d", &priority)) {
10110 } else if (unformat(input, "w %d", &weight)) {
10116 if (locator_set_name_set == 0) {
10117 errmsg ("missing locator-set name");
10121 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0) {
10122 errmsg ("missing sw_if_index");
10123 vec_free(locator_set_name);
10127 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0) {
10128 errmsg ("cannot use both params interface name and sw_if_index");
10129 vec_free(locator_set_name);
10133 if (priority_set == 0) {
10134 errmsg ("missing locator-set priority\n");
10135 vec_free(locator_set_name);
10139 if (weight_set == 0) {
10140 errmsg ("missing locator-set weight\n");
10141 vec_free(locator_set_name);
10145 if (vec_len(locator_set_name) > 64) {
10146 errmsg ("locator-set name too long\n");
10147 vec_free(locator_set_name);
10150 vec_add1(locator_set_name, 0);
10152 /* Construct the API message */
10153 M(LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
10155 mp->is_add = is_add;
10156 mp->sw_if_index = ntohl(sw_if_index);
10157 mp->priority = priority;
10158 mp->weight = weight;
10159 clib_memcpy(mp->locator_set_name, locator_set_name,
10160 vec_len(locator_set_name));
10161 vec_free(locator_set_name);
10166 /* Wait for a reply... */
10174 api_lisp_add_del_local_eid(vat_main_t * vam)
10176 unformat_input_t * input = vam->input;
10177 vl_api_lisp_add_del_local_eid_t *mp;
10182 u8 eid_type = (u8)~0;
10183 ip4_address_t eidv4;
10184 ip6_address_t eidv6;
10186 u32 tmp_eid_lenght = ~0;
10187 u8 eid_lenght = ~0;
10188 u8 *locator_set_name = NULL;
10189 u8 locator_set_name_set = 0;
10192 /* Parse args required to build the message */
10193 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10194 if (unformat(input, "del")) {
10196 } else if (unformat(input, "vni &d", &vni)) {
10198 } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
10199 &eidv4, &tmp_eid_lenght)) {
10200 eid_lenght = tmp_eid_lenght;
10202 eid_type = 0; /* ipv4 type */
10203 } else if (unformat(input, "eid %U/%d", unformat_ip6_address,
10204 &eidv6, &tmp_eid_lenght)) {
10205 eid_lenght = tmp_eid_lenght;
10207 eid_type = 1; /* ipv6 type */
10208 } else if (unformat(input, "eid %U", unformat_ethernet_address, mac)) {
10209 eid_type = 2; /* mac type */
10210 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
10211 locator_set_name_set = 1;
10216 if (locator_set_name_set == 0) {
10217 errmsg ("missing locator-set name\n");
10221 if ((u8)~0 == eid_type) {
10222 errmsg ("EID address not set!");
10223 vec_free(locator_set_name);
10227 if (vec_len(locator_set_name) > 64) {
10228 errmsg ("locator-set name too long\n");
10229 vec_free(locator_set_name);
10232 vec_add1(locator_set_name, 0);
10234 if (eidv4_set && eidv6_set) {
10235 errmsg ("both eid v4 and v6 addresses set\n");
10236 vec_free(locator_set_name);
10240 if (eidv4_set && eid_lenght > 32) {
10241 errmsg ("eid prefix to big\n");
10242 vec_free(locator_set_name);
10246 if (eidv6_set && eid_lenght > 128) {
10247 errmsg ("eid prefix to big\n");
10248 vec_free(locator_set_name);
10252 /* Construct the API message */
10253 M(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
10255 mp->is_add = is_add;
10256 switch (eid_type) {
10258 clib_memcpy (mp->eid, &eidv4, sizeof(eidv4));
10261 clib_memcpy (mp->eid, &eidv6, sizeof(eidv6));
10264 clib_memcpy (mp->eid, mac, 6);
10267 mp->eid_type = eid_type;
10268 mp->prefix_len = eid_lenght;
10269 mp->vni = clib_host_to_net_u32(vni);
10270 clib_memcpy(mp->locator_set_name, locator_set_name,
10271 vec_len(locator_set_name));
10272 vec_free(locator_set_name);
10277 /* Wait for a reply... */
10285 api_lisp_gpe_add_del_fwd_entry(vat_main_t * vam)
10287 unformat_input_t * input = vam->input;
10288 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
10291 u8 eidv4_set = 0, slocv4_set = 0, dlocv4_set = 0;
10292 u8 eidv6_set = 0, slocv6_set = 0, dlocv6_set = 0;
10293 ip4_address_t eidv4, slocv4, dlocv4;
10294 ip6_address_t eidv6, slocv6, dlocv6;
10295 u32 tmp_eid_lenght = ~0;
10296 u8 eid_lenght = ~0;
10298 /* Parse args required to build the message */
10299 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10300 if (unformat(input, "del")) {
10302 } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
10303 &eidv4, &tmp_eid_lenght)) {
10304 eid_lenght = tmp_eid_lenght;
10306 } else if (unformat(input, "eid %U/%d", unformat_ip6_address,
10307 &eidv6, &tmp_eid_lenght)) {
10308 eid_lenght = tmp_eid_lenght;
10310 } else if (unformat(input, "sloc %U", unformat_ip4_address, &slocv4)) {
10312 } else if (unformat(input, "sloc %U", unformat_ip6_address, &slocv6)) {
10314 } else if (unformat(input, "dloc %U", unformat_ip4_address, &dlocv4)) {
10316 } else if (unformat(input, "dloc %U", unformat_ip6_address, &dlocv6)) {
10322 if (eidv4_set && eidv6_set) {
10323 errmsg ("both eid v4 and v6 addresses set\n");
10327 if (!eidv4_set && !eidv6_set) {
10328 errmsg ("eid addresses not set\n");
10332 if (slocv4_set && slocv6_set) {
10333 errmsg ("both source v4 and v6 addresses set\n");
10337 if (!slocv4_set && !slocv6_set) {
10338 errmsg ("source addresses not set\n");
10342 if (dlocv4_set && dlocv6_set) {
10343 errmsg ("both destination v4 and v6 addresses set\n");
10347 if (dlocv4_set && dlocv6_set) {
10348 errmsg ("destination addresses not set\n");
10352 if (!(slocv4_set == dlocv4_set && slocv6_set == dlocv6_set)) {
10353 errmsg ("mixing type of source and destination address\n");
10357 /* Construct the API message */
10358 M(LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
10360 mp->is_add = is_add;
10362 mp->eid_is_ipv6 = 1;
10363 clib_memcpy(mp->eid_ip_address, &eidv6, sizeof(eidv6));
10365 mp->eid_is_ipv6 = 0;
10366 clib_memcpy(mp->eid_ip_address, &eidv4, sizeof(eidv4));
10368 mp->eid_prefix_len = eid_lenght;
10370 mp->address_is_ipv6 = 1;
10371 clib_memcpy(mp->source_ip_address, &slocv6, sizeof(slocv6));
10372 clib_memcpy(mp->destination_ip_address, &dlocv6, sizeof(dlocv6));
10374 mp->address_is_ipv6 = 0;
10375 clib_memcpy(mp->source_ip_address, &slocv4, sizeof(slocv4));
10376 clib_memcpy(mp->destination_ip_address, &dlocv4, sizeof(dlocv4));
10382 /* Wait for a reply... */
10390 api_lisp_add_del_map_resolver(vat_main_t * vam)
10392 unformat_input_t * input = vam->input;
10393 vl_api_lisp_add_del_map_resolver_t *mp;
10398 ip4_address_t ipv4;
10399 ip6_address_t ipv6;
10401 /* Parse args required to build the message */
10402 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10403 if (unformat(input, "del")) {
10405 } else if (unformat(input, "%U", unformat_ip4_address, &ipv4)) {
10407 } else if (unformat(input, "%U", unformat_ip6_address, &ipv6)) {
10413 if (ipv4_set && ipv6_set) {
10414 errmsg ("both eid v4 and v6 addresses set\n");
10418 if (!ipv4_set && !ipv6_set) {
10419 errmsg ("eid addresses not set\n");
10423 /* Construct the API message */
10424 M(LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
10426 mp->is_add = is_add;
10429 clib_memcpy(mp->ip_address, &ipv6, sizeof(ipv6));
10432 clib_memcpy(mp->ip_address, &ipv4, sizeof(ipv4));
10438 /* Wait for a reply... */
10446 api_lisp_gpe_enable_disable (vat_main_t * vam)
10448 unformat_input_t * input = vam->input;
10449 vl_api_lisp_gpe_enable_disable_t *mp;
10454 /* Parse args required to build the message */
10455 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10456 if (unformat(input, "enable")) {
10459 } else if (unformat(input, "disable")) {
10467 errmsg("Value not set\n");
10471 /* Construct the API message */
10472 M(LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
10479 /* Wait for a reply... */
10487 api_lisp_enable_disable (vat_main_t * vam)
10489 unformat_input_t * input = vam->input;
10490 vl_api_lisp_enable_disable_t *mp;
10495 /* Parse args required to build the message */
10496 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10498 if (unformat (input, "enable"))
10503 else if (unformat (input, "disable"))
10513 errmsg ("Value not set\n");
10517 /* Construct the API message */
10518 M(LISP_ENABLE_DISABLE, lisp_enable_disable);
10525 /* Wait for a reply... */
10532 /** Used for transferring locators via VPP API */
10533 typedef CLIB_PACKED(struct
10535 u8 is_ip4; /**< is locator an IPv4 address? */
10536 u8 addr[16]; /**< IPv4/IPv6 address */
10540 * Enable/disable LISP proxy ITR.
10542 * @param vam vpp API test context
10543 * @return return code
10546 api_lisp_pitr_set_locator_set (vat_main_t * vam)
10549 u8 ls_name_set = 0;
10550 unformat_input_t * input = vam->input;
10551 vl_api_lisp_pitr_set_locator_set_t * mp;
10555 /* Parse args required to build the message */
10556 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10558 if (unformat (input, "del"))
10560 else if (unformat (input, "locator-set %s", &ls_name))
10564 errmsg ("parse error '%U'", format_unformat_error, input);
10571 errmsg ("locator-set name not set!");
10575 M(LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
10577 mp->is_add = is_add;
10578 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
10579 vec_free (ls_name);
10584 /* wait for reply */
10592 * Add/delete mapping between vni and vrf
10595 api_lisp_eid_table_add_del_map (vat_main_t * vam)
10598 unformat_input_t * input = vam->input;
10599 vl_api_lisp_eid_table_add_del_map_t *mp;
10600 u8 is_add = 1, vni_set = 0, vrf_set = 0;
10603 /* Parse args required to build the message */
10604 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10606 if (unformat (input, "del"))
10608 else if (unformat(input, "vrf %d", &vrf))
10610 else if (unformat(input, "vni %d", &vni))
10616 if (!vni_set || !vrf_set)
10618 errmsg ("missing arguments!");
10622 M(LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
10624 mp->is_add = is_add;
10625 mp->vni = htonl (vni);
10626 mp->vrf = htonl (vrf);
10631 /* wait for reply */
10639 * Add/del remote mapping to/from LISP control plane
10641 * @param vam vpp API test context
10642 * @return return code
10645 api_lisp_add_del_remote_mapping (vat_main_t * vam)
10647 unformat_input_t * input = vam->input;
10648 vl_api_lisp_add_del_remote_mapping_t *mp;
10651 ip4_address_t seid4, deid4, rloc4;
10652 ip6_address_t seid6, deid6, rloc6;
10653 u8 deid_mac[6] = {0};
10654 u8 seid_mac[6] = {0};
10655 u8 deid_type, seid_type;
10656 u32 seid_len = 0, deid_len = 0, len;
10657 u8 is_add = 1, del_all = 0;
10659 rloc_t * rlocs = 0, rloc;
10661 seid_type = deid_type = (u8)~0;
10663 /* Parse args required to build the message */
10664 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10665 if (unformat(input, "del-all")) {
10667 } else if (unformat(input, "del")) {
10669 } else if (unformat(input, "add")) {
10671 } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
10673 deid_type = 0; /* ipv4 */
10675 } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
10677 deid_type = 1; /* ipv6 */
10679 } else if (unformat(input, "deid %U", unformat_ethernet_address,
10681 deid_type = 2; /* mac */
10682 } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
10684 seid_type = 0; /* ipv4 */
10686 } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
10688 seid_type = 1; /* ipv6 */
10690 } else if (unformat(input, "seid %U", unformat_ethernet_address,
10692 seid_type = 2; /* mac */
10693 } else if (unformat(input, "vni %d", &vni)) {
10695 } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
10697 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
10698 vec_add1 (rlocs, rloc);
10699 } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
10701 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
10702 vec_add1 (rlocs, rloc);
10703 } else if (unformat(input, "action %d", &action)) {
10706 clib_warning ("parse error '%U'", format_unformat_error, input);
10711 if ((u8)~0 == deid_type) {
10712 errmsg ("missing params!");
10716 if (seid_type != deid_type) {
10717 errmsg ("source and destination EIDs are of different types!");
10721 if (is_add && (~0 == action)
10722 && 0 == vec_len (rlocs)) {
10723 errmsg ("no action set for negative map-reply!");
10727 M(LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
10728 mp->is_add = is_add;
10729 mp->vni = htonl (vni);
10730 mp->seid_len = seid_len;
10731 mp->action = (u8) action;
10732 mp->deid_len = deid_len;
10733 mp->del_all = del_all;
10734 mp->eid_type = deid_type;
10736 switch (mp->eid_type) {
10738 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
10739 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
10742 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
10743 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
10746 clib_memcpy (mp->seid, seid_mac, 6);
10747 clib_memcpy (mp->deid, deid_mac, 6);
10750 errmsg ("unknown EID type %d!", mp->eid_type);
10754 mp->rloc_num = vec_len (rlocs);
10755 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
10761 /* Wait for a reply... */
10769 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
10770 * forwarding entries in data-plane accordingly.
10772 * @param vam vpp API test context
10773 * @return return code
10776 api_lisp_add_del_adjacency (vat_main_t * vam)
10778 unformat_input_t * input = vam->input;
10779 vl_api_lisp_add_del_adjacency_t *mp;
10782 ip4_address_t seid4, deid4, rloc4;
10783 ip6_address_t seid6, deid6, rloc6;
10784 u8 deid_mac[6] = {0};
10785 u8 seid_mac[6] = {0};
10786 u8 deid_type, seid_type;
10787 u32 seid_len = 0, deid_len = 0, len;
10790 rloc_t * rlocs = 0, rloc;
10792 memset(mp, 0, sizeof(mp[0]));
10793 seid_type = deid_type = (u8)~0;
10795 /* Parse args required to build the message */
10796 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10797 if (unformat(input, "del")) {
10799 } else if (unformat(input, "add")) {
10801 } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
10803 deid_type = 0; /* ipv4 */
10805 } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
10807 deid_type = 1; /* ipv6 */
10809 } else if (unformat(input, "deid %U", unformat_ethernet_address,
10811 deid_type = 2; /* mac */
10812 } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
10814 seid_type = 0; /* ipv4 */
10816 } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
10818 seid_type = 1; /* ipv6 */
10820 } else if (unformat(input, "seid %U", unformat_ethernet_address,
10822 seid_type = 2; /* mac */
10823 } else if (unformat(input, "vni %d", &vni)) {
10825 } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
10827 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
10828 vec_add1 (rlocs, rloc);
10829 } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
10831 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
10832 vec_add1 (rlocs, rloc);
10833 } else if (unformat(input, "action %d", &action)) {
10836 clib_warning ("parse error '%U'", format_unformat_error, input);
10841 if ((u8)~0 == deid_type) {
10842 errmsg ("missing params!");
10846 if (seid_type != deid_type) {
10847 errmsg ("source and destination EIDs are of different types!");
10851 if (is_add && (~0 == action)
10852 && 0 == vec_len (rlocs)) {
10853 errmsg ("no action set for negative map-reply!");
10857 M(LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
10858 mp->is_add = is_add;
10859 mp->vni = htonl (vni);
10860 mp->seid_len = seid_len;
10861 mp->action = (u8) action;
10862 mp->deid_len = deid_len;
10863 mp->eid_type = deid_type;
10865 switch (mp->eid_type) {
10867 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
10868 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
10871 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
10872 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
10875 clib_memcpy (mp->seid, seid_mac, 6);
10876 clib_memcpy (mp->deid, deid_mac, 6);
10879 errmsg ("unknown EID type %d!", mp->eid_type);
10883 mp->rloc_num = vec_len (rlocs);
10884 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
10890 /* Wait for a reply... */
10898 api_lisp_gpe_add_del_iface(vat_main_t * vam)
10900 unformat_input_t * input = vam->input;
10901 vl_api_lisp_gpe_add_del_iface_t *mp;
10907 /* Parse args required to build the message */
10908 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10909 if (unformat(input, "up")) {
10912 } else if (unformat(input, "down")) {
10915 } else if (unformat(input, "table_id %d", &table_id)) {
10917 } else if (unformat(input, "vni %d", &vni)) {
10924 errmsg("Value not set\n");
10928 /* Construct the API message */
10929 M(LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
10931 mp->is_add = is_add;
10932 mp->table_id = table_id;
10938 /* Wait for a reply... */
10946 * Add/del map request itr rlocs from LISP control plane and updates
10948 * @param vam vpp API test context
10949 * @return return code
10952 api_lisp_add_del_map_request_itr_rlocs(vat_main_t * vam)
10954 unformat_input_t * input = vam->input;
10955 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
10957 u8 *locator_set_name = 0;
10958 u8 locator_set_name_set = 0;
10961 /* Parse args required to build the message */
10962 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10963 if (unformat(input, "del")) {
10965 } else if (unformat(input, "%_%v%_", &locator_set_name)) {
10966 locator_set_name_set = 1;
10968 clib_warning ("parse error '%U'", format_unformat_error, input);
10973 if (is_add && !locator_set_name_set) {
10974 errmsg ("itr-rloc is not set!");
10978 if (is_add && vec_len(locator_set_name) > 64) {
10979 errmsg ("itr-rloc locator-set name too long\n");
10980 vec_free(locator_set_name);
10984 M(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
10985 mp->is_add = is_add;
10987 clib_memcpy (mp->locator_set_name , locator_set_name,
10988 vec_len(locator_set_name));
10990 memset(mp->locator_set_name, 0, sizeof(mp->locator_set_name));
10992 vec_free (locator_set_name);
10997 /* Wait for a reply... */
11005 api_lisp_locator_set_dump(vat_main_t *vam)
11007 vl_api_lisp_locator_set_dump_t *mp;
11010 if (!vam->json_output) {
11011 fformat(vam->ofp, "%=20s%=16s%=16s%=16s\n",
11012 "Locator-set", "Locator", "Priority", "Weight");
11015 M(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
11019 /* Use a control ping for synchronization */
11021 vl_api_control_ping_t * mp;
11022 M(CONTROL_PING, control_ping);
11025 /* Wait for a reply... */
11033 api_lisp_local_eid_table_dump(vat_main_t *vam)
11035 unformat_input_t * i = vam->input;
11036 vl_api_lisp_local_eid_table_dump_t *mp;
11038 struct in_addr ip4;
11039 struct in6_addr ip6;
11041 u8 eid_type = ~0, eid_set;
11042 u32 prefix_length = ~0, t, vni = 0;
11044 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11045 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t)) {
11049 } else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t)) {
11053 } else if (unformat (i, "eid %U", unformat_ethernet_address, mac)) {
11056 } else if (unformat (i, "vni %d", &t))
11059 errmsg ("parse error '%U'", format_unformat_error, i);
11064 if (!vam->json_output) {
11065 fformat(vam->ofp, "%=20s%=30s\n",
11066 "Locator-set", "Eid");
11069 M(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump);
11073 mp->vni = htonl (vni);
11074 mp->eid_type = eid_type;
11075 switch (eid_type) {
11077 mp->prefix_length = prefix_length;
11078 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
11081 mp->prefix_length = prefix_length;
11082 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
11085 clib_memcpy (mp->eid, mac, sizeof (mac));
11088 errmsg ("unknown EID type %d!", eid_type);
11096 /* Use a control ping for synchronization */
11098 vl_api_control_ping_t * mp;
11099 M(CONTROL_PING, control_ping);
11102 /* Wait for a reply... */
11110 api_lisp_gpe_tunnel_dump(vat_main_t *vam)
11112 vl_api_lisp_gpe_tunnel_dump_t *mp;
11115 if (!vam->json_output) {
11116 fformat(vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
11117 "%=16s%=16s%=16s%=16s%=16s\n",
11118 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
11119 "Decap next", "Lisp version", "Flags", "Next protocol",
11120 "ver_res", "res", "iid");
11123 M(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
11127 /* Use a control ping for synchronization */
11129 vl_api_control_ping_t * mp;
11130 M(CONTROL_PING, control_ping);
11133 /* Wait for a reply... */
11141 api_lisp_map_resolver_dump(vat_main_t *vam)
11143 vl_api_lisp_map_resolver_dump_t *mp;
11146 if (!vam->json_output) {
11147 fformat(vam->ofp, "%=20s\n",
11151 M(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
11155 /* Use a control ping for synchronization */
11157 vl_api_control_ping_t * mp;
11158 M(CONTROL_PING, control_ping);
11161 /* Wait for a reply... */
11169 api_lisp_enable_disable_status_dump(vat_main_t *vam)
11171 vl_api_lisp_enable_disable_status_dump_t *mp;
11174 if (!vam->json_output) {
11175 fformat(vam->ofp, "%=20s\n",
11179 M(LISP_ENABLE_DISABLE_STATUS_DUMP,
11180 lisp_enable_disable_status_dump);
11184 /* Use a control ping for synchronization */
11186 vl_api_control_ping_t * mp;
11187 M(CONTROL_PING, control_ping);
11190 /* Wait for a reply... */
11198 api_lisp_get_map_request_itr_rlocs(vat_main_t *vam)
11200 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
11203 if (!vam->json_output) {
11204 fformat(vam->ofp, "%=20s\n",
11208 M(LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
11211 /* Wait for a reply... */
11219 api_af_packet_create (vat_main_t * vam)
11221 unformat_input_t * i = vam->input;
11222 vl_api_af_packet_create_t * mp;
11224 u8 * host_if_name = 0;
11226 u8 random_hw_addr = 1;
11228 memset (hw_addr, 0, sizeof (hw_addr));
11230 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11231 if (unformat (i, "name %s", &host_if_name))
11232 vec_add1 (host_if_name, 0);
11233 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
11234 random_hw_addr = 0;
11239 if (!vec_len (host_if_name)) {
11240 errmsg ("host-interface name must be specified");
11244 if (vec_len (host_if_name) > 64) {
11245 errmsg ("host-interface name too long");
11249 M(AF_PACKET_CREATE, af_packet_create);
11251 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
11252 clib_memcpy (mp->hw_addr, hw_addr, 6);
11253 mp->use_random_hw_addr = random_hw_addr;
11254 vec_free (host_if_name);
11256 S; W2(fprintf(vam->ofp," new sw_if_index = %d ", vam->sw_if_index));
11262 api_af_packet_delete (vat_main_t * vam)
11264 unformat_input_t * i = vam->input;
11265 vl_api_af_packet_delete_t * mp;
11267 u8 * host_if_name = 0;
11269 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11270 if (unformat (i, "name %s", &host_if_name))
11271 vec_add1 (host_if_name, 0);
11276 if (!vec_len (host_if_name)) {
11277 errmsg ("host-interface name must be specified");
11281 if (vec_len (host_if_name) > 64) {
11282 errmsg ("host-interface name too long");
11286 M(AF_PACKET_DELETE, af_packet_delete);
11288 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
11289 vec_free (host_if_name);
11297 api_policer_add_del (vat_main_t * vam)
11299 unformat_input_t * i = vam->input;
11300 vl_api_policer_add_del_t * mp;
11312 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11313 if (unformat (i, "del"))
11315 else if (unformat (i, "name %s", &name))
11316 vec_add1 (name, 0);
11317 else if (unformat (i, "cir %u", &cir))
11319 else if (unformat (i, "eir %u", &eir))
11321 else if (unformat (i, "cb %u", &cb))
11323 else if (unformat (i, "eb %u", &eb))
11325 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
11328 else if (unformat (i, "round_type %U", unformat_policer_round_type,
11331 else if (unformat (i, "type %U", unformat_policer_type, &type))
11337 if (!vec_len (name)) {
11338 errmsg ("policer name must be specified");
11342 if (vec_len (name) > 64) {
11343 errmsg ("policer name too long");
11347 M(POLICER_ADD_DEL, policer_add_del);
11349 clib_memcpy (mp->name, name, vec_len (name));
11351 mp->is_add = is_add;
11356 mp->rate_type = rate_type;
11357 mp->round_type = round_type;
11366 api_policer_dump(vat_main_t *vam)
11368 unformat_input_t * i = vam->input;
11369 vl_api_policer_dump_t *mp;
11371 u8 *match_name = 0;
11372 u8 match_name_valid = 0;
11374 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11375 if (unformat (i, "name %s", &match_name)) {
11376 vec_add1 (match_name, 0);
11377 match_name_valid = 1;
11382 M(POLICER_DUMP, policer_dump);
11383 mp->match_name_valid = match_name_valid;
11384 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
11385 vec_free (match_name);
11389 /* Use a control ping for synchronization */
11391 vl_api_control_ping_t * mp;
11392 M(CONTROL_PING, control_ping);
11395 /* Wait for a reply... */
11403 api_netmap_create (vat_main_t * vam)
11405 unformat_input_t * i = vam->input;
11406 vl_api_netmap_create_t * mp;
11410 u8 random_hw_addr = 1;
11414 memset (hw_addr, 0, sizeof (hw_addr));
11416 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11417 if (unformat (i, "name %s", &if_name))
11418 vec_add1 (if_name, 0);
11419 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
11420 random_hw_addr = 0;
11421 else if (unformat (i, "pipe"))
11423 else if (unformat (i, "master"))
11425 else if (unformat (i, "slave"))
11431 if (!vec_len (if_name)) {
11432 errmsg ("interface name must be specified");
11436 if (vec_len (if_name) > 64) {
11437 errmsg ("interface name too long");
11441 M(NETMAP_CREATE, netmap_create);
11443 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
11444 clib_memcpy (mp->hw_addr, hw_addr, 6);
11445 mp->use_random_hw_addr = random_hw_addr;
11446 mp->is_pipe = is_pipe;
11447 mp->is_master = is_master;
11448 vec_free (if_name);
11456 api_netmap_delete (vat_main_t * vam)
11458 unformat_input_t * i = vam->input;
11459 vl_api_netmap_delete_t * mp;
11463 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
11464 if (unformat (i, "name %s", &if_name))
11465 vec_add1 (if_name, 0);
11470 if (!vec_len (if_name)) {
11471 errmsg ("interface name must be specified");
11475 if (vec_len (if_name) > 64) {
11476 errmsg ("interface name too long");
11480 M(NETMAP_DELETE, netmap_delete);
11482 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
11483 vec_free (if_name);
11490 static void vl_api_mpls_gre_tunnel_details_t_handler
11491 (vl_api_mpls_gre_tunnel_details_t * mp)
11493 vat_main_t * vam = &vat_main;
11495 i32 len = ntohl(mp->nlabels);
11497 if (mp->l2_only == 0) {
11498 fformat(vam->ofp, "[%d]: src %U, dst %U, adj %U/%d, labels ",
11499 ntohl(mp->tunnel_index),
11500 format_ip4_address, &mp->tunnel_src,
11501 format_ip4_address, &mp->tunnel_dst,
11502 format_ip4_address, &mp->intfc_address,
11503 ntohl(mp->mask_width));
11504 for (i = 0; i < len; i++) {
11505 fformat(vam->ofp, "%u ", ntohl(mp->labels[i]));
11507 fformat(vam->ofp, "\n");
11508 fformat(vam->ofp, " inner fib index %d, outer fib index %d\n",
11509 ntohl(mp->inner_fib_index), ntohl(mp->outer_fib_index));
11511 fformat(vam->ofp, "[%d]: src %U, dst %U, key %U, labels ",
11512 ntohl(mp->tunnel_index),
11513 format_ip4_address, &mp->tunnel_src,
11514 format_ip4_address, &mp->tunnel_dst,
11515 format_ip4_address, &mp->intfc_address);
11516 for (i = 0; i < len; i++) {
11517 fformat(vam->ofp, "%u ", ntohl(mp->labels[i]));
11519 fformat(vam->ofp, "\n");
11520 fformat(vam->ofp, " l2 interface %d, outer fib index %d\n",
11521 ntohl(mp->hw_if_index), ntohl(mp->outer_fib_index));
11525 static void vl_api_mpls_gre_tunnel_details_t_handler_json
11526 (vl_api_mpls_gre_tunnel_details_t * mp)
11528 vat_main_t * vam = &vat_main;
11529 vat_json_node_t *node = NULL;
11530 struct in_addr ip4;
11532 i32 len = ntohl(mp->nlabels);
11534 if (VAT_JSON_ARRAY != vam->json_tree.type) {
11535 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
11536 vat_json_init_array(&vam->json_tree);
11538 node = vat_json_array_add(&vam->json_tree);
11540 vat_json_init_object(node);
11541 vat_json_object_add_uint(node, "tunnel_index", ntohl(mp->tunnel_index));
11542 clib_memcpy(&ip4, &(mp->intfc_address), sizeof(ip4));
11543 vat_json_object_add_ip4(node, "intfc_address", ip4);
11544 vat_json_object_add_uint(node, "inner_fib_index", ntohl(mp->inner_fib_index));
11545 vat_json_object_add_uint(node, "mask_width", ntohl(mp->mask_width));
11546 vat_json_object_add_uint(node, "encap_index", ntohl(mp->encap_index));
11547 vat_json_object_add_uint(node, "hw_if_index", ntohl(mp->hw_if_index));
11548 vat_json_object_add_uint(node, "l2_only", ntohl(mp->l2_only));
11549 clib_memcpy(&ip4, &(mp->tunnel_src), sizeof(ip4));
11550 vat_json_object_add_ip4(node, "tunnel_src", ip4);
11551 clib_memcpy(&ip4, &(mp->tunnel_dst), sizeof(ip4));
11552 vat_json_object_add_ip4(node, "tunnel_dst", ip4);
11553 vat_json_object_add_uint(node, "outer_fib_index", ntohl(mp->outer_fib_index));
11554 vat_json_object_add_uint(node, "label_count", len);
11555 for (i = 0; i < len; i++) {
11556 vat_json_object_add_uint(node, "label", ntohl(mp->labels[i]));
11560 static int api_mpls_gre_tunnel_dump (vat_main_t * vam)
11562 vl_api_mpls_gre_tunnel_dump_t *mp;
11566 /* Parse args required to build the message */
11567 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT) {
11568 if (!unformat (vam->input, "tunnel_index %d", &index)) {
11574 fformat(vam->ofp, " tunnel_index %d\n", index);
11576 M(MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump);
11577 mp->tunnel_index = htonl(index);
11580 /* Use a control ping for synchronization */
11582 vl_api_control_ping_t * mp;
11583 M(CONTROL_PING, control_ping);
11589 static void vl_api_mpls_eth_tunnel_details_t_handler
11590 (vl_api_mpls_eth_tunnel_details_t * mp)
11592 vat_main_t * vam = &vat_main;
11594 i32 len = ntohl(mp->nlabels);
11596 fformat(vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
11597 ntohl(mp->tunnel_index),
11598 format_ethernet_address, &mp->tunnel_dst_mac,
11599 format_ip4_address, &mp->intfc_address,
11600 ntohl(mp->mask_width));
11601 for (i = 0; i < len; i++) {
11602 fformat(vam->ofp, "%u ", ntohl(mp->labels[i]));
11604 fformat(vam->ofp, "\n");
11605 fformat(vam->ofp, " tx on %d, rx fib index %d\n",
11606 ntohl(mp->tx_sw_if_index),
11607 ntohl(mp->inner_fib_index));
11610 static void vl_api_mpls_eth_tunnel_details_t_handler_json
11611 (vl_api_mpls_eth_tunnel_details_t * mp)
11613 vat_main_t * vam = &vat_main;
11614 vat_json_node_t *node = NULL;
11615 struct in_addr ip4;
11617 i32 len = ntohl(mp->nlabels);
11619 if (VAT_JSON_ARRAY != vam->json_tree.type) {
11620 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
11621 vat_json_init_array(&vam->json_tree);
11623 node = vat_json_array_add(&vam->json_tree);
11625 vat_json_init_object(node);
11626 vat_json_object_add_uint(node, "tunnel_index", ntohl(mp->tunnel_index));
11627 clib_memcpy(&ip4, &(mp->intfc_address), sizeof(ip4));
11628 vat_json_object_add_ip4(node, "intfc_address", ip4);
11629 vat_json_object_add_uint(node, "inner_fib_index", ntohl(mp->inner_fib_index));
11630 vat_json_object_add_uint(node, "mask_width", ntohl(mp->mask_width));
11631 vat_json_object_add_uint(node, "encap_index", ntohl(mp->encap_index));
11632 vat_json_object_add_uint(node, "hw_if_index", ntohl(mp->hw_if_index));
11633 vat_json_object_add_uint(node, "l2_only", ntohl(mp->l2_only));
11634 vat_json_object_add_string_copy(node, "tunnel_dst_mac",
11635 format(0, "%U", format_ethernet_address, &mp->tunnel_dst_mac));
11636 vat_json_object_add_uint(node, "tx_sw_if_index", ntohl(mp->tx_sw_if_index));
11637 vat_json_object_add_uint(node, "label_count", len);
11638 for (i = 0; i < len; i++) {
11639 vat_json_object_add_uint(node, "label", ntohl(mp->labels[i]));
11643 static int api_mpls_eth_tunnel_dump (vat_main_t * vam)
11645 vl_api_mpls_eth_tunnel_dump_t *mp;
11649 /* Parse args required to build the message */
11650 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT) {
11651 if (!unformat (vam->input, "tunnel_index %d", &index)) {
11657 fformat(vam->ofp, " tunnel_index %d\n", index);
11659 M(MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
11660 mp->tunnel_index = htonl(index);
11663 /* Use a control ping for synchronization */
11665 vl_api_control_ping_t * mp;
11666 M(CONTROL_PING, control_ping);
11672 static void vl_api_mpls_fib_encap_details_t_handler
11673 (vl_api_mpls_fib_encap_details_t * mp)
11675 vat_main_t * vam = &vat_main;
11677 i32 len = ntohl(mp->nlabels);
11679 fformat(vam->ofp, "table %d, dest %U, label ",
11680 ntohl(mp->fib_index),
11681 format_ip4_address, &mp->dest,
11683 for (i = 0; i < len; i++) {
11684 fformat(vam->ofp, "%u ", ntohl(mp->labels[i]));
11686 fformat(vam->ofp, "\n");
11689 static void vl_api_mpls_fib_encap_details_t_handler_json
11690 (vl_api_mpls_fib_encap_details_t * mp)
11692 vat_main_t * vam = &vat_main;
11693 vat_json_node_t *node = NULL;
11695 i32 len = ntohl(mp->nlabels);
11696 struct in_addr ip4;
11698 if (VAT_JSON_ARRAY != vam->json_tree.type) {
11699 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
11700 vat_json_init_array(&vam->json_tree);
11702 node = vat_json_array_add(&vam->json_tree);
11704 vat_json_init_object(node);
11705 vat_json_object_add_uint(node, "table", ntohl(mp->fib_index));
11706 vat_json_object_add_uint(node, "entry_index", ntohl(mp->entry_index));
11707 clib_memcpy(&ip4, &(mp->dest), sizeof(ip4));
11708 vat_json_object_add_ip4(node, "dest", ip4);
11709 vat_json_object_add_uint(node, "s_bit", ntohl(mp->s_bit));
11710 vat_json_object_add_uint(node, "label_count", len);
11711 for (i = 0; i < len; i++) {
11712 vat_json_object_add_uint(node, "label", ntohl(mp->labels[i]));
11716 static int api_mpls_fib_encap_dump (vat_main_t * vam)
11718 vl_api_mpls_fib_encap_dump_t *mp;
11721 M(MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
11724 /* Use a control ping for synchronization */
11726 vl_api_control_ping_t * mp;
11727 M(CONTROL_PING, control_ping);
11733 static void vl_api_mpls_fib_decap_details_t_handler
11734 (vl_api_mpls_fib_decap_details_t * mp)
11736 vat_main_t * vam = &vat_main;
11738 fformat(vam->ofp, "RX table %d, TX table/intfc %u, swif_tag '%s', label %u, s_bit %u\n",
11739 ntohl(mp->rx_table_id),
11740 ntohl(mp->tx_table_id),
11746 static void vl_api_mpls_fib_decap_details_t_handler_json
11747 (vl_api_mpls_fib_decap_details_t * mp)
11749 vat_main_t * vam = &vat_main;
11750 vat_json_node_t *node = NULL;
11751 struct in_addr ip4;
11753 if (VAT_JSON_ARRAY != vam->json_tree.type) {
11754 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
11755 vat_json_init_array(&vam->json_tree);
11757 node = vat_json_array_add(&vam->json_tree);
11759 vat_json_init_object(node);
11760 vat_json_object_add_uint(node, "table", ntohl(mp->fib_index));
11761 vat_json_object_add_uint(node, "entry_index", ntohl(mp->entry_index));
11762 clib_memcpy(&ip4, &(mp->dest), sizeof(ip4));
11763 vat_json_object_add_ip4(node, "dest", ip4);
11764 vat_json_object_add_uint(node, "s_bit", ntohl(mp->s_bit));
11765 vat_json_object_add_uint(node, "label", ntohl(mp->label));
11766 vat_json_object_add_uint(node, "rx_table_id", ntohl(mp->rx_table_id));
11767 vat_json_object_add_uint(node, "tx_table_id", ntohl(mp->tx_table_id));
11768 vat_json_object_add_string_copy(node, "swif_tag", mp->swif_tag);
11771 static int api_mpls_fib_decap_dump (vat_main_t * vam)
11773 vl_api_mpls_fib_decap_dump_t *mp;
11776 M(MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump);
11779 /* Use a control ping for synchronization */
11781 vl_api_control_ping_t * mp;
11782 M(CONTROL_PING, control_ping);
11788 int api_classify_table_ids (vat_main_t *vam)
11790 vl_api_classify_table_ids_t *mp;
11793 /* Construct the API message */
11794 M(CLASSIFY_TABLE_IDS, classify_table_ids);
11802 int api_classify_table_by_interface (vat_main_t *vam)
11804 unformat_input_t * input = vam->input;
11805 vl_api_classify_table_by_interface_t *mp;
11808 u32 sw_if_index = ~0;
11809 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
11810 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
11812 else if (unformat (input, "sw_if_index %d", &sw_if_index))
11817 if (sw_if_index == ~0) {
11818 errmsg ("missing interface name or sw_if_index\n");
11822 /* Construct the API message */
11823 M(CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
11825 mp->sw_if_index = ntohl(sw_if_index);
11832 int api_classify_table_info (vat_main_t *vam)
11834 unformat_input_t * input = vam->input;
11835 vl_api_classify_table_info_t *mp;
11839 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
11840 if (unformat (input, "table_id %d", &table_id))
11845 if (table_id == ~0) {
11846 errmsg ("missing table id\n");
11850 /* Construct the API message */
11851 M(CLASSIFY_TABLE_INFO, classify_table_info);
11853 mp->table_id = ntohl(table_id);
11860 int api_classify_session_dump (vat_main_t *vam)
11862 unformat_input_t * input = vam->input;
11863 vl_api_classify_session_dump_t *mp;
11867 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
11868 if (unformat (input, "table_id %d", &table_id))
11873 if (table_id == ~0) {
11874 errmsg ("missing table id\n");
11878 /* Construct the API message */
11879 M(CLASSIFY_SESSION_DUMP, classify_session_dump);
11881 mp->table_id = ntohl(table_id);
11884 /* Use a control ping for synchronization */
11886 vl_api_control_ping_t * mp;
11887 M(CONTROL_PING, control_ping);
11895 static void vl_api_ipfix_details_t_handler (vl_api_ipfix_details_t * mp)
11897 vat_main_t * vam = &vat_main;
11899 fformat(vam->ofp, "collector_address %U, collector_port %d, "
11900 "src_address %U, fib_index %u, path_mtu %u, "
11901 "template_interval %u\n",
11902 format_ip4_address, mp->collector_address,
11903 ntohs(mp->collector_port),
11904 format_ip4_address, mp->src_address,
11905 ntohl(mp->fib_index),
11906 ntohl(mp->path_mtu),
11907 ntohl(mp->template_interval));
11910 vam->result_ready = 1;
11913 static void vl_api_ipfix_details_t_handler_json
11914 (vl_api_ipfix_details_t * mp)
11916 vat_main_t * vam = &vat_main;
11917 vat_json_node_t node;
11918 struct in_addr collector_address;
11919 struct in_addr src_address;
11921 vat_json_init_object(&node);
11922 clib_memcpy(&collector_address, &mp->collector_address,
11923 sizeof(collector_address));
11924 vat_json_object_add_ip4(&node, "collector_address", collector_address);
11925 vat_json_object_add_uint(&node, "collector_port",
11926 ntohs(mp->collector_port));
11927 clib_memcpy(&src_address, &mp->src_address, sizeof(src_address));
11928 vat_json_object_add_ip4(&node, "src_address", src_address);
11929 vat_json_object_add_uint(&node, "fib_index", ntohl(mp->fib_index));
11930 vat_json_object_add_uint(&node, "path_mtu", ntohl(mp->path_mtu));
11931 vat_json_object_add_uint(&node, "template_interval",
11932 ntohl(mp->template_interval));
11934 vat_json_print(vam->ofp, &node);
11935 vat_json_free(&node);
11937 vam->result_ready = 1;
11940 int api_ipfix_dump (vat_main_t *vam)
11942 vl_api_ipfix_dump_t *mp;
11945 /* Construct the API message */
11946 M(IPFIX_DUMP, ipfix_dump);
11954 static int q_or_quit (vat_main_t * vam)
11956 longjmp (vam->jump_buf, 1);
11957 return 0; /* not so much */
11959 static int q (vat_main_t * vam) {return q_or_quit (vam);}
11960 static int quit (vat_main_t * vam) {return q_or_quit (vam);}
11962 static int comment (vat_main_t * vam)
11967 static int cmd_cmp (void * a1, void * a2)
11972 return strcmp ((char *)(c1[0]), (char *)(c2[0]));
11975 static int help (vat_main_t * vam)
11980 unformat_input_t * i = vam->input;
11983 if (unformat (i, "%s", &name)) {
11988 hs = hash_get_mem (vam->help_by_name, name);
11990 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
11992 fformat (vam->ofp, "No such msg / command '%s'\n", name);
11997 fformat(vam->ofp, "Help is available for the following:\n");
11999 hash_foreach_pair (p, vam->function_by_name,
12001 vec_add1 (cmds, (u8 *)(p->key));
12004 vec_sort_with_function (cmds, cmd_cmp);
12006 for (j = 0; j < vec_len(cmds); j++)
12007 fformat (vam->ofp, "%s\n", cmds[j]);
12013 static int set (vat_main_t * vam)
12015 u8 * name = 0, * value = 0;
12016 unformat_input_t * i = vam->input;
12018 if (unformat (i, "%s", &name)) {
12019 /* The input buffer is a vector, not a string. */
12020 value = vec_dup (i->buffer);
12021 vec_delete (value, i->index, 0);
12022 /* Almost certainly has a trailing newline */
12023 if (value[vec_len(value)-1] == '\n')
12024 value[vec_len(value)-1] = 0;
12025 /* Make sure it's a proper string, one way or the other */
12026 vec_add1 (value, 0);
12027 (void) clib_macro_set_value (&vam->macro_main,
12028 (char *)name, (char *)value);
12031 errmsg ("usage: set <name> <value>\n");
12038 static int unset (vat_main_t * vam)
12042 if (unformat (vam->input, "%s", &name))
12043 if (clib_macro_unset (&vam->macro_main, (char *)name) == 1)
12044 errmsg ("unset: %s wasn't set\n", name);
12055 static int macro_sort_cmp (void * a1, void * a2)
12057 macro_sort_t * s1 = a1;
12058 macro_sort_t * s2 = a2;
12060 return strcmp ((char *)(s1->name), (char *)(s2->name));
12063 static int dump_macro_table (vat_main_t * vam)
12065 macro_sort_t * sort_me = 0, * sm;
12069 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
12071 vec_add2 (sort_me, sm, 1);
12072 sm->name = (u8 *)(p->key);
12073 sm->value = (u8 *) (p->value[0]);
12076 vec_sort_with_function (sort_me, macro_sort_cmp);
12078 if (vec_len(sort_me))
12079 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
12081 fformat (vam->ofp, "The macro table is empty...\n");
12083 for (i = 0; i < vec_len (sort_me); i++)
12084 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name,
12089 static int dump_node_table (vat_main_t * vam)
12092 vlib_node_t * node, * next_node;
12094 if (vec_len (vam->graph_nodes) == 0) {
12095 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
12099 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
12100 node = vam->graph_nodes[i];
12101 fformat (vam->ofp, "[%d] %s\n", i, node->name);
12102 for (j = 0; j < vec_len (node->next_nodes); j++) {
12103 if (node->next_nodes[j] != ~0) {
12104 next_node = vam->graph_nodes[node->next_nodes[j]];
12105 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
12112 static int search_node_table (vat_main_t * vam)
12114 unformat_input_t * line_input = vam->input;
12117 vlib_node_t * node, * next_node;
12120 if (vam->graph_node_index_by_name == 0) {
12121 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
12125 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
12126 if (unformat (line_input, "%s", &node_to_find)) {
12127 vec_add1 (node_to_find, 0);
12128 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
12130 fformat (vam->ofp, "%s not found...\n", node_to_find);
12133 node = vam->graph_nodes[p[0]];
12134 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
12135 for (j = 0; j < vec_len (node->next_nodes); j++) {
12136 if (node->next_nodes[j] != ~0) {
12137 next_node = vam->graph_nodes[node->next_nodes[j]];
12138 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
12144 clib_warning ("parse error '%U'", format_unformat_error,
12150 vec_free(node_to_find);
12158 static int script (vat_main_t * vam)
12161 char * save_current_file;
12162 unformat_input_t save_input;
12163 jmp_buf save_jump_buf;
12164 u32 save_line_number;
12166 FILE * new_fp, * save_ifp;
12168 if (unformat (vam->input, "%s", &s)) {
12169 new_fp = fopen ((char *)s, "r");
12171 errmsg ("Couldn't open script file %s\n", s);
12176 errmsg ("Missing script name\n");
12180 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
12181 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
12182 save_ifp = vam->ifp;
12183 save_line_number = vam->input_line_number;
12184 save_current_file = (char *) vam->current_file;
12186 vam->input_line_number = 0;
12188 vam->current_file = s;
12191 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
12192 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
12193 vam->ifp = save_ifp;
12194 vam->input_line_number = save_line_number;
12195 vam->current_file = (u8 *) save_current_file;
12201 static int echo (vat_main_t * vam)
12203 fformat (vam->ofp, "%v", vam->input->buffer);
12207 /* List of API message constructors, CLI names map to api_xxx */
12208 #define foreach_vpe_api_msg \
12209 _(create_loopback,"[mac <mac-addr>]") \
12210 _(sw_interface_dump,"") \
12211 _(sw_interface_set_flags, \
12212 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
12213 _(sw_interface_add_del_address, \
12214 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
12215 _(sw_interface_set_table, \
12216 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
12217 _(sw_interface_set_vpath, \
12218 "<intfc> | sw_if_index <id> enable | disable") \
12219 _(sw_interface_set_l2_xconnect, \
12220 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
12221 "enable | disable") \
12222 _(sw_interface_set_l2_bridge, \
12223 "rx <intfc> | rx_sw_if_index <id> bd_id <bridge-domain-id>\n" \
12224 "[shg <split-horizon-group>] [bvi]\n" \
12225 "enable | disable") \
12226 _(bridge_domain_add_del, \
12227 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
12228 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
12230 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi]\n") \
12232 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
12234 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
12236 "tapname <name> mac <mac-addr> | random-mac") \
12238 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
12240 "<vpp-if-name> | sw_if_index <id>") \
12241 _(sw_interface_tap_dump, "") \
12242 _(ip_add_del_route, \
12243 "<addr>/<mask> via <addr> [vrf <n>]\n" \
12244 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
12245 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
12246 "[multipath] [count <n>]") \
12247 _(proxy_arp_add_del, \
12248 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
12249 _(proxy_arp_intfc_enable_disable, \
12250 "<intfc> | sw_if_index <id> enable | disable") \
12251 _(mpls_add_del_encap, \
12252 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
12253 _(mpls_add_del_decap, \
12254 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
12255 _(mpls_gre_add_del_tunnel, \
12256 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
12257 "adj <ip4-address>/<mask-width> [del]") \
12258 _(sw_interface_set_unnumbered, \
12259 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
12260 _(ip_neighbor_add_del, \
12261 "<intfc> | sw_if_index <id> dst <ip46-address> mac <mac-addr>") \
12262 _(reset_vrf, "vrf <id> [ipv6]") \
12263 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
12264 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
12265 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
12266 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
12267 "[outer_vlan_id_any][inner_vlan_id_any]") \
12268 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
12269 _(reset_fib, "vrf <n> [ipv6]") \
12270 _(dhcp_proxy_config, \
12271 "svr <v46-address> src <v46-address>\n" \
12272 "insert-cid <n> [del]") \
12273 _(dhcp_proxy_config_2, \
12274 "svr <v46-address> src <v46-address>\n" \
12275 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
12276 _(dhcp_proxy_set_vss, \
12277 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
12278 _(dhcp_client_config, \
12279 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
12280 _(set_ip_flow_hash, \
12281 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
12282 _(sw_interface_ip6_enable_disable, \
12283 "<intfc> | sw_if_index <id> enable | disable") \
12284 _(sw_interface_ip6_set_link_local_address, \
12285 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
12286 _(sw_interface_ip6nd_ra_prefix, \
12287 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
12288 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
12289 "[nolink] [isno]") \
12290 _(sw_interface_ip6nd_ra_config, \
12291 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
12292 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
12293 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
12294 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
12295 _(l2_patch_add_del, \
12296 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
12297 "enable | disable") \
12298 _(mpls_ethernet_add_del_tunnel, \
12299 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
12300 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
12301 _(mpls_ethernet_add_del_tunnel_2, \
12302 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
12303 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
12304 _(sr_tunnel_add_del, \
12305 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
12306 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
12307 "[policy <policy_name>]") \
12308 _(sr_policy_add_del, \
12309 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
12310 _(sr_multicast_map_add_del, \
12311 "address [ip6 multicast address] sr-policy [policy name] [del]") \
12312 _(classify_add_del_table, \
12313 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
12314 "[del] mask <mask-value>\n" \
12315 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
12316 _(classify_add_del_session, \
12317 "[hit-next|l2-hit-next|acl-hit-next] <name|nn> table-index <nn>\n" \
12318 "skip_n <nn> match_n <nn> match [hex] [l2] [l3 [ip4|ip6]]") \
12319 _(classify_set_interface_ip_table, \
12320 "<intfc> | sw_if_index <nn> table <nn>") \
12321 _(classify_set_interface_l2_tables, \
12322 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
12323 " [other-table <nn>]") \
12324 _(get_node_index, "node <node-name") \
12325 _(add_node_next, "node <node-name> next <next-node-name>") \
12326 _(l2tpv3_create_tunnel, \
12327 "client_address <ip6-addr> our_address <ip6-addr>\n" \
12328 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
12329 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
12330 _(l2tpv3_set_tunnel_cookies, \
12331 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
12332 "[new_remote_cookie <nn>]\n") \
12333 _(l2tpv3_interface_enable_disable, \
12334 "<intfc> | sw_if_index <nn> enable | disable") \
12335 _(l2tpv3_set_lookup_key, \
12336 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
12337 _(sw_if_l2tpv3_tunnel_dump, "") \
12338 _(vxlan_add_del_tunnel, \
12339 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
12340 " [decap-next l2|ip4|ip6] [del]") \
12341 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
12342 _(gre_add_del_tunnel, \
12343 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
12344 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
12345 _(l2_fib_clear_table, "") \
12346 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
12347 _(l2_interface_vlan_tag_rewrite, \
12348 "<intfc> | sw_if_index <nn> \n" \
12349 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
12350 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
12351 _(create_vhost_user_if, \
12352 "socket <filename> [server] [renumber <dev_instance>] " \
12353 "[mac <mac_address>]") \
12354 _(modify_vhost_user_if, \
12355 "<intfc> | sw_if_index <nn> socket <filename>\n" \
12356 "[server] [renumber <dev_instance>]") \
12357 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
12358 _(sw_interface_vhost_user_dump, "") \
12359 _(show_version, "") \
12360 _(vxlan_gpe_add_del_tunnel, \
12361 "local <addr> remote <addr> vni <nn>\n" \
12362 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
12363 "[next-ethernet] [next-nsh]\n") \
12364 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
12365 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
12366 _(interface_name_renumber, \
12367 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
12368 _(input_acl_set_interface, \
12369 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
12370 " [l2-table <nn>] [del]") \
12371 _(want_ip4_arp_events, "address <ip4-address> [del]") \
12372 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
12373 _(ip_dump, "ipv4 | ipv6") \
12374 _(ipsec_spd_add_del, "spd_id <n> [del]") \
12375 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
12377 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
12378 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
12379 " integ_alg <alg> integ_key <hex>") \
12380 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
12381 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
12382 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
12383 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
12384 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
12385 _(ikev2_profile_add_del, "name <profile_name> [del]") \
12386 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
12387 "(auth_data 0x<data> | auth_data <data>)") \
12388 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
12389 "(id_data 0x<data> | id_data <data>) (local|remote)") \
12390 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
12391 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
12392 "(local|remote)") \
12393 _(ikev2_set_local_key, "file <absolute_file_path>") \
12394 _(delete_loopback,"sw_if_index <nn>") \
12395 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
12396 _(map_add_domain, \
12397 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
12398 "ip6-src <ip6addr> " \
12399 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
12400 _(map_del_domain, "index <n>") \
12401 _(map_add_del_rule, \
12402 "index <n> psid <n> dst <ip6addr> [del]") \
12403 _(map_domain_dump, "") \
12404 _(map_rule_dump, "index <map-domain>") \
12405 _(want_interface_events, "enable|disable") \
12406 _(want_stats,"enable|disable") \
12407 _(get_first_msg_id, "client <name>") \
12408 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
12409 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
12410 "fib-id <nn> [ip4][ip6][default]") \
12411 _(get_node_graph, " ") \
12412 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
12413 _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> " \
12414 "trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> " \
12415 "app-data <app_data in hex> [pow] [ppc <encap|decap>]") \
12416 _(trace_profile_apply, "id <nn> <ip6-address>/<width>" \
12417 " vrf_id <nn> add | pop | none") \
12418 _(trace_profile_del, "") \
12419 _(lisp_add_del_locator_set, "locator-set <locator_name> [del]") \
12420 _(lisp_add_del_locator, "locator-set <locator_name> " \
12421 "iface <intf> | sw_if_index <sw_if_index> " \
12422 "p <priority> w <weight> [del]") \
12423 _(lisp_add_del_local_eid, "<ipv4|ipv6>/<prefix> " \
12424 "locator-set <locator_name> [del]") \
12425 _(lisp_gpe_add_del_fwd_entry, "eid <ip4|6-addr>/<prefix> " \
12426 "sloc <ip4/6-addr> dloc <ip4|6-addr> [del]") \
12427 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
12428 _(lisp_gpe_enable_disable, "enable|disable") \
12429 _(lisp_enable_disable, "enable|disable") \
12430 _(lisp_gpe_add_del_iface, "up|down") \
12431 _(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> seid" \
12432 " <src-eid> rloc <locator> " \
12433 "[rloc <loc> ... ] action <action>") \
12434 _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid" \
12435 " <src-eid> rloc <locator> " \
12436 "[rloc <loc> ... ] action <action>") \
12437 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
12438 _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
12439 _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
12440 _(lisp_locator_set_dump, "") \
12441 _(lisp_local_eid_table_dump, "") \
12442 _(lisp_gpe_tunnel_dump, "") \
12443 _(lisp_map_resolver_dump, "") \
12444 _(lisp_enable_disable_status_dump, "") \
12445 _(lisp_get_map_request_itr_rlocs, "") \
12446 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
12447 _(af_packet_delete, "name <host interface name>") \
12448 _(policer_add_del, "name <policer name> <params> [del]") \
12449 _(policer_dump, "[name <policer name>]") \
12450 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
12451 "[master|slave]") \
12452 _(netmap_delete, "name <interface name>") \
12453 _(mpls_gre_tunnel_dump, "tunnel_index <tunnel-id>") \
12454 _(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
12455 _(mpls_fib_encap_dump, "") \
12456 _(mpls_fib_decap_dump, "") \
12457 _(classify_table_ids, "") \
12458 _(classify_table_by_interface, "sw_if_index <sw_if_index>") \
12459 _(classify_table_info, "table_id <nn>") \
12460 _(classify_session_dump, "table_id <nn>") \
12461 _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \
12462 "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \
12463 "[template_interval <nn>]") \
12466 /* List of command functions, CLI names map directly to functions */
12467 #define foreach_cli_function \
12468 _(comment, "usage: comment <ignore-rest-of-line>") \
12469 _(dump_interface_table, "usage: dump_interface_table") \
12470 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
12471 _(dump_ipv4_table, "usage: dump_ipv4_table") \
12472 _(dump_ipv6_table, "usage: dump_ipv6_table") \
12473 _(dump_stats_table, "usage: dump_stats_table") \
12474 _(dump_macro_table, "usage: dump_macro_table ") \
12475 _(dump_node_table, "usage: dump_node_table") \
12476 _(echo, "usage: echo <message>") \
12477 _(exec, "usage: exec <vpe-debug-CLI-command>") \
12478 _(help, "usage: help") \
12479 _(q, "usage: quit") \
12480 _(quit, "usage: quit") \
12481 _(search_node_table, "usage: search_node_table <name>...") \
12482 _(set, "usage: set <variable-name> <value>") \
12483 _(script, "usage: script <file-name>") \
12484 _(unset, "usage: unset <variable-name>")
12487 static void vl_api_##n##_t_handler_uni \
12488 (vl_api_##n##_t * mp) \
12490 vat_main_t * vam = &vat_main; \
12491 if (vam->json_output) { \
12492 vl_api_##n##_t_handler_json(mp); \
12494 vl_api_##n##_t_handler(mp); \
12497 foreach_vpe_api_reply_msg;
12500 void vat_api_hookup (vat_main_t *vam)
12503 vl_msg_api_set_handlers(VL_API_##N, #n, \
12504 vl_api_##n##_t_handler_uni, \
12506 vl_api_##n##_t_endian, \
12507 vl_api_##n##_t_print, \
12508 sizeof(vl_api_##n##_t), 1);
12509 foreach_vpe_api_reply_msg;
12512 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
12514 vam->sw_if_index_by_interface_name =
12515 hash_create_string (0, sizeof (uword));
12517 vam->function_by_name =
12518 hash_create_string (0, sizeof(uword));
12520 vam->help_by_name =
12521 hash_create_string (0, sizeof(uword));
12523 /* API messages we can send */
12524 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
12525 foreach_vpe_api_msg;
12529 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
12530 foreach_vpe_api_msg;
12533 /* CLI functions */
12534 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
12535 foreach_cli_function;
12539 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
12540 foreach_cli_function;
12544 #undef vl_api_version
12545 #define vl_api_version(n,v) static u32 vpe_api_version = v;
12546 #include <vpp-api/vpe.api.h>
12547 #undef vl_api_version
12549 void vl_client_add_api_signatures (vl_api_memclnt_create_t *mp)
12552 * Send the main API signature in slot 0. This bit of code must
12553 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
12555 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);