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 <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>
38 #include <vnet/ipsec/ipsec.h>
39 #include <vnet/ipsec/ikev2.h>
43 #include <vnet/map/map.h>
44 #include <vnet/cop/cop.h>
45 #include <vnet/ip/ip6_hop_by_hop.h>
46 #include <vnet/policer/xlate.h>
48 #include "vat/json_format.h"
50 #define vl_typedefs /* define message structures */
51 #include <api/vpe_all_api_h.h>
54 /* declare message handlers for each api */
56 #define vl_endianfun /* define message structures */
57 #include <api/vpe_all_api_h.h>
60 /* instantiate all the print functions we know about */
61 #define vl_print(handle, ...)
63 #include <api/vpe_all_api_h.h>
66 uword unformat_sw_if_index (unformat_input_t * input, va_list * args)
68 vat_main_t * vam = va_arg (*args, vat_main_t *);
69 u32 * result = va_arg (*args, u32 *);
73 if (!unformat (input, "%s", &if_name))
76 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
83 /* Parse an IP4 address %d.%d.%d.%d. */
84 uword unformat_ip4_address (unformat_input_t * input, va_list * args)
86 u8 * result = va_arg (*args, u8 *);
89 if (! unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
92 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
105 unformat_ethernet_address (unformat_input_t * input, va_list * args)
107 u8 * result = va_arg (*args, u8 *);
110 if (! unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
111 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
115 for (i = 0; i < 6; i++)
116 if (a[i] >= (1 << 8))
119 for (i = 0; i < 6; i++)
125 /* Returns ethernet type as an int in host byte order. */
127 unformat_ethernet_type_host_byte_order (unformat_input_t * input,
130 u16 * result = va_arg (*args, u16 *);
134 if (unformat (input, "0x%x", &type)
135 || unformat (input, "%d", &type))
137 if (type >= (1 << 16))
145 /* Parse an IP6 address. */
146 uword unformat_ip6_address (unformat_input_t * input, va_list * args)
148 ip6_address_t * result = va_arg (*args, ip6_address_t *);
150 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
151 uword c, n_colon, double_colon_index;
153 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
154 double_colon_index = ARRAY_LEN (hex_quads);
155 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
158 if (c >= '0' && c <= '9')
160 else if (c >= 'a' && c <= 'f')
161 hex_digit = c + 10 - 'a';
162 else if (c >= 'A' && c <= 'F')
163 hex_digit = c + 10 - 'A';
164 else if (c == ':' && n_colon < 2)
168 unformat_put_input (input);
172 /* Too many hex quads. */
173 if (n_hex_quads >= ARRAY_LEN (hex_quads))
178 hex_quad = (hex_quad << 4) | hex_digit;
180 /* Hex quad must fit in 16 bits. */
181 if (n_hex_digits >= 4)
188 /* Save position of :: */
191 /* More than one :: ? */
192 if (double_colon_index < ARRAY_LEN (hex_quads))
194 double_colon_index = n_hex_quads;
197 if (n_colon > 0 && n_hex_digits > 0)
199 hex_quads[n_hex_quads++] = hex_quad;
205 if (n_hex_digits > 0)
206 hex_quads[n_hex_quads++] = hex_quad;
211 /* Expand :: to appropriate number of zero hex quads. */
212 if (double_colon_index < ARRAY_LEN (hex_quads))
214 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
216 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
217 hex_quads[n_zero + i] = hex_quads[i];
219 for (i = 0; i < n_zero; i++)
220 hex_quads[double_colon_index + i] = 0;
222 n_hex_quads = ARRAY_LEN (hex_quads);
225 /* Too few hex quads given. */
226 if (n_hex_quads < ARRAY_LEN (hex_quads))
229 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
230 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
237 unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
240 u32 * r = va_arg (*args, u32 *);
243 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
244 foreach_ipsec_policy_action
255 unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
258 u32 * r = va_arg (*args, u32 *);
261 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
262 foreach_ipsec_crypto_alg
273 format_ipsec_crypto_alg (u8 * s, va_list * args)
276 u32 i = va_arg (*args, u32);
281 #define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
282 foreach_ipsec_crypto_alg
285 return format (s, "unknown");
287 return format (s, "%s", t);
289 return format (s, "Unimplemented");
294 unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
297 u32 * r = va_arg (*args, u32 *);
300 #define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
301 foreach_ipsec_integ_alg
312 format_ipsec_integ_alg (u8 * s, va_list * args)
315 u32 i = va_arg (*args, u32);
320 #define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
321 foreach_ipsec_integ_alg
324 return format (s, "unknown");
326 return format (s, "%s", t);
328 return format (s, "Unsupported");
333 unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
336 u32 * r = va_arg (*args, u32 *);
339 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
340 foreach_ikev2_auth_method
351 unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
354 u32 * r = va_arg (*args, u32 *);
357 #define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
358 foreach_ikev2_id_type
369 unformat_policer_rate_type (unformat_input_t * input, va_list * args)
371 u8 * r = va_arg (*args, u8 *);
373 if (unformat (input, "kbps"))
374 *r = SSE2_QOS_RATE_KBPS;
375 else if (unformat(input, "pps"))
376 *r = SSE2_QOS_RATE_PPS;
383 unformat_policer_round_type (unformat_input_t * input, va_list * args)
385 u8 * r = va_arg (*args, u8 *);
387 if (unformat(input, "closest"))
388 *r = SSE2_QOS_ROUND_TO_CLOSEST;
389 else if (unformat (input, "up"))
390 *r = SSE2_QOS_ROUND_TO_UP;
391 else if (unformat (input, "down"))
392 *r = SSE2_QOS_ROUND_TO_DOWN;
399 unformat_policer_type (unformat_input_t * input, va_list * args)
401 u8 * r = va_arg (*args, u8 *);
403 if (unformat (input, "1r2c"))
404 *r = SSE2_QOS_POLICER_TYPE_1R2C;
405 else if (unformat (input, "1r3c"))
406 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
407 else if (unformat (input, "2r3c-2698"))
408 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
409 else if (unformat (input, "2r3c-4115"))
410 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
411 else if (unformat (input, "2r3c-mef5cf1"))
412 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
418 u8 * format_ip4_address (u8 * s, va_list * args)
420 u8 * a = va_arg (*args, u8 *);
421 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
424 u8 * format_ip6_address (u8 * s, va_list * args)
426 ip6_address_t * a = va_arg (*args, ip6_address_t *);
427 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
429 i_max_n_zero = ARRAY_LEN (a->as_u16);
431 i_first_zero = i_max_n_zero;
433 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
435 u32 is_zero = a->as_u16[i] == 0;
436 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
442 if ((! is_zero && n_zeros > max_n_zeros)
443 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
445 i_max_n_zero = i_first_zero;
446 max_n_zeros = n_zeros;
447 i_first_zero = ARRAY_LEN (a->as_u16);
452 last_double_colon = 0;
453 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
455 if (i == i_max_n_zero && max_n_zeros > 1)
457 s = format (s, "::");
458 i += max_n_zeros - 1;
459 last_double_colon = 1;
463 s = format (s, "%s%x",
464 (last_double_colon || i == 0) ? "" : ":",
465 clib_net_to_host_u16 (a->as_u16[i]));
466 last_double_colon = 0;
473 /* Format an IP46 address. */
474 u8 * format_ip46_address (u8 * s, va_list * args)
476 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
477 return ip46_address_is_ip4(ip46)?
478 format(s, "%U", format_ip4_address, &ip46->ip4):
479 format(s, "%U", format_ip6_address, &ip46->ip6);
482 u8 * format_ethernet_address (u8 * s, va_list * args)
484 u8 * a = va_arg (*args, u8 *);
486 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
487 a[0], a[1], a[2], a[3], a[4], a[5]);
490 void increment_v4_address (ip4_address_t * a)
494 v = ntohl(a->as_u32) + 1;
495 a->as_u32 = ntohl(v);
498 void increment_v6_address (ip6_address_t * a)
502 v0 = clib_net_to_host_u64 (a->as_u64[0]);
503 v1 = clib_net_to_host_u64 (a->as_u64[1]);
508 a->as_u64[0] = clib_net_to_host_u64 (v0);
509 a->as_u64[1] = clib_net_to_host_u64 (v1);
513 static void vl_api_create_loopback_reply_t_handler
514 (vl_api_create_loopback_reply_t * mp)
516 vat_main_t * vam = &vat_main;
517 i32 retval = ntohl(mp->retval);
519 vam->retval = retval;
520 vam->result_ready = 1;
521 vam->regenerate_interface_table = 1;
524 static void vl_api_create_loopback_reply_t_handler_json
525 (vl_api_create_loopback_reply_t * mp)
527 vat_main_t * vam = &vat_main;
528 vat_json_node_t node;
530 vat_json_init_object(&node);
531 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
532 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
534 vat_json_print(vam->ofp, &node);
535 vat_json_free(&node);
537 vam->retval = ntohl(mp->retval);
538 vam->result_ready = 1;
541 static void vl_api_create_vlan_subif_reply_t_handler
542 (vl_api_create_vlan_subif_reply_t * mp)
544 vat_main_t * vam = &vat_main;
545 i32 retval = ntohl(mp->retval);
547 vam->retval = retval;
548 vam->result_ready = 1;
549 vam->regenerate_interface_table = 1;
552 static void vl_api_create_vlan_subif_reply_t_handler_json
553 (vl_api_create_vlan_subif_reply_t * mp)
555 vat_main_t * vam = &vat_main;
556 vat_json_node_t node;
558 vat_json_init_object(&node);
559 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
560 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
562 vat_json_print(vam->ofp, &node);
563 vat_json_free(&node);
565 vam->retval = ntohl(mp->retval);
566 vam->result_ready = 1;
569 static void vl_api_create_subif_reply_t_handler
570 (vl_api_create_subif_reply_t * mp)
572 vat_main_t * vam = &vat_main;
573 i32 retval = ntohl(mp->retval);
575 vam->retval = retval;
576 vam->result_ready = 1;
577 vam->regenerate_interface_table = 1;
580 static void vl_api_create_subif_reply_t_handler_json
581 (vl_api_create_subif_reply_t * mp)
583 vat_main_t * vam = &vat_main;
584 vat_json_node_t node;
586 vat_json_init_object(&node);
587 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
588 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
590 vat_json_print(vam->ofp, &node);
591 vat_json_free(&node);
593 vam->retval = ntohl(mp->retval);
594 vam->result_ready = 1;
597 static void vl_api_interface_name_renumber_reply_t_handler
598 (vl_api_interface_name_renumber_reply_t * mp)
600 vat_main_t * vam = &vat_main;
601 i32 retval = ntohl(mp->retval);
603 vam->retval = retval;
604 vam->result_ready = 1;
605 vam->regenerate_interface_table = 1;
608 static void vl_api_interface_name_renumber_reply_t_handler_json
609 (vl_api_interface_name_renumber_reply_t * mp)
611 vat_main_t * vam = &vat_main;
612 vat_json_node_t node;
614 vat_json_init_object(&node);
615 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
617 vat_json_print(vam->ofp, &node);
618 vat_json_free(&node);
620 vam->retval = ntohl(mp->retval);
621 vam->result_ready = 1;
625 * Special-case: build the interface table, maintain
626 * the next loopback sw_if_index vbl.
628 static void vl_api_sw_interface_details_t_handler
629 (vl_api_sw_interface_details_t * mp)
631 vat_main_t * vam = &vat_main;
632 u8 * s = format (0, "%s%c", mp->interface_name, 0);
634 hash_set_mem (vam->sw_if_index_by_interface_name, s,
635 ntohl(mp->sw_if_index));
637 /* In sub interface case, fill the sub interface table entry */
638 if (mp->sw_if_index != mp->sup_sw_if_index) {
639 sw_interface_subif_t * sub = NULL;
641 vec_add2(vam->sw_if_subif_table, sub, 1);
643 vec_validate(sub->interface_name, strlen((char *)s) + 1);
644 strncpy((char *)sub->interface_name, (char *)s,
645 vec_len(sub->interface_name));
646 sub->sw_if_index = ntohl(mp->sw_if_index);
647 sub->sub_id = ntohl(mp->sub_id);
649 sub->sub_dot1ad = mp->sub_dot1ad;
650 sub->sub_number_of_tags = mp->sub_number_of_tags;
651 sub->sub_outer_vlan_id = ntohs(mp->sub_outer_vlan_id);
652 sub->sub_inner_vlan_id = ntohs(mp->sub_inner_vlan_id);
653 sub->sub_exact_match = mp->sub_exact_match;
654 sub->sub_default = mp->sub_default;
655 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
656 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
658 /* vlan tag rewrite */
659 sub->vtr_op = ntohl(mp->vtr_op);
660 sub->vtr_push_dot1q = ntohl(mp->vtr_push_dot1q);
661 sub->vtr_tag1 = ntohl(mp->vtr_tag1);
662 sub->vtr_tag2 = ntohl(mp->vtr_tag2);
666 static void vl_api_sw_interface_details_t_handler_json
667 (vl_api_sw_interface_details_t * mp)
669 vat_main_t * vam = &vat_main;
670 vat_json_node_t *node = NULL;
672 if (VAT_JSON_ARRAY != vam->json_tree.type) {
673 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
674 vat_json_init_array(&vam->json_tree);
676 node = vat_json_array_add(&vam->json_tree);
678 vat_json_init_object(node);
679 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
680 vat_json_object_add_uint(node, "sup_sw_if_index", ntohl(mp->sup_sw_if_index));
681 vat_json_object_add_uint(node, "l2_address_length", ntohl(mp->l2_address_length));
682 vat_json_object_add_bytes(node, "l2_address", mp->l2_address, sizeof(mp->l2_address));
683 vat_json_object_add_string_copy(node, "interface_name", mp->interface_name);
684 vat_json_object_add_uint(node, "admin_up_down", mp->admin_up_down);
685 vat_json_object_add_uint(node, "link_up_down", mp->link_up_down);
686 vat_json_object_add_uint(node, "link_duplex", mp->link_duplex);
687 vat_json_object_add_uint(node, "link_speed", mp->link_speed);
688 vat_json_object_add_uint(node, "mtu", ntohs(mp->link_mtu));
689 vat_json_object_add_uint(node, "sub_id", ntohl(mp->sub_id));
690 vat_json_object_add_uint(node, "sub_dot1ad", mp->sub_dot1ad);
691 vat_json_object_add_uint(node, "sub_number_of_tags", mp->sub_number_of_tags);
692 vat_json_object_add_uint(node, "sub_outer_vlan_id", ntohs(mp->sub_outer_vlan_id));
693 vat_json_object_add_uint(node, "sub_inner_vlan_id", ntohs(mp->sub_inner_vlan_id));
694 vat_json_object_add_uint(node, "sub_exact_match", mp->sub_exact_match);
695 vat_json_object_add_uint(node, "sub_default", mp->sub_default);
696 vat_json_object_add_uint(node, "sub_outer_vlan_id_any", mp->sub_outer_vlan_id_any);
697 vat_json_object_add_uint(node, "sub_inner_vlan_id_any", mp->sub_inner_vlan_id_any);
698 vat_json_object_add_uint(node, "vtr_op", ntohl(mp->vtr_op));
699 vat_json_object_add_uint(node, "vtr_push_dot1q", ntohl(mp->vtr_push_dot1q));
700 vat_json_object_add_uint(node, "vtr_tag1", ntohl(mp->vtr_tag1));
701 vat_json_object_add_uint(node, "vtr_tag2", ntohl(mp->vtr_tag2));
704 static void vl_api_sw_interface_set_flags_t_handler
705 (vl_api_sw_interface_set_flags_t * mp)
707 vat_main_t * vam = &vat_main;
708 if (vam->interface_event_display)
709 errmsg ("interface flags: sw_if_index %d %s %s\n",
710 ntohl(mp->sw_if_index),
711 mp->admin_up_down ? "admin-up" : "admin-down",
712 mp->link_up_down ? "link-up" : "link-down");
715 static void vl_api_sw_interface_set_flags_t_handler_json
716 (vl_api_sw_interface_set_flags_t * mp)
718 /* JSON output not supported */
721 static void vl_api_cli_reply_t_handler
722 (vl_api_cli_reply_t * mp)
724 vat_main_t * vam = &vat_main;
725 i32 retval = ntohl(mp->retval);
727 vam->retval = retval;
728 vam->shmem_result = (u8 *) mp->reply_in_shmem;
729 vam->result_ready = 1;
732 static void vl_api_cli_reply_t_handler_json
733 (vl_api_cli_reply_t * mp)
735 vat_main_t * vam = &vat_main;
736 vat_json_node_t node;
737 api_main_t * am = &api_main;
741 vat_json_init_object(&node);
742 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
743 vat_json_object_add_uint(&node, "reply_in_shmem",
744 ntohl(mp->reply_in_shmem));
745 /* Toss the shared-memory original... */
746 pthread_mutex_lock (&am->vlib_rp->mutex);
747 oldheap = svm_push_data_heap (am->vlib_rp);
749 reply = (u8 *)(mp->reply_in_shmem);
752 svm_pop_heap (oldheap);
753 pthread_mutex_unlock (&am->vlib_rp->mutex);
755 vat_json_print(vam->ofp, &node);
756 vat_json_free(&node);
758 vam->retval = ntohl(mp->retval);
759 vam->result_ready = 1;
762 static void vl_api_classify_add_del_table_reply_t_handler
763 (vl_api_classify_add_del_table_reply_t * mp)
765 vat_main_t * vam = &vat_main;
766 i32 retval = ntohl(mp->retval);
767 if (vam->async_mode) {
768 vam->async_errors += (retval < 0);
770 vam->retval = retval;
771 vam->result_ready = 1;
773 ((mp->new_table_index != 0xFFFFFFFF) ||
774 (mp->skip_n_vectors != 0xFFFFFFFF) ||
775 (mp->match_n_vectors != 0xFFFFFFFF)))
777 * Note: this is just barely thread-safe, depends on
778 * the main thread spinning waiting for an answer...
780 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
781 ntohl(mp->new_table_index),
782 ntohl(mp->skip_n_vectors), ntohl(mp->match_n_vectors));
786 static void vl_api_classify_add_del_table_reply_t_handler_json
787 (vl_api_classify_add_del_table_reply_t * mp)
789 vat_main_t * vam = &vat_main;
790 vat_json_node_t node;
792 vat_json_init_object(&node);
793 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
794 vat_json_object_add_uint(&node, "new_table_index", ntohl(mp->new_table_index));
795 vat_json_object_add_uint(&node, "skip_n_vectors", ntohl(mp->skip_n_vectors));
796 vat_json_object_add_uint(&node, "match_n_vectors", ntohl(mp->match_n_vectors));
798 vat_json_print(vam->ofp, &node);
799 vat_json_free(&node);
801 vam->retval = ntohl(mp->retval);
802 vam->result_ready = 1;
805 static void vl_api_get_node_index_reply_t_handler
806 (vl_api_get_node_index_reply_t * mp)
808 vat_main_t * vam = &vat_main;
809 i32 retval = ntohl(mp->retval);
810 if (vam->async_mode) {
811 vam->async_errors += (retval < 0);
813 vam->retval = retval;
814 vam->result_ready = 1;
816 errmsg ("node index %d\n", ntohl(mp->node_index));
820 static void vl_api_get_node_index_reply_t_handler_json
821 (vl_api_get_node_index_reply_t * mp)
823 vat_main_t * vam = &vat_main;
824 vat_json_node_t node;
826 vat_json_init_object(&node);
827 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
828 vat_json_object_add_uint(&node, "node_index", ntohl(mp->node_index));
830 vat_json_print(vam->ofp, &node);
831 vat_json_free(&node);
833 vam->retval = ntohl(mp->retval);
834 vam->result_ready = 1;
837 static void vl_api_add_node_next_reply_t_handler
838 (vl_api_add_node_next_reply_t * mp)
840 vat_main_t * vam = &vat_main;
841 i32 retval = ntohl(mp->retval);
842 if (vam->async_mode) {
843 vam->async_errors += (retval < 0);
845 vam->retval = retval;
846 vam->result_ready = 1;
848 errmsg ("next index %d\n", ntohl(mp->next_index));
852 static void vl_api_add_node_next_reply_t_handler_json
853 (vl_api_add_node_next_reply_t * mp)
855 vat_main_t * vam = &vat_main;
856 vat_json_node_t node;
858 vat_json_init_object(&node);
859 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
860 vat_json_object_add_uint(&node, "next_index", ntohl(mp->next_index));
862 vat_json_print(vam->ofp, &node);
863 vat_json_free(&node);
865 vam->retval = ntohl(mp->retval);
866 vam->result_ready = 1;
869 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler
870 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
872 vat_main_t * vam = &vat_main;
873 i32 retval = ntohl(mp->retval);
874 u32 sw_if_index = ntohl(mp->tunnel_sw_if_index);
876 if (retval >= 0 && sw_if_index != (u32)~0) {
877 errmsg ("tunnel_sw_if_index %d\n", sw_if_index);
879 vam->retval = retval;
880 vam->result_ready = 1;
883 static void vl_api_mpls_gre_add_del_tunnel_reply_t_handler_json
884 (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
886 vat_main_t * vam = &vat_main;
887 vat_json_node_t node;
889 vat_json_init_object(&node);
890 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
891 vat_json_object_add_uint(&node, "tunnel_sw_if_index", ntohl(mp->tunnel_sw_if_index));
893 vat_json_print(vam->ofp, &node);
894 vat_json_free(&node);
896 vam->retval = ntohl(mp->retval);
897 vam->result_ready = 1;
901 static void vl_api_show_version_reply_t_handler
902 (vl_api_show_version_reply_t * mp)
904 vat_main_t * vam = &vat_main;
905 i32 retval = ntohl(mp->retval);
908 errmsg (" program: %s\n", mp->program);
909 errmsg (" version: %s\n", mp->version);
910 errmsg (" build date: %s\n", mp->build_date);
911 errmsg ("build directory: %s\n", mp->build_directory);
913 vam->retval = retval;
914 vam->result_ready = 1;
917 static void vl_api_show_version_reply_t_handler_json
918 (vl_api_show_version_reply_t * mp)
920 vat_main_t * vam = &vat_main;
921 vat_json_node_t node;
923 vat_json_init_object(&node);
924 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
925 vat_json_object_add_string_copy(&node, "program", mp->program);
926 vat_json_object_add_string_copy(&node, "version", mp->version);
927 vat_json_object_add_string_copy(&node, "build_date", mp->build_date);
928 vat_json_object_add_string_copy(&node, "build_directory", mp->build_directory);
930 vat_json_print(vam->ofp, &node);
931 vat_json_free(&node);
933 vam->retval = ntohl(mp->retval);
934 vam->result_ready = 1;
937 static void vl_api_ip4_arp_event_t_handler
938 (vl_api_ip4_arp_event_t * mp)
940 vat_main_t * vam = &vat_main;
941 errmsg ("arp event: address %U new mac %U sw_if_index %d\n",
942 format_ip4_address, &mp->address,
943 format_ethernet_address, mp->new_mac, mp->sw_if_index);
946 static void vl_api_ip4_arp_event_t_handler_json
947 (vl_api_ip4_arp_event_t * mp)
949 /* JSON output not supported */
953 * Special-case: build the bridge domain table, maintain
954 * the next bd id vbl.
956 static void vl_api_bridge_domain_details_t_handler
957 (vl_api_bridge_domain_details_t * mp)
959 vat_main_t * vam = &vat_main;
960 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
962 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
963 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
965 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
966 ntohl (mp->bd_id), mp->learn, mp->forward,
967 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
970 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
974 static void vl_api_bridge_domain_details_t_handler_json
975 (vl_api_bridge_domain_details_t * mp)
977 vat_main_t * vam = &vat_main;
978 vat_json_node_t *node, *array = NULL;
980 if (VAT_JSON_ARRAY != vam->json_tree.type) {
981 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
982 vat_json_init_array(&vam->json_tree);
984 node = vat_json_array_add(&vam->json_tree);
986 vat_json_init_object(node);
987 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
988 vat_json_object_add_uint(node, "flood", mp->flood);
989 vat_json_object_add_uint(node, "forward", mp->forward);
990 vat_json_object_add_uint(node, "learn", mp->learn);
991 vat_json_object_add_uint(node, "bvi_sw_if_index", ntohl(mp->bvi_sw_if_index));
992 vat_json_object_add_uint(node, "n_sw_ifs", ntohl(mp->n_sw_ifs));
993 array = vat_json_object_add(node, "sw_if");
994 vat_json_init_array(array);
998 * Special-case: build the bridge domain sw if table.
1000 static void vl_api_bridge_domain_sw_if_details_t_handler
1001 (vl_api_bridge_domain_sw_if_details_t * mp)
1003 vat_main_t * vam = &vat_main;
1005 u8 * sw_if_name = 0;
1008 sw_if_index = ntohl (mp->sw_if_index);
1009 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1011 if ((u32) p->value[0] == sw_if_index) {
1012 sw_if_name = (u8 *)(p->key);
1017 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1018 mp->shg, sw_if_name ? (char *)sw_if_name :
1019 "sw_if_index not found!");
1022 static void vl_api_bridge_domain_sw_if_details_t_handler_json
1023 (vl_api_bridge_domain_sw_if_details_t * mp)
1025 vat_main_t * vam = &vat_main;
1026 vat_json_node_t *node = NULL;
1027 uword last_index = 0;
1029 ASSERT(VAT_JSON_ARRAY == vam->json_tree.type);
1030 ASSERT(vec_len(vam->json_tree.array) >= 1);
1031 last_index = vec_len(vam->json_tree.array) - 1;
1032 node = &vam->json_tree.array[last_index];
1033 node = vat_json_object_get_element(node, "sw_if");
1034 ASSERT(NULL != node);
1035 node = vat_json_array_add(node);
1037 vat_json_init_object(node);
1038 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
1039 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
1040 vat_json_object_add_uint(node, "shg", mp->shg);
1043 static void vl_api_control_ping_reply_t_handler
1044 (vl_api_control_ping_reply_t * mp)
1046 vat_main_t * vam = &vat_main;
1047 i32 retval = ntohl(mp->retval);
1048 if (vam->async_mode) {
1049 vam->async_errors += (retval < 0);
1051 vam->retval = retval;
1052 vam->result_ready = 1;
1056 static void vl_api_control_ping_reply_t_handler_json
1057 (vl_api_control_ping_reply_t * mp)
1059 vat_main_t * vam = &vat_main;
1060 i32 retval = ntohl(mp->retval);
1062 if (VAT_JSON_NONE != vam->json_tree.type) {
1063 vat_json_print(vam->ofp, &vam->json_tree);
1064 vat_json_free(&vam->json_tree);
1065 vam->json_tree.type = VAT_JSON_NONE;
1068 vat_json_init_array(&vam->json_tree);
1069 vat_json_print(vam->ofp, &vam->json_tree);
1070 vam->json_tree.type = VAT_JSON_NONE;
1073 vam->retval = retval;
1074 vam->result_ready = 1;
1077 static void vl_api_l2_flags_reply_t_handler
1078 (vl_api_l2_flags_reply_t * mp)
1080 vat_main_t * vam = &vat_main;
1081 i32 retval = ntohl(mp->retval);
1082 if (vam->async_mode) {
1083 vam->async_errors += (retval < 0);
1085 vam->retval = retval;
1086 vam->result_ready = 1;
1090 static void vl_api_l2_flags_reply_t_handler_json
1091 (vl_api_l2_flags_reply_t * mp)
1093 vat_main_t * vam = &vat_main;
1094 vat_json_node_t node;
1096 vat_json_init_object(&node);
1097 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1098 vat_json_object_add_uint(&node, "resulting_feature_bitmap", ntohl(mp->resulting_feature_bitmap));
1100 vat_json_print(vam->ofp, &node);
1101 vat_json_free(&node);
1103 vam->retval = ntohl(mp->retval);
1104 vam->result_ready = 1;
1107 static void vl_api_bridge_flags_reply_t_handler
1108 (vl_api_bridge_flags_reply_t * mp)
1110 vat_main_t * vam = &vat_main;
1111 i32 retval = ntohl(mp->retval);
1112 if (vam->async_mode) {
1113 vam->async_errors += (retval < 0);
1115 vam->retval = retval;
1116 vam->result_ready = 1;
1120 static void vl_api_bridge_flags_reply_t_handler_json
1121 (vl_api_bridge_flags_reply_t * mp)
1123 vat_main_t * vam = &vat_main;
1124 vat_json_node_t node;
1126 vat_json_init_object(&node);
1127 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1128 vat_json_object_add_uint(&node, "resulting_feature_bitmap", ntohl(mp->resulting_feature_bitmap));
1130 vat_json_print(vam->ofp, &node);
1131 vat_json_free(&node);
1133 vam->retval = ntohl(mp->retval);
1134 vam->result_ready = 1;
1137 static void vl_api_tap_connect_reply_t_handler
1138 (vl_api_tap_connect_reply_t * mp)
1140 vat_main_t * vam = &vat_main;
1141 i32 retval = ntohl(mp->retval);
1142 if (vam->async_mode) {
1143 vam->async_errors += (retval < 0);
1145 vam->retval = retval;
1146 vam->result_ready = 1;
1150 static void vl_api_tap_connect_reply_t_handler_json
1151 (vl_api_tap_connect_reply_t * mp)
1153 vat_main_t * vam = &vat_main;
1154 vat_json_node_t node;
1156 vat_json_init_object(&node);
1157 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1158 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1160 vat_json_print(vam->ofp, &node);
1161 vat_json_free(&node);
1163 vam->retval = ntohl(mp->retval);
1164 vam->result_ready = 1;
1167 static void vl_api_tap_modify_reply_t_handler
1168 (vl_api_tap_modify_reply_t * mp)
1170 vat_main_t * vam = &vat_main;
1171 i32 retval = ntohl(mp->retval);
1172 if (vam->async_mode) {
1173 vam->async_errors += (retval < 0);
1175 vam->retval = retval;
1176 vam->result_ready = 1;
1180 static void vl_api_tap_modify_reply_t_handler_json
1181 (vl_api_tap_modify_reply_t * mp)
1183 vat_main_t * vam = &vat_main;
1184 vat_json_node_t node;
1186 vat_json_init_object(&node);
1187 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1188 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1190 vat_json_print(vam->ofp, &node);
1191 vat_json_free(&node);
1193 vam->retval = ntohl(mp->retval);
1194 vam->result_ready = 1;
1197 static void vl_api_tap_delete_reply_t_handler
1198 (vl_api_tap_delete_reply_t * mp)
1200 vat_main_t * vam = &vat_main;
1201 i32 retval = ntohl(mp->retval);
1202 if (vam->async_mode) {
1203 vam->async_errors += (retval < 0);
1205 vam->retval = retval;
1206 vam->result_ready = 1;
1210 static void vl_api_tap_delete_reply_t_handler_json
1211 (vl_api_tap_delete_reply_t * mp)
1213 vat_main_t * vam = &vat_main;
1214 vat_json_node_t node;
1216 vat_json_init_object(&node);
1217 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1219 vat_json_print(vam->ofp, &node);
1220 vat_json_free(&node);
1222 vam->retval = ntohl(mp->retval);
1223 vam->result_ready = 1;
1226 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
1227 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1229 vat_main_t * vam = &vat_main;
1230 i32 retval = ntohl(mp->retval);
1231 if (vam->async_mode) {
1232 vam->async_errors += (retval < 0);
1234 vam->retval = retval;
1235 vam->result_ready = 1;
1239 static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
1240 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
1242 vat_main_t * vam = &vat_main;
1243 vat_json_node_t node;
1245 vat_json_init_object(&node);
1246 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1247 vat_json_object_add_uint(&node, "tunnel_sw_if_index", ntohl(mp->tunnel_sw_if_index));
1249 vat_json_print(vam->ofp, &node);
1250 vat_json_free(&node);
1252 vam->retval = ntohl(mp->retval);
1253 vam->result_ready = 1;
1256 static void vl_api_l2tpv3_create_tunnel_reply_t_handler
1257 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1259 vat_main_t * vam = &vat_main;
1260 i32 retval = ntohl(mp->retval);
1261 if (vam->async_mode) {
1262 vam->async_errors += (retval < 0);
1264 vam->retval = retval;
1265 vam->result_ready = 1;
1269 static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
1270 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
1272 vat_main_t * vam = &vat_main;
1273 vat_json_node_t node;
1275 vat_json_init_object(&node);
1276 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1277 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1279 vat_json_print(vam->ofp, &node);
1280 vat_json_free(&node);
1282 vam->retval = ntohl(mp->retval);
1283 vam->result_ready = 1;
1286 static void vl_api_vxlan_add_del_tunnel_reply_t_handler
1287 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1289 vat_main_t * vam = &vat_main;
1290 i32 retval = ntohl(mp->retval);
1291 if (vam->async_mode) {
1292 vam->async_errors += (retval < 0);
1294 vam->retval = retval;
1295 vam->result_ready = 1;
1299 static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
1300 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
1302 vat_main_t * vam = &vat_main;
1303 vat_json_node_t node;
1305 vat_json_init_object(&node);
1306 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1307 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1309 vat_json_print(vam->ofp, &node);
1310 vat_json_free(&node);
1312 vam->retval = ntohl(mp->retval);
1313 vam->result_ready = 1;
1316 static void vl_api_gre_add_del_tunnel_reply_t_handler
1317 (vl_api_gre_add_del_tunnel_reply_t * mp)
1319 vat_main_t * vam = &vat_main;
1320 i32 retval = ntohl(mp->retval);
1321 if (vam->async_mode) {
1322 vam->async_errors += (retval < 0);
1324 vam->retval = retval;
1325 vam->result_ready = 1;
1329 static void vl_api_gre_add_del_tunnel_reply_t_handler_json
1330 (vl_api_gre_add_del_tunnel_reply_t * mp)
1332 vat_main_t * vam = &vat_main;
1333 vat_json_node_t node;
1335 vat_json_init_object(&node);
1336 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1337 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1339 vat_json_print(vam->ofp, &node);
1340 vat_json_free(&node);
1342 vam->retval = ntohl(mp->retval);
1343 vam->result_ready = 1;
1346 static void vl_api_create_vhost_user_if_reply_t_handler
1347 (vl_api_create_vhost_user_if_reply_t * mp)
1349 vat_main_t * vam = &vat_main;
1350 i32 retval = ntohl(mp->retval);
1351 if (vam->async_mode) {
1352 vam->async_errors += (retval < 0);
1354 vam->retval = retval;
1355 vam->result_ready = 1;
1359 static void vl_api_create_vhost_user_if_reply_t_handler_json
1360 (vl_api_create_vhost_user_if_reply_t * mp)
1362 vat_main_t * vam = &vat_main;
1363 vat_json_node_t node;
1365 vat_json_init_object(&node);
1366 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1367 vat_json_object_add_uint(&node, "sw_if_index", ntohl(mp->sw_if_index));
1369 vat_json_print(vam->ofp, &node);
1370 vat_json_free(&node);
1372 vam->retval = ntohl(mp->retval);
1373 vam->result_ready = 1;
1376 static void vl_api_ip_address_details_t_handler
1377 (vl_api_ip_address_details_t * mp)
1379 vat_main_t * vam = &vat_main;
1380 static ip_address_details_t empty_ip_address_details = {{0}};
1381 ip_address_details_t * address = NULL;
1382 ip_details_t * current_ip_details = NULL;
1383 ip_details_t * details = NULL;
1385 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
1387 if (!details || vam->current_sw_if_index >= vec_len(details)
1388 || !details[vam->current_sw_if_index].present) {
1389 errmsg ("ip address details arrived but not stored\n");
1390 errmsg ("ip_dump should be called first\n");
1394 current_ip_details = vec_elt_at_index(details,
1395 vam->current_sw_if_index);
1397 #define addresses (current_ip_details->addr)
1399 vec_validate_init_empty(addresses, vec_len(addresses),
1400 empty_ip_address_details);
1402 address = vec_elt_at_index(addresses, vec_len(addresses) - 1);
1404 clib_memcpy(&address->ip, &mp->ip, sizeof(address->ip));
1405 address->prefix_length = mp->prefix_length;
1409 static void vl_api_ip_address_details_t_handler_json
1410 (vl_api_ip_address_details_t * mp)
1412 vat_main_t * vam = &vat_main;
1413 vat_json_node_t *node = NULL;
1414 struct in6_addr ip6;
1417 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1418 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1419 vat_json_init_array(&vam->json_tree);
1421 node = vat_json_array_add(&vam->json_tree);
1423 vat_json_init_object(node);
1425 clib_memcpy(&ip6, mp->ip, sizeof(ip6));
1426 vat_json_object_add_ip6(node, "ip", ip6);
1428 clib_memcpy(&ip4, mp->ip, sizeof(ip4));
1429 vat_json_object_add_ip4(node, "ip", ip4);
1431 vat_json_object_add_uint(node, "prefix_length", mp->prefix_length);
1434 static void vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
1436 vat_main_t * vam = &vat_main;
1437 static ip_details_t empty_ip_details = {0};
1438 ip_details_t * ip = NULL;
1439 u32 sw_if_index = ~0;
1441 sw_if_index = ntohl(mp->sw_if_index);
1443 vec_validate_init_empty(vam->ip_details_by_sw_if_index[vam->is_ipv6],
1444 sw_if_index, empty_ip_details);
1446 ip = vec_elt_at_index(vam->ip_details_by_sw_if_index[vam->is_ipv6],
1452 static void vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
1454 vat_main_t * vam = &vat_main;
1456 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1457 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1458 vat_json_init_array(&vam->json_tree);
1460 vat_json_array_add_uint(&vam->json_tree, clib_net_to_host_u32(mp->sw_if_index));
1463 static void vl_api_map_domain_details_t_handler_json
1464 (vl_api_map_domain_details_t * mp)
1466 vat_json_node_t * node = NULL;
1467 vat_main_t * vam = &vat_main;
1468 struct in6_addr ip6;
1471 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1472 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1473 vat_json_init_array(&vam->json_tree);
1476 node = vat_json_array_add(&vam->json_tree);
1477 vat_json_init_object(node);
1479 vat_json_object_add_uint(node, "domain_index", clib_net_to_host_u32(mp->domain_index));
1480 clib_memcpy(&ip6, mp->ip6_prefix, sizeof(ip6));
1481 vat_json_object_add_ip6(node, "ip6_prefix", ip6);
1482 clib_memcpy(&ip4, mp->ip4_prefix, sizeof(ip4));
1483 vat_json_object_add_ip4(node, "ip4_prefix", ip4);
1484 clib_memcpy(&ip6, mp->ip6_src, sizeof(ip6));
1485 vat_json_object_add_ip6(node, "ip6_src", ip6);
1486 vat_json_object_add_int(node, "ip6_prefix_len", mp->ip6_prefix_len);
1487 vat_json_object_add_int(node, "ip4_prefix_len", mp->ip4_prefix_len);
1488 vat_json_object_add_int(node, "ip6_src_len", mp->ip6_src_len);
1489 vat_json_object_add_int(node, "ea_bits_len", mp->ea_bits_len);
1490 vat_json_object_add_int(node, "psid_offset", mp->psid_offset);
1491 vat_json_object_add_int(node, "psid_length", mp->psid_length);
1492 vat_json_object_add_uint(node, "flags", mp->flags);
1493 vat_json_object_add_uint(node, "mtu", clib_net_to_host_u16(mp->mtu));
1494 vat_json_object_add_int(node, "is_translation", mp->is_translation);
1497 static void vl_api_map_domain_details_t_handler
1498 (vl_api_map_domain_details_t * mp)
1500 vat_main_t * vam = &vat_main;
1502 if (mp->is_translation) {
1503 fformat(vam->ofp, "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1504 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1505 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1506 format_ip6_address, mp->ip6_src, mp->ip6_src_len, clib_net_to_host_u32(mp->domain_index));
1508 fformat(vam->ofp, "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1509 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1510 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1511 format_ip6_address, mp->ip6_src, clib_net_to_host_u32(mp->domain_index));
1513 fformat(vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1514 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu, mp->is_translation? "map-t":"");
1517 static void vl_api_map_rule_details_t_handler_json
1518 (vl_api_map_rule_details_t * mp)
1520 struct in6_addr ip6;
1521 vat_json_node_t * node = NULL;
1522 vat_main_t * vam = &vat_main;
1524 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1525 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1526 vat_json_init_array(&vam->json_tree);
1529 node = vat_json_array_add(&vam->json_tree);
1530 vat_json_init_object(node);
1532 vat_json_object_add_uint(node, "psid", clib_net_to_host_u16(mp->psid));
1533 clib_memcpy(&ip6, mp->ip6_dst, sizeof(ip6));
1534 vat_json_object_add_ip6(node, "ip6_dst", ip6);
1537 static void vl_api_map_rule_details_t_handler
1538 (vl_api_map_rule_details_t * mp)
1540 vat_main_t * vam = &vat_main;
1541 fformat(vam->ofp, " %d (psid) %U (ip6-dst)\n", clib_net_to_host_u16(mp->psid),
1542 format_ip6_address, mp->ip6_dst);
1545 static void vl_api_dhcp_compl_event_t_handler
1546 (vl_api_dhcp_compl_event_t * mp)
1548 vat_main_t * vam = &vat_main;
1549 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1550 "router_addr %U host_mac %U\n",
1551 mp->pid, mp->is_ipv6 ? "ipv6":"ipv4", mp->hostname,
1552 format_ip4_address, &mp->host_address,
1553 format_ip4_address, &mp->router_address,
1554 format_ethernet_address, mp->host_mac);
1557 static void vl_api_dhcp_compl_event_t_handler_json
1558 (vl_api_dhcp_compl_event_t * mp)
1560 /* JSON output not supported */
1563 static void set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1566 vat_main_t * vam = &vat_main;
1567 static u64 default_counter = 0;
1569 vec_validate_init_empty(vam->simple_interface_counters, vnet_counter_type, NULL);
1570 vec_validate_init_empty(vam->simple_interface_counters[vnet_counter_type],
1571 sw_if_index, default_counter);
1572 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
1575 static void set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1576 interface_counter_t counter)
1578 vat_main_t * vam = &vat_main;
1579 static interface_counter_t default_counter = {0, };
1581 vec_validate_init_empty(vam->combined_interface_counters, vnet_counter_type, NULL);
1582 vec_validate_init_empty(vam->combined_interface_counters[vnet_counter_type],
1583 sw_if_index, default_counter);
1584 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
1587 static void vl_api_vnet_interface_counters_t_handler
1588 (vl_api_vnet_interface_counters_t *mp)
1593 static void vl_api_vnet_interface_counters_t_handler_json
1594 (vl_api_vnet_interface_counters_t *mp)
1596 interface_counter_t counter;
1601 u32 first_sw_if_index;
1604 count = ntohl(mp->count);
1605 first_sw_if_index = ntohl(mp->first_sw_if_index);
1607 if (!mp->is_combined) {
1608 v_packets = (u64*)&mp->data;
1609 for (i = 0; i < count; i++) {
1610 packets = clib_net_to_host_u64(clib_mem_unaligned(v_packets, u64));
1611 set_simple_interface_counter(mp->vnet_counter_type,
1612 first_sw_if_index + i, packets);
1616 v = (vlib_counter_t*)&mp->data;
1617 for (i = 0; i < count; i++) {
1618 counter.packets = clib_net_to_host_u64(
1619 clib_mem_unaligned(&v->packets, u64));
1620 counter.bytes = clib_net_to_host_u64(
1621 clib_mem_unaligned(&v->bytes, u64));
1622 set_combined_interface_counter(mp->vnet_counter_type,
1623 first_sw_if_index + i, counter);
1629 static u32 ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1631 vat_main_t * vam = &vat_main;
1634 for (i = 0; i < vec_len(vam->ip4_fib_counters_vrf_id_by_index); i++) {
1635 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id) {
1642 static u32 ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
1644 vat_main_t * vam = &vat_main;
1647 for (i = 0; i < vec_len(vam->ip6_fib_counters_vrf_id_by_index); i++) {
1648 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id) {
1655 static void vl_api_vnet_ip4_fib_counters_t_handler
1656 (vl_api_vnet_ip4_fib_counters_t *mp)
1661 static void vl_api_vnet_ip4_fib_counters_t_handler_json
1662 (vl_api_vnet_ip4_fib_counters_t *mp)
1664 vat_main_t * vam = &vat_main;
1665 vl_api_ip4_fib_counter_t *v;
1666 ip4_fib_counter_t *counter;
1673 vrf_id = ntohl(mp->vrf_id);
1674 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id(vrf_id);
1675 if (~0 == vrf_index) {
1676 vrf_index = vec_len(vam->ip4_fib_counters_vrf_id_by_index);
1677 vec_validate(vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
1678 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
1679 vec_validate(vam->ip4_fib_counters, vrf_index);
1680 vam->ip4_fib_counters[vrf_index] = NULL;
1683 vec_free(vam->ip4_fib_counters[vrf_index]);
1684 v = (vl_api_ip4_fib_counter_t*)&mp->c;
1685 count = ntohl(mp->count);
1686 for (i = 0; i < count; i++) {
1687 vec_validate(vam->ip4_fib_counters[vrf_index], i);
1688 counter = &vam->ip4_fib_counters[vrf_index][i];
1689 clib_memcpy(&ip4, &v->address, sizeof(ip4));
1690 counter->address = ip4;
1691 counter->address_length = v->address_length;
1692 counter->packets = clib_net_to_host_u64(v->packets);
1693 counter->bytes = clib_net_to_host_u64(v->bytes);
1698 static void vl_api_vnet_ip6_fib_counters_t_handler
1699 (vl_api_vnet_ip6_fib_counters_t *mp)
1704 static void vl_api_vnet_ip6_fib_counters_t_handler_json
1705 (vl_api_vnet_ip6_fib_counters_t *mp)
1707 vat_main_t * vam = &vat_main;
1708 vl_api_ip6_fib_counter_t *v;
1709 ip6_fib_counter_t *counter;
1710 struct in6_addr ip6;
1716 vrf_id = ntohl(mp->vrf_id);
1717 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id(vrf_id);
1718 if (~0 == vrf_index) {
1719 vrf_index = vec_len(vam->ip6_fib_counters_vrf_id_by_index);
1720 vec_validate(vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
1721 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
1722 vec_validate(vam->ip6_fib_counters, vrf_index);
1723 vam->ip6_fib_counters[vrf_index] = NULL;
1726 vec_free(vam->ip6_fib_counters[vrf_index]);
1727 v = (vl_api_ip6_fib_counter_t*)&mp->c;
1728 count = ntohl(mp->count);
1729 for (i = 0; i < count; i++) {
1730 vec_validate(vam->ip6_fib_counters[vrf_index], i);
1731 counter = &vam->ip6_fib_counters[vrf_index][i];
1732 clib_memcpy(&ip6, &v->address, sizeof(ip6));
1733 counter->address = ip6;
1734 counter->address_length = v->address_length;
1735 counter->packets = clib_net_to_host_u64(v->packets);
1736 counter->bytes = clib_net_to_host_u64(v->bytes);
1741 static void vl_api_get_first_msg_id_reply_t_handler
1742 (vl_api_get_first_msg_id_reply_t * mp)
1744 vat_main_t * vam = &vat_main;
1745 i32 retval = ntohl(mp->retval);
1747 if (vam->async_mode) {
1748 vam->async_errors += (retval < 0);
1750 vam->retval = retval;
1751 vam->result_ready = 1;
1754 errmsg ("first message id %d\n", ntohs(mp->first_msg_id));
1758 static void vl_api_get_first_msg_id_reply_t_handler_json
1759 (vl_api_get_first_msg_id_reply_t * mp)
1761 vat_main_t * vam = &vat_main;
1762 vat_json_node_t node;
1764 vat_json_init_object(&node);
1765 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1766 vat_json_object_add_uint(&node, "first_msg_id",
1767 (uint) ntohs(mp->first_msg_id));
1769 vat_json_print(vam->ofp, &node);
1770 vat_json_free(&node);
1772 vam->retval = ntohl(mp->retval);
1773 vam->result_ready = 1;
1776 static void vl_api_get_node_graph_reply_t_handler
1777 (vl_api_get_node_graph_reply_t * mp)
1779 vat_main_t * vam = &vat_main;
1780 api_main_t * am = &api_main;
1781 i32 retval = ntohl(mp->retval);
1782 u8 * pvt_copy, * reply;
1787 if (vam->async_mode) {
1788 vam->async_errors += (retval < 0);
1790 vam->retval = retval;
1791 vam->result_ready = 1;
1794 /* "Should never happen..." */
1798 reply = (u8 *)(mp->reply_in_shmem);
1799 pvt_copy = vec_dup (reply);
1801 /* Toss the shared-memory original... */
1802 pthread_mutex_lock (&am->vlib_rp->mutex);
1803 oldheap = svm_push_data_heap (am->vlib_rp);
1807 svm_pop_heap (oldheap);
1808 pthread_mutex_unlock (&am->vlib_rp->mutex);
1810 if (vam->graph_nodes) {
1811 hash_free (vam->graph_node_index_by_name);
1813 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
1814 node = vam->graph_nodes[i];
1815 vec_free (node->name);
1816 vec_free (node->next_nodes);
1819 vec_free(vam->graph_nodes);
1822 vam->graph_node_index_by_name = hash_create_string (0, sizeof(uword));
1823 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
1824 vec_free (pvt_copy);
1826 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
1827 node = vam->graph_nodes[i];
1828 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
1832 static void vl_api_get_node_graph_reply_t_handler_json
1833 (vl_api_get_node_graph_reply_t * mp)
1835 vat_main_t * vam = &vat_main;
1836 api_main_t * am = &api_main;
1838 vat_json_node_t node;
1841 /* $$$$ make this real? */
1842 vat_json_init_object(&node);
1843 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
1844 vat_json_object_add_uint(&node, "reply_in_shmem", mp->reply_in_shmem);
1846 reply = (u8 *)(mp->reply_in_shmem);
1848 /* Toss the shared-memory original... */
1849 pthread_mutex_lock (&am->vlib_rp->mutex);
1850 oldheap = svm_push_data_heap (am->vlib_rp);
1854 svm_pop_heap (oldheap);
1855 pthread_mutex_unlock (&am->vlib_rp->mutex);
1857 vat_json_print(vam->ofp, &node);
1858 vat_json_free(&node);
1860 vam->retval = ntohl(mp->retval);
1861 vam->result_ready = 1;
1865 vl_api_lisp_locator_set_details_t_handler (
1866 vl_api_lisp_locator_set_details_t *mp)
1868 vat_main_t *vam = &vat_main;
1869 u8 * tmp_str = NULL;
1872 fformat(vam->ofp, "%=20s%=16d%=16d%=16d\n",
1873 mp->locator_set_name,
1874 ntohl(mp->sw_if_index),
1878 tmp_str = format(0,"%U/%d",
1879 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
1883 fformat(vam->ofp, "%=20s%=16s%=16d%=16d\n",
1884 mp->locator_set_name,
1893 vl_api_lisp_locator_set_details_t_handler_json (
1894 vl_api_lisp_locator_set_details_t *mp)
1896 vat_main_t *vam = &vat_main;
1897 vat_json_node_t *node = NULL;
1898 struct in6_addr ip6;
1901 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1902 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1903 vat_json_init_array(&vam->json_tree);
1905 node = vat_json_array_add(&vam->json_tree);
1907 vat_json_init_object(node);
1908 vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
1910 vat_json_object_add_uint(node, "locator", ntohl(mp->sw_if_index));
1913 clib_memcpy(&ip6, mp->ip_address, sizeof(ip6));
1914 vat_json_object_add_ip6(node, "locator", ip6);
1916 clib_memcpy(&ip4, mp->ip_address, sizeof(ip4));
1917 vat_json_object_add_ip4(node, "locator", ip4);
1919 vat_json_object_add_uint(node, "prefix-length", mp->prefix_len);
1921 vat_json_object_add_uint(node, "priority", mp->priority);
1922 vat_json_object_add_uint(node, "weight", mp->weight);
1926 vl_api_lisp_local_eid_table_details_t_handler (
1927 vl_api_lisp_local_eid_table_details_t *mp)
1929 vat_main_t *vam = &vat_main;
1932 prefix = format(0, "%U/%d",
1933 mp->eid_is_ipv6 ? format_ip6_address : format_ip4_address,
1935 mp->eid_prefix_len);
1937 fformat(vam->ofp, "%=20s%=30s\n",
1938 mp->locator_set_name, prefix);
1944 vl_api_lisp_local_eid_table_details_t_handler_json (
1945 vl_api_lisp_local_eid_table_details_t *mp)
1947 vat_main_t *vam = &vat_main;
1948 vat_json_node_t *node = NULL;
1949 struct in6_addr ip6;
1952 if (VAT_JSON_ARRAY != vam->json_tree.type) {
1953 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
1954 vat_json_init_array(&vam->json_tree);
1956 node = vat_json_array_add(&vam->json_tree);
1958 vat_json_init_object(node);
1959 vat_json_object_add_string_copy(node, "locator-set", mp->locator_set_name);
1960 if (mp->eid_is_ipv6) {
1961 clib_memcpy(&ip6, mp->eid_ip_address, sizeof(ip6));
1962 vat_json_object_add_ip6(node, "eid address", ip6);
1964 clib_memcpy(&ip4, mp->eid_ip_address, sizeof(ip4));
1965 vat_json_object_add_ip4(node, "eid address", ip4);
1967 vat_json_object_add_uint(node, "eid prefix len", mp->eid_prefix_len);
1971 format_decap_next (u8 * s, va_list * args)
1973 u32 next_index = va_arg (*args, u32);
1977 case LISP_GPE_INPUT_NEXT_DROP:
1978 return format (s, "drop");
1979 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
1980 return format (s, "ip4");
1981 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
1982 return format (s, "ip6");
1984 return format (s, "unknown %d", next_index);
1990 vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *mp)
1992 vat_main_t *vam = &vat_main;
1994 u8 *flag_str = NULL;
1996 iid_str = format(0, "%d (0x%x)", ntohl(mp->iid), ntohl(mp->iid));
1998 #define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
1999 foreach_lisp_gpe_flag_bit;
2002 fformat(vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2003 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2005 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2007 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2009 ntohl(mp->encap_fib_id),
2010 ntohl(mp->decap_fib_id),
2011 format_decap_next, ntohl(mp->dcap_next),
2023 vl_api_lisp_gpe_tunnel_details_t_handler_json (
2024 vl_api_lisp_gpe_tunnel_details_t *mp)
2026 vat_main_t *vam = &vat_main;
2027 vat_json_node_t *node = NULL;
2028 struct in6_addr ip6;
2032 next_decap_str = format(0, "%U", format_decap_next, htonl(mp->dcap_next));
2034 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2035 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2036 vat_json_init_array(&vam->json_tree);
2038 node = vat_json_array_add(&vam->json_tree);
2040 vat_json_init_object(node);
2041 vat_json_object_add_uint(node, "tunel", mp->tunnels);
2043 clib_memcpy(&ip6, mp->source_ip, sizeof(ip6));
2044 vat_json_object_add_ip6(node, "source address", ip6);
2045 clib_memcpy(&ip6, mp->destination_ip, sizeof(ip6));
2046 vat_json_object_add_ip6(node, "destination address", ip6);
2048 clib_memcpy(&ip4, mp->source_ip, sizeof(ip4));
2049 vat_json_object_add_ip4(node, "source address", ip4);
2050 clib_memcpy(&ip4, mp->destination_ip, sizeof(ip4));
2051 vat_json_object_add_ip4(node, "destination address", ip4);
2053 vat_json_object_add_uint(node, "fib encap", ntohl(mp->encap_fib_id));
2054 vat_json_object_add_uint(node, "fib decap", ntohl(mp->decap_fib_id));
2055 vat_json_object_add_string_copy(node, "decap next", next_decap_str);
2056 vat_json_object_add_uint(node, "lisp version", mp->ver_res >> 6);
2057 vat_json_object_add_uint(node, "flags", mp->flags);
2058 vat_json_object_add_uint(node, "next protocol", mp->next_protocol);
2059 vat_json_object_add_uint(node, "ver_res", mp->ver_res);
2060 vat_json_object_add_uint(node, "res", mp->res);
2061 vat_json_object_add_uint(node, "iid", ntohl(mp->iid));
2063 vec_free(next_decap_str);
2067 vl_api_lisp_map_resolver_details_t_handler (
2068 vl_api_lisp_map_resolver_details_t *mp)
2070 vat_main_t *vam = &vat_main;
2072 fformat(vam->ofp, "%=20U\n",
2073 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2078 vl_api_lisp_map_resolver_details_t_handler_json (
2079 vl_api_lisp_map_resolver_details_t *mp)
2081 vat_main_t *vam = &vat_main;
2082 vat_json_node_t *node = NULL;
2083 struct in6_addr ip6;
2086 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2087 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2088 vat_json_init_array(&vam->json_tree);
2090 node = vat_json_array_add(&vam->json_tree);
2092 vat_json_init_object(node);
2094 clib_memcpy(&ip6, mp->ip_address, sizeof(ip6));
2095 vat_json_object_add_ip6(node, "map resolver", ip6);
2097 clib_memcpy(&ip4, mp->ip_address, sizeof(ip4));
2098 vat_json_object_add_ip4(node, "map resolver", ip4);
2103 vl_api_lisp_enable_disable_status_details_t_handler
2104 (vl_api_lisp_enable_disable_status_details_t *mp)
2106 vat_main_t *vam = &vat_main;
2108 fformat(vam->ofp, "feature: %s\ngpe: %s\n",
2109 mp->feature_status ? "enabled" : "disabled",
2110 mp->gpe_status ? "enabled" : "disabled");
2114 vl_api_lisp_enable_disable_status_details_t_handler_json
2115 (vl_api_lisp_enable_disable_status_details_t *mp)
2117 vat_main_t *vam = &vat_main;
2118 vat_json_node_t *node = NULL;
2119 u8 * gpe_status = NULL;
2120 u8 * feature_status = NULL;
2122 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2123 feature_status = format (0, "%s",
2124 mp->feature_status ? "enabled" : "disabled");
2125 vec_add1 (gpe_status, 0);
2126 vec_add1 (feature_status, 0);
2128 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2129 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2130 vat_json_init_array(&vam->json_tree);
2132 node = vat_json_array_add(&vam->json_tree);
2134 vat_json_init_object(node);
2135 vat_json_object_add_string_copy(node, "gpe_status", gpe_status);
2136 vat_json_object_add_string_copy(node, "feature_status", feature_status);
2138 vec_free (gpe_status);
2139 vec_free (feature_status);
2142 static u8 * format_policer_type (u8 * s, va_list * va)
2144 u32 i = va_arg (*va, u32);
2146 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2147 s = format (s, "1r2c");
2148 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2149 s = format (s, "1r3c");
2150 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2151 s = format (s, "2r3c-2698");
2152 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2153 s = format (s, "2r3c-4115");
2154 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2155 s = format (s, "2r3c-mef5cf1");
2157 s = format (s, "ILLEGAL");
2161 static u8 * format_policer_rate_type (u8 * s, va_list * va)
2163 u32 i = va_arg (*va, u32);
2165 if (i == SSE2_QOS_RATE_KBPS)
2166 s = format (s, "kbps");
2167 else if (i == SSE2_QOS_RATE_PPS)
2168 s = format(s, "pps");
2170 s = format (s, "ILLEGAL");
2174 static u8 * format_policer_round_type (u8 * s, va_list * va)
2176 u32 i = va_arg (*va, u32);
2178 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2179 s = format(s, "closest");
2180 else if (i == SSE2_QOS_ROUND_TO_UP)
2181 s = format (s, "up");
2182 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2183 s = format (s, "down");
2185 s = format (s, "ILLEGAL");
2189 static void vl_api_policer_details_t_handler
2190 (vl_api_policer_details_t * mp)
2192 vat_main_t * vam = &vat_main;
2194 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2195 "rate type %U, round type %U, %s rate, %s color-aware, "
2196 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2197 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu\n",
2199 format_policer_type, mp->type,
2204 format_policer_rate_type, mp->rate_type,
2205 format_policer_round_type, mp->round_type,
2206 mp->single_rate ? "single" : "dual",
2207 mp->color_aware ? "is" : "not",
2208 ntohl(mp->cir_tokens_per_period),
2209 ntohl(mp->pir_tokens_per_period),
2211 ntohl(mp->current_limit),
2212 ntohl(mp->current_bucket),
2213 ntohl(mp->extended_limit),
2214 ntohl(mp->extended_bucket),
2215 clib_net_to_host_u64(mp->last_update_time));
2218 static void vl_api_policer_details_t_handler_json
2219 (vl_api_policer_details_t * mp)
2221 vat_main_t * vam = &vat_main;
2222 vat_json_node_t *node;
2223 u8 *rate_type_str, *round_type_str, *type_str;
2225 rate_type_str = format(0, "%U", format_policer_rate_type, mp->rate_type);
2226 round_type_str = format(0, "%U", format_policer_round_type, mp->round_type);
2227 type_str = format(0, "%U", format_policer_type, mp->type);
2229 if (VAT_JSON_ARRAY != vam->json_tree.type) {
2230 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
2231 vat_json_init_array(&vam->json_tree);
2233 node = vat_json_array_add(&vam->json_tree);
2235 vat_json_init_object(node);
2236 vat_json_object_add_string_copy(node, "name", mp->name);
2237 vat_json_object_add_uint(node, "cir", ntohl(mp->cir));
2238 vat_json_object_add_uint(node, "eir", ntohl(mp->eir));
2239 vat_json_object_add_uint(node, "cb", ntohl(mp->cb));
2240 vat_json_object_add_uint(node, "eb", ntohl(mp->eb));
2241 vat_json_object_add_string_copy(node, "rate_type", rate_type_str);
2242 vat_json_object_add_string_copy(node, "round_type", round_type_str);
2243 vat_json_object_add_string_copy(node, "type", type_str);
2244 vat_json_object_add_uint(node, "single_rate", mp->single_rate);
2245 vat_json_object_add_uint(node, "color_aware", mp->color_aware);
2246 vat_json_object_add_uint(node, "scale", ntohl(mp->scale));
2247 vat_json_object_add_uint(node, "cir_tokens_per_period",
2248 ntohl(mp->cir_tokens_per_period));
2249 vat_json_object_add_uint(node, "eir_tokens_per_period",
2250 ntohl(mp->pir_tokens_per_period));
2251 vat_json_object_add_uint(node, "current_limit", ntohl(mp->current_limit));
2252 vat_json_object_add_uint(node, "current_bucket", ntohl(mp->current_bucket));
2253 vat_json_object_add_uint(node, "extended_limit", ntohl(mp->extended_limit));
2254 vat_json_object_add_uint(node, "extended_bucket",
2255 ntohl(mp->extended_bucket));
2256 vat_json_object_add_uint(node, "last_update_time",
2257 ntohl(mp->last_update_time));
2259 vec_free(rate_type_str);
2260 vec_free(round_type_str);
2265 #define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
2266 #define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
2267 #define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
2268 #define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
2271 * Generate boilerplate reply handlers, which
2272 * dig the return value out of the xxx_reply_t API message,
2273 * stick it into vam->retval, and set vam->result_ready
2275 * Could also do this by pointing N message decode slots at
2276 * a single function, but that could break in subtle ways.
2279 #define foreach_standard_reply_retval_handler \
2280 _(sw_interface_set_flags_reply) \
2281 _(sw_interface_add_del_address_reply) \
2282 _(sw_interface_set_table_reply) \
2283 _(sw_interface_set_vpath_reply) \
2284 _(sw_interface_set_l2_bridge_reply) \
2285 _(bridge_domain_add_del_reply) \
2286 _(sw_interface_set_l2_xconnect_reply) \
2287 _(l2fib_add_del_reply) \
2288 _(ip_add_del_route_reply) \
2289 _(proxy_arp_add_del_reply) \
2290 _(proxy_arp_intfc_enable_disable_reply) \
2291 _(mpls_add_del_encap_reply) \
2292 _(mpls_add_del_decap_reply) \
2293 _(mpls_ethernet_add_del_tunnel_2_reply) \
2294 _(sw_interface_set_unnumbered_reply) \
2295 _(ip_neighbor_add_del_reply) \
2296 _(reset_vrf_reply) \
2297 _(oam_add_del_reply) \
2298 _(reset_fib_reply) \
2299 _(dhcp_proxy_config_reply) \
2300 _(dhcp_proxy_config_2_reply) \
2301 _(dhcp_proxy_set_vss_reply) \
2302 _(dhcp_client_config_reply) \
2303 _(set_ip_flow_hash_reply) \
2304 _(sw_interface_ip6_enable_disable_reply) \
2305 _(sw_interface_ip6_set_link_local_address_reply) \
2306 _(sw_interface_ip6nd_ra_prefix_reply) \
2307 _(sw_interface_ip6nd_ra_config_reply) \
2308 _(set_arp_neighbor_limit_reply) \
2309 _(l2_patch_add_del_reply) \
2310 _(sr_tunnel_add_del_reply) \
2311 _(sr_policy_add_del_reply) \
2312 _(sr_multicast_map_add_del_reply) \
2313 _(classify_add_del_session_reply) \
2314 _(classify_set_interface_ip_table_reply) \
2315 _(classify_set_interface_l2_tables_reply) \
2316 _(l2tpv3_set_tunnel_cookies_reply) \
2317 _(l2tpv3_interface_enable_disable_reply) \
2318 _(l2tpv3_set_lookup_key_reply) \
2319 _(l2_fib_clear_table_reply) \
2320 _(l2_interface_efp_filter_reply) \
2321 _(l2_interface_vlan_tag_rewrite_reply) \
2322 _(modify_vhost_user_if_reply) \
2323 _(delete_vhost_user_if_reply) \
2324 _(want_ip4_arp_events_reply) \
2325 _(input_acl_set_interface_reply) \
2326 _(ipsec_spd_add_del_reply) \
2327 _(ipsec_interface_add_del_spd_reply) \
2328 _(ipsec_spd_add_del_entry_reply) \
2329 _(ipsec_sad_add_del_entry_reply) \
2330 _(ipsec_sa_set_key_reply) \
2331 _(ikev2_profile_add_del_reply) \
2332 _(ikev2_profile_set_auth_reply) \
2333 _(ikev2_profile_set_id_reply) \
2334 _(ikev2_profile_set_ts_reply) \
2335 _(ikev2_set_local_key_reply) \
2336 _(delete_loopback_reply) \
2337 _(bd_ip_mac_add_del_reply) \
2338 _(map_del_domain_reply) \
2339 _(map_add_del_rule_reply) \
2340 _(want_interface_events_reply) \
2341 _(want_stats_reply) \
2342 _(cop_interface_enable_disable_reply) \
2343 _(cop_whitelist_enable_disable_reply) \
2344 _(sw_interface_clear_stats_reply) \
2345 _(trace_profile_add_reply) \
2346 _(trace_profile_apply_reply) \
2347 _(trace_profile_del_reply) \
2348 _(lisp_add_del_locator_set_reply) \
2349 _(lisp_add_del_locator_reply) \
2350 _(lisp_add_del_local_eid_reply) \
2351 _(lisp_gpe_add_del_fwd_entry_reply) \
2352 _(lisp_add_del_map_resolver_reply) \
2353 _(lisp_gpe_enable_disable_reply) \
2354 _(lisp_gpe_add_del_iface_reply) \
2355 _(lisp_enable_disable_reply) \
2356 _(lisp_pitr_set_locator_set_reply) \
2357 _(vxlan_gpe_add_del_tunnel_reply) \
2358 _(af_packet_create_reply) \
2359 _(af_packet_delete_reply) \
2360 _(policer_add_del_reply) \
2361 _(netmap_create_reply) \
2362 _(netmap_delete_reply)
2365 static void vl_api_##n##_t_handler \
2366 (vl_api_##n##_t * mp) \
2368 vat_main_t * vam = &vat_main; \
2369 i32 retval = ntohl(mp->retval); \
2370 if (vam->async_mode) { \
2371 vam->async_errors += (retval < 0); \
2373 vam->retval = retval; \
2374 vam->result_ready = 1; \
2377 foreach_standard_reply_retval_handler;
2381 static void vl_api_##n##_t_handler_json \
2382 (vl_api_##n##_t * mp) \
2384 vat_main_t * vam = &vat_main; \
2385 vat_json_node_t node; \
2386 vat_json_init_object(&node); \
2387 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
2388 vat_json_print(vam->ofp, &node); \
2389 vam->retval = ntohl(mp->retval); \
2390 vam->result_ready = 1; \
2392 foreach_standard_reply_retval_handler;
2396 * Table of message reply handlers, must include boilerplate handlers
2400 #define foreach_vpe_api_reply_msg \
2401 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
2402 _(SW_INTERFACE_DETAILS, sw_interface_details) \
2403 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
2404 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
2405 _(CONTROL_PING_REPLY, control_ping_reply) \
2406 _(CLI_REPLY, cli_reply) \
2407 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
2408 sw_interface_add_del_address_reply) \
2409 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
2410 _(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
2411 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
2412 sw_interface_set_l2_xconnect_reply) \
2413 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
2414 sw_interface_set_l2_bridge_reply) \
2415 _(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
2416 _(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
2417 _(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
2418 _(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
2419 _(L2_FLAGS_REPLY, l2_flags_reply) \
2420 _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
2421 _(TAP_CONNECT_REPLY, tap_connect_reply) \
2422 _(TAP_MODIFY_REPLY, tap_modify_reply) \
2423 _(TAP_DELETE_REPLY, tap_delete_reply) \
2424 _(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
2425 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
2426 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
2427 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
2428 proxy_arp_intfc_enable_disable_reply) \
2429 _(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
2430 _(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
2431 _(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
2432 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
2433 mpls_ethernet_add_del_tunnel_reply) \
2434 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
2435 mpls_ethernet_add_del_tunnel_2_reply) \
2436 _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
2437 sw_interface_set_unnumbered_reply) \
2438 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
2439 _(RESET_VRF_REPLY, reset_vrf_reply) \
2440 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
2441 _(CREATE_SUBIF_REPLY, create_subif_reply) \
2442 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
2443 _(RESET_FIB_REPLY, reset_fib_reply) \
2444 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
2445 _(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
2446 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
2447 _(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
2448 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
2449 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
2450 sw_interface_ip6_enable_disable_reply) \
2451 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
2452 sw_interface_ip6_set_link_local_address_reply) \
2453 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
2454 sw_interface_ip6nd_ra_prefix_reply) \
2455 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
2456 sw_interface_ip6nd_ra_config_reply) \
2457 _(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
2458 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
2459 _(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
2460 _(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
2461 _(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
2462 _(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
2463 _(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
2464 _(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
2465 classify_set_interface_ip_table_reply) \
2466 _(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
2467 classify_set_interface_l2_tables_reply) \
2468 _(GET_NODE_INDEX_REPLY, get_node_index_reply) \
2469 _(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
2470 _(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
2471 _(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
2472 _(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
2473 l2tpv3_interface_enable_disable_reply) \
2474 _(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
2475 _(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
2476 _(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
2477 _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
2478 _(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
2479 _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
2480 _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
2481 _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
2482 _(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
2483 _(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
2484 _(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
2485 _(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
2486 _(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
2487 _(SHOW_VERSION_REPLY, show_version_reply) \
2488 _(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
2489 _(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
2490 _(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
2491 _(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
2492 _(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
2493 _(IP4_ARP_EVENT, ip4_arp_event) \
2494 _(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
2495 _(IP_ADDRESS_DETAILS, ip_address_details) \
2496 _(IP_DETAILS, ip_details) \
2497 _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
2498 _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
2499 _(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
2500 _(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
2501 _(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
2502 _(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
2503 _(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
2504 _(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
2505 _(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
2506 _(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
2507 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
2508 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
2509 _(DHCP_COMPL_EVENT, dhcp_compl_event) \
2510 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
2511 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
2512 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
2513 _(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
2514 _(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
2515 _(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
2516 _(MAP_DOMAIN_DETAILS, map_domain_details) \
2517 _(MAP_RULE_DETAILS, map_rule_details) \
2518 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
2519 _(WANT_STATS_REPLY, want_stats_reply) \
2520 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
2521 _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
2522 _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
2523 _(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
2524 _(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
2525 _(TRACE_PROFILE_ADD_REPLY, trace_profile_add_reply) \
2526 _(TRACE_PROFILE_APPLY_REPLY, trace_profile_apply_reply) \
2527 _(TRACE_PROFILE_DEL_REPLY, trace_profile_del_reply) \
2528 _(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
2529 _(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
2530 _(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
2531 _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
2532 _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
2533 _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
2534 _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
2535 _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
2536 _(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
2537 _(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
2538 _(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details) \
2539 _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
2540 _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
2541 _(LISP_ENABLE_DISABLE_STATUS_DETAILS, \
2542 lisp_enable_disable_status_details) \
2543 _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
2544 _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
2545 _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
2546 _(POLICER_DETAILS, policer_details) \
2547 _(NETMAP_CREATE_REPLY, netmap_create_reply) \
2548 _(NETMAP_DELETE_REPLY, netmap_delete_reply)
2550 /* M: construct, but don't yet send a message */
2554 vam->result_ready = 0; \
2555 mp = vl_msg_api_alloc(sizeof(*mp)); \
2556 memset (mp, 0, sizeof (*mp)); \
2557 mp->_vl_msg_id = ntohs (VL_API_##T); \
2558 mp->client_index = vam->my_client_index; \
2563 vam->result_ready = 0; \
2564 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
2565 memset (mp, 0, sizeof (*mp)); \
2566 mp->_vl_msg_id = ntohs (VL_API_##T); \
2567 mp->client_index = vam->my_client_index; \
2571 /* S: send a message */
2572 #define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
2574 /* W: wait for results, with timeout */
2577 timeout = vat_time_now (vam) + 1.0; \
2579 while (vat_time_now (vam) < timeout) { \
2580 if (vam->result_ready == 1) { \
2581 return (vam->retval); \
2593 #define STR_VTR_OP_CASE(op) \
2594 case L2_VTR_ ## op: \
2597 static const char *str_vtr_op(u32 vtr_op)
2600 STR_VTR_OP_CASE(DISABLED);
2601 STR_VTR_OP_CASE(PUSH_1);
2602 STR_VTR_OP_CASE(PUSH_2);
2603 STR_VTR_OP_CASE(POP_1);
2604 STR_VTR_OP_CASE(POP_2);
2605 STR_VTR_OP_CASE(TRANSLATE_1_1);
2606 STR_VTR_OP_CASE(TRANSLATE_1_2);
2607 STR_VTR_OP_CASE(TRANSLATE_2_1);
2608 STR_VTR_OP_CASE(TRANSLATE_2_2);
2614 static int dump_sub_interface_table (vat_main_t * vam)
2616 const sw_interface_subif_t * sub = NULL;
2618 if (vam->json_output) {
2619 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2624 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
2625 "Interface", "sw_if_index",
2626 "sub id", "dot1ad", "tags", "outer id",
2627 "inner id", "exact", "default",
2628 "outer any", "inner any");
2630 vec_foreach (sub, vam->sw_if_subif_table) {
2632 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
2633 sub->interface_name,
2635 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
2636 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
2637 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
2638 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
2639 if (sub->vtr_op != L2_VTR_DISABLED) {
2641 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
2642 "tag1: %d tag2: %d ]\n",
2643 str_vtr_op(sub->vtr_op), sub->vtr_push_dot1q,
2644 sub->vtr_tag1, sub->vtr_tag2);
2651 static int name_sort_cmp (void * a1, void * a2)
2653 name_sort_t * n1 = a1;
2654 name_sort_t * n2 = a2;
2656 return strcmp ((char *)n1->name, (char *)n2->name);
2659 static int dump_interface_table (vat_main_t * vam)
2662 name_sort_t * nses = 0, * ns;
2664 if (vam->json_output) {
2665 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2669 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
2671 vec_add2 (nses, ns, 1);
2672 ns->name = (u8 *)(p->key);
2673 ns->value = (u32) p->value[0];
2676 vec_sort_with_function (nses, name_sort_cmp);
2678 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
2679 vec_foreach (ns, nses) {
2680 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
2686 static int dump_ip_table (vat_main_t * vam, int is_ipv6)
2688 const ip_details_t * det = NULL;
2689 const ip_address_details_t * address = NULL;
2700 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6]) {
2702 if (!det->present) {
2710 "Address", "Prefix length");
2714 vec_foreach (address, det->addr) {
2717 is_ipv6 ? format_ip6_address : format_ip4_address,
2719 address->prefix_length);
2726 static int dump_ipv4_table (vat_main_t * vam)
2728 if (vam->json_output) {
2729 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2733 return dump_ip_table (vam, 0);
2736 static int dump_ipv6_table (vat_main_t * vam)
2738 if (vam->json_output) {
2739 clib_warning ("JSON output supported only for VPE API calls and dump_stats_table");
2743 return dump_ip_table (vam, 1);
2746 static char* counter_type_to_str (u8 counter_type, u8 is_combined)
2749 switch(counter_type) {
2750 case VNET_INTERFACE_COUNTER_DROP:
2752 case VNET_INTERFACE_COUNTER_PUNT:
2754 case VNET_INTERFACE_COUNTER_IP4:
2756 case VNET_INTERFACE_COUNTER_IP6:
2758 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
2760 case VNET_INTERFACE_COUNTER_RX_MISS:
2762 case VNET_INTERFACE_COUNTER_RX_ERROR:
2764 case VNET_INTERFACE_COUNTER_TX_ERROR:
2767 return "INVALID-COUNTER-TYPE";
2770 switch(counter_type) {
2771 case VNET_INTERFACE_COUNTER_RX:
2773 case VNET_INTERFACE_COUNTER_TX:
2776 return "INVALID-COUNTER-TYPE";
2781 static int dump_stats_table (vat_main_t * vam)
2783 vat_json_node_t node;
2784 vat_json_node_t *msg_array;
2785 vat_json_node_t *msg;
2786 vat_json_node_t *counter_array;
2787 vat_json_node_t *counter;
2788 interface_counter_t c;
2790 ip4_fib_counter_t *c4;
2791 ip6_fib_counter_t *c6;
2794 if (!vam->json_output) {
2795 clib_warning ("dump_stats_table supported only in JSON format");
2799 vat_json_init_object(&node);
2801 /* interface counters */
2802 msg_array = vat_json_object_add(&node, "interface_counters");
2803 vat_json_init_array(msg_array);
2804 for (i = 0; i < vec_len(vam->simple_interface_counters); i++) {
2805 msg = vat_json_array_add(msg_array);
2806 vat_json_init_object(msg);
2807 vat_json_object_add_string_copy(msg, "vnet_counter_type",
2808 (u8*)counter_type_to_str(i, 0));
2809 vat_json_object_add_int(msg, "is_combined", 0);
2810 counter_array = vat_json_object_add(msg, "data");
2811 vat_json_init_array(counter_array);
2812 for (j = 0; j < vec_len(vam->simple_interface_counters[i]); j++) {
2813 packets = vam->simple_interface_counters[i][j];
2814 vat_json_array_add_uint(counter_array, packets);
2817 for (i = 0; i < vec_len(vam->combined_interface_counters); i++) {
2818 msg = vat_json_array_add(msg_array);
2819 vat_json_init_object(msg);
2820 vat_json_object_add_string_copy(msg, "vnet_counter_type",
2821 (u8*)counter_type_to_str(i, 1));
2822 vat_json_object_add_int(msg, "is_combined", 1);
2823 counter_array = vat_json_object_add(msg, "data");
2824 vat_json_init_array(counter_array);
2825 for (j = 0; j < vec_len(vam->combined_interface_counters[i]); j++) {
2826 c = vam->combined_interface_counters[i][j];
2827 counter = vat_json_array_add(counter_array);
2828 vat_json_init_object(counter);
2829 vat_json_object_add_uint(counter, "packets", c.packets);
2830 vat_json_object_add_uint(counter, "bytes", c.bytes);
2834 /* ip4 fib counters */
2835 msg_array = vat_json_object_add(&node, "ip4_fib_counters");
2836 vat_json_init_array(msg_array);
2837 for (i = 0; i < vec_len(vam->ip4_fib_counters); i++) {
2838 msg = vat_json_array_add(msg_array);
2839 vat_json_init_object(msg);
2840 vat_json_object_add_uint(msg, "vrf_id", vam->ip4_fib_counters_vrf_id_by_index[i]);
2841 counter_array = vat_json_object_add(msg, "c");
2842 vat_json_init_array(counter_array);
2843 for (j = 0; j < vec_len(vam->ip4_fib_counters[i]); j++) {
2844 counter = vat_json_array_add(counter_array);
2845 vat_json_init_object(counter);
2846 c4 = &vam->ip4_fib_counters[i][j];
2847 vat_json_object_add_ip4(counter, "address", c4->address);
2848 vat_json_object_add_uint(counter, "address_length", c4->address_length);
2849 vat_json_object_add_uint(counter, "packets", c4->packets);
2850 vat_json_object_add_uint(counter, "bytes", c4->bytes);
2854 /* ip6 fib counters */
2855 msg_array = vat_json_object_add(&node, "ip6_fib_counters");
2856 vat_json_init_array(msg_array);
2857 for (i = 0; i < vec_len(vam->ip6_fib_counters); i++) {
2858 msg = vat_json_array_add(msg_array);
2859 vat_json_init_object(msg);
2860 vat_json_object_add_uint(msg, "vrf_id", vam->ip6_fib_counters_vrf_id_by_index[i]);
2861 counter_array = vat_json_object_add(msg, "c");
2862 vat_json_init_array(counter_array);
2863 for (j = 0; j < vec_len(vam->ip6_fib_counters[i]); j++) {
2864 counter = vat_json_array_add(counter_array);
2865 vat_json_init_object(counter);
2866 c6 = &vam->ip6_fib_counters[i][j];
2867 vat_json_object_add_ip6(counter, "address", c6->address);
2868 vat_json_object_add_uint(counter, "address_length", c6->address_length);
2869 vat_json_object_add_uint(counter, "packets", c6->packets);
2870 vat_json_object_add_uint(counter, "bytes", c6->bytes);
2874 vat_json_print(vam->ofp, &node);
2875 vat_json_free(&node);
2880 int exec (vat_main_t * vam)
2882 api_main_t * am = &api_main;
2883 vl_api_cli_request_t *mp;
2887 unformat_input_t * i = vam->input;
2889 if (vec_len(i->buffer) == 0)
2892 if (vam->exec_mode == 0 && unformat (i, "mode")) {
2896 if (vam->exec_mode == 1 &&
2897 (unformat (i, "exit") || unformat (i, "quit"))) {
2903 M(CLI_REQUEST, cli_request);
2906 * Copy cmd into shared memory.
2907 * In order for the CLI command to work, it
2908 * must be a vector ending in \n, not a C-string ending
2911 pthread_mutex_lock (&am->vlib_rp->mutex);
2912 oldheap = svm_push_data_heap (am->vlib_rp);
2914 vec_validate (cmd, vec_len(vam->input->buffer)-1);
2915 clib_memcpy (cmd, vam->input->buffer, vec_len(vam->input->buffer));
2917 svm_pop_heap (oldheap);
2918 pthread_mutex_unlock (&am->vlib_rp->mutex);
2920 mp->cmd_in_shmem = (u64) cmd;
2922 timeout = vat_time_now (vam) + 10.0;
2924 while (vat_time_now (vam) < timeout) {
2925 if (vam->result_ready == 1) {
2927 if (vam->shmem_result != NULL)
2928 fformat (vam->ofp, "%s", vam->shmem_result);
2929 pthread_mutex_lock (&am->vlib_rp->mutex);
2930 oldheap = svm_push_data_heap (am->vlib_rp);
2932 free_me = (u8 *)vam->shmem_result;
2935 svm_pop_heap (oldheap);
2936 pthread_mutex_unlock (&am->vlib_rp->mutex);
2943 static int api_create_loopback (vat_main_t * vam)
2945 unformat_input_t * i = vam->input;
2946 vl_api_create_loopback_t *mp;
2951 memset (mac_address, 0, sizeof (mac_address));
2953 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2955 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
2961 /* Construct the API message */
2962 M(CREATE_LOOPBACK, create_loopback);
2964 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
2969 static int api_delete_loopback (vat_main_t * vam)
2971 unformat_input_t * i = vam->input;
2972 vl_api_delete_loopback_t *mp;
2974 u32 sw_if_index = ~0;
2976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2978 if (unformat (i, "sw_if_index %d", &sw_if_index))
2984 if (sw_if_index == ~0)
2986 errmsg ("missing sw_if_index\n");
2990 /* Construct the API message */
2991 M(DELETE_LOOPBACK, delete_loopback);
2992 mp->sw_if_index = ntohl (sw_if_index);
2997 static int api_want_stats (vat_main_t * vam)
2999 unformat_input_t * i = vam->input;
3000 vl_api_want_stats_t * mp;
3004 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3006 if (unformat (i, "enable"))
3008 else if (unformat (i, "disable"))
3016 errmsg ("missing enable|disable\n");
3020 M(WANT_STATS, want_stats);
3021 mp->enable_disable = enable;
3026 static int api_want_interface_events (vat_main_t * vam)
3028 unformat_input_t * i = vam->input;
3029 vl_api_want_interface_events_t * mp;
3033 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
3035 if (unformat (i, "enable"))
3037 else if (unformat (i, "disable"))
3045 errmsg ("missing enable|disable\n");
3049 M(WANT_INTERFACE_EVENTS, want_interface_events);
3050 mp->enable_disable = enable;
3052 vam->interface_event_display = enable;
3058 /* Note: non-static, called once to set up the initial intfc table */
3059 int api_sw_interface_dump (vat_main_t * vam)
3061 vl_api_sw_interface_dump_t *mp;
3064 name_sort_t * nses = 0, * ns;
3065 sw_interface_subif_t * sub = NULL;
3067 /* Toss the old name table */
3068 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3070 vec_add2 (nses, ns, 1);
3071 ns->name = (u8 *)(p->key);
3072 ns->value = (u32) p->value[0];
3075 hash_free (vam->sw_if_index_by_interface_name);
3077 vec_foreach (ns, nses)
3078 vec_free (ns->name);
3082 vec_foreach (sub, vam->sw_if_subif_table) {
3083 vec_free (sub->interface_name);
3085 vec_free (vam->sw_if_subif_table);
3087 /* recreate the interface name hash table */
3088 vam->sw_if_index_by_interface_name
3089 = hash_create_string (0, sizeof(uword));
3091 /* Get list of ethernets */
3092 M(SW_INTERFACE_DUMP, sw_interface_dump);
3093 mp->name_filter_valid = 1;
3094 strncpy ((char *) mp->name_filter, "Ether", sizeof(mp->name_filter)-1);
3097 /* and local / loopback interfaces */
3098 M(SW_INTERFACE_DUMP, sw_interface_dump);
3099 mp->name_filter_valid = 1;
3100 strncpy ((char *) mp->name_filter, "lo", sizeof(mp->name_filter)-1);
3103 /* and vxlan tunnel interfaces */
3104 M(SW_INTERFACE_DUMP, sw_interface_dump);
3105 mp->name_filter_valid = 1;
3106 strncpy ((char *) mp->name_filter, "vxlan", sizeof(mp->name_filter)-1);
3109 /* and host (af_packet) interfaces */
3110 M(SW_INTERFACE_DUMP, sw_interface_dump);
3111 mp->name_filter_valid = 1;
3112 strncpy ((char *) mp->name_filter, "host", sizeof(mp->name_filter)-1);
3115 /* and l2tpv3 tunnel interfaces */
3116 M(SW_INTERFACE_DUMP, sw_interface_dump);
3117 mp->name_filter_valid = 1;
3118 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel", sizeof(mp->name_filter)-1);
3121 /* and GRE tunnel interfaces */
3122 M(SW_INTERFACE_DUMP, sw_interface_dump);
3123 mp->name_filter_valid = 1;
3124 strncpy ((char *) mp->name_filter, "gre", sizeof(mp->name_filter)-1);
3127 /* Use a control ping for synchronization */
3129 vl_api_control_ping_t * mp;
3130 M(CONTROL_PING, control_ping);
3136 static int api_sw_interface_set_flags (vat_main_t * vam)
3138 unformat_input_t * i = vam->input;
3139 vl_api_sw_interface_set_flags_t *mp;
3142 u8 sw_if_index_set = 0;
3143 u8 admin_up = 0, link_up = 0;
3145 /* Parse args required to build the message */
3146 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3147 if (unformat (i, "admin-up"))
3149 else if (unformat (i, "admin-down"))
3151 else if (unformat (i, "link-up"))
3153 else if (unformat (i, "link-down"))
3155 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3156 sw_if_index_set = 1;
3157 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3158 sw_if_index_set = 1;
3163 if (sw_if_index_set == 0) {
3164 errmsg ("missing interface name or sw_if_index\n");
3168 /* Construct the API message */
3169 M(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
3170 mp->sw_if_index = ntohl (sw_if_index);
3171 mp->admin_up_down = admin_up;
3172 mp->link_up_down = link_up;
3177 /* Wait for a reply, return the good/bad news... */
3181 static int api_sw_interface_clear_stats (vat_main_t * vam)
3183 unformat_input_t * i = vam->input;
3184 vl_api_sw_interface_clear_stats_t *mp;
3187 u8 sw_if_index_set = 0;
3189 /* Parse args required to build the message */
3190 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3191 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3192 sw_if_index_set = 1;
3193 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3194 sw_if_index_set = 1;
3199 /* Construct the API message */
3200 M(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
3202 if (sw_if_index_set == 1)
3203 mp->sw_if_index = ntohl (sw_if_index);
3205 mp->sw_if_index = ~0;
3210 /* Wait for a reply, return the good/bad news... */
3214 static int api_sw_interface_add_del_address (vat_main_t * vam)
3216 unformat_input_t * i = vam->input;
3217 vl_api_sw_interface_add_del_address_t *mp;
3220 u8 sw_if_index_set = 0;
3221 u8 is_add = 1, del_all = 0;
3222 u32 address_length = 0;
3223 u8 v4_address_set = 0;
3224 u8 v6_address_set = 0;
3225 ip4_address_t v4address;
3226 ip6_address_t v6address;
3228 /* Parse args required to build the message */
3229 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3230 if (unformat (i, "del-all"))
3232 else if (unformat (i, "del"))
3234 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3235 sw_if_index_set = 1;
3236 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3237 sw_if_index_set = 1;
3238 else if (unformat (i, "%U/%d",
3239 unformat_ip4_address, &v4address,
3242 else if (unformat (i, "%U/%d",
3243 unformat_ip6_address, &v6address,
3250 if (sw_if_index_set == 0) {
3251 errmsg ("missing interface name or sw_if_index\n");
3254 if (v4_address_set && v6_address_set) {
3255 errmsg ("both v4 and v6 addresses set\n");
3258 if (!v4_address_set && !v6_address_set && !del_all) {
3259 errmsg ("no addresses set\n");
3263 /* Construct the API message */
3264 M(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
3266 mp->sw_if_index = ntohl (sw_if_index);
3267 mp->is_add = is_add;
3268 mp->del_all = del_all;
3269 if (v6_address_set) {
3271 clib_memcpy (mp->address, &v6address, sizeof (v6address));
3273 clib_memcpy (mp->address, &v4address, sizeof (v4address));
3275 mp->address_length = address_length;
3280 /* Wait for a reply, return good/bad news */
3284 static int api_sw_interface_set_table (vat_main_t * vam)
3286 unformat_input_t * i = vam->input;
3287 vl_api_sw_interface_set_table_t *mp;
3289 u32 sw_if_index, vrf_id = 0;
3290 u8 sw_if_index_set = 0;
3293 /* Parse args required to build the message */
3294 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3295 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3296 sw_if_index_set = 1;
3297 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3298 sw_if_index_set = 1;
3299 else if (unformat (i, "vrf %d", &vrf_id))
3301 else if (unformat (i, "ipv6"))
3307 if (sw_if_index_set == 0) {
3308 errmsg ("missing interface name or sw_if_index\n");
3312 /* Construct the API message */
3313 M(SW_INTERFACE_SET_TABLE, sw_interface_set_table);
3315 mp->sw_if_index = ntohl (sw_if_index);
3316 mp->is_ipv6 = is_ipv6;
3317 mp->vrf_id = ntohl (vrf_id);
3322 /* Wait for a reply... */
3326 static int api_sw_interface_set_vpath (vat_main_t * vam)
3328 unformat_input_t * i = vam->input;
3329 vl_api_sw_interface_set_vpath_t *mp;
3331 u32 sw_if_index = 0;
3332 u8 sw_if_index_set = 0;
3335 /* Parse args required to build the message */
3336 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3337 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3338 sw_if_index_set = 1;
3339 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3340 sw_if_index_set = 1;
3341 else if (unformat (i, "enable"))
3343 else if (unformat (i, "disable"))
3349 if (sw_if_index_set == 0) {
3350 errmsg ("missing interface name or sw_if_index\n");
3354 /* Construct the API message */
3355 M(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
3357 mp->sw_if_index = ntohl (sw_if_index);
3358 mp->enable = is_enable;
3363 /* Wait for a reply... */
3367 static int api_sw_interface_set_l2_xconnect (vat_main_t * vam)
3369 unformat_input_t * i = vam->input;
3370 vl_api_sw_interface_set_l2_xconnect_t *mp;
3373 u8 rx_sw_if_index_set = 0;
3375 u8 tx_sw_if_index_set = 0;
3378 /* Parse args required to build the message */
3379 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3380 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
3381 rx_sw_if_index_set = 1;
3382 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
3383 tx_sw_if_index_set = 1;
3384 else if (unformat (i, "rx")) {
3385 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3386 if (unformat (i, "%U", unformat_sw_if_index, vam,
3388 rx_sw_if_index_set = 1;
3391 } else if (unformat (i, "tx")) {
3392 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3393 if (unformat (i, "%U", unformat_sw_if_index, vam,
3395 tx_sw_if_index_set = 1;
3398 } else if (unformat (i, "enable"))
3400 else if (unformat (i, "disable"))
3406 if (rx_sw_if_index_set == 0) {
3407 errmsg ("missing rx interface name or rx_sw_if_index\n");
3411 if (enable && (tx_sw_if_index_set == 0)) {
3412 errmsg ("missing tx interface name or tx_sw_if_index\n");
3416 M(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
3418 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
3419 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
3420 mp->enable = enable;
3427 static int api_sw_interface_set_l2_bridge (vat_main_t * vam)
3429 unformat_input_t * i = vam->input;
3430 vl_api_sw_interface_set_l2_bridge_t *mp;
3433 u8 rx_sw_if_index_set = 0;
3440 /* Parse args required to build the message */
3441 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3442 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
3443 rx_sw_if_index_set = 1;
3444 else if (unformat (i, "bd_id %d", &bd_id))
3446 else if (unformat (i, "%U", unformat_sw_if_index, vam,
3448 rx_sw_if_index_set = 1;
3449 else if (unformat (i, "shg %d", &shg))
3451 else if (unformat (i, "bvi"))
3453 else if (unformat (i, "enable"))
3455 else if (unformat (i, "disable"))
3461 if (rx_sw_if_index_set == 0) {
3462 errmsg ("missing rx interface name or sw_if_index\n");
3466 if (enable && (bd_id_set == 0)) {
3467 errmsg ("missing bridge domain\n");
3471 M(SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
3473 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
3474 mp->bd_id = ntohl(bd_id);
3477 mp->enable = enable;
3484 static int api_bridge_domain_dump (vat_main_t * vam)
3486 unformat_input_t * i = vam->input;
3487 vl_api_bridge_domain_dump_t *mp;
3491 /* Parse args required to build the message */
3492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3493 if (unformat (i, "bd_id %d", &bd_id))
3499 M(BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
3500 mp->bd_id = ntohl(bd_id);
3503 /* Use a control ping for synchronization */
3505 vl_api_control_ping_t * mp;
3506 M(CONTROL_PING, control_ping);
3515 static int api_bridge_domain_add_del (vat_main_t * vam)
3517 unformat_input_t * i = vam->input;
3518 vl_api_bridge_domain_add_del_t *mp;
3522 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
3524 /* Parse args required to build the message */
3525 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3526 if (unformat (i, "bd_id %d", &bd_id))
3528 else if (unformat (i, "flood %d", &flood))
3530 else if (unformat (i, "uu-flood %d", &uu_flood))
3532 else if (unformat (i, "forward %d", &forward))
3534 else if (unformat (i, "learn %d", &learn))
3536 else if (unformat (i, "arp-term %d", &arp_term))
3538 else if (unformat (i, "del")) {
3540 flood = uu_flood = forward = learn = 0;
3547 errmsg ("missing bridge domain\n");
3551 M(BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
3553 mp->bd_id = ntohl(bd_id);
3555 mp->uu_flood = uu_flood;
3556 mp->forward = forward;
3558 mp->arp_term = arp_term;
3559 mp->is_add = is_add;
3566 static int api_l2fib_add_del (vat_main_t * vam)
3568 unformat_input_t * i = vam->input;
3569 vl_api_l2fib_add_del_t *mp;
3576 u8 sw_if_index_set = 0;
3581 /* Parse args required to build the message */
3582 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3583 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
3585 else if (unformat (i, "bd_id %d", &bd_id))
3587 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3588 sw_if_index_set = 1;
3589 else if (unformat (i, "sw_if")) {
3590 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3591 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3592 sw_if_index_set = 1;
3595 } else if (unformat (i, "static"))
3597 else if (unformat (i, "filter")) {
3600 } else if (unformat (i, "del"))
3607 errmsg ("missing mac address\n");
3611 if (bd_id_set == 0) {
3612 errmsg ("missing bridge domain\n");
3616 if (is_add && (sw_if_index_set == 0)) {
3617 errmsg ("missing interface name or sw_if_index\n");
3621 M(L2FIB_ADD_DEL, l2fib_add_del);
3624 mp->bd_id = ntohl(bd_id);
3625 mp->is_add = is_add;
3628 mp->sw_if_index = ntohl(sw_if_index);
3629 mp->static_mac = static_mac;
3630 mp->filter_mac = filter_mac;
3638 static int api_l2_flags (vat_main_t * vam)
3640 unformat_input_t * i = vam->input;
3641 vl_api_l2_flags_t *mp;
3644 u32 feature_bitmap = 0;
3645 u8 sw_if_index_set = 0;
3647 /* Parse args required to build the message */
3648 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3649 if (unformat (i, "sw_if_index %d", &sw_if_index))
3650 sw_if_index_set = 1;
3651 else if (unformat (i, "sw_if")) {
3652 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3653 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3654 sw_if_index_set = 1;
3657 } else if (unformat (i, "learn"))
3658 feature_bitmap |= L2INPUT_FEAT_LEARN;
3659 else if (unformat (i, "forward"))
3660 feature_bitmap |= L2INPUT_FEAT_FWD;
3661 else if (unformat (i, "flood"))
3662 feature_bitmap |= L2INPUT_FEAT_FLOOD;
3663 else if (unformat (i, "uu-flood"))
3664 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
3669 if (sw_if_index_set == 0) {
3670 errmsg ("missing interface name or sw_if_index\n");
3674 M(L2_FLAGS, l2_flags);
3676 mp->sw_if_index = ntohl(sw_if_index);
3677 mp->feature_bitmap = ntohl(feature_bitmap);
3684 static int api_bridge_flags (vat_main_t * vam)
3686 unformat_input_t * i = vam->input;
3687 vl_api_bridge_flags_t *mp;
3694 /* Parse args required to build the message */
3695 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3696 if (unformat (i, "bd_id %d", &bd_id))
3698 else if (unformat (i, "learn"))
3700 else if (unformat (i, "forward"))
3702 else if (unformat (i, "flood"))
3704 else if (unformat (i, "uu-flood"))
3705 flags |= L2_UU_FLOOD;
3706 else if (unformat (i, "arp-term"))
3707 flags |= L2_ARP_TERM;
3708 else if (unformat (i, "off"))
3710 else if (unformat (i, "disable"))
3716 if (bd_id_set == 0) {
3717 errmsg ("missing bridge domain\n");
3721 M(BRIDGE_FLAGS, bridge_flags);
3723 mp->bd_id = ntohl(bd_id);
3724 mp->feature_bitmap = ntohl(flags);
3725 mp->is_set = is_set;
3732 static int api_bd_ip_mac_add_del (vat_main_t * vam)
3734 unformat_input_t * i = vam->input;
3735 vl_api_bd_ip_mac_add_del_t *mp;
3743 ip4_address_t v4addr;
3744 ip6_address_t v6addr;
3748 /* Parse args required to build the message */
3749 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3750 if (unformat (i, "bd_id %d", &bd_id)) {
3752 } else if (unformat (i, "%U", unformat_ip4_address, &v4addr)) {
3754 } else if (unformat (i, "%U", unformat_ip6_address, &v6addr)) {
3757 } else if (unformat (i, "%U", unformat_ethernet_address, macaddr)) {
3759 } else if (unformat (i, "del"))
3765 if (bd_id_set == 0) {
3766 errmsg ("missing bridge domain\n");
3768 } else if (ip_set == 0) {
3769 errmsg ("missing IP address\n");
3771 } else if (mac_set == 0) {
3772 errmsg ("missing MAC address\n");
3776 M(BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
3778 mp->bd_id = ntohl(bd_id);
3779 mp->is_ipv6 = is_ipv6;
3780 mp->is_add = is_add;
3782 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
3783 else clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
3784 clib_memcpy (mp->mac_address, macaddr, 6);
3790 static int api_tap_connect (vat_main_t * vam)
3792 unformat_input_t * i = vam->input;
3793 vl_api_tap_connect_t *mp;
3800 memset (mac_address, 0, sizeof (mac_address));
3802 /* Parse args required to build the message */
3803 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3804 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
3807 else if (unformat (i, "random-mac"))
3809 else if (unformat (i, "tapname %s", &tap_name))
3815 if (name_set == 0) {
3816 errmsg ("missing tap name\n");
3819 if (vec_len (tap_name) > 63) {
3820 errmsg ("tap name too long\n");
3822 vec_add1 (tap_name, 0);
3824 /* Construct the API message */
3825 M(TAP_CONNECT, tap_connect);
3827 mp->use_random_mac = random_mac;
3828 clib_memcpy (mp->mac_address, mac_address, 6);
3829 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
3830 vec_free (tap_name);
3835 /* Wait for a reply... */
3839 static int api_tap_modify (vat_main_t * vam)
3841 unformat_input_t * i = vam->input;
3842 vl_api_tap_modify_t *mp;
3848 u32 sw_if_index = ~0;
3849 u8 sw_if_index_set = 0;
3851 memset (mac_address, 0, sizeof (mac_address));
3853 /* Parse args required to build the message */
3854 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3855 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3856 sw_if_index_set = 1;
3857 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3858 sw_if_index_set = 1;
3859 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
3862 else if (unformat (i, "random-mac"))
3864 else if (unformat (i, "tapname %s", &tap_name))
3870 if (sw_if_index_set == 0) {
3871 errmsg ("missing vpp interface name");
3874 if (name_set == 0) {
3875 errmsg ("missing tap name\n");
3878 if (vec_len (tap_name) > 63) {
3879 errmsg ("tap name too long\n");
3881 vec_add1 (tap_name, 0);
3883 /* Construct the API message */
3884 M(TAP_MODIFY, tap_modify);
3886 mp->use_random_mac = random_mac;
3887 mp->sw_if_index = ntohl(sw_if_index);
3888 clib_memcpy (mp->mac_address, mac_address, 6);
3889 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
3890 vec_free (tap_name);
3895 /* Wait for a reply... */
3899 static int api_tap_delete (vat_main_t * vam)
3901 unformat_input_t * i = vam->input;
3902 vl_api_tap_delete_t *mp;
3904 u32 sw_if_index = ~0;
3905 u8 sw_if_index_set = 0;
3907 /* Parse args required to build the message */
3908 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3909 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3910 sw_if_index_set = 1;
3911 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3912 sw_if_index_set = 1;
3917 if (sw_if_index_set == 0) {
3918 errmsg ("missing vpp interface name");
3922 /* Construct the API message */
3923 M(TAP_DELETE, tap_delete);
3925 mp->sw_if_index = ntohl(sw_if_index);
3930 /* Wait for a reply... */
3934 static int api_ip_add_del_route (vat_main_t * vam)
3936 unformat_input_t * i = vam->input;
3937 vl_api_ip_add_del_route_t *mp;
3939 u32 sw_if_index = 0, vrf_id = 0;
3940 u8 sw_if_index_set = 0;
3942 u8 is_local = 0, is_drop = 0;
3943 u8 create_vrf_if_needed = 0;
3945 u8 next_hop_weight = 1;
3947 u8 is_multipath = 0;
3949 u8 address_length_set = 0;
3950 u32 lookup_in_vrf = 0;
3951 u32 resolve_attempts = 0;
3952 u32 dst_address_length = 0;
3953 u8 next_hop_set = 0;
3954 ip4_address_t v4_dst_address, v4_next_hop_address;
3955 ip6_address_t v6_dst_address, v6_next_hop_address;
3959 u32 random_add_del = 0;
3960 u32 * random_vector = 0;
3961 uword * random_hash;
3962 u32 random_seed = 0xdeaddabe;
3963 u32 classify_table_index = ~0;
3966 /* Parse args required to build the message */
3967 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
3968 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
3969 sw_if_index_set = 1;
3970 else if (unformat (i, "sw_if_index %d", &sw_if_index))
3971 sw_if_index_set = 1;
3972 else if (unformat (i, "%U", unformat_ip4_address,
3977 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address)) {
3981 else if (unformat (i, "/%d", &dst_address_length)) {
3982 address_length_set = 1;
3985 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
3986 &v4_next_hop_address)) {
3989 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
3990 &v6_next_hop_address)) {
3993 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
3995 else if (unformat (i, "weight %d", &next_hop_weight))
3997 else if (unformat (i, "drop")) {
3999 } else if (unformat (i, "local")) {
4001 } else if (unformat (i, "classify %d", &classify_table_index)) {
4003 } else if (unformat (i, "del"))
4005 else if (unformat (i, "add"))
4007 else if (unformat (i, "not-last"))
4009 else if (unformat (i, "multipath"))
4011 else if (unformat (i, "vrf %d", &vrf_id))
4013 else if (unformat (i, "create-vrf"))
4014 create_vrf_if_needed = 1;
4015 else if (unformat (i, "count %d", &count))
4017 else if (unformat (i, "lookup-in-vrf %d", &lookup_in_vrf))
4019 else if (unformat (i, "random"))
4021 else if (unformat (i, "seed %d", &random_seed))
4024 clib_warning ("parse error '%U'", format_unformat_error, i);
4029 if (resolve_attempts > 0 && sw_if_index_set == 0) {
4030 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
4034 if (!next_hop_set && !is_drop && !is_local && !is_classify) {
4035 errmsg ("next hop / local / drop / classify not set\n");
4039 if (address_set == 0) {
4040 errmsg ("missing addresses\n");
4044 if (address_length_set == 0) {
4045 errmsg ("missing address length\n");
4049 /* Generate a pile of unique, random routes */
4050 if (random_add_del) {
4051 u32 this_random_address;
4052 random_hash = hash_create (count, sizeof(uword));
4054 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
4055 for (j = 0; j <= count; j++) {
4057 this_random_address = random_u32 (&random_seed);
4058 this_random_address =
4059 clib_host_to_net_u32 (this_random_address);
4060 } while (hash_get (random_hash, this_random_address));
4061 vec_add1 (random_vector, this_random_address);
4062 hash_set (random_hash, this_random_address, 1);
4064 hash_free (random_hash);
4065 v4_dst_address.as_u32 = random_vector[0];
4069 /* Turn on async mode */
4070 vam->async_mode = 1;
4071 vam->async_errors = 0;
4072 before = vat_time_now(vam);
4075 for (j = 0; j < count; j++) {
4076 /* Construct the API message */
4077 M(IP_ADD_DEL_ROUTE, ip_add_del_route);
4079 mp->next_hop_sw_if_index = ntohl (sw_if_index);
4080 mp->vrf_id = ntohl (vrf_id);
4081 if (resolve_attempts > 0) {
4082 mp->resolve_attempts = ntohl (resolve_attempts);
4083 mp->resolve_if_needed = 1;
4085 mp->create_vrf_if_needed = create_vrf_if_needed;
4087 mp->is_add = is_add;
4088 mp->is_drop = is_drop;
4089 mp->is_ipv6 = is_ipv6;
4090 mp->is_local = is_local;
4091 mp->is_classify = is_classify;
4092 mp->is_multipath = is_multipath;
4093 mp->not_last = not_last;
4094 mp->next_hop_weight = next_hop_weight;
4095 mp->dst_address_length = dst_address_length;
4096 mp->lookup_in_vrf = ntohl(lookup_in_vrf);
4097 mp->classify_table_index = ntohl(classify_table_index);
4100 clib_memcpy (mp->dst_address, &v6_dst_address, sizeof (v6_dst_address));
4102 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
4103 sizeof (v6_next_hop_address));
4104 increment_v6_address (&v6_dst_address);
4106 clib_memcpy (mp->dst_address, &v4_dst_address, sizeof (v4_dst_address));
4108 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
4109 sizeof (v4_next_hop_address));
4111 v4_dst_address.as_u32 = random_vector[j+1];
4113 increment_v4_address (&v4_dst_address);
4119 /* When testing multiple add/del ops, use a control-ping to sync */
4121 vl_api_control_ping_t * mp;
4124 /* Shut off async mode */
4125 vam->async_mode = 0;
4127 M(CONTROL_PING, control_ping);
4130 timeout = vat_time_now(vam) + 1.0;
4131 while (vat_time_now (vam) < timeout)
4132 if (vam->result_ready == 1)
4137 if (vam->retval == -99)
4138 errmsg ("timeout\n");
4140 if (vam->async_errors > 0) {
4141 errmsg ("%d asynchronous errors\n", vam->async_errors);
4144 vam->async_errors = 0;
4145 after = vat_time_now(vam);
4147 fformat(vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
4148 count, after - before, count / (after - before));
4150 /* Wait for a reply... */
4154 /* Return the good/bad news */
4155 return (vam->retval);
4158 static int api_proxy_arp_add_del (vat_main_t * vam)
4160 unformat_input_t * i = vam->input;
4161 vl_api_proxy_arp_add_del_t *mp;
4165 ip4_address_t lo, hi;
4168 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4169 if (unformat (i, "vrf %d", &vrf_id))
4171 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
4172 unformat_ip4_address, &hi))
4174 else if (unformat (i, "del"))
4177 clib_warning ("parse error '%U'", format_unformat_error, i);
4182 if (range_set == 0) {
4183 errmsg ("address range not set\n");
4187 M(PROXY_ARP_ADD_DEL, proxy_arp_add_del);
4189 mp->vrf_id = ntohl(vrf_id);
4190 mp->is_add = is_add;
4191 clib_memcpy(mp->low_address, &lo, sizeof (mp->low_address));
4192 clib_memcpy(mp->hi_address, &hi, sizeof (mp->hi_address));
4199 static int api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
4201 unformat_input_t * i = vam->input;
4202 vl_api_proxy_arp_intfc_enable_disable_t *mp;
4206 u8 sw_if_index_set = 0;
4208 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4209 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4210 sw_if_index_set = 1;
4211 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4212 sw_if_index_set = 1;
4213 else if (unformat (i, "enable"))
4215 else if (unformat (i, "disable"))
4218 clib_warning ("parse error '%U'", format_unformat_error, i);
4223 if (sw_if_index_set == 0) {
4224 errmsg ("missing interface name or sw_if_index\n");
4228 M(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
4230 mp->sw_if_index = ntohl(sw_if_index);
4231 mp->enable_disable = enable;
4238 static int api_mpls_add_del_decap (vat_main_t * vam)
4240 unformat_input_t * i = vam->input;
4241 vl_api_mpls_add_del_decap_t *mp;
4250 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4251 if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
4253 else if (unformat (i, "tx_vrf_id %d", &tx_vrf_id))
4255 else if (unformat (i, "label %d", &label))
4257 else if (unformat (i, "next-index %d", &next_index))
4259 else if (unformat (i, "del"))
4261 else if (unformat (i, "s-bit-clear"))
4264 clib_warning ("parse error '%U'", format_unformat_error, i);
4269 M(MPLS_ADD_DEL_DECAP, mpls_add_del_decap);
4271 mp->rx_vrf_id = ntohl(rx_vrf_id);
4272 mp->tx_vrf_id = ntohl(tx_vrf_id);
4273 mp->label = ntohl(label);
4274 mp->next_index = ntohl(next_index);
4276 mp->is_add = is_add;
4283 static int api_mpls_add_del_encap (vat_main_t * vam)
4285 unformat_input_t * i = vam->input;
4286 vl_api_mpls_add_del_encap_t *mp;
4291 ip4_address_t dst_address;
4294 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4295 if (unformat (i, "vrf %d", &vrf_id))
4297 else if (unformat (i, "label %d", &label))
4298 vec_add1 (labels, ntohl(label));
4299 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
4301 else if (unformat (i, "del"))
4304 clib_warning ("parse error '%U'", format_unformat_error, i);
4309 if (vec_len (labels) == 0) {
4310 errmsg ("missing encap label stack\n");
4314 M2(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
4315 sizeof (u32) * vec_len (labels));
4317 mp->vrf_id = ntohl(vrf_id);
4318 clib_memcpy(mp->dst_address, &dst_address, sizeof (dst_address));
4319 mp->is_add = is_add;
4320 mp->nlabels = vec_len (labels);
4321 clib_memcpy(mp->labels, labels, sizeof(u32)*mp->nlabels);
4330 static int api_mpls_gre_add_del_tunnel (vat_main_t * vam)
4332 unformat_input_t * i = vam->input;
4333 vl_api_mpls_gre_add_del_tunnel_t *mp;
4335 u32 inner_vrf_id = 0;
4336 u32 outer_vrf_id = 0;
4337 ip4_address_t src_address;
4338 ip4_address_t dst_address;
4339 ip4_address_t intfc_address;
4341 u8 intfc_address_length = 0;
4345 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4346 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
4348 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
4350 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
4352 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
4354 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4355 &intfc_address, &tmp))
4356 intfc_address_length = tmp;
4357 else if (unformat (i, "l2-only"))
4359 else if (unformat (i, "del"))
4362 clib_warning ("parse error '%U'", format_unformat_error, i);
4367 M(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel);
4369 mp->inner_vrf_id = ntohl(inner_vrf_id);
4370 mp->outer_vrf_id = ntohl(outer_vrf_id);
4371 clib_memcpy(mp->src_address, &src_address, sizeof (src_address));
4372 clib_memcpy(mp->dst_address, &dst_address, sizeof (dst_address));
4373 clib_memcpy(mp->intfc_address, &intfc_address, sizeof (intfc_address));
4374 mp->intfc_address_length = intfc_address_length;
4375 mp->l2_only = l2_only;
4376 mp->is_add = is_add;
4383 static int api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
4385 unformat_input_t * i = vam->input;
4386 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
4388 u32 inner_vrf_id = 0;
4389 ip4_address_t intfc_address;
4390 u8 dst_mac_address[6];
4393 u8 intfc_address_length = 0;
4397 int tx_sw_if_index_set = 0;
4399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4400 if (unformat (i, "vrf %d", &inner_vrf_id))
4402 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4403 &intfc_address, &tmp))
4404 intfc_address_length = tmp;
4405 else if (unformat (i, "%U",
4406 unformat_sw_if_index, vam, &tx_sw_if_index))
4407 tx_sw_if_index_set = 1;
4408 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
4409 tx_sw_if_index_set = 1;
4410 else if (unformat (i, "dst %U", unformat_ethernet_address,
4413 else if (unformat (i, "l2-only"))
4415 else if (unformat (i, "del"))
4418 clib_warning ("parse error '%U'", format_unformat_error, i);
4424 errmsg ("dst (mac address) not set\n");
4427 if (!tx_sw_if_index_set) {
4428 errmsg ("tx-intfc not set\n");
4432 M(MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
4434 mp->vrf_id = ntohl(inner_vrf_id);
4435 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
4436 mp->adj_address_length = intfc_address_length;
4437 clib_memcpy (mp->dst_mac_address, dst_mac_address, sizeof (dst_mac_address));
4438 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
4439 mp->l2_only = l2_only;
4440 mp->is_add = is_add;
4447 static int api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
4449 unformat_input_t * i = vam->input;
4450 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
4452 u32 inner_vrf_id = 0;
4453 u32 outer_vrf_id = 0;
4454 ip4_address_t adj_address;
4455 int adj_address_set = 0;
4456 ip4_address_t next_hop_address;
4457 int next_hop_address_set = 0;
4459 u8 adj_address_length = 0;
4462 u32 resolve_attempts = 5;
4463 u8 resolve_if_needed = 1;
4465 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4466 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
4468 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
4470 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
4471 &adj_address, &tmp)) {
4472 adj_address_length = tmp;
4473 adj_address_set = 1;
4475 else if (unformat (i, "next-hop %U", unformat_ip4_address,
4477 next_hop_address_set = 1;
4478 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
4480 else if (unformat (i, "resolve-if-needed %d", &tmp))
4481 resolve_if_needed = tmp;
4482 else if (unformat (i, "l2-only"))
4484 else if (unformat (i, "del"))
4487 clib_warning ("parse error '%U'", format_unformat_error, i);
4492 if (!adj_address_set) {
4493 errmsg ("adjacency address/mask not set\n");
4496 if (!next_hop_address_set) {
4497 errmsg ("ip4 next hop address (in outer fib) not set\n");
4501 M(MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
4503 mp->inner_vrf_id = ntohl(inner_vrf_id);
4504 mp->outer_vrf_id = ntohl(outer_vrf_id);
4505 mp->resolve_attempts = ntohl(resolve_attempts);
4506 mp->resolve_if_needed = resolve_if_needed;
4507 mp->is_add = is_add;
4508 mp->l2_only = l2_only;
4509 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
4510 mp->adj_address_length = adj_address_length;
4511 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
4512 sizeof (next_hop_address));
4519 static int api_sw_interface_set_unnumbered (vat_main_t * vam)
4521 unformat_input_t * i = vam->input;
4522 vl_api_sw_interface_set_unnumbered_t *mp;
4527 u8 sw_if_index_set = 0;
4529 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4530 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4531 sw_if_index_set = 1;
4532 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4533 sw_if_index_set = 1;
4534 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
4536 else if (unformat (i, "del"))
4539 clib_warning ("parse error '%U'", format_unformat_error, i);
4544 if (sw_if_index_set == 0) {
4545 errmsg ("missing interface name or sw_if_index\n");
4549 M(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
4551 mp->sw_if_index = ntohl(sw_if_index);
4552 mp->unnumbered_sw_if_index = ntohl(unnum_sw_index);
4553 mp->is_add = is_add;
4560 static int api_ip_neighbor_add_del (vat_main_t * vam)
4562 unformat_input_t * i = vam->input;
4563 vl_api_ip_neighbor_add_del_t *mp;
4566 u8 sw_if_index_set = 0;
4572 u8 v4_address_set = 0;
4573 u8 v6_address_set = 0;
4574 ip4_address_t v4address;
4575 ip6_address_t v6address;
4577 memset (mac_address, 0, sizeof (mac_address));
4579 /* Parse args required to build the message */
4580 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4581 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) {
4584 else if (unformat (i, "del"))
4586 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4587 sw_if_index_set = 1;
4588 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4589 sw_if_index_set = 1;
4590 else if (unformat (i, "is_static"))
4592 else if (unformat (i, "vrf %d", &vrf_id))
4594 else if (unformat (i, "dst %U",
4595 unformat_ip4_address, &v4address))
4597 else if (unformat (i, "dst %U",
4598 unformat_ip6_address, &v6address))
4601 clib_warning ("parse error '%U'", format_unformat_error, i);
4606 if (sw_if_index_set == 0) {
4607 errmsg ("missing interface name or sw_if_index\n");
4610 if (v4_address_set && v6_address_set) {
4611 errmsg ("both v4 and v6 addresses set\n");
4614 if (!v4_address_set && !v6_address_set) {
4615 errmsg ("no addresses set\n");
4619 /* Construct the API message */
4620 M(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
4622 mp->sw_if_index = ntohl (sw_if_index);
4623 mp->is_add = is_add;
4624 mp->vrf_id = ntohl (vrf_id);
4625 mp->is_static = is_static;
4627 clib_memcpy (mp->mac_address, mac_address, 6);
4628 if (v6_address_set) {
4630 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
4632 /* mp->is_ipv6 = 0; via memset in M macro above */
4633 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
4639 /* Wait for a reply, return good/bad news */
4646 static int api_reset_vrf (vat_main_t * vam)
4648 unformat_input_t * i = vam->input;
4649 vl_api_reset_vrf_t *mp;
4655 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4656 if (unformat (i, "vrf %d", &vrf_id))
4658 else if (unformat (i, "ipv6"))
4661 clib_warning ("parse error '%U'", format_unformat_error, i);
4666 if (vrf_id_set == 0) {
4667 errmsg ("missing vrf id\n");
4671 M(RESET_VRF, reset_vrf);
4673 mp->vrf_id = ntohl(vrf_id);
4674 mp->is_ipv6 = is_ipv6;
4681 static int api_create_vlan_subif (vat_main_t * vam)
4683 unformat_input_t * i = vam->input;
4684 vl_api_create_vlan_subif_t *mp;
4687 u8 sw_if_index_set = 0;
4691 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4692 if (unformat (i, "sw_if_index %d", &sw_if_index))
4693 sw_if_index_set = 1;
4694 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4695 sw_if_index_set = 1;
4696 else if (unformat (i, "vlan %d", &vlan_id))
4699 clib_warning ("parse error '%U'", format_unformat_error, i);
4704 if (sw_if_index_set == 0) {
4705 errmsg ("missing interface name or sw_if_index\n");
4709 if (vlan_id_set == 0) {
4710 errmsg ("missing vlan_id\n");
4713 M(CREATE_VLAN_SUBIF, create_vlan_subif);
4715 mp->sw_if_index = ntohl(sw_if_index);
4716 mp->vlan_id = ntohl(vlan_id);
4723 #define foreach_create_subif_bit \
4730 _(outer_vlan_id_any) \
4731 _(inner_vlan_id_any)
4733 static int api_create_subif (vat_main_t * vam)
4735 unformat_input_t * i = vam->input;
4736 vl_api_create_subif_t *mp;
4739 u8 sw_if_index_set = 0;
4746 u32 exact_match = 0;
4747 u32 default_sub = 0;
4748 u32 outer_vlan_id_any = 0;
4749 u32 inner_vlan_id_any = 0;
4751 u16 outer_vlan_id = 0;
4752 u16 inner_vlan_id = 0;
4754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4755 if (unformat (i, "sw_if_index %d", &sw_if_index))
4756 sw_if_index_set = 1;
4757 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4758 sw_if_index_set = 1;
4759 else if (unformat (i, "sub_id %d", &sub_id))
4761 else if (unformat (i, "outer_vlan_id %d", &tmp))
4762 outer_vlan_id = tmp;
4763 else if (unformat (i, "inner_vlan_id %d", &tmp))
4764 inner_vlan_id = tmp;
4766 #define _(a) else if (unformat (i, #a)) a = 1 ;
4767 foreach_create_subif_bit
4771 clib_warning ("parse error '%U'", format_unformat_error, i);
4776 if (sw_if_index_set == 0) {
4777 errmsg ("missing interface name or sw_if_index\n");
4781 if (sub_id_set == 0) {
4782 errmsg ("missing sub_id\n");
4785 M(CREATE_SUBIF, create_subif);
4787 mp->sw_if_index = ntohl(sw_if_index);
4788 mp->sub_id = ntohl(sub_id);
4790 #define _(a) mp->a = a;
4791 foreach_create_subif_bit;
4794 mp->outer_vlan_id = ntohs (outer_vlan_id);
4795 mp->inner_vlan_id = ntohs (inner_vlan_id);
4802 static int api_oam_add_del (vat_main_t * vam)
4804 unformat_input_t * i = vam->input;
4805 vl_api_oam_add_del_t *mp;
4809 ip4_address_t src, dst;
4813 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4814 if (unformat (i, "vrf %d", &vrf_id))
4816 else if (unformat (i, "src %U", unformat_ip4_address, &src))
4818 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
4820 else if (unformat (i, "del"))
4823 clib_warning ("parse error '%U'", format_unformat_error, i);
4829 errmsg ("missing src addr\n");
4834 errmsg ("missing dst addr\n");
4838 M(OAM_ADD_DEL, oam_add_del);
4840 mp->vrf_id = ntohl(vrf_id);
4841 mp->is_add = is_add;
4842 clib_memcpy(mp->src_address, &src, sizeof (mp->src_address));
4843 clib_memcpy(mp->dst_address, &dst, sizeof (mp->dst_address));
4850 static int api_reset_fib (vat_main_t * vam)
4852 unformat_input_t * i = vam->input;
4853 vl_api_reset_fib_t *mp;
4859 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4860 if (unformat (i, "vrf %d", &vrf_id))
4862 else if (unformat (i, "ipv6"))
4865 clib_warning ("parse error '%U'", format_unformat_error, i);
4870 if (vrf_id_set == 0) {
4871 errmsg ("missing vrf id\n");
4875 M(RESET_FIB, reset_fib);
4877 mp->vrf_id = ntohl(vrf_id);
4878 mp->is_ipv6 = is_ipv6;
4885 static int api_dhcp_proxy_config (vat_main_t * vam)
4887 unformat_input_t * i = vam->input;
4888 vl_api_dhcp_proxy_config_t *mp;
4893 u8 v4_address_set = 0;
4894 u8 v6_address_set = 0;
4895 ip4_address_t v4address;
4896 ip6_address_t v6address;
4897 u8 v4_src_address_set = 0;
4898 u8 v6_src_address_set = 0;
4899 ip4_address_t v4srcaddress;
4900 ip6_address_t v6srcaddress;
4902 /* Parse args required to build the message */
4903 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4904 if (unformat (i, "del"))
4906 else if (unformat (i, "vrf %d", &vrf_id))
4908 else if (unformat (i, "insert-cid %d", &insert_cid))
4910 else if (unformat (i, "svr %U",
4911 unformat_ip4_address, &v4address))
4913 else if (unformat (i, "svr %U",
4914 unformat_ip6_address, &v6address))
4916 else if (unformat (i, "src %U",
4917 unformat_ip4_address, &v4srcaddress))
4918 v4_src_address_set = 1;
4919 else if (unformat (i, "src %U",
4920 unformat_ip6_address, &v6srcaddress))
4921 v6_src_address_set = 1;
4926 if (v4_address_set && v6_address_set) {
4927 errmsg ("both v4 and v6 server addresses set\n");
4930 if (!v4_address_set && !v6_address_set) {
4931 errmsg ("no server addresses set\n");
4935 if (v4_src_address_set && v6_src_address_set) {
4936 errmsg ("both v4 and v6 src addresses set\n");
4939 if (!v4_src_address_set && !v6_src_address_set) {
4940 errmsg ("no src addresses set\n");
4944 if (!(v4_src_address_set && v4_address_set) &&
4945 !(v6_src_address_set && v6_address_set)) {
4946 errmsg ("no matching server and src addresses set\n");
4950 /* Construct the API message */
4951 M(DHCP_PROXY_CONFIG, dhcp_proxy_config);
4953 mp->insert_circuit_id = insert_cid;
4954 mp->is_add = is_add;
4955 mp->vrf_id = ntohl (vrf_id);
4956 if (v6_address_set) {
4958 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
4959 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
4961 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
4962 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
4968 /* Wait for a reply, return good/bad news */
4974 static int api_dhcp_proxy_config_2 (vat_main_t * vam)
4976 unformat_input_t * i = vam->input;
4977 vl_api_dhcp_proxy_config_2_t *mp;
4980 u32 server_vrf_id = 0;
4983 u8 v4_address_set = 0;
4984 u8 v6_address_set = 0;
4985 ip4_address_t v4address;
4986 ip6_address_t v6address;
4987 u8 v4_src_address_set = 0;
4988 u8 v6_src_address_set = 0;
4989 ip4_address_t v4srcaddress;
4990 ip6_address_t v6srcaddress;
4992 /* Parse args required to build the message */
4993 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
4994 if (unformat (i, "del"))
4996 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
4998 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
5000 else if (unformat (i, "insert-cid %d", &insert_cid))
5002 else if (unformat (i, "svr %U",
5003 unformat_ip4_address, &v4address))
5005 else if (unformat (i, "svr %U",
5006 unformat_ip6_address, &v6address))
5008 else if (unformat (i, "src %U",
5009 unformat_ip4_address, &v4srcaddress))
5010 v4_src_address_set = 1;
5011 else if (unformat (i, "src %U",
5012 unformat_ip6_address, &v6srcaddress))
5013 v6_src_address_set = 1;
5018 if (v4_address_set && v6_address_set) {
5019 errmsg ("both v4 and v6 server addresses set\n");
5022 if (!v4_address_set && !v6_address_set) {
5023 errmsg ("no server addresses set\n");
5027 if (v4_src_address_set && v6_src_address_set) {
5028 errmsg ("both v4 and v6 src addresses set\n");
5031 if (!v4_src_address_set && !v6_src_address_set) {
5032 errmsg ("no src addresses set\n");
5036 if (!(v4_src_address_set && v4_address_set) &&
5037 !(v6_src_address_set && v6_address_set)) {
5038 errmsg ("no matching server and src addresses set\n");
5042 /* Construct the API message */
5043 M(DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
5045 mp->insert_circuit_id = insert_cid;
5046 mp->is_add = is_add;
5047 mp->rx_vrf_id = ntohl (rx_vrf_id);
5048 mp->server_vrf_id = ntohl (server_vrf_id);
5049 if (v6_address_set) {
5051 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
5052 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
5054 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
5055 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
5061 /* Wait for a reply, return good/bad news */
5067 static int api_dhcp_proxy_set_vss (vat_main_t * vam)
5069 unformat_input_t * i = vam->input;
5070 vl_api_dhcp_proxy_set_vss_t *mp;
5081 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5082 if (unformat (i, "tbl_id %d", &tbl_id))
5084 if (unformat (i, "fib_id %d", &fib_id))
5086 if (unformat (i, "oui %d", &oui))
5088 else if (unformat (i, "ipv6"))
5090 else if (unformat (i, "del"))
5093 clib_warning ("parse error '%U'", format_unformat_error, i);
5098 if (tbl_id_set == 0) {
5099 errmsg ("missing tbl id\n");
5103 if (fib_id_set == 0) {
5104 errmsg ("missing fib id\n");
5108 errmsg ("missing oui\n");
5112 M(DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
5113 mp->tbl_id = ntohl(tbl_id);
5114 mp->fib_id = ntohl(fib_id);
5115 mp->oui = ntohl(oui);
5116 mp->is_ipv6 = is_ipv6;
5117 mp->is_add = is_add;
5124 static int api_dhcp_client_config (vat_main_t * vam)
5126 unformat_input_t * i = vam->input;
5127 vl_api_dhcp_client_config_t *mp;
5130 u8 sw_if_index_set = 0;
5133 u8 disable_event = 0;
5135 /* Parse args required to build the message */
5136 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5137 if (unformat (i, "del"))
5139 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5140 sw_if_index_set = 1;
5141 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5142 sw_if_index_set = 1;
5143 else if (unformat (i, "hostname %s", &hostname))
5145 else if (unformat (i, "disable_event"))
5151 if (sw_if_index_set == 0) {
5152 errmsg ("missing interface name or sw_if_index\n");
5156 if (vec_len (hostname) > 63) {
5157 errmsg ("hostname too long\n");
5159 vec_add1 (hostname, 0);
5161 /* Construct the API message */
5162 M(DHCP_CLIENT_CONFIG, dhcp_client_config);
5164 mp->sw_if_index = ntohl (sw_if_index);
5165 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
5166 vec_free (hostname);
5167 mp->is_add = is_add;
5168 mp->want_dhcp_event = disable_event ? 0 : 1;
5174 /* Wait for a reply, return good/bad news */
5180 static int api_set_ip_flow_hash (vat_main_t * vam)
5182 unformat_input_t * i = vam->input;
5183 vl_api_set_ip_flow_hash_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"))
5200 else if (unformat (i, "src"))
5202 else if (unformat (i, "dst"))
5204 else if (unformat (i, "sport"))
5206 else if (unformat (i, "dport"))
5208 else if (unformat (i, "proto"))
5210 else if (unformat (i, "reverse"))
5214 clib_warning ("parse error '%U'", format_unformat_error, i);
5219 if (vrf_id_set == 0) {
5220 errmsg ("missing vrf id\n");
5224 M(SET_IP_FLOW_HASH, set_ip_flow_hash);
5230 mp->reverse = reverse;
5231 mp->vrf_id = ntohl(vrf_id);
5232 mp->is_ipv6 = is_ipv6;
5239 static int api_sw_interface_ip6_enable_disable (vat_main_t * vam)
5241 unformat_input_t * i = vam->input;
5242 vl_api_sw_interface_ip6_enable_disable_t *mp;
5245 u8 sw_if_index_set = 0;
5248 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5249 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5250 sw_if_index_set = 1;
5251 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5252 sw_if_index_set = 1;
5253 else if (unformat (i, "enable"))
5255 else if (unformat (i, "disable"))
5258 clib_warning ("parse error '%U'", format_unformat_error, i);
5263 if (sw_if_index_set == 0) {
5264 errmsg ("missing interface name or sw_if_index\n");
5268 M(SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
5270 mp->sw_if_index = ntohl(sw_if_index);
5271 mp->enable = enable;
5278 static int api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
5280 unformat_input_t * i = vam->input;
5281 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
5284 u8 sw_if_index_set = 0;
5285 u32 address_length = 0;
5286 u8 v6_address_set = 0;
5287 ip6_address_t v6address;
5289 /* Parse args required to build the message */
5290 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5291 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5292 sw_if_index_set = 1;
5293 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5294 sw_if_index_set = 1;
5295 else if (unformat (i, "%U/%d",
5296 unformat_ip6_address, &v6address,
5303 if (sw_if_index_set == 0) {
5304 errmsg ("missing interface name or sw_if_index\n");
5307 if (!v6_address_set) {
5308 errmsg ("no address set\n");
5312 /* Construct the API message */
5313 M(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, \
5314 sw_interface_ip6_set_link_local_address);
5316 mp->sw_if_index = ntohl (sw_if_index);
5317 clib_memcpy (mp->address, &v6address, sizeof (v6address));
5318 mp->address_length = address_length;
5323 /* Wait for a reply, return good/bad news */
5331 static int api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
5333 unformat_input_t * i = vam->input;
5334 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
5337 u8 sw_if_index_set = 0;
5338 u32 address_length = 0;
5339 u8 v6_address_set = 0;
5340 ip6_address_t v6address;
5342 u8 no_advertise = 0;
5344 u8 no_autoconfig = 0;
5347 u32 val_lifetime = 0;
5348 u32 pref_lifetime = 0;
5350 /* Parse args required to build the message */
5351 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5352 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5353 sw_if_index_set = 1;
5354 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5355 sw_if_index_set = 1;
5356 else if (unformat (i, "%U/%d",
5357 unformat_ip6_address, &v6address,
5360 else if (unformat (i, "val_life %d", &val_lifetime))
5362 else if (unformat (i, "pref_life %d", &pref_lifetime))
5364 else if (unformat (i, "def"))
5366 else if (unformat (i, "noadv"))
5368 else if (unformat (i, "offl"))
5370 else if (unformat (i, "noauto"))
5372 else if (unformat (i, "nolink"))
5374 else if (unformat (i, "isno"))
5377 clib_warning ("parse error '%U'", format_unformat_error, i);
5382 if (sw_if_index_set == 0) {
5383 errmsg ("missing interface name or sw_if_index\n");
5386 if (!v6_address_set) {
5387 errmsg ("no address set\n");
5391 /* Construct the API message */
5392 M(SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
5394 mp->sw_if_index = ntohl (sw_if_index);
5395 clib_memcpy (mp->address, &v6address, sizeof (v6address));
5396 mp->address_length = address_length;
5397 mp->use_default = use_default;
5398 mp->no_advertise = no_advertise;
5399 mp->off_link = off_link;
5400 mp->no_autoconfig = no_autoconfig;
5401 mp->no_onlink = no_onlink;
5403 mp->val_lifetime = ntohl(val_lifetime);
5404 mp->pref_lifetime = ntohl(pref_lifetime);
5409 /* Wait for a reply, return good/bad news */
5416 static int api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
5418 unformat_input_t * i = vam->input;
5419 vl_api_sw_interface_ip6nd_ra_config_t *mp;
5422 u8 sw_if_index_set = 0;
5427 u8 send_unicast = 0;
5430 u8 default_router = 0;
5431 u32 max_interval = 0;
5432 u32 min_interval = 0;
5434 u32 initial_count = 0;
5435 u32 initial_interval = 0;
5438 /* Parse args required to build the message */
5439 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5440 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5441 sw_if_index_set = 1;
5442 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5443 sw_if_index_set = 1;
5444 else if (unformat (i, "maxint %d", &max_interval))
5446 else if (unformat (i, "minint %d", &min_interval))
5448 else if (unformat (i, "life %d", &lifetime))
5450 else if (unformat (i, "count %d", &initial_count))
5452 else if (unformat (i, "interval %d", &initial_interval))
5454 else if (unformat (i, "surpress"))
5456 else if (unformat (i, "managed"))
5458 else if (unformat (i, "other"))
5460 else if (unformat (i, "ll"))
5462 else if (unformat (i, "send"))
5464 else if (unformat (i, "cease"))
5466 else if (unformat (i, "isno"))
5468 else if (unformat (i, "def"))
5471 clib_warning ("parse error '%U'", format_unformat_error, i);
5476 if (sw_if_index_set == 0) {
5477 errmsg ("missing interface name or sw_if_index\n");
5481 /* Construct the API message */
5482 M(SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
5484 mp->sw_if_index = ntohl (sw_if_index);
5485 mp->max_interval = ntohl(max_interval);
5486 mp->min_interval = ntohl(min_interval);
5487 mp->lifetime = ntohl(lifetime);
5488 mp->initial_count = ntohl(initial_count);
5489 mp->initial_interval = ntohl(initial_interval);
5490 mp->surpress = surpress;
5491 mp->managed = managed;
5493 mp->ll_option = ll_option;
5494 mp->send_unicast = send_unicast;
5497 mp->default_router = default_router;
5502 /* Wait for a reply, return good/bad news */
5509 static int api_set_arp_neighbor_limit (vat_main_t * vam)
5511 unformat_input_t * i = vam->input;
5512 vl_api_set_arp_neighbor_limit_t *mp;
5518 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5519 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
5521 else if (unformat (i, "ipv6"))
5524 clib_warning ("parse error '%U'", format_unformat_error, i);
5529 if (limit_set == 0) {
5530 errmsg ("missing limit value\n");
5534 M(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
5536 mp->arp_neighbor_limit = ntohl(arp_nbr_limit);
5537 mp->is_ipv6 = is_ipv6;
5544 static int api_l2_patch_add_del (vat_main_t * vam)
5546 unformat_input_t * i = vam->input;
5547 vl_api_l2_patch_add_del_t *mp;
5550 u8 rx_sw_if_index_set = 0;
5552 u8 tx_sw_if_index_set = 0;
5555 /* Parse args required to build the message */
5556 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5557 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5558 rx_sw_if_index_set = 1;
5559 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5560 tx_sw_if_index_set = 1;
5561 else if (unformat (i, "rx")) {
5562 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5563 if (unformat (i, "%U", unformat_sw_if_index, vam,
5565 rx_sw_if_index_set = 1;
5568 } else if (unformat (i, "tx")) {
5569 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
5570 if (unformat (i, "%U", unformat_sw_if_index, vam,
5572 tx_sw_if_index_set = 1;
5575 } else if (unformat (i, "del"))
5581 if (rx_sw_if_index_set == 0) {
5582 errmsg ("missing rx interface name or rx_sw_if_index\n");
5586 if (tx_sw_if_index_set == 0) {
5587 errmsg ("missing tx interface name or tx_sw_if_index\n");
5591 M(L2_PATCH_ADD_DEL, l2_patch_add_del);
5593 mp->rx_sw_if_index = ntohl(rx_sw_if_index);
5594 mp->tx_sw_if_index = ntohl(tx_sw_if_index);
5595 mp->is_add = is_add;
5601 static int api_trace_profile_add (vat_main_t *vam)
5603 unformat_input_t * input = vam->input;
5604 vl_api_trace_profile_add_t *mp;
5607 u32 trace_option_elts = 0;
5608 u32 trace_type = 0, node_id = 0, app_data = 0, trace_tsp = 2;
5609 int has_pow_option = 0;
5610 int has_ppc_option = 0;
5612 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5614 if (unformat (input, "id %d trace-type 0x%x trace-elts %d "
5615 "trace-tsp %d node-id 0x%x app-data 0x%x",
5616 &id, &trace_type, &trace_option_elts, &trace_tsp,
5617 &node_id, &app_data))
5619 else if (unformat (input, "pow"))
5621 else if (unformat (input, "ppc encap"))
5622 has_ppc_option = PPC_ENCAP;
5623 else if (unformat (input, "ppc decap"))
5624 has_ppc_option = PPC_DECAP;
5625 else if (unformat (input, "ppc none"))
5626 has_ppc_option = PPC_NONE;
5630 M(TRACE_PROFILE_ADD, trace_profile_add);
5632 mp->trace_type = trace_type;
5633 mp->trace_num_elt = trace_option_elts;
5634 mp->trace_ppc = has_ppc_option;
5635 mp->trace_app_data = htonl(app_data);
5636 mp->pow_enable = has_pow_option;
5637 mp->trace_tsp = trace_tsp;
5638 mp->node_id = htonl(node_id);
5645 static int api_trace_profile_apply (vat_main_t *vam)
5647 unformat_input_t * input = vam->input;
5648 vl_api_trace_profile_apply_t *mp;
5651 u32 mask_width = ~0;
5658 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5660 if (unformat (input, "%U/%d",
5661 unformat_ip6_address, &addr, &mask_width))
5663 else if (unformat (input, "id %d", &id))
5665 else if (unformat (input, "vrf-id %d", &vrf_id))
5667 else if (unformat (input, "add"))
5669 else if (unformat (input, "pop"))
5671 else if (unformat (input, "none"))
5677 if ((is_add + is_pop + is_none) != 1) {
5678 errmsg("One of (add, pop, none) required");
5681 if (mask_width == ~0) {
5682 errmsg("<address>/<mask-width> required");
5685 M(TRACE_PROFILE_APPLY, trace_profile_apply);
5686 clib_memcpy(mp->dest_ipv6, &addr, sizeof(mp->dest_ipv6));
5688 mp->prefix_length = htonl(mask_width);
5689 mp->vrf_id = htonl(vrf_id);
5691 mp->trace_op = IOAM_HBYH_ADD;
5693 mp->trace_op = IOAM_HBYH_POP;
5695 mp->trace_op = IOAM_HBYH_MOD;
5707 static int api_trace_profile_del (vat_main_t *vam)
5709 vl_api_trace_profile_del_t *mp;
5712 M(TRACE_PROFILE_DEL, trace_profile_del);
5717 static int api_sr_tunnel_add_del (vat_main_t * vam)
5719 unformat_input_t * i = vam->input;
5720 vl_api_sr_tunnel_add_del_t *mp;
5724 ip6_address_t src_address;
5725 int src_address_set = 0;
5726 ip6_address_t dst_address;
5728 int dst_address_set = 0;
5730 u32 rx_table_id = 0;
5731 u32 tx_table_id = 0;
5732 ip6_address_t * segments = 0;
5733 ip6_address_t * this_seg;
5734 ip6_address_t * tags = 0;
5735 ip6_address_t * this_tag;
5736 ip6_address_t next_address, tag;
5738 u8 * policy_name = 0;
5740 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5742 if (unformat (i, "del"))
5744 else if (unformat (i, "name %s", &name))
5746 else if (unformat (i, "policy %s", &policy_name))
5748 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
5750 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
5752 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
5753 src_address_set = 1;
5754 else if (unformat (i, "dst %U/%d",
5755 unformat_ip6_address, &dst_address,
5757 dst_address_set = 1;
5758 else if (unformat (i, "next %U", unformat_ip6_address,
5761 vec_add2 (segments, this_seg, 1);
5762 clib_memcpy (this_seg->as_u8, next_address.as_u8, sizeof (*this_seg));
5764 else if (unformat (i, "tag %U", unformat_ip6_address,
5767 vec_add2 (tags, this_tag, 1);
5768 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
5770 else if (unformat (i, "clean"))
5771 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
5772 else if (unformat (i, "protected"))
5773 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
5774 else if (unformat (i, "InPE %d", &pl_index))
5776 if (pl_index <= 0 || pl_index > 4)
5778 pl_index_range_error:
5779 errmsg ("pl index %d out of range\n", pl_index);
5782 flags |= IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3*(pl_index - 1));
5784 else if (unformat (i, "EgPE %d", &pl_index))
5786 if (pl_index <= 0 || pl_index > 4)
5787 goto pl_index_range_error;
5788 flags |= IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3*(pl_index - 1));
5790 else if (unformat (i, "OrgSrc %d", &pl_index))
5792 if (pl_index <= 0 || pl_index > 4)
5793 goto pl_index_range_error;
5794 flags |= IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3*(pl_index - 1));
5800 if (!src_address_set)
5802 errmsg ("src address required\n");
5806 if (!dst_address_set)
5808 errmsg ("dst address required\n");
5814 errmsg ("at least one sr segment required\n");
5818 M2(SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
5819 vec_len(segments) * sizeof (ip6_address_t)
5820 + vec_len(tags) * sizeof (ip6_address_t));
5822 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
5823 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
5824 mp->dst_mask_width = dst_mask_width;
5825 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
5826 mp->n_segments = vec_len (segments);
5827 mp->n_tags = vec_len (tags);
5828 mp->is_add = is_del == 0;
5829 clib_memcpy (mp->segs_and_tags, segments,
5830 vec_len(segments)* sizeof (ip6_address_t));
5831 clib_memcpy (mp->segs_and_tags + vec_len(segments)*sizeof (ip6_address_t),
5832 tags, vec_len(tags)* sizeof (ip6_address_t));
5834 mp->outer_vrf_id = ntohl (rx_table_id);
5835 mp->inner_vrf_id = ntohl (tx_table_id);
5836 memcpy (mp->name, name, vec_len(name));
5837 memcpy (mp->policy_name, policy_name, vec_len(policy_name));
5839 vec_free (segments);
5846 static int api_sr_policy_add_del (vat_main_t * vam)
5848 unformat_input_t * input = vam->input;
5849 vl_api_sr_policy_add_del_t *mp;
5853 u8 * tunnel_name = 0;
5854 u8 ** tunnel_names = 0;
5859 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
5860 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
5862 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5864 if (unformat (input, "del"))
5866 else if (unformat (input, "name %s", &name))
5868 else if (unformat (input, "tunnel %s", &tunnel_name))
5872 vec_add1 (tunnel_names, tunnel_name);
5874 - length = #bytes to store in serial vector
5875 - +1 = byte to store that length
5877 tunnel_names_length += (vec_len (tunnel_name) + 1);
5888 errmsg ("policy name required\n");
5892 if ((!tunnel_set) && (!is_del))
5894 errmsg ("tunnel name required\n");
5898 M2(SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
5902 mp->is_add = !is_del;
5904 memcpy (mp->name, name, vec_len(name));
5905 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
5906 u8 * serial_orig = 0;
5907 vec_validate (serial_orig, tunnel_names_length);
5908 *serial_orig = vec_len(tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
5909 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
5911 for (j=0; j < vec_len(tunnel_names); j++)
5913 tun_name_len = vec_len (tunnel_names[j]);
5914 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
5915 serial_orig += 1; // Move along one byte to store the actual tunnel name
5916 memcpy (serial_orig, tunnel_names[j], tun_name_len);
5917 serial_orig += tun_name_len; // Advance past the copy
5919 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
5921 vec_free (tunnel_names);
5922 vec_free (tunnel_name);
5928 static int api_sr_multicast_map_add_del (vat_main_t * vam)
5930 unformat_input_t * input = vam->input;
5931 vl_api_sr_multicast_map_add_del_t *mp;
5934 ip6_address_t multicast_address;
5935 u8 * policy_name = 0;
5936 int multicast_address_set = 0;
5938 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
5940 if (unformat (input, "del"))
5942 else if (unformat (input, "address %U", unformat_ip6_address, &multicast_address))
5943 multicast_address_set = 1;
5944 else if (unformat (input, "sr-policy %s", &policy_name))
5950 if (!is_del && !policy_name)
5952 errmsg ("sr-policy name required\n");
5957 if (!multicast_address_set)
5959 errmsg ("address required\n");
5963 M(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
5965 mp->is_add = !is_del;
5966 memcpy (mp->policy_name, policy_name, vec_len(policy_name));
5967 clib_memcpy (mp->multicast_address, &multicast_address, sizeof (mp->multicast_address));
5970 vec_free (policy_name);
5977 #define foreach_ip4_proto_field \
5987 uword unformat_ip4_mask (unformat_input_t * input, va_list * args)
5989 u8 ** maskp = va_arg (*args, u8 **);
5991 u8 found_something = 0;
5994 #define _(a) u8 a=0;
5995 foreach_ip4_proto_field;
6001 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6003 if (unformat (input, "version"))
6005 else if (unformat (input, "hdr_length"))
6007 else if (unformat (input, "src"))
6009 else if (unformat (input, "dst"))
6011 else if (unformat (input, "proto"))
6014 #define _(a) else if (unformat (input, #a)) a=1;
6015 foreach_ip4_proto_field
6021 #define _(a) found_something += a;
6022 foreach_ip4_proto_field;
6025 if (found_something == 0)
6028 vec_validate (mask, sizeof (*ip) - 1);
6030 ip = (ip4_header_t *) mask;
6032 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
6033 foreach_ip4_proto_field;
6036 ip->ip_version_and_header_length = 0;
6039 ip->ip_version_and_header_length |= 0xF0;
6042 ip->ip_version_and_header_length |= 0x0F;
6048 #define foreach_ip6_proto_field \
6055 uword unformat_ip6_mask (unformat_input_t * input, va_list * args)
6057 u8 ** maskp = va_arg (*args, u8 **);
6059 u8 found_something = 0;
6061 u32 ip_version_traffic_class_and_flow_label;
6063 #define _(a) u8 a=0;
6064 foreach_ip6_proto_field;
6067 u8 traffic_class = 0;
6070 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6072 if (unformat (input, "version"))
6074 else if (unformat (input, "traffic-class"))
6076 else if (unformat (input, "flow-label"))
6078 else if (unformat (input, "src"))
6080 else if (unformat (input, "dst"))
6082 else if (unformat (input, "proto"))
6085 #define _(a) else if (unformat (input, #a)) a=1;
6086 foreach_ip6_proto_field
6092 #define _(a) found_something += a;
6093 foreach_ip6_proto_field;
6096 if (found_something == 0)
6099 vec_validate (mask, sizeof (*ip) - 1);
6101 ip = (ip6_header_t *) mask;
6103 #define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
6104 foreach_ip6_proto_field;
6107 ip_version_traffic_class_and_flow_label = 0;
6110 ip_version_traffic_class_and_flow_label |= 0xF0000000;
6113 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
6116 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
6118 ip->ip_version_traffic_class_and_flow_label =
6119 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
6125 uword unformat_l3_mask (unformat_input_t * input, va_list * args)
6127 u8 ** maskp = va_arg (*args, u8 **);
6129 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6130 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
6132 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
6140 uword unformat_l2_mask (unformat_input_t * input, va_list * args)
6142 u8 ** maskp = va_arg (*args, u8 **);
6157 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6158 if (unformat (input, "src"))
6160 else if (unformat (input, "dst"))
6162 else if (unformat (input, "proto"))
6164 else if (unformat (input, "tag1"))
6166 else if (unformat (input, "tag2"))
6168 else if (unformat (input, "ignore-tag1"))
6170 else if (unformat (input, "ignore-tag2"))
6172 else if (unformat (input, "cos1"))
6174 else if (unformat (input, "cos2"))
6176 else if (unformat (input, "dot1q"))
6178 else if (unformat (input, "dot1ad"))
6183 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
6184 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
6187 if (tag1 || ignore_tag1 || cos1 || dot1q)
6189 if (tag2 || ignore_tag2 || cos2 || dot1ad)
6192 vec_validate (mask, len-1);
6195 memset (mask, 0xff, 6);
6198 memset (mask + 6, 0xff, 6);
6202 /* inner vlan tag */
6211 mask[21] = mask [20] = 0xff;
6232 mask[16] = mask [17] = 0xff;
6242 mask[12] = mask [13] = 0xff;
6248 uword unformat_classify_mask (unformat_input_t * input, va_list * args)
6250 u8 ** maskp = va_arg (*args, u8 **);
6251 u32 * skipp = va_arg (*args, u32 *);
6252 u32 * matchp = va_arg (*args, u32 *);
6259 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6260 if (unformat (input, "hex %U", unformat_hex_string, &mask))
6262 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
6264 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
6270 if (mask || l2 || l3)
6274 /* "With a free Ethernet header in every package" */
6276 vec_validate (l2, 13);
6278 vec_append (mask, l3);
6282 /* Scan forward looking for the first significant mask octet */
6283 for (i = 0; i < vec_len (mask); i++)
6287 /* compute (skip, match) params */
6288 *skipp = i / sizeof(u32x4);
6289 vec_delete (mask, *skipp * sizeof(u32x4), 0);
6291 /* Pad mask to an even multiple of the vector size */
6292 while (vec_len (mask) % sizeof (u32x4))
6295 match = vec_len (mask) / sizeof (u32x4);
6297 for (i = match*sizeof(u32x4); i > 0; i-= sizeof(u32x4))
6299 u64 *tmp = (u64 *)(mask + (i-sizeof(u32x4)));
6300 if (*tmp || *(tmp+1))
6305 clib_warning ("BUG: match 0");
6307 _vec_len (mask) = match * sizeof(u32x4);
6318 #define foreach_l2_next \
6320 _(ethernet, ETHERNET_INPUT) \
6324 uword unformat_l2_next_index (unformat_input_t * input, va_list * args)
6326 u32 * miss_next_indexp = va_arg (*args, u32 *);
6331 if (unformat (input, #n)) { next_index = L2_CLASSIFY_NEXT_##N; goto out;}
6335 if (unformat (input, "%d", &tmp))
6344 *miss_next_indexp = next_index;
6348 #define foreach_ip_next \
6354 uword unformat_ip_next_index (unformat_input_t * input, va_list * args)
6356 u32 * miss_next_indexp = va_arg (*args, u32 *);
6361 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
6365 if (unformat (input, "%d", &tmp))
6374 *miss_next_indexp = next_index;
6378 #define foreach_acl_next \
6381 uword unformat_acl_next_index (unformat_input_t * input, va_list * args)
6383 u32 * miss_next_indexp = va_arg (*args, u32 *);
6388 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
6392 if (unformat (input, "permit"))
6397 else if (unformat (input, "%d", &tmp))
6406 *miss_next_indexp = next_index;
6410 static int api_classify_add_del_table (vat_main_t * vam)
6412 unformat_input_t * i = vam->input;
6413 vl_api_classify_add_del_table_t *mp;
6419 u32 table_index = ~0;
6420 u32 next_table_index = ~0;
6421 u32 miss_next_index = ~0;
6422 u32 memory_size = 32<<20;
6426 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
6427 if (unformat (i, "del"))
6429 else if (unformat (i, "buckets %d", &nbuckets))
6431 else if (unformat (i, "memory_size %d", &memory_size))
6433 else if (unformat (i, "skip %d", &skip))
6435 else if (unformat (i, "match %d", &match))
6437 else if (unformat (i, "table %d", &table_index))
6439 else if (unformat (i, "mask %U", unformat_classify_mask,
6440 &mask, &skip, &match))
6442 else if (unformat (i, "next-table %d", &next_table_index))
6444 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
6447 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
6450 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
6457 if (is_add && mask == 0) {
6458 errmsg ("Mask required\n");
6462 if (is_add && skip == ~0) {
6463 errmsg ("skip count required\n");
6467 if (is_add && match == ~0) {
6468 errmsg ("match count required\n");
6472 if (!is_add && table_index == ~0) {
6473 errmsg ("table index required for delete\n");
6477 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table,
6480 mp->is_add = is_add;
6481 mp->table_index = ntohl(table_index);
6482 mp->nbuckets = ntohl(nbuckets);
6483 mp->memory_size = ntohl(memory_size);
6484 mp->skip_n_vectors = ntohl(skip);
6485 mp->match_n_vectors = ntohl(match);
6486 mp->next_table_index = ntohl(next_table_index);
6487 mp->miss_next_index = ntohl(miss_next_index);
6488 clib_memcpy (mp->mask, mask, vec_len(mask));
6496 uword unformat_ip4_match (unformat_input_t * input, va_list * args)
6498 u8 ** matchp = va_arg (*args, u8 **);
6505 int src = 0, dst = 0;
6506 ip4_address_t src_val, dst_val;
6513 int fragment_id = 0;
6514 u32 fragment_id_val;
6520 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6522 if (unformat (input, "version %d", &version_val))
6524 else if (unformat (input, "hdr_length %d", &hdr_length_val))
6526 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
6528 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
6530 else if (unformat (input, "proto %d", &proto_val))
6532 else if (unformat (input, "tos %d", &tos_val))
6534 else if (unformat (input, "length %d", &length_val))
6536 else if (unformat (input, "fragment_id %d", &fragment_id_val))
6538 else if (unformat (input, "ttl %d", &ttl_val))
6540 else if (unformat (input, "checksum %d", &checksum_val))
6546 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
6547 + ttl + checksum == 0)
6551 * Aligned because we use the real comparison functions
6553 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
6555 ip = (ip4_header_t *) match;
6557 /* These are realistically matched in practice */
6559 ip->src_address.as_u32 = src_val.as_u32;
6562 ip->dst_address.as_u32 = dst_val.as_u32;
6565 ip->protocol = proto_val;
6568 /* These are not, but they're included for completeness */
6570 ip->ip_version_and_header_length |= (version_val & 0xF)<<4;
6573 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
6579 ip->length = length_val;
6585 ip->checksum = checksum_val;
6591 uword unformat_ip6_match (unformat_input_t * input, va_list * args)
6593 u8 ** matchp = va_arg (*args, u8 **);
6599 u32 traffic_class_val;
6602 int src = 0, dst = 0;
6603 ip6_address_t src_val, dst_val;
6606 int payload_length = 0;
6607 u32 payload_length_val;
6610 u32 ip_version_traffic_class_and_flow_label;
6612 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
6614 if (unformat (input, "version %d", &version_val))
6616 else if (unformat (input, "traffic_class %d", &traffic_class_val))
6618 else if (unformat (input, "flow_label %d", &flow_label_val))
6620 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
6622 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
6624 else if (unformat (input, "proto %d", &proto_val))
6626 else if (unformat (input, "payload_length %d", &payload_length_val))
6628 else if (unformat (input, "hop_limit %d", &hop_limit_val))
6634 if (version + traffic_class + flow_label + src + dst + proto +
6635 payload_length + hop_limit == 0)
6639 * Aligned because we use the real comparison functions
6641 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof(u32x4));
6643 ip = (ip6_header_t *) match;
6646 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
6649 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
6652 ip->protocol = proto_val;
6654 ip_version_traffic_class_and_flow_label = 0;
6657 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
6660 ip_version_traffic_class_and_flow_label |= (traffic_class_val & 0xFF) << 20;
6663 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
6665 ip->ip_version_traffic_class_and_flow_label =
6666 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
6669 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
6672 ip->hop_limit = hop_limit_val;
6678 uword unformat_l3_match (unformat_input_t * input, va_list * args)
6680 u8 ** matchp = va_arg (*args, u8 **);
6682 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6683 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
6685 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
6693 uword unformat_vlan_tag (unformat_input_t * input, va_list * args)
6695 u8 * tagp = va_arg (*args, u8 *);
6698 if (unformat(input, "%d", &tag))
6700 tagp[0] = (tag>>8) & 0x0F;
6701 tagp[1] = tag & 0xFF;
6708 uword unformat_l2_match (unformat_input_t * input, va_list * args)
6710 u8 ** matchp = va_arg (*args, u8 **);
6730 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6731 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
6733 else if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
6735 else if (unformat (input, "proto %U",
6736 unformat_ethernet_type_host_byte_order, &proto_val))
6738 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
6740 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
6742 else if (unformat (input, "ignore-tag1"))
6744 else if (unformat (input, "ignore-tag2"))
6746 else if (unformat (input, "cos1 %d", &cos1_val))
6748 else if (unformat (input, "cos2 %d", &cos2_val))
6753 if ((src + dst + proto + tag1 + tag2 +
6754 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
6757 if (tag1 || ignore_tag1 || cos1)
6759 if (tag2 || ignore_tag2 || cos2)
6762 vec_validate_aligned (match, len-1, sizeof(u32x4));
6765 clib_memcpy (match, dst_val, 6);
6768 clib_memcpy (match + 6, src_val, 6);
6772 /* inner vlan tag */
6773 match[19] = tag2_val[1];
6774 match[18] = tag2_val[0];
6776 match [18] |= (cos2_val & 0x7) << 5;
6779 match[21] = proto_val & 0xff;
6780 match[20] = proto_val >> 8;
6784 match [15] = tag1_val[1];
6785 match [14] = tag1_val[0];
6788 match [14] |= (cos1_val & 0x7) << 5;
6794 match [15] = tag1_val[1];
6795 match [14] = tag1_val[0];
6798 match[17] = proto_val & 0xff;
6799 match[16] = proto_val >> 8;
6802 match [14] |= (cos1_val & 0x7) << 5;
6808 match [18] |= (cos2_val & 0x7) << 5;
6810 match [14] |= (cos1_val & 0x7) << 5;
6813 match[13] = proto_val & 0xff;
6814 match[12] = proto_val >> 8;
6822 uword unformat_classify_match (unformat_input_t * input, va_list * args)
6824 u8 ** matchp = va_arg (*args, u8 **);
6825 u32 skip_n_vectors = va_arg (*args, u32);
6826 u32 match_n_vectors = va_arg (*args, u32);
6832 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
6833 if (unformat (input, "hex %U", unformat_hex_string, &match))
6835 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
6837 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
6843 if (match || l2 || l3)
6847 /* "Win a free Ethernet header in every packet" */
6849 vec_validate_aligned (l2, 13, sizeof(u32x4));
6851 vec_append_aligned (match, l3, sizeof(u32x4));
6855 /* Make sure the vector is big enough even if key is all 0's */
6856 vec_validate_aligned
6857 (match, ((match_n_vectors + skip_n_vectors) * sizeof(u32x4)) - 1,
6860 /* Set size, include skipped vectors*/
6861 _vec_len (match) = (match_n_vectors+skip_n_vectors) * sizeof(u32x4);
6871 static int api_classify_add_del_session (vat_main_t * vam)
6873 unformat_input_t * i = vam->input;
6874 vl_api_classify_add_del_session_t *mp;
6876 u32 table_index = ~0;
6877 u32 hit_next_index = ~0;
6878 u32 opaque_index = ~0;
6882 u32 skip_n_vectors = 0;
6883 u32 match_n_vectors = 0;
6886 * Warning: you have to supply skip_n and match_n
6887 * because the API client cant simply look at the classify
6891 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
6892 if (unformat (i, "del"))
6894 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
6897 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
6900 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
6903 else if (unformat (i, "opaque-index %d", &opaque_index))
6905 else if (unformat (i, "skip_n %d", &skip_n_vectors))
6907 else if (unformat (i, "match_n %d", &match_n_vectors))
6909 else if (unformat (i, "match %U", unformat_classify_match,
6910 &match, skip_n_vectors, match_n_vectors))
6912 else if (unformat (i, "advance %d", &advance))
6914 else if (unformat (i, "table-index %d", &table_index))
6920 if (table_index == ~0) {
6921 errmsg ("Table index required\n");
6925 if (is_add && match == 0) {
6926 errmsg ("Match value required\n");
6930 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session,
6933 mp->is_add = is_add;
6934 mp->table_index = ntohl(table_index);
6935 mp->hit_next_index = ntohl(hit_next_index);
6936 mp->opaque_index = ntohl(opaque_index);
6937 mp->advance = ntohl(advance);
6938 clib_memcpy (mp->match, match, vec_len(match));
6945 static int api_classify_set_interface_ip_table (vat_main_t * vam)
6947 unformat_input_t * i = vam->input;
6948 vl_api_classify_set_interface_ip_table_t *mp;
6951 int sw_if_index_set;
6952 u32 table_index = ~0;
6955 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
6956 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6957 sw_if_index_set = 1;
6958 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6959 sw_if_index_set = 1;
6960 else if (unformat (i, "table %d", &table_index))
6963 clib_warning ("parse error '%U'", format_unformat_error, i);
6968 if (sw_if_index_set == 0) {
6969 errmsg ("missing interface name or sw_if_index\n");
6974 M(CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
6976 mp->sw_if_index = ntohl(sw_if_index);
6977 mp->table_index = ntohl(table_index);
6978 mp->is_ipv6 = is_ipv6;
6985 static int api_classify_set_interface_l2_tables (vat_main_t * vam)
6987 unformat_input_t * i = vam->input;
6988 vl_api_classify_set_interface_l2_tables_t *mp;
6991 int sw_if_index_set;
6992 u32 ip4_table_index = ~0;
6993 u32 ip6_table_index = ~0;
6994 u32 other_table_index = ~0;
6996 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
6997 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6998 sw_if_index_set = 1;
6999 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7000 sw_if_index_set = 1;
7001 else if (unformat (i, "ip4-table %d", &ip4_table_index))
7003 else if (unformat (i, "ip6-table %d", &ip6_table_index))
7005 else if (unformat (i, "other-table %d", &other_table_index))
7008 clib_warning ("parse error '%U'", format_unformat_error, i);
7013 if (sw_if_index_set == 0) {
7014 errmsg ("missing interface name or sw_if_index\n");
7019 M(CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
7021 mp->sw_if_index = ntohl(sw_if_index);
7022 mp->ip4_table_index = ntohl(ip4_table_index);
7023 mp->ip6_table_index = ntohl(ip6_table_index);
7024 mp->other_table_index = ntohl(other_table_index);
7032 static int api_get_node_index (vat_main_t * vam)
7034 unformat_input_t * i = vam->input;
7035 vl_api_get_node_index_t * mp;
7039 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7040 if (unformat (i, "node %s", &name))
7046 errmsg ("node name required\n");
7049 if (vec_len (name) >= ARRAY_LEN(mp->node_name)) {
7050 errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name));
7054 M(GET_NODE_INDEX, get_node_index);
7055 clib_memcpy (mp->node_name, name, vec_len(name));
7063 static int api_add_node_next (vat_main_t * vam)
7065 unformat_input_t * i = vam->input;
7066 vl_api_add_node_next_t * mp;
7071 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7072 if (unformat (i, "node %s", &name))
7074 else if (unformat (i, "next %s", &next))
7080 errmsg ("node name required\n");
7083 if (vec_len (name) >= ARRAY_LEN(mp->node_name)) {
7084 errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name));
7088 errmsg ("next node required\n");
7091 if (vec_len (next) >= ARRAY_LEN(mp->next_name)) {
7092 errmsg ("next name too long, max %d\n", ARRAY_LEN(mp->next_name));
7096 M(ADD_NODE_NEXT, add_node_next);
7097 clib_memcpy (mp->node_name, name, vec_len(name));
7098 clib_memcpy (mp->next_name, next, vec_len(next));
7107 static int api_l2tpv3_create_tunnel (vat_main_t * vam)
7109 unformat_input_t * i = vam->input;
7110 ip6_address_t client_address, our_address;
7111 int client_address_set = 0;
7112 int our_address_set = 0;
7113 u32 local_session_id = 0;
7114 u32 remote_session_id = 0;
7115 u64 local_cookie = 0;
7116 u64 remote_cookie = 0;
7117 u8 l2_sublayer_present = 0;
7118 vl_api_l2tpv3_create_tunnel_t * mp;
7121 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7122 if (unformat (i, "client_address %U", unformat_ip6_address,
7124 client_address_set = 1;
7125 else if (unformat (i, "our_address %U", unformat_ip6_address,
7127 our_address_set = 1;
7128 else if (unformat (i, "local_session_id %d", &local_session_id))
7130 else if (unformat (i, "remote_session_id %d", &remote_session_id))
7132 else if (unformat (i, "local_cookie %lld", &local_cookie))
7134 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
7136 else if (unformat (i, "l2-sublayer-present"))
7137 l2_sublayer_present = 1;
7142 if (client_address_set == 0) {
7143 errmsg ("client_address required\n");
7147 if (our_address_set == 0) {
7148 errmsg ("our_address required\n");
7152 M(L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
7154 clib_memcpy (mp->client_address, client_address.as_u8,
7155 sizeof (mp->client_address));
7157 clib_memcpy (mp->our_address, our_address.as_u8,
7158 sizeof (mp->our_address));
7160 mp->local_session_id = ntohl (local_session_id);
7161 mp->remote_session_id = ntohl (remote_session_id);
7162 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
7163 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
7164 mp->l2_sublayer_present = l2_sublayer_present;
7172 static int api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
7174 unformat_input_t * i = vam->input;
7176 u8 sw_if_index_set = 0;
7177 u64 new_local_cookie = 0;
7178 u64 new_remote_cookie = 0;
7179 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
7182 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7183 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7184 sw_if_index_set = 1;
7185 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7186 sw_if_index_set = 1;
7187 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
7189 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
7195 if (sw_if_index_set == 0) {
7196 errmsg ("missing interface name or sw_if_index\n");
7200 M(L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
7202 mp->sw_if_index = ntohl(sw_if_index);
7203 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
7204 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
7211 static int api_l2tpv3_interface_enable_disable (vat_main_t * vam)
7213 unformat_input_t * i = vam->input;
7214 vl_api_l2tpv3_interface_enable_disable_t *mp;
7217 u8 sw_if_index_set = 0;
7218 u8 enable_disable = 1;
7220 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7221 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7222 sw_if_index_set = 1;
7223 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7224 sw_if_index_set = 1;
7225 else if (unformat (i, "enable"))
7227 else if (unformat (i, "disable"))
7233 if (sw_if_index_set == 0) {
7234 errmsg ("missing interface name or sw_if_index\n");
7238 M(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
7240 mp->sw_if_index = ntohl(sw_if_index);
7241 mp->enable_disable = enable_disable;
7248 static int api_l2tpv3_set_lookup_key (vat_main_t * vam)
7250 unformat_input_t * i = vam->input;
7251 vl_api_l2tpv3_set_lookup_key_t * mp;
7255 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7256 if (unformat (i, "lookup_v6_src"))
7257 key = L2T_LOOKUP_SRC_ADDRESS;
7258 else if (unformat (i, "lookup_v6_dst"))
7259 key = L2T_LOOKUP_DST_ADDRESS;
7260 else if (unformat (i, "lookup_session_id"))
7261 key = L2T_LOOKUP_SESSION_ID;
7266 if (key == (u8) ~0) {
7267 errmsg ("l2tp session lookup key unset\n");
7271 M(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
7280 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
7281 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
7283 vat_main_t * vam = &vat_main;
7285 fformat(vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
7286 format_ip6_address, mp->our_address,
7287 format_ip6_address, mp->client_address,
7288 clib_net_to_host_u32(mp->sw_if_index));
7290 fformat (vam->ofp, " local cookies %016llx %016llx remote cookie %016llx\n",
7291 clib_net_to_host_u64 (mp->local_cookie[0]),
7292 clib_net_to_host_u64 (mp->local_cookie[1]),
7293 clib_net_to_host_u64 (mp->remote_cookie));
7295 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
7296 clib_net_to_host_u32 (mp->local_session_id),
7297 clib_net_to_host_u32 (mp->remote_session_id));
7299 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
7300 mp->l2_sublayer_present ? "preset" : "absent");
7304 static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
7305 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
7307 vat_main_t * vam = &vat_main;
7308 vat_json_node_t *node = NULL;
7309 struct in6_addr addr;
7311 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7312 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7313 vat_json_init_array(&vam->json_tree);
7315 node = vat_json_array_add(&vam->json_tree);
7317 vat_json_init_object(node);
7319 clib_memcpy(&addr, mp->our_address, sizeof(addr));
7320 vat_json_object_add_ip6(node, "our_address", addr);
7321 clib_memcpy(&addr, mp->client_address, sizeof(addr));
7322 vat_json_object_add_ip6(node, "client_address", addr);
7324 vat_json_node_t * lc = vat_json_object_add(node, "local_cookie");
7325 vat_json_init_array(lc);
7326 vat_json_array_add_uint(lc, clib_net_to_host_u64(mp->local_cookie[0]));
7327 vat_json_array_add_uint(lc, clib_net_to_host_u64(mp->local_cookie[1]));
7328 vat_json_object_add_uint(node, "remote_cookie", clib_net_to_host_u64(mp->remote_cookie));
7330 printf("local id: %u", clib_net_to_host_u32(mp->local_session_id));
7331 vat_json_object_add_uint(node, "local_session_id", clib_net_to_host_u32(mp->local_session_id));
7332 vat_json_object_add_uint(node, "remote_session_id", clib_net_to_host_u32(mp->remote_session_id));
7333 vat_json_object_add_string_copy(node, "l2_sublayer", mp->l2_sublayer_present ?
7334 (u8*)"present" : (u8*)"absent");
7337 static int api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
7339 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
7342 /* Get list of l2tpv3-tunnel interfaces */
7343 M(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
7346 /* Use a control ping for synchronization */
7348 vl_api_control_ping_t * mp;
7349 M(CONTROL_PING, control_ping);
7356 static void vl_api_sw_interface_tap_details_t_handler
7357 (vl_api_sw_interface_tap_details_t * mp)
7359 vat_main_t * vam = &vat_main;
7361 fformat(vam->ofp, "%-16s %d\n",
7363 clib_net_to_host_u32(mp->sw_if_index));
7366 static void vl_api_sw_interface_tap_details_t_handler_json
7367 (vl_api_sw_interface_tap_details_t * mp)
7369 vat_main_t * vam = &vat_main;
7370 vat_json_node_t *node = NULL;
7372 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7373 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7374 vat_json_init_array(&vam->json_tree);
7376 node = vat_json_array_add(&vam->json_tree);
7378 vat_json_init_object(node);
7379 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
7380 vat_json_object_add_string_copy(node, "dev_name", mp->dev_name);
7383 static int api_sw_interface_tap_dump (vat_main_t * vam)
7385 vl_api_sw_interface_tap_dump_t *mp;
7388 fformat(vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
7389 /* Get list of tap interfaces */
7390 M(SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
7393 /* Use a control ping for synchronization */
7395 vl_api_control_ping_t * mp;
7396 M(CONTROL_PING, control_ping);
7402 static uword unformat_vxlan_decap_next
7403 (unformat_input_t * input, va_list * args)
7405 u32 * result = va_arg (*args, u32 *);
7408 if (unformat (input, "drop"))
7409 *result = VXLAN_INPUT_NEXT_DROP;
7410 else if (unformat (input, "ip4"))
7411 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
7412 else if (unformat (input, "ip6"))
7413 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
7414 else if (unformat (input, "l2"))
7415 *result = VXLAN_INPUT_NEXT_L2_INPUT;
7416 else if (unformat (input, "%d", &tmp))
7423 static int api_vxlan_add_del_tunnel (vat_main_t * vam)
7425 unformat_input_t * line_input = vam->input;
7426 vl_api_vxlan_add_del_tunnel_t *mp;
7428 ip4_address_t src4, dst4;
7429 ip6_address_t src6, dst6;
7431 u8 ipv4_set = 0, ipv6_set = 0;
7434 u32 encap_vrf_id = 0;
7435 u32 decap_next_index = ~0;
7438 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
7439 if (unformat (line_input, "del"))
7441 else if (unformat (line_input, "src %U",
7442 unformat_ip4_address, &src4))
7447 else if (unformat (line_input, "dst %U",
7448 unformat_ip4_address, &dst4))
7453 else if (unformat (line_input, "src %U",
7454 unformat_ip6_address, &src6))
7459 else if (unformat (line_input, "dst %U",
7460 unformat_ip6_address, &dst6))
7465 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
7467 else if (unformat (line_input, "decap-next %U",
7468 unformat_vxlan_decap_next, &decap_next_index))
7470 else if (unformat (line_input, "vni %d", &vni))
7473 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
7479 errmsg ("tunnel src address not specified\n");
7483 errmsg ("tunnel dst address not specified\n");
7487 if (ipv4_set && ipv6_set) {
7488 errmsg ("both IPv4 and IPv6 addresses specified");
7492 if ((vni == 0) || (vni>>24)) {
7493 errmsg ("vni not specified or out of range\n");
7497 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
7500 clib_memcpy(&mp->src_address, &src6, sizeof(src6));
7501 clib_memcpy(&mp->dst_address, &dst6, sizeof(dst6));
7503 clib_memcpy(&mp->src_address, &src4, sizeof(src4));
7504 clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
7506 mp->encap_vrf_id = ntohl(encap_vrf_id);
7507 mp->decap_next_index = ntohl(decap_next_index);
7508 mp->vni = ntohl(vni);
7509 mp->is_add = is_add;
7510 mp->is_ipv6 = ipv6_set;
7517 static void vl_api_vxlan_tunnel_details_t_handler
7518 (vl_api_vxlan_tunnel_details_t * mp)
7520 vat_main_t * vam = &vat_main;
7522 fformat(vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
7523 ntohl(mp->sw_if_index),
7524 format_ip46_address, &(mp->src_address[0]),
7525 format_ip46_address, &(mp->dst_address[0]),
7526 ntohl(mp->encap_vrf_id),
7527 ntohl(mp->decap_next_index),
7531 static void vl_api_vxlan_tunnel_details_t_handler_json
7532 (vl_api_vxlan_tunnel_details_t * mp)
7534 vat_main_t * vam = &vat_main;
7535 vat_json_node_t *node = NULL;
7537 struct in6_addr ip6;
7539 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7540 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7541 vat_json_init_array(&vam->json_tree);
7543 node = vat_json_array_add(&vam->json_tree);
7545 vat_json_init_object(node);
7546 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
7548 clib_memcpy(&ip6, &(mp->src_address[0]), sizeof(ip6));
7549 vat_json_object_add_ip6(node, "src_address", ip6);
7550 clib_memcpy(&ip6, &(mp->dst_address[0]), sizeof(ip6));
7551 vat_json_object_add_ip6(node, "dst_address", ip6);
7553 clib_memcpy(&ip4, &(mp->src_address[0]), sizeof(ip4));
7554 vat_json_object_add_ip4(node, "src_address", ip4);
7555 clib_memcpy(&ip4, &(mp->dst_address[0]), sizeof(ip4));
7556 vat_json_object_add_ip4(node, "dst_address", ip4);
7558 vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
7559 vat_json_object_add_uint(node, "decap_next_index", ntohl(mp->decap_next_index));
7560 vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
7561 vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
7564 static int api_vxlan_tunnel_dump (vat_main_t * vam)
7566 unformat_input_t * i = vam->input;
7567 vl_api_vxlan_tunnel_dump_t *mp;
7570 u8 sw_if_index_set = 0;
7572 /* Parse args required to build the message */
7573 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7574 if (unformat (i, "sw_if_index %d", &sw_if_index))
7575 sw_if_index_set = 1;
7580 if (sw_if_index_set == 0) {
7584 if (!vam->json_output) {
7585 fformat(vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
7586 "sw_if_index", "src_address", "dst_address",
7587 "encap_vrf_id", "decap_next_index", "vni");
7590 /* Get list of vxlan-tunnel interfaces */
7591 M(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
7593 mp->sw_if_index = htonl(sw_if_index);
7597 /* Use a control ping for synchronization */
7599 vl_api_control_ping_t * mp;
7600 M(CONTROL_PING, control_ping);
7606 static int api_gre_add_del_tunnel (vat_main_t * vam)
7608 unformat_input_t * line_input = vam->input;
7609 vl_api_gre_add_del_tunnel_t *mp;
7611 ip4_address_t src4, dst4;
7615 u32 outer_fib_id = 0;
7617 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
7618 if (unformat (line_input, "del"))
7620 else if (unformat (line_input, "src %U",
7621 unformat_ip4_address, &src4))
7623 else if (unformat (line_input, "dst %U",
7624 unformat_ip4_address, &dst4))
7626 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
7629 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
7635 errmsg ("tunnel src address not specified\n");
7639 errmsg ("tunnel dst address not specified\n");
7644 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
7646 clib_memcpy(&mp->src_address, &src4, sizeof(src4));
7647 clib_memcpy(&mp->dst_address, &dst4, sizeof(dst4));
7648 mp->outer_table_id = ntohl(outer_fib_id);
7649 mp->is_add = is_add;
7656 static void vl_api_gre_tunnel_details_t_handler
7657 (vl_api_gre_tunnel_details_t * mp)
7659 vat_main_t * vam = &vat_main;
7661 fformat(vam->ofp, "%11d%15U%15U%14d\n",
7662 ntohl(mp->sw_if_index),
7663 format_ip4_address, &mp->src_address,
7664 format_ip4_address, &mp->dst_address,
7665 ntohl(mp->outer_table_id));
7668 static void vl_api_gre_tunnel_details_t_handler_json
7669 (vl_api_gre_tunnel_details_t * mp)
7671 vat_main_t * vam = &vat_main;
7672 vat_json_node_t *node = NULL;
7675 if (VAT_JSON_ARRAY != vam->json_tree.type) {
7676 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
7677 vat_json_init_array(&vam->json_tree);
7679 node = vat_json_array_add(&vam->json_tree);
7681 vat_json_init_object(node);
7682 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
7683 clib_memcpy(&ip4, &mp->src_address, sizeof(ip4));
7684 vat_json_object_add_ip4(node, "src_address", ip4);
7685 clib_memcpy(&ip4, &mp->dst_address, sizeof(ip4));
7686 vat_json_object_add_ip4(node, "dst_address", ip4);
7687 vat_json_object_add_uint(node, "outer_fib_id", ntohl(mp->outer_table_id));
7690 static int api_gre_tunnel_dump (vat_main_t * vam)
7692 unformat_input_t * i = vam->input;
7693 vl_api_gre_tunnel_dump_t *mp;
7696 u8 sw_if_index_set = 0;
7698 /* Parse args required to build the message */
7699 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7700 if (unformat (i, "sw_if_index %d", &sw_if_index))
7701 sw_if_index_set = 1;
7706 if (sw_if_index_set == 0) {
7710 if (!vam->json_output) {
7711 fformat(vam->ofp, "%11s%15s%15s%14s\n",
7712 "sw_if_index", "src_address", "dst_address",
7716 /* Get list of gre-tunnel interfaces */
7717 M(GRE_TUNNEL_DUMP, gre_tunnel_dump);
7719 mp->sw_if_index = htonl(sw_if_index);
7723 /* Use a control ping for synchronization */
7725 vl_api_control_ping_t * mp;
7726 M(CONTROL_PING, control_ping);
7732 static int api_l2_fib_clear_table (vat_main_t * vam)
7734 // unformat_input_t * i = vam->input;
7735 vl_api_l2_fib_clear_table_t *mp;
7738 M(L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
7745 static int api_l2_interface_efp_filter (vat_main_t * vam)
7747 unformat_input_t * i = vam->input;
7748 vl_api_l2_interface_efp_filter_t *mp;
7752 u8 sw_if_index_set = 0;
7754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7755 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7756 sw_if_index_set = 1;
7757 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7758 sw_if_index_set = 1;
7759 else if (unformat (i, "enable"))
7761 else if (unformat (i, "disable"))
7764 clib_warning ("parse error '%U'", format_unformat_error, i);
7769 if (sw_if_index_set == 0) {
7770 errmsg ("missing sw_if_index\n");
7774 M(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
7776 mp->sw_if_index = ntohl(sw_if_index);
7777 mp->enable_disable = enable;
7784 #define foreach_vtr_op \
7785 _("disable", L2_VTR_DISABLED) \
7786 _("push-1", L2_VTR_PUSH_1) \
7787 _("push-2", L2_VTR_PUSH_2) \
7788 _("pop-1", L2_VTR_POP_1) \
7789 _("pop-2", L2_VTR_POP_2) \
7790 _("translate-1-1", L2_VTR_TRANSLATE_1_1) \
7791 _("translate-1-2", L2_VTR_TRANSLATE_1_2) \
7792 _("translate-2-1", L2_VTR_TRANSLATE_2_1) \
7793 _("translate-2-2", L2_VTR_TRANSLATE_2_2)
7795 static int api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
7797 unformat_input_t * i = vam->input;
7798 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
7801 u8 sw_if_index_set = 0;
7808 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7809 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7810 sw_if_index_set = 1;
7811 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7812 sw_if_index_set = 1;
7813 else if (unformat (i, "vtr_op %d", &vtr_op))
7815 #define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
7819 else if (unformat (i, "push_dot1q %d", &push_dot1q))
7821 else if (unformat (i, "tag1 %d", &tag1))
7823 else if (unformat (i, "tag2 %d", &tag2))
7826 clib_warning ("parse error '%U'", format_unformat_error, i);
7831 if ((sw_if_index_set == 0)||(vtr_op_set == 0)) {
7832 errmsg ("missing vtr operation or sw_if_index\n");
7836 M(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
7838 mp->sw_if_index = ntohl(sw_if_index);
7839 mp->vtr_op = ntohl(vtr_op);
7840 mp->push_dot1q = ntohl(push_dot1q);
7841 mp->tag1 = ntohl(tag1);
7842 mp->tag2 = ntohl(tag2);
7849 static int api_create_vhost_user_if (vat_main_t * vam)
7851 unformat_input_t * i = vam->input;
7852 vl_api_create_vhost_user_if_t *mp;
7856 u8 file_name_set = 0;
7857 u32 custom_dev_instance = ~0;
7859 u8 use_custom_mac = 0;
7861 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7862 if (unformat (i, "socket %s", &file_name)) {
7865 else if (unformat (i, "renumber %"PRIu32, &custom_dev_instance))
7867 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
7869 else if (unformat (i, "server"))
7875 if (file_name_set == 0) {
7876 errmsg ("missing socket file name\n");
7880 if (vec_len (file_name) > 255) {
7881 errmsg ("socket file name too long\n");
7884 vec_add1 (file_name, 0);
7886 M(CREATE_VHOST_USER_IF, create_vhost_user_if);
7888 mp->is_server = is_server;
7889 clib_memcpy(mp->sock_filename, file_name, vec_len(file_name));
7890 vec_free(file_name);
7891 if (custom_dev_instance != ~0) {
7893 mp->custom_dev_instance = ntohl(custom_dev_instance);
7895 mp->use_custom_mac = use_custom_mac;
7896 clib_memcpy(mp->mac_address, hwaddr, 6);
7903 static int api_modify_vhost_user_if (vat_main_t * vam)
7905 unformat_input_t * i = vam->input;
7906 vl_api_modify_vhost_user_if_t *mp;
7910 u8 file_name_set = 0;
7911 u32 custom_dev_instance = ~0;
7912 u8 sw_if_index_set = 0;
7913 u32 sw_if_index = (u32)~0;
7915 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7916 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7917 sw_if_index_set = 1;
7918 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7919 sw_if_index_set = 1;
7920 else if (unformat (i, "socket %s", &file_name)) {
7923 else if (unformat (i, "renumber %"PRIu32, &custom_dev_instance))
7925 else if (unformat (i, "server"))
7931 if (sw_if_index_set == 0) {
7932 errmsg ("missing sw_if_index or interface name\n");
7936 if (file_name_set == 0) {
7937 errmsg ("missing socket file name\n");
7941 if (vec_len (file_name) > 255) {
7942 errmsg ("socket file name too long\n");
7945 vec_add1 (file_name, 0);
7947 M(MODIFY_VHOST_USER_IF, modify_vhost_user_if);
7949 mp->sw_if_index = ntohl(sw_if_index);
7950 mp->is_server = is_server;
7951 clib_memcpy(mp->sock_filename, file_name, vec_len(file_name));
7952 vec_free(file_name);
7953 if (custom_dev_instance != ~0) {
7955 mp->custom_dev_instance = ntohl(custom_dev_instance);
7963 static int api_delete_vhost_user_if (vat_main_t * vam)
7965 unformat_input_t * i = vam->input;
7966 vl_api_delete_vhost_user_if_t *mp;
7968 u32 sw_if_index = ~0;
7969 u8 sw_if_index_set = 0;
7971 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
7972 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7973 sw_if_index_set = 1;
7974 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7975 sw_if_index_set = 1;
7980 if (sw_if_index_set == 0) {
7981 errmsg ("missing sw_if_index or interface name\n");
7986 M(DELETE_VHOST_USER_IF, delete_vhost_user_if);
7988 mp->sw_if_index = ntohl(sw_if_index);
7995 static void vl_api_sw_interface_vhost_user_details_t_handler
7996 (vl_api_sw_interface_vhost_user_details_t * mp)
7998 vat_main_t * vam = &vat_main;
8000 fformat(vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
8001 (char *)mp->interface_name,
8002 ntohl(mp->sw_if_index), ntohl(mp->virtio_net_hdr_sz),
8003 clib_net_to_host_u64(mp->features), mp->is_server,
8004 ntohl(mp->num_regions), (char *)mp->sock_filename);
8005 fformat(vam->ofp, " Status: '%s'\n", strerror(ntohl(mp->sock_errno)));
8008 static void vl_api_sw_interface_vhost_user_details_t_handler_json
8009 (vl_api_sw_interface_vhost_user_details_t * mp)
8011 vat_main_t * vam = &vat_main;
8012 vat_json_node_t *node = NULL;
8014 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8015 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8016 vat_json_init_array(&vam->json_tree);
8018 node = vat_json_array_add(&vam->json_tree);
8020 vat_json_init_object(node);
8021 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8022 vat_json_object_add_string_copy(node, "interface_name", mp->interface_name);
8023 vat_json_object_add_uint(node, "virtio_net_hdr_sz", ntohl(mp->virtio_net_hdr_sz));
8024 vat_json_object_add_uint(node, "features", clib_net_to_host_u64(mp->features));
8025 vat_json_object_add_uint(node, "is_server", mp->is_server);
8026 vat_json_object_add_string_copy(node, "sock_filename", mp->sock_filename);
8027 vat_json_object_add_uint(node, "num_regions", ntohl(mp->num_regions));
8028 vat_json_object_add_uint(node, "sock_errno", ntohl(mp->sock_errno));
8031 static int api_sw_interface_vhost_user_dump (vat_main_t * vam)
8033 vl_api_sw_interface_vhost_user_dump_t *mp;
8035 fformat(vam->ofp, "Interface name idx hdr_sz features server regions filename\n");
8037 /* Get list of vhost-user interfaces */
8038 M(SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
8041 /* Use a control ping for synchronization */
8043 vl_api_control_ping_t * mp;
8044 M(CONTROL_PING, control_ping);
8050 static int api_show_version (vat_main_t * vam)
8052 vl_api_show_version_t *mp;
8055 M(SHOW_VERSION, show_version);
8063 static int api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
8065 unformat_input_t * line_input = vam->input;
8066 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
8068 ip4_address_t local4, remote4;
8069 ip6_address_t local6, remote6;
8071 u8 ipv4_set = 0, ipv6_set = 0;
8074 u32 encap_vrf_id = 0;
8075 u32 decap_vrf_id = 0;
8080 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8081 if (unformat (line_input, "del"))
8083 else if (unformat (line_input, "local %U",
8084 unformat_ip4_address, &local4))
8089 else if (unformat (line_input, "remote %U",
8090 unformat_ip4_address, &remote4))
8095 else if (unformat (line_input, "local %U",
8096 unformat_ip6_address, &local6))
8101 else if (unformat (line_input, "remote %U",
8102 unformat_ip6_address, &remote6))
8107 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
8109 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
8111 else if (unformat (line_input, "vni %d", &vni))
8113 else if (unformat(line_input, "next-ip4"))
8115 else if (unformat(line_input, "next-ip6"))
8117 else if (unformat(line_input, "next-ethernet"))
8119 else if (unformat(line_input, "next-nsh"))
8122 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
8127 if (local_set == 0) {
8128 errmsg ("tunnel local address not specified\n");
8131 if (remote_set == 0) {
8132 errmsg ("tunnel remote address not specified\n");
8135 if (ipv4_set && ipv6_set) {
8136 errmsg ("both IPv4 and IPv6 addresses specified");
8141 errmsg ("vni not specified\n");
8145 M(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
8149 clib_memcpy(&mp->local, &local6, sizeof(local6));
8150 clib_memcpy(&mp->remote, &remote6, sizeof(remote6));
8152 clib_memcpy(&mp->local, &local4, sizeof(local4));
8153 clib_memcpy(&mp->remote, &remote4, sizeof(remote4));
8156 mp->encap_vrf_id = ntohl(encap_vrf_id);
8157 mp->decap_vrf_id = ntohl(decap_vrf_id);
8158 mp->protocol = ntohl(protocol);
8159 mp->vni = ntohl(vni);
8160 mp->is_add = is_add;
8161 mp->is_ipv6 = ipv6_set;
8168 static void vl_api_vxlan_gpe_tunnel_details_t_handler
8169 (vl_api_vxlan_gpe_tunnel_details_t * mp)
8171 vat_main_t * vam = &vat_main;
8173 fformat(vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
8174 ntohl(mp->sw_if_index),
8175 format_ip46_address, &(mp->local[0]),
8176 format_ip46_address, &(mp->remote[0]),
8178 ntohl(mp->protocol),
8179 ntohl(mp->encap_vrf_id),
8180 ntohl(mp->decap_vrf_id));
8183 static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
8184 (vl_api_vxlan_gpe_tunnel_details_t * mp)
8186 vat_main_t * vam = &vat_main;
8187 vat_json_node_t *node = NULL;
8189 struct in6_addr ip6;
8191 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8192 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8193 vat_json_init_array(&vam->json_tree);
8195 node = vat_json_array_add(&vam->json_tree);
8197 vat_json_init_object(node);
8198 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8200 clib_memcpy(&ip6, &(mp->local[0]), sizeof(ip6));
8201 vat_json_object_add_ip6(node, "local", ip6);
8202 clib_memcpy(&ip6, &(mp->remote[0]), sizeof(ip6));
8203 vat_json_object_add_ip6(node, "remote", ip6);
8205 clib_memcpy(&ip4, &(mp->local[0]), sizeof(ip4));
8206 vat_json_object_add_ip4(node, "local", ip4);
8207 clib_memcpy(&ip4, &(mp->remote[0]), sizeof(ip4));
8208 vat_json_object_add_ip4(node, "remote", ip4);
8210 vat_json_object_add_uint(node, "vni", ntohl(mp->vni));
8211 vat_json_object_add_uint(node, "protocol", ntohl(mp->protocol));
8212 vat_json_object_add_uint(node, "encap_vrf_id", ntohl(mp->encap_vrf_id));
8213 vat_json_object_add_uint(node, "decap_vrf_id", ntohl(mp->decap_vrf_id));
8214 vat_json_object_add_uint(node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
8217 static int api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
8219 unformat_input_t * i = vam->input;
8220 vl_api_vxlan_gpe_tunnel_dump_t *mp;
8223 u8 sw_if_index_set = 0;
8225 /* Parse args required to build the message */
8226 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8227 if (unformat (i, "sw_if_index %d", &sw_if_index))
8228 sw_if_index_set = 1;
8233 if (sw_if_index_set == 0) {
8237 if (!vam->json_output) {
8238 fformat(vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
8239 "sw_if_index", "local", "remote", "vni",
8240 "protocol","encap_vrf_id", "decap_vrf_id");
8243 /* Get list of vxlan-tunnel interfaces */
8244 M(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
8246 mp->sw_if_index = htonl(sw_if_index);
8250 /* Use a control ping for synchronization */
8252 vl_api_control_ping_t * mp;
8253 M(CONTROL_PING, control_ping);
8259 u8 * format_l2_fib_mac_address (u8 * s, va_list * args)
8261 u8 * a = va_arg (*args, u8 *);
8263 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
8264 a[2], a[3], a[4], a[5], a[6], a[7]);
8267 static void vl_api_l2_fib_table_entry_t_handler
8268 (vl_api_l2_fib_table_entry_t * mp)
8270 vat_main_t * vam = &vat_main;
8272 fformat(vam->ofp, "%3" PRIu32 " %U %3" PRIu32
8274 ntohl(mp->bd_id), format_l2_fib_mac_address, &mp->mac,
8275 ntohl(mp->sw_if_index), mp->static_mac, mp->filter_mac,
8279 static void vl_api_l2_fib_table_entry_t_handler_json
8280 (vl_api_l2_fib_table_entry_t * mp)
8282 vat_main_t * vam = &vat_main;
8283 vat_json_node_t *node = NULL;
8285 if (VAT_JSON_ARRAY != vam->json_tree.type) {
8286 ASSERT(VAT_JSON_NONE == vam->json_tree.type);
8287 vat_json_init_array(&vam->json_tree);
8289 node = vat_json_array_add(&vam->json_tree);
8291 vat_json_init_object(node);
8292 vat_json_object_add_uint(node, "bd_id", ntohl(mp->bd_id));
8293 vat_json_object_add_uint(node, "mac", clib_net_to_host_u64(mp->mac));
8294 vat_json_object_add_uint(node, "sw_if_index", ntohl(mp->sw_if_index));
8295 vat_json_object_add_uint(node, "static_mac", mp->static_mac);
8296 vat_json_object_add_uint(node, "filter_mac", mp->filter_mac);
8297 vat_json_object_add_uint(node, "bvi_mac", mp->bvi_mac);
8300 static int api_l2_fib_table_dump (vat_main_t * vam)
8302 unformat_input_t * i = vam->input;
8303 vl_api_l2_fib_table_dump_t *mp;
8308 /* Parse args required to build the message */
8309 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8310 if (unformat (i, "bd_id %d", &bd_id))
8316 if (bd_id_set == 0) {
8317 errmsg ("missing bridge domain\n");
8321 fformat(vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI\n");
8323 /* Get list of l2 fib entries */
8324 M(L2_FIB_TABLE_DUMP, l2_fib_table_dump);
8326 mp->bd_id = ntohl(bd_id);
8329 /* Use a control ping for synchronization */
8331 vl_api_control_ping_t * mp;
8332 M(CONTROL_PING, control_ping);
8340 api_interface_name_renumber (vat_main_t * vam)
8342 unformat_input_t * line_input = vam->input;
8343 vl_api_interface_name_renumber_t *mp;
8344 u32 sw_if_index = ~0;
8346 u32 new_show_dev_instance = ~0;
8348 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8349 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
8352 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
8354 else if (unformat (line_input, "new_show_dev_instance %d",
8355 &new_show_dev_instance))
8361 if (sw_if_index == ~0) {
8362 errmsg ("missing interface name or sw_if_index\n");
8366 if (new_show_dev_instance == ~0) {
8367 errmsg ("missing new_show_dev_instance\n");
8371 M(INTERFACE_NAME_RENUMBER, interface_name_renumber);
8373 mp->sw_if_index = ntohl (sw_if_index);
8374 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
8380 api_want_ip4_arp_events (vat_main_t * vam)
8382 unformat_input_t * line_input = vam->input;
8383 vl_api_want_ip4_arp_events_t * mp;
8385 ip4_address_t address;
8386 int address_set = 0;
8387 u32 enable_disable = 1;
8389 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
8390 if (unformat (line_input, "address %U",
8391 unformat_ip4_address, &address))
8393 else if (unformat (line_input, "del"))
8399 if (address_set == 0) {
8400 errmsg ("missing addresses\n");
8404 M(WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
8405 mp->enable_disable = enable_disable;
8407 mp->address = address.as_u32;
8412 static int api_input_acl_set_interface (vat_main_t * vam)
8414 unformat_input_t * i = vam->input;
8415 vl_api_input_acl_set_interface_t *mp;
8418 int sw_if_index_set;
8419 u32 ip4_table_index = ~0;
8420 u32 ip6_table_index = ~0;
8421 u32 l2_table_index = ~0;
8424 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8425 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8426 sw_if_index_set = 1;
8427 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8428 sw_if_index_set = 1;
8429 else if (unformat (i, "del"))
8431 else if (unformat (i, "ip4-table %d", &ip4_table_index))
8433 else if (unformat (i, "ip6-table %d", &ip6_table_index))
8435 else if (unformat (i, "l2-table %d", &l2_table_index))
8438 clib_warning ("parse error '%U'", format_unformat_error, i);
8443 if (sw_if_index_set == 0) {
8444 errmsg ("missing interface name or sw_if_index\n");
8448 M(INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
8450 mp->sw_if_index = ntohl(sw_if_index);
8451 mp->ip4_table_index = ntohl(ip4_table_index);
8452 mp->ip6_table_index = ntohl(ip6_table_index);
8453 mp->l2_table_index = ntohl(l2_table_index);
8454 mp->is_add = is_add;
8462 api_ip_address_dump (vat_main_t * vam)
8464 unformat_input_t * i = vam->input;
8465 vl_api_ip_address_dump_t * mp;
8466 u32 sw_if_index = ~0;
8467 u8 sw_if_index_set = 0;
8472 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8473 if (unformat (i, "sw_if_index %d", &sw_if_index))
8474 sw_if_index_set = 1;
8475 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8476 sw_if_index_set = 1;
8477 else if (unformat (i, "ipv4"))
8479 else if (unformat (i, "ipv6"))
8485 if (ipv4_set && ipv6_set) {
8486 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
8490 if ((!ipv4_set) && (!ipv6_set)) {
8491 errmsg ("no ipv4 nor ipv6 flag set\n");
8495 if (sw_if_index_set == 0) {
8496 errmsg ("missing interface name or sw_if_index\n");
8500 vam->current_sw_if_index = sw_if_index;
8501 vam->is_ipv6 = ipv6_set;
8503 M(IP_ADDRESS_DUMP, ip_address_dump);
8504 mp->sw_if_index = ntohl(sw_if_index);
8505 mp->is_ipv6 = ipv6_set;
8508 /* Use a control ping for synchronization */
8510 vl_api_control_ping_t * mp;
8511 M(CONTROL_PING, control_ping);
8518 api_ip_dump (vat_main_t * vam)
8520 vl_api_ip_dump_t * mp;
8521 unformat_input_t * in = vam->input;
8528 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT) {
8529 if (unformat (in, "ipv4"))
8531 else if (unformat (in, "ipv6"))
8537 if (ipv4_set && ipv6_set) {
8538 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
8542 if ((!ipv4_set) && (!ipv6_set)) {
8543 errmsg ("no ipv4 nor ipv6 flag set\n");
8548 vam->is_ipv6 = is_ipv6;
8551 for (i = 0; i < vec_len(vam->ip_details_by_sw_if_index[is_ipv6]); i++) {
8552 vec_free(vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
8554 vec_free(vam->ip_details_by_sw_if_index[is_ipv6]);
8556 M(IP_DUMP, ip_dump);
8557 mp->is_ipv6 = ipv6_set;
8560 /* Use a control ping for synchronization */
8562 vl_api_control_ping_t * mp;
8563 M(CONTROL_PING, control_ping);
8570 api_ipsec_spd_add_del (vat_main_t * vam)
8573 unformat_input_t * i = vam->input;
8574 vl_api_ipsec_spd_add_del_t *mp;
8579 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8580 if (unformat (i, "spd_id %d", &spd_id))
8582 else if (unformat (i, "del"))
8585 clib_warning ("parse error '%U'", format_unformat_error, i);
8590 errmsg ("spd_id must be set\n");
8594 M(IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
8596 mp->spd_id = ntohl(spd_id);
8597 mp->is_add = is_add;
8603 clib_warning ("unsupported (no dpdk)");
8609 api_ipsec_interface_add_del_spd (vat_main_t * vam)
8612 unformat_input_t * i = vam->input;
8613 vl_api_ipsec_interface_add_del_spd_t *mp;
8616 u8 sw_if_index_set = 0;
8617 u32 spd_id = (u32) ~0;
8620 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8621 if (unformat (i, "del"))
8623 else if (unformat (i, "spd_id %d", &spd_id))
8625 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
8626 sw_if_index_set = 1;
8627 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8628 sw_if_index_set = 1;
8630 clib_warning ("parse error '%U'", format_unformat_error, i);
8636 if (spd_id == (u32) ~0) {
8637 errmsg ("spd_id must be set\n");
8641 if (sw_if_index_set == 0) {
8642 errmsg ("missing interface name or sw_if_index\n");
8646 M(IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
8648 mp->spd_id = ntohl(spd_id);
8649 mp->sw_if_index = ntohl (sw_if_index);
8650 mp->is_add = is_add;
8656 clib_warning ("unsupported (no dpdk)");
8662 api_ipsec_spd_add_del_entry (vat_main_t * vam)
8665 unformat_input_t * i = vam->input;
8666 vl_api_ipsec_spd_add_del_entry_t *mp;
8668 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
8669 u32 spd_id, sa_id, protocol = 0, policy = 0;
8671 u32 rport_start = 0, rport_stop = (u32) ~0;
8672 u32 lport_start = 0, lport_stop = (u32) ~0;
8673 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
8674 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
8676 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
8677 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~0;
8678 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
8679 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
8680 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~0;
8681 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~0;
8683 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8684 if (unformat (i, "del"))
8686 if (unformat (i, "outbound"))
8688 if (unformat (i, "inbound"))
8690 else if (unformat (i, "spd_id %d", &spd_id))
8692 else if (unformat (i, "sa_id %d", &sa_id))
8694 else if (unformat (i, "priority %d", &priority))
8696 else if (unformat (i, "protocol %d", &protocol))
8698 else if (unformat (i, "lport_start %d", &lport_start))
8700 else if (unformat (i, "lport_stop %d", &lport_stop))
8702 else if (unformat (i, "rport_start %d", &rport_start))
8704 else if (unformat (i, "rport_stop %d", &rport_stop))
8706 else if (unformat (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
8711 else if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
8716 else if (unformat (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
8721 else if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
8726 else if (unformat (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
8731 else if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
8736 else if (unformat (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
8741 else if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
8746 else if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
8748 if (policy == IPSEC_POLICY_ACTION_RESOLVE) {
8749 clib_warning ("unsupported action: 'resolve'");
8754 clib_warning ("parse error '%U'", format_unformat_error, i);
8760 M(IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
8762 mp->spd_id = ntohl(spd_id);
8763 mp->priority = ntohl(priority);
8764 mp->is_outbound = is_outbound;
8766 mp->is_ipv6 = is_ipv6;
8767 if (is_ipv6 || is_ip_any) {
8768 clib_memcpy (mp->remote_address_start, &raddr6_start, sizeof(ip6_address_t));
8769 clib_memcpy (mp->remote_address_stop, &raddr6_stop, sizeof(ip6_address_t));
8770 clib_memcpy (mp->local_address_start, &laddr6_start, sizeof(ip6_address_t));
8771 clib_memcpy (mp->local_address_stop, &laddr6_stop, sizeof(ip6_address_t));
8773 clib_memcpy (mp->remote_address_start, &raddr4_start, sizeof(ip4_address_t));
8774 clib_memcpy (mp->remote_address_stop, &raddr4_stop, sizeof(ip4_address_t));
8775 clib_memcpy (mp->local_address_start, &laddr4_start, sizeof(ip4_address_t));
8776 clib_memcpy (mp->local_address_stop, &laddr4_stop, sizeof(ip4_address_t));
8778 mp->protocol = (u8) protocol;
8779 mp->local_port_start = ntohs((u16) lport_start);
8780 mp->local_port_stop = ntohs((u16) lport_stop);
8781 mp->remote_port_start = ntohs((u16) rport_start);
8782 mp->remote_port_stop = ntohs((u16) rport_stop);
8783 mp->policy = (u8) policy;
8784 mp->sa_id = ntohl(sa_id);
8785 mp->is_add = is_add;
8786 mp->is_ip_any = is_ip_any;
8791 clib_warning ("unsupported (no dpdk)");
8797 api_ipsec_sad_add_del_entry (vat_main_t * vam)
8800 unformat_input_t * i = vam->input;
8801 vl_api_ipsec_sad_add_del_entry_t *mp;
8807 u8 protocol = IPSEC_PROTOCOL_AH;
8808 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
8809 u32 crypto_alg = 0, integ_alg = 0;
8810 ip4_address_t tun_src4;
8811 ip4_address_t tun_dst4;
8812 ip6_address_t tun_src6;
8813 ip6_address_t tun_dst6;
8815 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8816 if (unformat (i, "del"))
8818 else if (unformat (i, "sad_id %d", &sad_id))
8820 else if (unformat (i, "spi %d", &spi))
8822 else if (unformat (i, "esp"))
8823 protocol = IPSEC_PROTOCOL_ESP;
8824 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4)) {
8828 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4)) {
8832 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6)) {
8836 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6)) {
8840 else if (unformat (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg)) {
8841 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
8842 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256) {
8843 clib_warning ("unsupported crypto-alg: '%U'",
8844 format_ipsec_crypto_alg, crypto_alg);
8848 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
8850 else if (unformat (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg)) {
8851 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
8852 integ_alg > IPSEC_INTEG_ALG_SHA_512_256) {
8853 clib_warning ("unsupported integ-alg: '%U'",
8854 format_ipsec_integ_alg, integ_alg);
8858 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
8861 clib_warning ("parse error '%U'", format_unformat_error, i);
8867 M(IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
8869 mp->sad_id = ntohl(sad_id);
8870 mp->is_add = is_add;
8871 mp->protocol = protocol;
8872 mp->spi = ntohl(spi);
8873 mp->is_tunnel = is_tunnel;
8874 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
8875 mp->crypto_algorithm = crypto_alg;
8876 mp->integrity_algorithm = integ_alg;
8877 mp->crypto_key_length = vec_len(ck);
8878 mp->integrity_key_length = vec_len(ik);
8880 if (mp->crypto_key_length > sizeof(mp->crypto_key))
8881 mp->crypto_key_length = sizeof(mp->crypto_key);
8883 if (mp->integrity_key_length > sizeof(mp->integrity_key))
8884 mp->integrity_key_length = sizeof(mp->integrity_key);
8886 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
8887 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
8890 if (is_tunnel_ipv6) {
8891 clib_memcpy (mp->tunnel_src_address, &tun_src6, sizeof(ip6_address_t));
8892 clib_memcpy (mp->tunnel_dst_address, &tun_dst6, sizeof(ip6_address_t));
8894 clib_memcpy (mp->tunnel_src_address, &tun_src4, sizeof(ip4_address_t));
8895 clib_memcpy (mp->tunnel_dst_address, &tun_dst4, sizeof(ip4_address_t));
8903 clib_warning ("unsupported (no dpdk)");
8909 api_ipsec_sa_set_key (vat_main_t * vam)
8912 unformat_input_t * i = vam->input;
8913 vl_api_ipsec_sa_set_key_t *mp;
8918 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8919 if (unformat (i, "sa_id %d", &sa_id))
8921 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
8923 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
8926 clib_warning ("parse error '%U'", format_unformat_error, i);
8931 M(IPSEC_SA_SET_KEY, ipsec_set_sa_key);
8933 mp->sa_id = ntohl(sa_id);
8934 mp->crypto_key_length = vec_len(ck);
8935 mp->integrity_key_length = vec_len(ik);
8937 if (mp->crypto_key_length > sizeof(mp->crypto_key))
8938 mp->crypto_key_length = sizeof(mp->crypto_key);
8940 if (mp->integrity_key_length > sizeof(mp->integrity_key))
8941 mp->integrity_key_length = sizeof(mp->integrity_key);
8943 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
8944 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
8950 clib_warning ("unsupported (no dpdk)");
8956 api_ikev2_profile_add_del (vat_main_t * vam)
8959 unformat_input_t * i = vam->input;
8960 vl_api_ikev2_profile_add_del_t * mp;
8965 const char * valid_chars = "a-zA-Z0-9_";
8967 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
8968 if (unformat (i, "del"))
8970 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
8973 errmsg ("parse error '%U'", format_unformat_error, i);
8978 if (!vec_len (name)) {
8979 errmsg ("profile name must be specified");
8983 if (vec_len (name) > 64) {
8984 errmsg ("profile name too long");
8988 M(IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
8990 clib_memcpy(mp->name, name, vec_len (name));
8991 mp->is_add = is_add;
8998 clib_warning ("unsupported (no dpdk)");
9004 api_ikev2_profile_set_auth (vat_main_t * vam)
9007 unformat_input_t * i = vam->input;
9008 vl_api_ikev2_profile_set_auth_t * mp;
9012 u32 auth_method = 0;
9015 const char * valid_chars = "a-zA-Z0-9_";
9017 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9018 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9020 else if (unformat (i, "auth_method %U",
9021 unformat_ikev2_auth_method, &auth_method))
9023 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
9025 else if (unformat (i, "auth_data %v", &data))
9028 errmsg ("parse error '%U'", format_unformat_error, i);
9033 if (!vec_len (name)) {
9034 errmsg ("profile name must be specified");
9038 if (vec_len (name) > 64) {
9039 errmsg ("profile name too long");
9043 if (!vec_len(data)) {
9044 errmsg ("auth_data must be specified");
9049 errmsg ("auth_method must be specified");
9053 M(IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
9055 mp->is_hex = is_hex;
9056 mp->auth_method = (u8) auth_method;
9057 mp->data_len = vec_len (data);
9058 clib_memcpy (mp->name, name, vec_len (name));
9059 clib_memcpy (mp->data, data, vec_len (data));
9067 clib_warning ("unsupported (no dpdk)");
9073 api_ikev2_profile_set_id (vat_main_t * vam)
9076 unformat_input_t * i = vam->input;
9077 vl_api_ikev2_profile_set_id_t * mp;
9085 const char * valid_chars = "a-zA-Z0-9_";
9087 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9088 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9090 else if (unformat (i, "id_type %U",
9091 unformat_ikev2_id_type, &id_type))
9093 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
9095 data = vec_new(u8, 4);
9096 clib_memcpy(data, ip4.as_u8, 4);
9098 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
9100 else if (unformat (i, "id_data %v", &data))
9102 else if (unformat (i, "local"))
9104 else if (unformat (i, "remote"))
9107 errmsg ("parse error '%U'", format_unformat_error, i);
9112 if (!vec_len (name)) {
9113 errmsg ("profile name must be specified");
9117 if (vec_len (name) > 64) {
9118 errmsg ("profile name too long");
9122 if (!vec_len(data)) {
9123 errmsg ("id_data must be specified");
9128 errmsg ("id_type must be specified");
9132 M(IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
9134 mp->is_local = is_local;
9135 mp->id_type = (u8) id_type;
9136 mp->data_len = vec_len (data);
9137 clib_memcpy (mp->name, name, vec_len (name));
9138 clib_memcpy (mp->data, data, vec_len (data));
9146 clib_warning ("unsupported (no dpdk)");
9152 api_ikev2_profile_set_ts (vat_main_t * vam)
9155 unformat_input_t * i = vam->input;
9156 vl_api_ikev2_profile_set_ts_t * mp;
9160 u32 proto = 0, start_port = 0, end_port = (u32) ~0;
9161 ip4_address_t start_addr, end_addr;
9163 const char * valid_chars = "a-zA-Z0-9_";
9165 start_addr.as_u32 = 0;
9166 end_addr.as_u32 = (u32) ~0;
9168 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9169 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
9171 else if (unformat (i, "protocol %d", &proto))
9173 else if (unformat (i, "start_port %d", &start_port))
9175 else if (unformat (i, "end_port %d", &end_port))
9177 else if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
9179 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
9181 else if (unformat (i, "local"))
9183 else if (unformat (i, "remote"))
9186 errmsg ("parse error '%U'", format_unformat_error, i);
9191 if (!vec_len (name)) {
9192 errmsg ("profile name must be specified");
9196 if (vec_len (name) > 64) {
9197 errmsg ("profile name too long");
9201 M(IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
9203 mp->is_local = is_local;
9204 mp->proto = (u8) proto;
9205 mp->start_port = (u16) start_port;
9206 mp->end_port = (u16) end_port;
9207 mp->start_addr = start_addr.as_u32;
9208 mp->end_addr = end_addr.as_u32;
9209 clib_memcpy (mp->name, name, vec_len (name));
9216 clib_warning ("unsupported (no dpdk)");
9222 api_ikev2_set_local_key (vat_main_t * vam)
9225 unformat_input_t * i = vam->input;
9226 vl_api_ikev2_set_local_key_t * mp;
9230 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9231 if (unformat (i, "file %v", &file))
9234 errmsg ("parse error '%U'", format_unformat_error, i);
9239 if (!vec_len (file)) {
9240 errmsg ("RSA key file must be specified");
9244 if (vec_len (file) > 256) {
9245 errmsg ("file name too long");
9249 M(IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
9251 clib_memcpy (mp->key_file, file, vec_len (file));
9258 clib_warning ("unsupported (no dpdk)");
9266 static int api_map_add_domain (vat_main_t * vam)
9268 unformat_input_t *i = vam->input;
9269 vl_api_map_add_domain_t *mp;
9272 ip4_address_t ip4_prefix;
9273 ip6_address_t ip6_prefix;
9274 ip6_address_t ip6_src;
9276 u32 ip6_prefix_len, ip4_prefix_len, ea_bits_len, psid_offset,
9278 u8 is_translation = 0;
9280 u8 ip6_src_len = 128;
9282 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9283 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
9284 &ip4_prefix, &ip4_prefix_len))
9286 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
9287 &ip6_prefix, &ip6_prefix_len))
9289 else if (unformat (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src, &ip6_src_len))
9291 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
9293 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
9295 else if (unformat (i, "psid-offset %d", &psid_offset))
9297 else if (unformat (i, "psid-len %d", &psid_length))
9299 else if (unformat (i, "mtu %d", &mtu))
9301 else if (unformat (i, "map-t"))
9304 clib_warning ("parse error '%U'", format_unformat_error, i);
9309 if (num_m_args != 6) {
9310 errmsg("mandatory argument(s) missing\n");
9314 /* Construct the API message */
9315 M(MAP_ADD_DOMAIN, map_add_domain);
9317 clib_memcpy(mp->ip4_prefix, &ip4_prefix, sizeof(ip4_prefix));
9318 mp->ip4_prefix_len = ip4_prefix_len;
9320 clib_memcpy(mp->ip6_prefix, &ip6_prefix, sizeof(ip6_prefix));
9321 mp->ip6_prefix_len = ip6_prefix_len;
9323 clib_memcpy(mp->ip6_src, &ip6_src, sizeof(ip6_src));
9324 mp->ip6_src_prefix_len = ip6_src_len;
9326 mp->ea_bits_len = ea_bits_len;
9327 mp->psid_offset = psid_offset;
9328 mp->psid_length = psid_length;
9329 mp->is_translation = is_translation;
9330 mp->mtu = htons(mtu);
9335 /* Wait for a reply, return good/bad news */
9339 static int api_map_del_domain (vat_main_t * vam)
9341 unformat_input_t *i = vam->input;
9342 vl_api_map_del_domain_t *mp;
9348 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9349 if (unformat (i, "index %d", &index))
9352 clib_warning ("parse error '%U'", format_unformat_error, i);
9357 if (num_m_args != 1) {
9358 errmsg("mandatory argument(s) missing\n");
9362 /* Construct the API message */
9363 M(MAP_DEL_DOMAIN, map_del_domain);
9365 mp->index = ntohl(index);
9370 /* Wait for a reply, return good/bad news */
9374 static int api_map_add_del_rule (vat_main_t * vam)
9376 unformat_input_t *i = vam->input;
9377 vl_api_map_add_del_rule_t *mp;
9380 ip6_address_t ip6_dst;
9381 u32 num_m_args = 0, index, psid;
9383 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9384 if (unformat (i, "index %d", &index))
9386 else if (unformat (i, "psid %d", &psid))
9388 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
9390 else if (unformat (i, "del")) {
9393 clib_warning ("parse error '%U'", format_unformat_error, i);
9398 /* Construct the API message */
9399 M(MAP_ADD_DEL_RULE, map_add_del_rule);
9401 mp->index = ntohl(index);
9402 mp->is_add = is_add;
9403 clib_memcpy(mp->ip6_dst, &ip6_dst, sizeof(ip6_dst));
9404 mp->psid = ntohs(psid);
9409 /* Wait for a reply, return good/bad news */
9413 static int api_map_domain_dump (vat_main_t * vam)
9415 vl_api_map_domain_dump_t *mp;
9418 /* Construct the API message */
9419 M(MAP_DOMAIN_DUMP, map_domain_dump);
9424 /* Use a control ping for synchronization */
9426 vl_api_control_ping_t * mp;
9427 M(CONTROL_PING, control_ping);
9433 static int api_map_rule_dump (vat_main_t * vam)
9435 unformat_input_t *i = vam->input;
9436 vl_api_map_rule_dump_t *mp;
9438 u32 domain_index = ~0;
9440 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9441 if (unformat (i, "index %u", &domain_index))
9447 if (domain_index == ~0) {
9448 clib_warning("parse error: domain index expected");
9452 /* Construct the API message */
9453 M(MAP_RULE_DUMP, map_rule_dump);
9455 mp->domain_index = htonl(domain_index);
9460 /* Use a control ping for synchronization */
9462 vl_api_control_ping_t * mp;
9463 M(CONTROL_PING, control_ping);
9469 static void vl_api_map_add_domain_reply_t_handler
9470 (vl_api_map_add_domain_reply_t * mp)
9472 vat_main_t * vam = &vat_main;
9473 i32 retval = ntohl(mp->retval);
9475 if (vam->async_mode) {
9476 vam->async_errors += (retval < 0);
9478 vam->retval = retval;
9479 vam->result_ready = 1;
9483 static void vl_api_map_add_domain_reply_t_handler_json
9484 (vl_api_map_add_domain_reply_t * mp)
9486 vat_main_t * vam = &vat_main;
9487 vat_json_node_t node;
9489 vat_json_init_object(&node);
9490 vat_json_object_add_int(&node, "retval", ntohl(mp->retval));
9491 vat_json_object_add_uint(&node, "index", ntohl(mp->index));
9493 vat_json_print(vam->ofp, &node);
9494 vat_json_free(&node);
9496 vam->retval = ntohl(mp->retval);
9497 vam->result_ready = 1;
9501 api_get_first_msg_id (vat_main_t * vam)
9503 vl_api_get_first_msg_id_t * mp;
9505 unformat_input_t * i = vam->input;
9509 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
9510 if (unformat (i, "client %s", &name))
9516 if (name_set == 0) {
9517 errmsg ("missing client name\n");
9522 if (vec_len (name) > 63) {
9523 errmsg ("client name too long\n");
9527 M(GET_FIRST_MSG_ID, get_first_msg_id);
9528 clib_memcpy (mp->name, name, vec_len(name));
9534 static int api_cop_interface_enable_disable (vat_main_t * vam)
9536 unformat_input_t * line_input = vam->input;
9537 vl_api_cop_interface_enable_disable_t * mp;
9539 u32 sw_if_index = ~0;
9540 u8 enable_disable = 1;
9542 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
9543 if (unformat (line_input, "disable"))
9545 if (unformat (line_input, "enable"))
9547 else if (unformat (line_input, "%U", unformat_sw_if_index,
9550 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
9556 if (sw_if_index == ~0) {
9557 errmsg ("missing interface name or sw_if_index\n");
9561 /* Construct the API message */
9562 M(COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
9563 mp->sw_if_index = ntohl(sw_if_index);
9564 mp->enable_disable = enable_disable;
9568 /* Wait for the reply */
9572 static int api_cop_whitelist_enable_disable (vat_main_t * vam)
9574 unformat_input_t * line_input = vam->input;
9575 vl_api_cop_whitelist_enable_disable_t * mp;
9577 u32 sw_if_index = ~0;
9578 u8 ip4=0, ip6=0, default_cop=0;
9581 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
9582 if (unformat (line_input, "ip4"))
9584 else if (unformat (line_input, "ip6"))
9586 else if (unformat (line_input, "default"))
9588 else if (unformat (line_input, "%U", unformat_sw_if_index,
9591 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
9593 else if (unformat (line_input, "fib-id %d", &fib_id))
9599 if (sw_if_index == ~0) {
9600 errmsg ("missing interface name or sw_if_index\n");
9604 /* Construct the API message */
9605 M(COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
9606 mp->sw_if_index = ntohl(sw_if_index);
9607 mp->fib_id = ntohl(fib_id);
9610 mp->default_cop = default_cop;
9614 /* Wait for the reply */
9618 static int api_get_node_graph (vat_main_t * vam)
9620 vl_api_get_node_graph_t * mp;
9623 M(GET_NODE_GRAPH, get_node_graph);
9627 /* Wait for the reply */
9632 api_lisp_add_del_locator_set(vat_main_t * vam)
9634 unformat_input_t * input = vam->input;
9635 vl_api_lisp_add_del_locator_set_t *mp;
9638 u8 *locator_set_name = NULL;
9639 u8 locator_set_name_set = 0;
9641 /* Parse args required to build the message */
9642 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
9643 if (unformat(input, "del")) {
9645 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
9646 locator_set_name_set = 1;
9651 if (locator_set_name_set == 0) {
9652 errmsg ("missing locator-set name");
9656 if (vec_len(locator_set_name) > 64) {
9657 errmsg ("locator-set name too long\n");
9658 vec_free(locator_set_name);
9661 vec_add1(locator_set_name, 0);
9663 /* Construct the API message */
9664 M(LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set);
9666 mp->is_add = is_add;
9667 clib_memcpy(mp->locator_set_name, locator_set_name,
9668 vec_len(locator_set_name));
9669 vec_free(locator_set_name);
9674 /* Wait for a reply... */
9682 api_lisp_add_del_locator(vat_main_t * vam)
9684 unformat_input_t * input = vam->input;
9685 vl_api_lisp_add_del_locator_t *mp;
9687 u32 tmp_if_index = ~0;
9688 u32 sw_if_index = ~0;
9689 u8 sw_if_index_set = 0;
9690 u8 sw_if_index_if_name_set = 0;
9692 u8 priority_set = 0;
9696 u8 *locator_set_name = NULL;
9697 u8 locator_set_name_set = 0;
9699 /* Parse args required to build the message */
9700 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
9701 if (unformat(input, "del")) {
9703 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
9704 locator_set_name_set = 1;
9705 } else if (unformat(input, "iface %U", unformat_sw_if_index, vam,
9707 sw_if_index_if_name_set = 1;
9708 sw_if_index = tmp_if_index;
9709 } else if (unformat(input,"sw_if_index %d", &tmp_if_index)) {
9710 sw_if_index_set = 1;
9711 sw_if_index = tmp_if_index;
9712 } else if (unformat(input, "p %d", &priority)) {
9714 } else if (unformat(input, "w %d", &weight)) {
9720 if (locator_set_name_set == 0) {
9721 errmsg ("missing locator-set name");
9725 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0) {
9726 errmsg ("missing sw_if_index");
9727 vec_free(locator_set_name);
9731 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0) {
9732 errmsg ("cannot use both params interface name and sw_if_index");
9733 vec_free(locator_set_name);
9737 if (priority_set == 0) {
9738 errmsg ("missing locator-set priority\n");
9739 vec_free(locator_set_name);
9743 if (weight_set == 0) {
9744 errmsg ("missing locator-set weight\n");
9745 vec_free(locator_set_name);
9749 if (vec_len(locator_set_name) > 64) {
9750 errmsg ("locator-set name too long\n");
9751 vec_free(locator_set_name);
9754 vec_add1(locator_set_name, 0);
9756 /* Construct the API message */
9757 M(LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
9759 mp->is_add = is_add;
9760 mp->sw_if_index = ntohl(sw_if_index);
9761 mp->priority = priority;
9762 mp->weight = weight;
9763 clib_memcpy(mp->locator_set_name, locator_set_name,
9764 vec_len(locator_set_name));
9765 vec_free(locator_set_name);
9770 /* Wait for a reply... */
9778 api_lisp_add_del_local_eid(vat_main_t * vam)
9780 unformat_input_t * input = vam->input;
9781 vl_api_lisp_add_del_local_eid_t *mp;
9786 ip4_address_t eidv4;
9787 ip6_address_t eidv6;
9788 u8 tmp_eid_lenght = ~0;
9790 u8 *locator_set_name = NULL;
9791 u8 locator_set_name_set = 0;
9793 /* Parse args required to build the message */
9794 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
9795 if (unformat(input, "del")) {
9797 } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
9798 &eidv4, &tmp_eid_lenght)) {
9799 eid_lenght = tmp_eid_lenght;
9801 } else if (unformat(input, "eid %U/%d", unformat_ip6_address,
9802 &eidv6, &tmp_eid_lenght)) {
9803 eid_lenght = tmp_eid_lenght;
9805 } else if (unformat(input, "locator-set %s", &locator_set_name)) {
9806 locator_set_name_set = 1;
9811 if (locator_set_name_set == 0) {
9812 errmsg ("missing locator-set name\n");
9816 if (vec_len(locator_set_name) > 64) {
9817 errmsg ("locator-set name too long\n");
9818 vec_free(locator_set_name);
9821 vec_add1(locator_set_name, 0);
9823 if (eidv4_set && eidv6_set) {
9824 errmsg ("both eid v4 and v6 addresses set\n");
9825 vec_free(locator_set_name);
9829 if (!eidv4_set && !eidv6_set) {
9830 errmsg ("eid addresses not set\n");
9831 vec_free(locator_set_name);
9835 if (eidv4_set && eid_lenght > 32) {
9836 errmsg ("eid prefix to big\n");
9837 vec_free(locator_set_name);
9841 if (eidv6_set && eid_lenght > 128) {
9842 errmsg ("eid prefix to big\n");
9843 vec_free(locator_set_name);
9847 /* Construct the API message */
9848 M(LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
9850 mp->is_add = is_add;
9853 clib_memcpy(mp->ip_address, &eidv6, sizeof(eidv6));
9856 clib_memcpy(mp->ip_address, &eidv4, sizeof(eidv4));
9858 mp->prefix_len = eid_lenght;
9859 clib_memcpy(mp->locator_set_name, locator_set_name,
9860 vec_len(locator_set_name));
9861 vec_free(locator_set_name);
9866 /* Wait for a reply... */
9874 api_lisp_gpe_add_del_fwd_entry(vat_main_t * vam)
9876 unformat_input_t * input = vam->input;
9877 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
9880 u8 eidv4_set = 0, slocv4_set = 0, dlocv4_set = 0;
9881 u8 eidv6_set = 0, slocv6_set = 0, dlocv6_set = 0;
9882 ip4_address_t eidv4, slocv4, dlocv4;
9883 ip6_address_t eidv6, slocv6, dlocv6;
9884 u8 tmp_eid_lenght = ~0;
9887 /* Parse args required to build the message */
9888 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
9889 if (unformat(input, "del")) {
9891 } else if (unformat(input, "eid %U/%d", unformat_ip4_address,
9892 &eidv4, &tmp_eid_lenght)) {
9893 eid_lenght = tmp_eid_lenght;
9895 } else if (unformat(input, "eid %U/%d", unformat_ip6_address,
9896 &eidv6, &tmp_eid_lenght)) {
9897 eid_lenght = tmp_eid_lenght;
9899 } else if (unformat(input, "sloc %U", unformat_ip4_address, &slocv4)) {
9901 } else if (unformat(input, "sloc %U", unformat_ip6_address, &slocv6)) {
9903 } else if (unformat(input, "dloc %U", unformat_ip4_address, &dlocv4)) {
9905 } else if (unformat(input, "dloc %U", unformat_ip6_address, &dlocv6)) {
9911 if (eidv4_set && eidv6_set) {
9912 errmsg ("both eid v4 and v6 addresses set\n");
9916 if (!eidv4_set && !eidv6_set) {
9917 errmsg ("eid addresses not set\n");
9921 if (slocv4_set && slocv6_set) {
9922 errmsg ("both source v4 and v6 addresses set\n");
9926 if (!slocv4_set && !slocv6_set) {
9927 errmsg ("source addresses not set\n");
9931 if (dlocv4_set && dlocv6_set) {
9932 errmsg ("both destination v4 and v6 addresses set\n");
9936 if (dlocv4_set && dlocv6_set) {
9937 errmsg ("destination addresses not set\n");
9941 if (!(slocv4_set == dlocv4_set && slocv6_set == dlocv6_set)) {
9942 errmsg ("mixing type of source and destination address\n");
9946 /* Construct the API message */
9947 M(LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
9949 mp->is_add = is_add;
9951 mp->eid_is_ipv6 = 1;
9952 clib_memcpy(mp->eid_ip_address, &eidv6, sizeof(eidv6));
9954 mp->eid_is_ipv6 = 0;
9955 clib_memcpy(mp->eid_ip_address, &eidv4, sizeof(eidv4));
9957 mp->eid_prefix_len = eid_lenght;
9959 mp->address_is_ipv6 = 1;
9960 clib_memcpy(mp->source_ip_address, &slocv6, sizeof(slocv6));
9961 clib_memcpy(mp->destination_ip_address, &dlocv6, sizeof(dlocv6));
9963 mp->address_is_ipv6 = 0;
9964 clib_memcpy(mp->source_ip_address, &slocv4, sizeof(slocv4));
9965 clib_memcpy(mp->destination_ip_address, &dlocv4, sizeof(dlocv4));
9971 /* Wait for a reply... */
9979 api_lisp_add_del_map_resolver(vat_main_t * vam)
9981 unformat_input_t * input = vam->input;
9982 vl_api_lisp_add_del_map_resolver_t *mp;
9990 /* Parse args required to build the message */
9991 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
9992 if (unformat(input, "del")) {
9994 } else if (unformat(input, "%U", unformat_ip4_address, &ipv4)) {
9996 } else if (unformat(input, "%U", unformat_ip6_address, &ipv6)) {
10002 if (ipv4_set && ipv6_set) {
10003 errmsg ("both eid v4 and v6 addresses set\n");
10007 if (!ipv4_set && !ipv6_set) {
10008 errmsg ("eid addresses not set\n");
10012 /* Construct the API message */
10013 M(LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
10015 mp->is_add = is_add;
10018 clib_memcpy(mp->ip_address, &ipv6, sizeof(ipv6));
10021 clib_memcpy(mp->ip_address, &ipv4, sizeof(ipv4));
10027 /* Wait for a reply... */
10035 api_lisp_gpe_enable_disable (vat_main_t * vam)
10037 unformat_input_t * input = vam->input;
10038 vl_api_lisp_gpe_enable_disable_t *mp;
10043 /* Parse args required to build the message */
10044 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10045 if (unformat(input, "enable")) {
10048 } else if (unformat(input, "disable")) {
10056 errmsg("Value not set\n");
10060 /* Construct the API message */
10061 M(LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
10068 /* Wait for a reply... */
10076 api_lisp_enable_disable (vat_main_t * vam)
10078 unformat_input_t * input = vam->input;
10079 vl_api_lisp_enable_disable_t *mp;
10084 /* Parse args required to build the message */
10085 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10087 if (unformat (input, "enable"))
10092 else if (unformat (input, "disable"))
10102 errmsg ("Value not set\n");
10106 /* Construct the API message */
10107 M(LISP_ENABLE_DISABLE, lisp_enable_disable);
10114 /* Wait for a reply... */
10121 /** Used for transferring locators via VPP API */
10122 typedef CLIB_PACKED(struct
10124 u8 is_ip4; /**< is locator an IPv4 address? */
10125 u8 addr[16]; /**< IPv4/IPv6 address */
10129 * Enable/disable LISP proxy ITR.
10131 * @param vam vpp API test context
10132 * @return return code
10135 api_lisp_pitr_set_locator_set (vat_main_t * vam)
10138 u8 ls_name_set = 0;
10139 unformat_input_t * input = vam->input;
10140 vl_api_lisp_pitr_set_locator_set_t * mp;
10144 /* Parse args required to build the message */
10145 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10147 if (unformat (input, "del"))
10149 else if (unformat (input, "locator-set %s", &ls_name))
10153 errmsg ("parse error '%U'", format_unformat_error, input);
10160 errmsg ("locator-set name not set!");
10164 M(LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
10166 mp->is_add = is_add;
10167 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
10168 vec_free (ls_name);
10173 /* wait for reply */
10181 * Add/del remote mapping from LISP control plane and updates
10182 * forwarding entries in data-plane accordingly.
10184 * @param vam vpp API test context
10185 * @return return code
10188 api_lisp_add_del_remote_mapping (vat_main_t * vam)
10190 unformat_input_t * input = vam->input;
10191 vl_api_lisp_add_del_remote_mapping_t *mp;
10194 u8 seid_set = 0, deid_set = 0;
10195 ip4_address_t seid4, deid4, rloc4;
10196 ip6_address_t seid6, deid6, rloc6;
10197 u32 seid_len = 0, deid_len = 0, len;
10198 u8 deid_is_ip4 = 0, seid_is_ip4 = 0;
10199 u8 is_add = 1, del_all = 0;
10201 rloc_t * rlocs = 0, rloc;
10203 /* Parse args required to build the message */
10204 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10205 if (unformat(input, "del-all")) {
10207 } else if (unformat(input, "del")) {
10209 } else if (unformat(input, "add")) {
10211 } else if (unformat(input, "deid %U/%d", unformat_ip4_address,
10216 } else if (unformat(input, "deid %U/%d", unformat_ip6_address,
10221 } else if (unformat(input, "seid %U/%d", unformat_ip4_address,
10226 } else if (unformat(input, "seid %U/%d", unformat_ip6_address,
10231 } else if (unformat(input, "vni %d", &vni)) {
10233 } else if (unformat(input, "rloc %U", unformat_ip4_address, &rloc4)) {
10235 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
10236 vec_add1 (rlocs, rloc);
10237 } else if (unformat(input, "rloc %U", unformat_ip6_address, &rloc6)) {
10239 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
10240 vec_add1 (rlocs, rloc);
10241 } else if (unformat(input, "action %d", &action)) {
10244 clib_warning ("parse error '%U'", format_unformat_error, input);
10249 if (!seid_set || !deid_set) {
10250 errmsg ("missing params!");
10254 if (seid_is_ip4 != deid_is_ip4) {
10255 errmsg ("source and destination EIDs are not in " "same IP family!");
10259 if (is_add && (~0 == action)
10260 && 0 == vec_len (rlocs)) {
10261 errmsg ("no action set for negative map-reply!");
10265 M(LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping);
10266 mp->is_add = is_add;
10267 mp->vni = htonl (vni);
10268 mp->seid_len = seid_len;
10269 mp->action = (u8) action;
10270 mp->deid_len = deid_len;
10271 mp->del_all = del_all;
10273 mp->eid_is_ip4 = 1;
10274 clib_memcpy (mp->seid, &seid4, sizeof (seid4));
10276 mp->eid_is_ip4 = 0;
10277 clib_memcpy (mp->seid, &seid6, sizeof (seid6));
10281 mp->eid_is_ip4 = 1;
10282 clib_memcpy (mp->deid, &deid4, sizeof (deid4));
10284 mp->eid_is_ip4 = 0;
10285 clib_memcpy (mp->deid, &deid6, sizeof (deid6));
10288 mp->rloc_num = vec_len (rlocs);
10289 clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs)));
10295 /* Wait for a reply... */
10303 api_lisp_gpe_add_del_iface(vat_main_t * vam)
10305 unformat_input_t * input = vam->input;
10306 vl_api_lisp_gpe_add_del_iface_t *mp;
10312 /* Parse args required to build the message */
10313 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) {
10314 if (unformat(input, "up")) {
10317 } else if (unformat(input, "down")) {
10320 } else if (unformat(input, "table_id %d", &table_id)) {
10322 } else if (unformat(input, "vni %d", &vni)) {
10329 errmsg("Value not set\n");
10333 /* Construct the API message */
10334 M(LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
10336 mp->is_add = is_add;
10337 mp->table_id = table_id;
10343 /* Wait for a reply... */
10351 api_lisp_locator_set_dump(vat_main_t *vam)
10353 vl_api_lisp_locator_set_dump_t *mp;
10356 if (!vam->json_output) {
10357 fformat(vam->ofp, "%=20s%=16s%=16s%=16s\n",
10358 "Locator-set", "Locator", "Priority", "Weight");
10361 M(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
10365 /* Use a control ping for synchronization */
10367 vl_api_control_ping_t * mp;
10368 M(CONTROL_PING, control_ping);
10371 /* Wait for a reply... */
10379 api_lisp_local_eid_table_dump(vat_main_t *vam)
10381 vl_api_lisp_local_eid_table_dump_t *mp;
10384 if (!vam->json_output) {
10385 fformat(vam->ofp, "%=20s%=30s\n",
10386 "Locator-set", "Eid");
10389 M(LISP_LOCAL_EID_TABLE_DUMP, lisp_local_eid_table_dump);
10393 /* Use a control ping for synchronization */
10395 vl_api_control_ping_t * mp;
10396 M(CONTROL_PING, control_ping);
10399 /* Wait for a reply... */
10407 api_lisp_gpe_tunnel_dump(vat_main_t *vam)
10409 vl_api_lisp_gpe_tunnel_dump_t *mp;
10412 if (!vam->json_output) {
10413 fformat(vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
10414 "%=16s%=16s%=16s%=16s%=16s\n",
10415 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
10416 "Decap next", "Lisp version", "Flags", "Next protocol",
10417 "ver_res", "res", "iid");
10420 M(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
10424 /* Use a control ping for synchronization */
10426 vl_api_control_ping_t * mp;
10427 M(CONTROL_PING, control_ping);
10430 /* Wait for a reply... */
10438 api_lisp_map_resolver_dump(vat_main_t *vam)
10440 vl_api_lisp_map_resolver_dump_t *mp;
10443 if (!vam->json_output) {
10444 fformat(vam->ofp, "%=20s\n",
10448 M(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
10452 /* Use a control ping for synchronization */
10454 vl_api_control_ping_t * mp;
10455 M(CONTROL_PING, control_ping);
10458 /* Wait for a reply... */
10466 api_lisp_enable_disable_status_dump(vat_main_t *vam)
10468 vl_api_lisp_enable_disable_status_dump_t *mp;
10471 if (!vam->json_output) {
10472 fformat(vam->ofp, "%=20s\n",
10476 M(LISP_ENABLE_DISABLE_STATUS_DUMP,
10477 lisp_enable_disable_status_dump);
10481 /* Use a control ping for synchronization */
10483 vl_api_control_ping_t * mp;
10484 M(CONTROL_PING, control_ping);
10487 /* Wait for a reply... */
10495 api_af_packet_create (vat_main_t * vam)
10497 unformat_input_t * i = vam->input;
10498 vl_api_af_packet_create_t * mp;
10500 u8 * host_if_name = 0;
10502 u8 random_hw_addr = 1;
10504 memset (hw_addr, 0, sizeof (hw_addr));
10506 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10507 if (unformat (i, "name %s", &host_if_name))
10508 vec_add1 (host_if_name, 0);
10509 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
10510 random_hw_addr = 0;
10515 if (!vec_len (host_if_name)) {
10516 errmsg ("host-interface name must be specified");
10520 if (vec_len (host_if_name) > 64) {
10521 errmsg ("host-interface name too long");
10525 M(AF_PACKET_CREATE, af_packet_create);
10527 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
10528 clib_memcpy (mp->hw_addr, hw_addr, 6);
10529 mp->use_random_hw_addr = random_hw_addr;
10530 vec_free (host_if_name);
10538 api_af_packet_delete (vat_main_t * vam)
10540 unformat_input_t * i = vam->input;
10541 vl_api_af_packet_delete_t * mp;
10543 u8 * host_if_name = 0;
10545 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10546 if (unformat (i, "name %s", &host_if_name))
10547 vec_add1 (host_if_name, 0);
10552 if (!vec_len (host_if_name)) {
10553 errmsg ("host-interface name must be specified");
10557 if (vec_len (host_if_name) > 64) {
10558 errmsg ("host-interface name too long");
10562 M(AF_PACKET_DELETE, af_packet_delete);
10564 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
10565 vec_free (host_if_name);
10573 api_policer_add_del (vat_main_t * vam)
10575 unformat_input_t * i = vam->input;
10576 vl_api_policer_add_del_t * mp;
10588 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10589 if (unformat (i, "del"))
10591 else if (unformat (i, "name %s", &name))
10592 vec_add1 (name, 0);
10593 else if (unformat (i, "cir %u", &cir))
10595 else if (unformat (i, "eir %u", &eir))
10597 else if (unformat (i, "cb %u", &cb))
10599 else if (unformat (i, "eb %u", &eb))
10601 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
10604 else if (unformat (i, "round_type %U", unformat_policer_round_type,
10607 else if (unformat (i, "type %U", unformat_policer_type, &type))
10613 if (!vec_len (name)) {
10614 errmsg ("policer name must be specified");
10618 if (vec_len (name) > 64) {
10619 errmsg ("policer name too long");
10623 M(POLICER_ADD_DEL, policer_add_del);
10625 clib_memcpy (mp->name, name, vec_len (name));
10627 mp->is_add = is_add;
10632 mp->rate_type = rate_type;
10633 mp->round_type = round_type;
10642 api_policer_dump(vat_main_t *vam)
10644 unformat_input_t * i = vam->input;
10645 vl_api_policer_dump_t *mp;
10647 u8 *match_name = 0;
10648 u8 match_name_valid = 0;
10650 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10651 if (unformat (i, "name %s", &match_name)) {
10652 vec_add1 (match_name, 0);
10653 match_name_valid = 1;
10658 M(POLICER_DUMP, policer_dump);
10659 mp->match_name_valid = match_name_valid;
10660 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
10661 vec_free (match_name);
10665 /* Use a control ping for synchronization */
10667 vl_api_control_ping_t * mp;
10668 M(CONTROL_PING, control_ping);
10671 /* Wait for a reply... */
10679 api_netmap_create (vat_main_t * vam)
10681 unformat_input_t * i = vam->input;
10682 vl_api_netmap_create_t * mp;
10686 u8 random_hw_addr = 1;
10690 memset (hw_addr, 0, sizeof (hw_addr));
10692 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10693 if (unformat (i, "name %s", &if_name))
10694 vec_add1 (if_name, 0);
10695 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
10696 random_hw_addr = 0;
10697 else if (unformat (i, "pipe"))
10699 else if (unformat (i, "master"))
10701 else if (unformat (i, "slave"))
10707 if (!vec_len (if_name)) {
10708 errmsg ("interface name must be specified");
10712 if (vec_len (if_name) > 64) {
10713 errmsg ("interface name too long");
10717 M(NETMAP_CREATE, netmap_create);
10719 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
10720 clib_memcpy (mp->hw_addr, hw_addr, 6);
10721 mp->use_random_hw_addr = random_hw_addr;
10722 mp->is_pipe = is_pipe;
10723 mp->is_master = is_master;
10724 vec_free (if_name);
10732 api_netmap_delete (vat_main_t * vam)
10734 unformat_input_t * i = vam->input;
10735 vl_api_netmap_delete_t * mp;
10739 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
10740 if (unformat (i, "name %s", &if_name))
10741 vec_add1 (if_name, 0);
10746 if (!vec_len (if_name)) {
10747 errmsg ("interface name must be specified");
10751 if (vec_len (if_name) > 64) {
10752 errmsg ("interface name too long");
10756 M(NETMAP_DELETE, netmap_delete);
10758 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
10759 vec_free (if_name);
10766 static int q_or_quit (vat_main_t * vam)
10768 longjmp (vam->jump_buf, 1);
10769 return 0; /* not so much */
10771 static int q (vat_main_t * vam) {return q_or_quit (vam);}
10772 static int quit (vat_main_t * vam) {return q_or_quit (vam);}
10774 static int comment (vat_main_t * vam)
10779 static int cmd_cmp (void * a1, void * a2)
10784 return strcmp ((char *)(c1[0]), (char *)(c2[0]));
10787 static int help (vat_main_t * vam)
10792 unformat_input_t * i = vam->input;
10795 if (unformat (i, "%s", &name)) {
10800 hs = hash_get_mem (vam->help_by_name, name);
10802 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
10804 fformat (vam->ofp, "No such msg / command '%s'\n", name);
10809 fformat(vam->ofp, "Help is available for the following:\n");
10811 hash_foreach_pair (p, vam->function_by_name,
10813 vec_add1 (cmds, (u8 *)(p->key));
10816 vec_sort_with_function (cmds, cmd_cmp);
10818 for (j = 0; j < vec_len(cmds); j++)
10819 fformat (vam->ofp, "%s\n", cmds[j]);
10825 static int set (vat_main_t * vam)
10827 u8 * name = 0, * value = 0;
10828 unformat_input_t * i = vam->input;
10830 if (unformat (i, "%s", &name)) {
10831 /* The input buffer is a vector, not a string. */
10832 value = vec_dup (i->buffer);
10833 vec_delete (value, i->index, 0);
10834 /* Almost certainly has a trailing newline */
10835 if (value[vec_len(value)-1] == '\n')
10836 value[vec_len(value)-1] = 0;
10837 /* Make sure it's a proper string, one way or the other */
10838 vec_add1 (value, 0);
10839 (void) clib_macro_set_value (&vam->macro_main,
10840 (char *)name, (char *)value);
10843 errmsg ("usage: set <name> <value>\n");
10850 static int unset (vat_main_t * vam)
10854 if (unformat (vam->input, "%s", &name))
10855 if (clib_macro_unset (&vam->macro_main, (char *)name) == 1)
10856 errmsg ("unset: %s wasn't set\n", name);
10867 static int macro_sort_cmp (void * a1, void * a2)
10869 macro_sort_t * s1 = a1;
10870 macro_sort_t * s2 = a2;
10872 return strcmp ((char *)(s1->name), (char *)(s2->name));
10875 static int dump_macro_table (vat_main_t * vam)
10877 macro_sort_t * sort_me = 0, * sm;
10881 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
10883 vec_add2 (sort_me, sm, 1);
10884 sm->name = (u8 *)(p->key);
10885 sm->value = (u8 *) (p->value[0]);
10888 vec_sort_with_function (sort_me, macro_sort_cmp);
10890 if (vec_len(sort_me))
10891 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
10893 fformat (vam->ofp, "The macro table is empty...\n");
10895 for (i = 0; i < vec_len (sort_me); i++)
10896 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name,
10901 static int dump_node_table (vat_main_t * vam)
10904 vlib_node_t * node, * next_node;
10906 if (vec_len (vam->graph_nodes) == 0) {
10907 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
10911 for (i = 0; i < vec_len (vam->graph_nodes); i++) {
10912 node = vam->graph_nodes[i];
10913 fformat (vam->ofp, "[%d] %s\n", i, node->name);
10914 for (j = 0; j < vec_len (node->next_nodes); j++) {
10915 if (node->next_nodes[j] != ~0) {
10916 next_node = vam->graph_nodes[node->next_nodes[j]];
10917 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
10924 static int search_node_table (vat_main_t * vam)
10926 unformat_input_t * line_input = vam->input;
10929 vlib_node_t * node, * next_node;
10932 if (vam->graph_node_index_by_name == 0) {
10933 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
10937 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) {
10938 if (unformat (line_input, "%s", &node_to_find)) {
10939 vec_add1 (node_to_find, 0);
10940 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
10942 fformat (vam->ofp, "%s not found...\n", node_to_find);
10945 node = vam->graph_nodes[p[0]];
10946 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
10947 for (j = 0; j < vec_len (node->next_nodes); j++) {
10948 if (node->next_nodes[j] != ~0) {
10949 next_node = vam->graph_nodes[node->next_nodes[j]];
10950 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
10956 clib_warning ("parse error '%U'", format_unformat_error,
10962 vec_free(node_to_find);
10970 static int script (vat_main_t * vam)
10973 char * save_current_file;
10974 unformat_input_t save_input;
10975 jmp_buf save_jump_buf;
10976 u32 save_line_number;
10978 FILE * new_fp, * save_ifp;
10980 if (unformat (vam->input, "%s", &s)) {
10981 new_fp = fopen ((char *)s, "r");
10983 errmsg ("Couldn't open script file %s\n", s);
10988 errmsg ("Missing script name\n");
10992 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
10993 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
10994 save_ifp = vam->ifp;
10995 save_line_number = vam->input_line_number;
10996 save_current_file = (char *) vam->current_file;
10998 vam->input_line_number = 0;
11000 vam->current_file = s;
11003 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
11004 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
11005 vam->ifp = save_ifp;
11006 vam->input_line_number = save_line_number;
11007 vam->current_file = (u8 *) save_current_file;
11013 static int echo (vat_main_t * vam)
11015 fformat (vam->ofp, "%v", vam->input->buffer);
11019 /* List of API message constructors, CLI names map to api_xxx */
11020 #define foreach_vpe_api_msg \
11021 _(create_loopback,"[mac <mac-addr>]") \
11022 _(sw_interface_dump,"") \
11023 _(sw_interface_set_flags, \
11024 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
11025 _(sw_interface_add_del_address, \
11026 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
11027 _(sw_interface_set_table, \
11028 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
11029 _(sw_interface_set_vpath, \
11030 "<intfc> | sw_if_index <id> enable | disable") \
11031 _(sw_interface_set_l2_xconnect, \
11032 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
11033 "enable | disable") \
11034 _(sw_interface_set_l2_bridge, \
11035 "rx <intfc> | rx_sw_if_index <id> bd_id <bridge-domain-id>\n" \
11036 "[shg <split-horizon-group>] [bvi]\n" \
11037 "enable | disable") \
11038 _(bridge_domain_add_del, \
11039 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
11040 _(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
11042 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi]\n") \
11044 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
11046 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
11048 "tapname <name> mac <mac-addr> | random-mac") \
11050 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
11052 "<vpp-if-name> | sw_if_index <id>") \
11053 _(sw_interface_tap_dump, "") \
11054 _(ip_add_del_route, \
11055 "<addr>/<mask> via <addr> [vrf <n>]\n" \
11056 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
11057 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
11058 "[multipath] [count <n>]") \
11059 _(proxy_arp_add_del, \
11060 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
11061 _(proxy_arp_intfc_enable_disable, \
11062 "<intfc> | sw_if_index <id> enable | disable") \
11063 _(mpls_add_del_encap, \
11064 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
11065 _(mpls_add_del_decap, \
11066 "label <n> [rx_vrf_id <n>] [tx_vrf_id] [s-bit-clear][del]") \
11067 _(mpls_gre_add_del_tunnel, \
11068 "inner_vrf_id <n> outer_vrf_id <n> src <ip4-address> dst <ip4-address>\n" \
11069 "adj <ip4-address>/<mask-width> [del]") \
11070 _(sw_interface_set_unnumbered, \
11071 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
11072 _(ip_neighbor_add_del, \
11073 "<intfc> | sw_if_index <id> dst <ip46-address> mac <mac-addr>") \
11074 _(reset_vrf, "vrf <id> [ipv6]") \
11075 _(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
11076 _(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
11077 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
11078 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
11079 "[outer_vlan_id_any][inner_vlan_id_any]") \
11080 _(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
11081 _(reset_fib, "vrf <n> [ipv6]") \
11082 _(dhcp_proxy_config, \
11083 "svr <v46-address> src <v46-address>\n" \
11084 "insert-cid <n> [del]") \
11085 _(dhcp_proxy_config_2, \
11086 "svr <v46-address> src <v46-address>\n" \
11087 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
11088 _(dhcp_proxy_set_vss, \
11089 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
11090 _(dhcp_client_config, \
11091 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
11092 _(set_ip_flow_hash, \
11093 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
11094 _(sw_interface_ip6_enable_disable, \
11095 "<intfc> | sw_if_index <id> enable | disable") \
11096 _(sw_interface_ip6_set_link_local_address, \
11097 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
11098 _(sw_interface_ip6nd_ra_prefix, \
11099 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
11100 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
11101 "[nolink] [isno]") \
11102 _(sw_interface_ip6nd_ra_config, \
11103 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
11104 "[life <n>] [count <n>] [interval <n>] [surpress]\n" \
11105 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
11106 _(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
11107 _(l2_patch_add_del, \
11108 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
11109 "enable | disable") \
11110 _(mpls_ethernet_add_del_tunnel, \
11111 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
11112 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
11113 _(mpls_ethernet_add_del_tunnel_2, \
11114 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
11115 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
11116 _(sr_tunnel_add_del, \
11117 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
11118 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
11119 "[policy <policy_name>]") \
11120 _(sr_policy_add_del, \
11121 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
11122 _(sr_multicast_map_add_del, \
11123 "address [ip6 multicast address] sr-policy [policy name] [del]") \
11124 _(classify_add_del_table, \
11125 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
11126 "[del] mask <mask-value>\n" \
11127 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
11128 _(classify_add_del_session, \
11129 "[hit-next|l2-hit-next|acl-hit-next] <name|nn> table-index <nn>\n" \
11130 "skip_n <nn> match_n <nn> match [hex] [l2] [l3 [ip4|ip6]]") \
11131 _(classify_set_interface_ip_table, \
11132 "<intfc> | sw_if_index <nn> table <nn>") \
11133 _(classify_set_interface_l2_tables, \
11134 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
11135 " [other-table <nn>]") \
11136 _(get_node_index, "node <node-name") \
11137 _(add_node_next, "node <node-name> next <next-node-name>") \
11138 _(l2tpv3_create_tunnel, \
11139 "client_address <ip6-addr> our_address <ip6-addr>\n" \
11140 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
11141 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
11142 _(l2tpv3_set_tunnel_cookies, \
11143 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
11144 "[new_remote_cookie <nn>]\n") \
11145 _(l2tpv3_interface_enable_disable, \
11146 "<intfc> | sw_if_index <nn> enable | disable") \
11147 _(l2tpv3_set_lookup_key, \
11148 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
11149 _(sw_if_l2tpv3_tunnel_dump, "") \
11150 _(vxlan_add_del_tunnel, \
11151 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
11152 " [decap-next l2|ip4|ip6] [del]") \
11153 _(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
11154 _(gre_add_del_tunnel, \
11155 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [del]\n") \
11156 _(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
11157 _(l2_fib_clear_table, "") \
11158 _(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
11159 _(l2_interface_vlan_tag_rewrite, \
11160 "<intfc> | sw_if_index <nn> \n" \
11161 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
11162 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
11163 _(create_vhost_user_if, \
11164 "socket <filename> [server] [renumber <dev_instance>] " \
11165 "[mac <mac_address>]") \
11166 _(modify_vhost_user_if, \
11167 "<intfc> | sw_if_index <nn> socket <filename>\n" \
11168 "[server] [renumber <dev_instance>]") \
11169 _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
11170 _(sw_interface_vhost_user_dump, "") \
11171 _(show_version, "") \
11172 _(vxlan_gpe_add_del_tunnel, \
11173 "local <addr> remote <addr> vni <nn>\n" \
11174 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
11175 "[next-ethernet] [next-nsh]\n") \
11176 _(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
11177 _(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
11178 _(interface_name_renumber, \
11179 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
11180 _(input_acl_set_interface, \
11181 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
11182 " [l2-table <nn>] [del]") \
11183 _(want_ip4_arp_events, "address <ip4-address> [del]") \
11184 _(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
11185 _(ip_dump, "ipv4 | ipv6") \
11186 _(ipsec_spd_add_del, "spd_id <n> [del]") \
11187 _(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
11189 _(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
11190 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
11191 " integ_alg <alg> integ_key <hex>") \
11192 _(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
11193 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
11194 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
11195 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
11196 _(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
11197 _(ikev2_profile_add_del, "name <profile_name> [del]") \
11198 _(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
11199 "(auth_data 0x<data> | auth_data <data>)") \
11200 _(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
11201 "(id_data 0x<data> | id_data <data>) (local|remote)") \
11202 _(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
11203 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
11204 "(local|remote)") \
11205 _(ikev2_set_local_key, "file <absolute_file_path>") \
11206 _(delete_loopback,"sw_if_index <nn>") \
11207 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
11208 _(map_add_domain, \
11209 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
11210 "ip6-src <ip6addr> " \
11211 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
11212 _(map_del_domain, "index <n>") \
11213 _(map_add_del_rule, \
11214 "index <n> psid <n> dst <ip6addr> [del]") \
11215 _(map_domain_dump, "") \
11216 _(map_rule_dump, "index <map-domain>") \
11217 _(want_interface_events, "enable|disable") \
11218 _(want_stats,"enable|disable") \
11219 _(get_first_msg_id, "client <name>") \
11220 _(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
11221 _(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
11222 "fib-id <nn> [ip4][ip6][default]") \
11223 _(get_node_graph, " ") \
11224 _(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
11225 _(trace_profile_add, "id <nn> trace-type <0x1f|0x3|0x9|0x11|0x19> " \
11226 "trace-elts <nn> trace-tsp <0|1|2|3> node-id <node id in hex> " \
11227 "app-data <app_data in hex> [pow] [ppc <encap|decap>]") \
11228 _(trace_profile_apply, "id <nn> <ip6-address>/<width>" \
11229 " vrf_id <nn> add | pop | none") \
11230 _(trace_profile_del, "") \
11231 _(lisp_add_del_locator_set, "locator-set <locator_name> [del]") \
11232 _(lisp_add_del_locator, "locator-set <locator_name> " \
11233 "iface <intf> | sw_if_index <sw_if_index> " \
11234 "p <priority> w <weight> [del]") \
11235 _(lisp_add_del_local_eid, "<ipv4|ipv6>/<prefix> " \
11236 "locator-set <locator_name> [del]") \
11237 _(lisp_gpe_add_del_fwd_entry, "eid <ip4|6-addr>/<prefix> " \
11238 "sloc <ip4/6-addr> dloc <ip4|6-addr> [del]") \
11239 _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
11240 _(lisp_gpe_enable_disable, "enable|disable") \
11241 _(lisp_enable_disable, "enable|disable") \
11242 _(lisp_gpe_add_del_iface, "up|down") \
11243 _(lisp_add_del_remote_mapping, "add|del vni <vni> table-id <id> " \
11244 "deid <dest-eid> seid" \
11245 " <src-eid> rloc <locator> " \
11246 "[rloc <loc> ... ]") \
11247 _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
11248 _(lisp_locator_set_dump, "") \
11249 _(lisp_local_eid_table_dump, "") \
11250 _(lisp_gpe_tunnel_dump, "") \
11251 _(lisp_map_resolver_dump, "") \
11252 _(lisp_enable_disable_status_dump, "") \
11253 _(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
11254 _(af_packet_delete, "name <host interface name>") \
11255 _(policer_add_del, "name <policer name> <params> [del]") \
11256 _(policer_dump, "[name <policer name>]") \
11257 _(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
11258 "[master|slave]") \
11259 _(netmap_delete, "name <interface name>")
11261 /* List of command functions, CLI names map directly to functions */
11262 #define foreach_cli_function \
11263 _(comment, "usage: comment <ignore-rest-of-line>") \
11264 _(dump_interface_table, "usage: dump_interface_table") \
11265 _(dump_sub_interface_table, "usage: dump_sub_interface_table") \
11266 _(dump_ipv4_table, "usage: dump_ipv4_table") \
11267 _(dump_ipv6_table, "usage: dump_ipv6_table") \
11268 _(dump_stats_table, "usage: dump_stats_table") \
11269 _(dump_macro_table, "usage: dump_macro_table ") \
11270 _(dump_node_table, "usage: dump_node_table") \
11271 _(echo, "usage: echo <message>") \
11272 _(exec, "usage: exec <vpe-debug-CLI-command>") \
11273 _(help, "usage: help") \
11274 _(q, "usage: quit") \
11275 _(quit, "usage: quit") \
11276 _(search_node_table, "usage: search_node_table <name>...") \
11277 _(set, "usage: set <variable-name> <value>") \
11278 _(script, "usage: script <file-name>") \
11279 _(unset, "usage: unset <variable-name>")
11282 static void vl_api_##n##_t_handler_uni \
11283 (vl_api_##n##_t * mp) \
11285 vat_main_t * vam = &vat_main; \
11286 if (vam->json_output) { \
11287 vl_api_##n##_t_handler_json(mp); \
11289 vl_api_##n##_t_handler(mp); \
11292 foreach_vpe_api_reply_msg;
11295 void vat_api_hookup (vat_main_t *vam)
11298 vl_msg_api_set_handlers(VL_API_##N, #n, \
11299 vl_api_##n##_t_handler_uni, \
11301 vl_api_##n##_t_endian, \
11302 vl_api_##n##_t_print, \
11303 sizeof(vl_api_##n##_t), 1);
11304 foreach_vpe_api_reply_msg;
11307 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
11309 vam->sw_if_index_by_interface_name =
11310 hash_create_string (0, sizeof (uword));
11312 vam->function_by_name =
11313 hash_create_string (0, sizeof(uword));
11315 vam->help_by_name =
11316 hash_create_string (0, sizeof(uword));
11318 /* API messages we can send */
11319 #define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
11320 foreach_vpe_api_msg;
11324 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
11325 foreach_vpe_api_msg;
11328 /* CLI functions */
11329 #define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
11330 foreach_cli_function;
11334 #define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
11335 foreach_cli_function;
11339 #undef vl_api_version
11340 #define vl_api_version(n,v) static u32 vpe_api_version = v;
11341 #include <api/vpe.api.h>
11342 #undef vl_api_version
11344 void vl_client_add_api_signatures (vl_api_memclnt_create_t *mp)
11347 * Send the main API signature in slot 0. This bit of code must
11348 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
11350 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);