2 *------------------------------------------------------------------
3 * api.c - message handler registration
5 * Copyright (c) 2010 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 *------------------------------------------------------------------
22 #include <sys/types.h>
25 #include <netinet/in.h>
32 #include <vppinfra/clib.h>
33 #include <vppinfra/vec.h>
34 #include <vppinfra/hash.h>
35 #include <vppinfra/bitmap.h>
36 #include <vppinfra/fifo.h>
37 #include <vppinfra/time.h>
38 #include <vppinfra/heap.h>
39 #include <vppinfra/pool.h>
40 #include <vppinfra/format.h>
41 #include <vppinfra/error.h>
43 #include <vnet/vnet.h>
44 #include <vlib/vlib.h>
45 #include <vlib/unix/unix.h>
46 #include <vlibapi/api.h>
47 #include <vlibmemory/api.h>
49 #include <vpp/api/vpe_msg_enum.h>
51 #include <vnet/ip/ip.h>
52 #include <vnet/interface.h>
55 #define f64_print(a,b)
57 #define vl_typedefs /* define message structures */
58 #include <vpp/api/vpe_all_api_h.h>
61 #define vl_endianfun /* define message structures */
62 #include <vpp/api/vpe_all_api_h.h>
65 /* instantiate all the print functions we know about */
66 #define vl_print(handle, ...)
68 #include <vpp/api/vpe_all_api_h.h>
71 vl_shmem_hdr_t *shmem_hdr;
80 svm_queue_t *vl_input_queue;
84 test_main_t test_main;
87 * Satisfy external references when -lvlib is not available.
91 vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...)
93 clib_warning ("vlib_cli_output called...");
97 format_ethernet_address (u8 * s, va_list * args)
99 u8 *a = va_arg (*args, u8 *);
101 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
102 a[0], a[1], a[2], a[3], a[4], a[5]);
106 vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t * mp)
108 char *duplex, *speed;
110 switch (mp->link_duplex << VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT)
112 case VNET_HW_INTERFACE_FLAG_HALF_DUPLEX:
115 case VNET_HW_INTERFACE_FLAG_FULL_DUPLEX:
122 switch (mp->link_speed << VNET_HW_INTERFACE_FLAG_SPEED_SHIFT)
124 case VNET_HW_INTERFACE_FLAG_SPEED_10M:
127 case VNET_HW_INTERFACE_FLAG_SPEED_100M:
130 case VNET_HW_INTERFACE_FLAG_SPEED_1G:
133 case VNET_HW_INTERFACE_FLAG_SPEED_2_5G:
136 case VNET_HW_INTERFACE_FLAG_SPEED_5G:
139 case VNET_HW_INTERFACE_FLAG_SPEED_10G:
142 case VNET_HW_INTERFACE_FLAG_SPEED_20G:
145 case VNET_HW_INTERFACE_FLAG_SPEED_25G:
148 case VNET_HW_INTERFACE_FLAG_SPEED_40G:
151 case VNET_HW_INTERFACE_FLAG_SPEED_50G:
154 case VNET_HW_INTERFACE_FLAG_SPEED_56G:
157 case VNET_HW_INTERFACE_FLAG_SPEED_100G:
165 "details: %s device_type %s sw_if_index %d sup_sw_if_index %d "
166 "link_duplex %s link_speed %s", mp->interface_name,
167 mp->interface_dev_type, ntohl (mp->sw_if_index),
168 ntohl (mp->sup_sw_if_index), duplex, speed);
170 if (mp->l2_address_length)
171 fformat (stdout, " l2 address: %U\n",
172 format_ethernet_address, mp->l2_address);
174 fformat (stdout, "\n");
178 vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
180 fformat (stdout, "set flags: sw_if_index %d, admin %s\n",
181 ntohl (mp->sw_if_index), mp->admin_up_down ? "up" : "down");
185 vl_api_sw_interface_set_flags_reply_t_handler
186 (vl_api_sw_interface_set_flags_reply_t * mp)
188 fformat (stdout, "set flags reply: reply %d\n", ntohl (mp->retval));
192 vl_api_want_interface_events_reply_t_handler
193 (vl_api_want_interface_events_reply_t * mp)
198 vl_api_want_stats_reply_t_handler (vl_api_want_stats_reply_t * mp)
200 fformat (stdout, "want stats reply %d\n", ntohl (mp->retval));
204 vl_api_want_oam_events_reply_t_handler (vl_api_want_oam_events_reply_t * mp)
206 fformat (stdout, "want oam reply %d\n", ntohl (mp->retval));
210 vl_api_ip_add_del_route_reply_t_handler (vl_api_ip_add_del_route_reply_t * mp)
212 fformat (stdout, "add_route reply %d\n", ntohl (mp->retval));
216 vl_api_sw_interface_add_del_address_reply_t_handler
217 (vl_api_sw_interface_add_del_address_reply_t * mp)
219 fformat (stdout, "add_del_address reply %d\n", ntohl (mp->retval));
223 vl_api_sw_interface_set_table_reply_t_handler
224 (vl_api_sw_interface_set_table_reply_t * mp)
226 fformat (stdout, "set_table reply %d\n", ntohl (mp->retval));
230 vl_api_tap_connect_reply_t_handler (vl_api_tap_connect_reply_t * mp)
232 fformat (stdout, "tap connect reply %d, sw_if_index %d\n",
233 ntohl (mp->retval), ntohl (mp->sw_if_index));
237 vl_api_create_vlan_subif_reply_t_handler (vl_api_create_vlan_subif_reply_t *
240 fformat (stdout, "create vlan subif reply %d, sw_if_index %d\n",
241 ntohl (mp->retval), ntohl (mp->sw_if_index));
244 static void vl_api_proxy_arp_add_del_reply_t_handler
245 (vl_api_proxy_arp_add_del_reply_t * mp)
247 fformat (stdout, "add del proxy arp reply %d\n", ntohl (mp->retval));
250 static void vl_api_proxy_arp_intfc_enable_disable_reply_t_handler
251 (vl_api_proxy_arp_intfc_enable_disable_reply_t * mp)
253 fformat (stdout, "proxy arp intfc ena/dis reply %d\n", ntohl (mp->retval));
256 static void vl_api_ip_neighbor_add_del_reply_t_handler
257 (vl_api_ip_neighbor_add_del_reply_t * mp)
259 fformat (stdout, "ip neighbor add del reply %d\n", ntohl (mp->retval));
264 vl_api_vnet_interface_counters_t_handler (vl_api_vnet_interface_counters_t *
268 u32 count, sw_if_index;
271 count = ntohl (mp->count);
272 sw_if_index = ntohl (mp->first_sw_if_index);
273 if (mp->is_combined == 0)
276 vp = (u64 *) mp->data;
278 switch (mp->vnet_counter_type)
280 case VNET_INTERFACE_COUNTER_DROP:
281 counter_name = "drop";
283 case VNET_INTERFACE_COUNTER_PUNT:
284 counter_name = "punt";
286 case VNET_INTERFACE_COUNTER_IP4:
287 counter_name = "ip4";
289 case VNET_INTERFACE_COUNTER_IP6:
290 counter_name = "ip6";
292 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
293 counter_name = "rx-no-buf";
295 case VNET_INTERFACE_COUNTER_RX_MISS:
296 counter_name = "rx-miss";
298 case VNET_INTERFACE_COUNTER_RX_ERROR:
299 counter_name = "rx-error";
301 case VNET_INTERFACE_COUNTER_TX_ERROR:
302 counter_name = "tx-error (fifo-full)";
305 counter_name = "bogus";
308 for (i = 0; i < count; i++)
310 v = clib_mem_unaligned (vp, u64);
311 v = clib_net_to_host_u64 (v);
313 fformat (stdout, "%d.%s %lld\n", sw_if_index, counter_name, v);
321 vp = (vlib_counter_t *) mp->data;
323 switch (mp->vnet_counter_type)
325 case VNET_INTERFACE_COUNTER_RX:
328 case VNET_INTERFACE_COUNTER_TX:
332 counter_name = "bogus";
335 for (i = 0; i < count; i++)
337 packets = clib_mem_unaligned (&vp->packets, u64);
338 packets = clib_net_to_host_u64 (packets);
339 bytes = clib_mem_unaligned (&vp->bytes, u64);
340 bytes = clib_net_to_host_u64 (bytes);
342 fformat (stdout, "%d.%s.packets %lld\n",
343 sw_if_index, counter_name, packets);
344 fformat (stdout, "%d.%s.bytes %lld\n",
345 sw_if_index, counter_name, bytes);
352 /* Format an IP4 address. */
354 format_ip4_address (u8 * s, va_list * args)
356 u8 *a = va_arg (*args, u8 *);
357 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
360 /* Format an IP4 route destination and length. */
362 format_ip4_address_and_length (u8 * s, va_list * args)
364 u8 *a = va_arg (*args, u8 *);
365 u8 l = va_arg (*args, u32);
366 return format (s, "%U/%d", format_ip4_address, a, l);
370 vl_api_vnet_ip4_fib_counters_t_handler (vl_api_vnet_ip4_fib_counters_t * mp)
373 vl_api_ip4_fib_counter_t *ctrp;
376 count = ntohl (mp->count);
378 fformat (stdout, "fib id %d, count this msg %d\n",
379 ntohl (mp->vrf_id), count);
382 for (i = 0; i < count; i++)
384 fformat (stdout, "%U: %lld packets, %lld bytes\n",
385 format_ip4_address_and_length, &ctrp->address,
386 (u32) ctrp->address_length,
387 clib_net_to_host_u64 (ctrp->packets),
388 clib_net_to_host_u64 (ctrp->bytes));
393 /* Format an IP6 address. */
395 format_ip6_address (u8 * s, va_list * args)
397 ip6_address_t *a = va_arg (*args, ip6_address_t *);
398 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
400 i_max_n_zero = ARRAY_LEN (a->as_u16);
402 i_first_zero = i_max_n_zero;
404 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
406 u32 is_zero = a->as_u16[i] == 0;
407 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
413 if ((!is_zero && n_zeros > max_n_zeros)
414 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
416 i_max_n_zero = i_first_zero;
417 max_n_zeros = n_zeros;
418 i_first_zero = ARRAY_LEN (a->as_u16);
423 last_double_colon = 0;
424 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
426 if (i == i_max_n_zero && max_n_zeros > 1)
428 s = format (s, "::");
429 i += max_n_zeros - 1;
430 last_double_colon = 1;
434 s = format (s, "%s%x",
435 (last_double_colon || i == 0) ? "" : ":",
436 clib_net_to_host_u16 (a->as_u16[i]));
437 last_double_colon = 0;
444 /* Format an IP6 route destination and length. */
446 format_ip6_address_and_length (u8 * s, va_list * args)
448 ip6_address_t *a = va_arg (*args, ip6_address_t *);
449 u8 l = va_arg (*args, u32);
450 return format (s, "%U/%d", format_ip6_address, a, l);
454 vl_api_vnet_ip6_fib_counters_t_handler (vl_api_vnet_ip6_fib_counters_t * mp)
457 vl_api_ip6_fib_counter_t *ctrp;
460 count = ntohl (mp->count);
462 fformat (stdout, "fib id %d, count this msg %d\n",
463 ntohl (mp->vrf_id), count);
466 for (i = 0; i < count; i++)
468 fformat (stdout, "%U: %lld packets, %lld bytes\n",
469 format_ip6_address_and_length, &ctrp->address,
470 (u32) ctrp->address_length,
471 clib_net_to_host_u64 (ctrp->packets),
472 clib_net_to_host_u64 (ctrp->bytes));
478 vl_api_oam_event_t_handler (vl_api_oam_event_t * mp)
480 fformat (stdout, "OAM: %U now %s\n",
481 format_ip4_address, &mp->dst_address,
482 mp->state == 1 ? "alive" : "dead");
486 vl_api_oam_add_del_reply_t_handler (vl_api_oam_add_del_reply_t * mp)
488 fformat (stdout, "oam add del reply %d\n", ntohl (mp->retval));
492 vl_api_reset_fib_reply_t_handler (vl_api_reset_fib_reply_t * mp)
494 fformat (stdout, "fib reset reply %d\n", ntohl (mp->retval));
498 vl_api_dhcp_proxy_set_vss_reply_t_handler (vl_api_dhcp_proxy_set_vss_reply_t *
501 fformat (stdout, "dhcp proxy set vss reply %d\n", ntohl (mp->retval));
505 vl_api_dhcp_proxy_config_reply_t_handler (vl_api_dhcp_proxy_config_reply_t *
508 fformat (stdout, "dhcp proxy config reply %d\n", ntohl (mp->retval));
512 vl_api_set_ip_flow_hash_reply_t_handler (vl_api_set_ip_flow_hash_reply_t * mp)
514 fformat (stdout, "set ip flow hash reply %d\n", ntohl (mp->retval));
518 vl_api_sw_interface_ip6nd_ra_config_reply_t_handler
519 (vl_api_sw_interface_ip6nd_ra_config_reply_t * mp)
521 fformat (stdout, "ip6 nd ra-config reply %d\n", ntohl (mp->retval));
525 vl_api_sw_interface_ip6nd_ra_prefix_reply_t_handler
526 (vl_api_sw_interface_ip6nd_ra_prefix_reply_t * mp)
528 fformat (stdout, "ip6 nd ra-prefix reply %d\n", ntohl (mp->retval));
532 vl_api_sw_interface_ip6_enable_disable_reply_t_handler
533 (vl_api_sw_interface_ip6_enable_disable_reply_t * mp)
535 fformat (stdout, "ip6 enable/disable reply %d\n", ntohl (mp->retval));
539 vl_api_sw_interface_ip6_set_link_local_address_reply_t_handler
540 (vl_api_sw_interface_ip6_set_link_local_address_reply_t * mp)
542 fformat (stdout, "ip6 set link-local address reply %d\n",
546 static void vl_api_create_loopback_reply_t_handler
547 (vl_api_create_loopback_reply_t * mp)
549 fformat (stdout, "create loopback status %d, sw_if_index %d\n",
550 ntohl (mp->retval), ntohl (mp->sw_if_index));
553 static void vl_api_create_loopback_instance_reply_t_handler
554 (vl_api_create_loopback_instance_reply_t * mp)
556 fformat (stdout, "create loopback status %d, sw_if_index %d\n",
557 ntohl (mp->retval), ntohl (mp->sw_if_index));
560 static void vl_api_l2_patch_add_del_reply_t_handler
561 (vl_api_l2_patch_add_del_reply_t * mp)
563 fformat (stdout, "l2 patch reply %d\n", ntohl (mp->retval));
566 static void vl_api_sw_interface_set_l2_xconnect_reply_t_handler
567 (vl_api_sw_interface_set_l2_xconnect_reply_t * mp)
569 fformat (stdout, "l2_xconnect reply %d\n", ntohl (mp->retval));
572 static void vl_api_sw_interface_set_l2_bridge_reply_t_handler
573 (vl_api_sw_interface_set_l2_bridge_reply_t * mp)
575 fformat (stdout, "l2_bridge reply %d\n", ntohl (mp->retval));
579 noop_handler (void *notused)
583 #define vl_api_vnet_ip4_fib_counters_t_endian noop_handler
584 #define vl_api_vnet_ip4_fib_counters_t_print noop_handler
585 #define vl_api_vnet_ip6_fib_counters_t_endian noop_handler
586 #define vl_api_vnet_ip6_fib_counters_t_print noop_handler
588 #define foreach_api_msg \
589 _(SW_INTERFACE_DETAILS, sw_interface_details) \
590 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
591 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
592 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
593 _(WANT_STATS_REPLY, want_stats_reply) \
594 _(WANT_OAM_EVENTS_REPLY, want_oam_events_reply) \
595 _(OAM_EVENT, oam_event) \
596 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
597 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
598 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
599 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
600 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, sw_interface_add_del_address_reply) \
601 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
602 _(TAP_CONNECT_REPLY, tap_connect_reply) \
603 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
604 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
605 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, proxy_arp_intfc_enable_disable_reply) \
606 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
607 _(RESET_FIB_REPLY, reset_fib_reply) \
608 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
609 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
610 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
611 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, sw_interface_ip6nd_ra_config_reply) \
612 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, sw_interface_ip6nd_ra_prefix_reply) \
613 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, sw_interface_ip6_enable_disable_reply) \
614 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, sw_interface_ip6_set_link_local_address_reply) \
615 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
616 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
617 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
618 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, sw_interface_set_l2_xconnect_reply) \
619 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, sw_interface_set_l2_bridge_reply)
622 connect_to_vpe (char *name)
626 rv = vl_client_connect_to_vlib ("/vpe-api", name, 32);
629 vl_msg_api_set_handlers(VL_API_##N, #n, \
630 vl_api_##n##_t_handler, \
632 vl_api_##n##_t_endian, \
633 vl_api_##n##_t_print, \
634 sizeof(vl_api_##n##_t), 1);
638 shmem_hdr = api_main.shmem_hdr;
644 disconnect_from_vpe (void)
646 vl_client_disconnect_from_vlib ();
651 link_up_down_enable_disable (test_main_t * tm, int enable)
653 vl_api_want_interface_events_t *mp;
655 /* Request admin / link up down messages */
656 mp = vl_msg_api_alloc (sizeof (*mp));
657 clib_memset (mp, 0, sizeof (*mp));
658 mp->_vl_msg_id = ntohs (VL_API_WANT_INTERFACE_EVENTS);
659 mp->client_index = tm->my_client_index;
660 mp->context = 0xdeadbeef;
661 mp->enable_disable = enable;
663 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
664 tm->link_events_on = enable;
668 stats_enable_disable (test_main_t * tm, int enable)
670 vl_api_want_stats_t *mp;
672 mp = vl_msg_api_alloc (sizeof (*mp));
673 clib_memset (mp, 0, sizeof (*mp));
674 mp->_vl_msg_id = ntohs (VL_API_WANT_STATS);
675 mp->client_index = tm->my_client_index;
676 mp->context = 0xdeadbeef;
677 mp->enable_disable = enable;
679 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
680 tm->stats_on = enable;
684 oam_events_enable_disable (test_main_t * tm, int enable)
686 vl_api_want_oam_events_t *mp;
688 mp = vl_msg_api_alloc (sizeof (*mp));
689 clib_memset (mp, 0, sizeof (*mp));
690 mp->_vl_msg_id = ntohs (VL_API_WANT_OAM_EVENTS);
691 mp->client_index = tm->my_client_index;
692 mp->context = 0xdeadbeef;
693 mp->enable_disable = enable;
695 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
696 tm->oam_events_on = enable;
700 oam_add_del (test_main_t * tm, int is_add)
702 vl_api_oam_add_del_t *mp;
705 mp = vl_msg_api_alloc (sizeof (*mp));
706 clib_memset (mp, 0, sizeof (*mp));
707 mp->_vl_msg_id = ntohs (VL_API_OAM_ADD_DEL);
708 mp->client_index = tm->my_client_index;
709 mp->context = 0xdeadbeef;
712 tmp.as_u32 = ntohl (0xc0a80101); /* 192.168.1.1 */
713 clib_memcpy (mp->src_address, tmp.as_u8, 4);
715 tmp.as_u32 = ntohl (0xc0a80103); /* 192.168.1.3 */
716 clib_memcpy (mp->dst_address, tmp.as_u8, 4);
719 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
723 dump (test_main_t * tm)
725 vl_api_sw_interface_dump_t *mp;
727 mp = vl_msg_api_alloc (sizeof (*mp));
728 clib_memset (mp, 0, sizeof (*mp));
729 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_DUMP);
730 mp->client_index = tm->my_client_index;
731 mp->name_filter_valid = 1;
732 strncpy ((char *) mp->name_filter, "eth", sizeof (mp->name_filter) - 1);
734 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
738 add_del_ip4_route (test_main_t * tm, int enable_disable)
740 vl_api_ip_add_del_route_t *mp;
743 mp = vl_msg_api_alloc (sizeof (*mp));
744 clib_memset (mp, 0, sizeof (*mp));
745 mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
746 mp->client_index = tm->my_client_index;
747 mp->context = 0xdeadbeef;
748 mp->table_id = ntohl (0);
750 mp->next_hop_sw_if_index = ntohl (5);
751 mp->is_add = enable_disable;
752 mp->next_hop_weight = 1;
754 /* Next hop: 6.0.0.1 */
755 tmp = ntohl (0x06000001);
756 clib_memcpy (mp->next_hop_address, &tmp, sizeof (tmp));
758 /* Destination: 10.0.0.1/32 */
760 clib_memcpy (mp->dst_address, &tmp, sizeof (tmp));
761 mp->dst_address_length = 0;
763 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
767 add_del_ip6_route (test_main_t * tm, int enable_disable)
769 vl_api_ip_add_del_route_t *mp;
772 mp = vl_msg_api_alloc (sizeof (*mp));
773 clib_memset (mp, 0, sizeof (*mp));
774 mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
775 mp->client_index = tm->my_client_index;
776 mp->context = 0xdeadbeef;
777 mp->next_hop_sw_if_index = ntohl (5);
778 mp->is_add = enable_disable;
780 mp->next_hop_weight = 1;
781 mp->dst_address_length = 64;
783 /* add/del dabe::/64 via db01::11 */
785 tmp[0] = clib_host_to_net_u64 (0xdabe000000000000ULL);
786 tmp[1] = clib_host_to_net_u64 (0x0ULL);
787 clib_memcpy (mp->dst_address, &tmp[0], 8);
788 clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
790 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
791 tmp[1] = clib_host_to_net_u64 (0x11ULL);
792 clib_memcpy (mp->next_hop_address, &tmp[0], 8);
793 clib_memcpy (&mp->next_hop_address[8], &tmp[1], 8);
795 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
799 add_del_interface_address (test_main_t * tm, int enable_disable)
801 vl_api_sw_interface_add_del_address_t *mp;
804 mp = vl_msg_api_alloc (sizeof (*mp));
805 clib_memset (mp, 0, sizeof (*mp));
806 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
807 mp->client_index = tm->my_client_index;
808 mp->context = 0xdeadbeef;
809 mp->sw_if_index = ntohl (5);
810 mp->is_add = enable_disable;
811 mp->address_length = 8;
813 tmp = ntohl (0x01020304);
814 clib_memcpy (mp->address, &tmp, 4);
816 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
820 add_del_v6_interface_address (test_main_t * tm, int enable_disable)
822 vl_api_sw_interface_add_del_address_t *mp;
825 mp = vl_msg_api_alloc (sizeof (*mp));
826 clib_memset (mp, 0, sizeof (*mp));
827 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
828 mp->client_index = tm->my_client_index;
829 mp->context = 0xdeadbeef;
831 mp->sw_if_index = ntohl (5);
832 mp->is_add = enable_disable;
833 mp->address_length = 64;
835 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
836 tmp[1] = clib_host_to_net_u64 (0x11ULL);
838 clib_memcpy (mp->address, &tmp[0], 8);
839 clib_memcpy (&mp->address[8], &tmp[1], 8);
841 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
845 del_all_interface_addresses (test_main_t * tm)
847 vl_api_sw_interface_add_del_address_t *mp;
849 mp = vl_msg_api_alloc (sizeof (*mp));
850 clib_memset (mp, 0, sizeof (*mp));
851 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
852 mp->client_index = tm->my_client_index;
853 mp->context = 0xdeadbeef;
854 mp->sw_if_index = ntohl (5);
857 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
861 set_interface_table (test_main_t * tm, int is_ipv6, u32 vrf_id)
863 vl_api_sw_interface_set_table_t *mp;
865 mp = vl_msg_api_alloc (sizeof (*mp));
866 clib_memset (mp, 0, sizeof (*mp));
867 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_TABLE);
868 mp->client_index = tm->my_client_index;
869 mp->context = 0xdeadbeef;
870 mp->sw_if_index = ntohl (5);
871 mp->is_ipv6 = is_ipv6;
872 mp->vrf_id = ntohl (vrf_id);
874 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
878 connect_unix_tap (test_main_t * tm, char *name)
880 vl_api_tap_connect_t *mp;
882 mp = vl_msg_api_alloc (sizeof (*mp));
883 clib_memset (mp, 0, sizeof (*mp));
884 mp->_vl_msg_id = ntohs (VL_API_TAP_CONNECT);
885 mp->client_index = tm->my_client_index;
886 mp->context = 0xdeadbeef;
887 strncpy ((char *) mp->tap_name, name, sizeof (mp->tap_name) - 1);
888 mp->use_random_mac = 1;
889 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
893 create_vlan_subif (test_main_t * tm, u32 vlan_id)
895 vl_api_create_vlan_subif_t *mp;
897 mp = vl_msg_api_alloc (sizeof (*mp));
898 clib_memset (mp, 0, sizeof (*mp));
899 mp->_vl_msg_id = ntohs (VL_API_CREATE_VLAN_SUBIF);
900 mp->client_index = tm->my_client_index;
901 mp->context = 0xdeadbeef;
902 mp->sw_if_index = ntohl (5);
903 mp->vlan_id = ntohl (vlan_id);
905 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
909 add_del_proxy_arp (test_main_t * tm, int is_add)
911 vl_api_proxy_arp_add_del_t *mp;
914 mp = vl_msg_api_alloc (sizeof (*mp));
915 clib_memset (mp, 0, sizeof (*mp));
916 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_ADD_DEL);
917 mp->client_index = tm->my_client_index;
918 mp->context = 0xdeadbeef;
919 mp->proxy.vrf_id = ntohl (11);
922 /* proxy fib 11, 1.1.1.1 -> 1.1.1.10 */
923 tmp = ntohl (0x01010101);
924 clib_memcpy (mp->proxy.low_address, &tmp, 4);
926 tmp = ntohl (0x0101010a);
927 clib_memcpy (mp->proxy.hi_address, &tmp, 4);
929 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
933 proxy_arp_intfc_enable_disable (test_main_t * tm, int enable_disable)
935 vl_api_proxy_arp_intfc_enable_disable_t *mp;
937 mp = vl_msg_api_alloc (sizeof (*mp));
938 clib_memset (mp, 0, sizeof (*mp));
939 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE);
940 mp->client_index = tm->my_client_index;
941 mp->context = 0xdeadbeef;
942 mp->sw_if_index = ntohl (6);
943 mp->enable_disable = enable_disable;
945 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
949 add_ip4_neighbor (test_main_t * tm, int add_del)
951 vl_api_ip_neighbor_add_del_t *mp;
954 mp = vl_msg_api_alloc (sizeof (*mp));
955 clib_memset (mp, 0, sizeof (*mp));
956 mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
957 mp->client_index = tm->my_client_index;
958 mp->context = 0xdeadbeef;
959 mp->sw_if_index = ntohl (6);
960 mp->is_add = add_del;
962 clib_memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
964 tmp = ntohl (0x0101010a);
965 clib_memcpy (mp->dst_address, &tmp, 4);
967 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
971 add_ip6_neighbor (test_main_t * tm, int add_del)
973 vl_api_ip_neighbor_add_del_t *mp;
976 mp = vl_msg_api_alloc (sizeof (*mp));
977 clib_memset (mp, 0, sizeof (*mp));
978 mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
979 mp->client_index = tm->my_client_index;
980 mp->context = 0xdeadbeef;
981 mp->sw_if_index = ntohl (6);
982 mp->is_add = add_del;
985 clib_memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
987 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
988 tmp[1] = clib_host_to_net_u64 (0x11ULL);
990 clib_memcpy (mp->dst_address, &tmp[0], 8);
991 clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
993 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
997 reset_fib (test_main_t * tm, u8 is_ip6)
999 vl_api_reset_fib_t *mp;
1001 mp = vl_msg_api_alloc (sizeof (*mp));
1002 clib_memset (mp, 0, sizeof (*mp));
1003 mp->_vl_msg_id = ntohs (VL_API_RESET_FIB);
1004 mp->client_index = tm->my_client_index;
1005 mp->context = 0xdeadbeef;
1006 mp->vrf_id = ntohl (11);
1007 mp->is_ipv6 = is_ip6;
1009 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1013 dhcpv6_set_vss (test_main_t * tm)
1015 vl_api_dhcp_proxy_set_vss_t *mp;
1017 mp = vl_msg_api_alloc (sizeof (*mp));
1018 clib_memset (mp, 0, sizeof (*mp));
1019 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1020 mp->client_index = tm->my_client_index;
1021 mp->context = 0xdeadbeef;
1022 mp->oui = ntohl (6);
1023 mp->tbl_id = ntohl (60);
1026 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1030 dhcpv4_set_vss (test_main_t * tm)
1032 vl_api_dhcp_proxy_set_vss_t *mp;
1034 mp = vl_msg_api_alloc (sizeof (*mp));
1035 clib_memset (mp, 0, sizeof (*mp));
1036 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1037 mp->client_index = tm->my_client_index;
1038 mp->context = 0xdeadbeef;
1039 mp->oui = ntohl (4);
1040 mp->tbl_id = ntohl (40);
1043 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1047 dhcp_set_vss (test_main_t * tm)
1049 dhcpv4_set_vss (tm);
1050 dhcpv6_set_vss (tm);
1054 dhcp_set_proxy (test_main_t * tm, int ipv6)
1056 vl_api_dhcp_proxy_config_t *mp;
1058 mp = vl_msg_api_alloc (sizeof (*mp));
1059 clib_memset (mp, 0, sizeof (*mp));
1060 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_CONFIG);
1061 mp->client_index = tm->my_client_index;
1062 mp->context = 0xdeadbeef;
1065 mp->dhcp_server[0] = 0x20;
1066 mp->dhcp_server[1] = 0x01;
1067 mp->dhcp_server[2] = 0xab;
1068 mp->dhcp_server[3] = 0xcd;
1069 mp->dhcp_server[4] = 0x12;
1070 mp->dhcp_server[5] = 0x34;
1071 mp->dhcp_server[6] = 0xfe;
1072 mp->dhcp_server[7] = 0xdc;
1073 mp->dhcp_server[14] = 0;
1074 mp->dhcp_server[15] = 0x2;
1076 mp->dhcp_src_address[0] = 0x20;
1077 mp->dhcp_src_address[1] = 0x01;
1078 mp->dhcp_src_address[2] = 0xab;
1079 mp->dhcp_src_address[3] = 0xcd;
1080 mp->dhcp_src_address[4] = 0x12;
1081 mp->dhcp_src_address[5] = 0x34;
1082 mp->dhcp_src_address[6] = 0x56;
1083 mp->dhcp_src_address[7] = 0x78;
1084 mp->dhcp_src_address[14] = 0;
1085 mp->dhcp_src_address[15] = 0x2;
1087 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1091 set_ip_flow_hash (test_main_t * tm, u8 is_ip6)
1093 vl_api_set_ip_flow_hash_t *mp;
1095 mp = vl_msg_api_alloc (sizeof (*mp));
1096 clib_memset (mp, 0, sizeof (*mp));
1097 mp->_vl_msg_id = ntohs (VL_API_SET_IP_FLOW_HASH);
1098 mp->client_index = tm->my_client_index;
1099 mp->context = 0xdeadbeef;
1101 mp->is_ipv6 = is_ip6;
1105 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1109 ip6nd_ra_config (test_main_t * tm, int is_no)
1111 vl_api_sw_interface_ip6nd_ra_config_t *mp;
1113 mp = vl_msg_api_alloc (sizeof (*mp));
1114 clib_memset (mp, 0, sizeof (*mp));
1116 mp->client_index = tm->my_client_index;
1117 mp->context = 0xdeadbeef;
1118 mp->sw_if_index = ntohl (5);
1124 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_CONFIG);
1125 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1129 ip6nd_ra_prefix (test_main_t * tm, int is_no)
1131 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
1134 mp = vl_msg_api_alloc (sizeof (*mp));
1135 clib_memset (mp, 0, sizeof (*mp));
1137 mp->client_index = tm->my_client_index;
1138 mp->context = 0xdeadbeef;
1139 mp->sw_if_index = ntohl (5);
1142 mp->use_default = 1;
1145 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
1146 tmp[1] = clib_host_to_net_u64 (0x11ULL);
1149 clib_memcpy (mp->address, &tmp[0], 8);
1150 clib_memcpy (&mp->address[8], &tmp[1], 8);
1152 mp->address_length = 64;
1155 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_PREFIX);
1156 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1160 ip6_enable_disable (test_main_t * tm, int enable)
1162 vl_api_sw_interface_ip6_enable_disable_t *mp;
1164 mp = vl_msg_api_alloc (sizeof (*mp));
1165 clib_memset (mp, 0, sizeof (*mp));
1167 mp->client_index = tm->my_client_index;
1168 mp->context = 0xdeadbeef;
1169 mp->sw_if_index = ntohl (5);
1170 mp->enable = (enable == 1);;
1172 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_ENABLE_DISABLE);
1173 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1177 loop_create (test_main_t * tm)
1179 vl_api_create_loopback_t *mp;
1181 mp = vl_msg_api_alloc (sizeof (*mp));
1182 clib_memset (mp, 0, sizeof (*mp));
1184 mp->_vl_msg_id = ntohs (VL_API_CREATE_LOOPBACK);
1185 mp->client_index = tm->my_client_index;
1186 mp->context = 0xdeadbeef;
1187 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1191 ip6_set_link_local_address (test_main_t * tm)
1193 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
1196 mp = vl_msg_api_alloc (sizeof (*mp));
1197 clib_memset (mp, 0, sizeof (*mp));
1199 mp->client_index = tm->my_client_index;
1200 mp->context = 0xdeadbeef;
1201 mp->sw_if_index = ntohl (5);
1203 tmp[0] = clib_host_to_net_u64 (0xfe80000000000000ULL);
1204 tmp[1] = clib_host_to_net_u64 (0x11ULL);
1206 ip6_address_encode ((ip6_address_encode *) & tmp, mp->address);
1208 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS);
1210 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1215 set_flags (test_main_t * tm, int up_down)
1217 vl_api_sw_interface_set_flags_t *mp;
1219 mp = vl_msg_api_alloc (sizeof (*mp));
1220 clib_memset (mp, 0, sizeof (*mp));
1222 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_FLAGS);
1223 mp->client_index = tm->my_client_index;
1224 mp->context = 0xdeadbeef;
1225 mp->sw_if_index = ntohl (5);
1226 mp->admin_up_down = up_down;
1227 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1232 l2_patch_add_del (test_main_t * tm, int is_add)
1234 vl_api_l2_patch_add_del_t *mp;
1236 mp = vl_msg_api_alloc (sizeof (*mp));
1237 clib_memset (mp, 0, sizeof (*mp));
1238 mp->_vl_msg_id = ntohs (VL_API_L2_PATCH_ADD_DEL);
1239 mp->client_index = tm->my_client_index;
1240 mp->context = 0xdeadbeef;
1241 mp->is_add = is_add;
1242 mp->rx_sw_if_index = ntohl (1);
1243 mp->tx_sw_if_index = ntohl (2);
1245 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1249 l2_xconnect (test_main_t * tm)
1251 vl_api_sw_interface_set_l2_xconnect_t *mp;
1253 mp = vl_msg_api_alloc (sizeof (*mp));
1254 clib_memset (mp, 0, sizeof (*mp));
1255 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_XCONNECT);
1256 mp->client_index = tm->my_client_index;
1257 mp->context = 0xdeadbeef;
1258 mp->rx_sw_if_index = ntohl (5);
1259 mp->tx_sw_if_index = ntohl (6);
1262 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1266 l2_bridge (test_main_t * tm)
1268 vl_api_sw_interface_set_l2_bridge_t *mp;
1270 mp = vl_msg_api_alloc (sizeof (*mp));
1271 clib_memset (mp, 0, sizeof (*mp));
1272 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_BRIDGE);
1273 mp->client_index = tm->my_client_index;
1274 mp->context = 0xdeadbeef;
1275 mp->rx_sw_if_index = ntohl (5);
1276 mp->bd_id = ntohl (6);
1277 mp->bvi = ntohl (1);
1278 mp->shg = ntohl (0);
1281 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1285 main (int argc, char **argv)
1287 api_main_t *am = vlibapi_get_main ();
1288 test_main_t *tm = &test_main;
1291 connect_to_vpe ("test_client");
1293 tm->vl_input_queue = shmem_hdr->vl_input_queue;
1294 tm->my_client_index = am->my_client_index;
1296 fformat (stdout, "Type 'h' for help, 'q' to quit...\n");
1309 link_up_down_enable_disable (tm, 1 /* enable_disable */ );
1312 link_up_down_enable_disable (tm, 0 /* enable_disable */ );
1315 stats_enable_disable (tm, 1 /* enable_disable */ );
1318 stats_enable_disable (tm, 0 /* enable_disable */ );
1321 add_del_ip4_route (tm, 0 /* add */ );
1324 add_del_ip4_route (tm, 1 /* add */ );
1327 add_del_ip6_route (tm, 0 /* add */ );
1330 add_del_ip6_route (tm, 1 /* add */ );
1333 add_del_interface_address (tm, 1 /* add */ );
1336 add_del_interface_address (tm, 0 /* add */ );
1339 add_del_v6_interface_address (tm, 1 /* add */ );
1342 add_del_v6_interface_address (tm, 0 /* add */ );
1345 l2_patch_add_del (tm, 1 /* is_add */ );
1348 l2_patch_add_del (tm, 0 /* is_add */ );
1351 del_all_interface_addresses (tm);
1354 set_interface_table (tm, 0 /* is_ipv6 */ ,
1355 11 /* my amp goes to 11 */ );
1358 set_interface_table (tm, 1 /* is_ipv6 */ ,
1359 12 /* my amp goes to 12 */ );
1363 create_vlan_subif (tm, 123);
1367 connect_unix_tap (tm, "foo");
1371 add_ip4_neighbor (tm, 1 /* is_add */ );
1372 add_ip6_neighbor (tm, 1 /* is_add */ );
1376 add_ip4_neighbor (tm, 0 /* is_add */ );
1377 add_ip6_neighbor (tm, 0 /* is_add */ );
1381 add_del_proxy_arp (tm, 1 /* add */ );
1385 proxy_arp_intfc_enable_disable (tm, 1 /* enable */ );
1389 oam_events_enable_disable (tm, 0 /* enable */ );
1393 oam_events_enable_disable (tm, 1 /* enable */ );
1397 oam_add_del (tm, 0 /* is_add */ );
1401 oam_add_del (tm, 1 /* is_add */ );
1405 reset_fib (tm, 0 /* is_ip6 */ );
1409 reset_fib (tm, 1 /* is_ip6 */ );
1417 dhcp_set_proxy (tm, 0);
1421 dhcp_set_proxy (tm, 1 /*ipv6 */ );
1425 set_ip_flow_hash (tm, 0 /* is_ip6 */ );
1429 ip6_set_link_local_address (tm);
1433 ip6_enable_disable (tm, 1 /* enable */ );
1437 ip6_enable_disable (tm, 0 /* disable */ );
1441 ip6nd_ra_config (tm, 0 /* is_no */ );
1444 ip6nd_ra_config (tm, 1 /* is_no */ );
1447 ip6nd_ra_prefix (tm, 0 /* is_no */ );
1450 ip6nd_ra_prefix (tm, 1 /* is_no */ );
1458 set_flags (tm, 1 /* up_down */ );
1462 set_flags (tm, 0 /* up_down */ );
1474 fformat (stdout, "q=quit,d=dump,L=link evts on,l=link evts off\n");
1475 fformat (stdout, "S=stats on,s=stats off\n");
1476 fformat (stdout, "4=add v4 route, 3=del v4 route\n");
1477 fformat (stdout, "6=add v6 route, 5=del v6 route\n");
1478 fformat (stdout, "A=add v4 intfc route, a=del v4 intfc route\n");
1479 fformat (stdout, "B=add v6 intfc route, b=del v6 intfc route\n");
1480 fformat (stdout, "z=del all intfc routes\n");
1481 fformat (stdout, "t=set v4 intfc table, T=set v6 intfc table\n");
1482 fformat (stdout, "c=connect unix tap\n");
1484 "j=set dhcpv4 and v6 link-address/option-82 params\n");
1485 fformat (stdout, "k=set dhcpv4 relay agent params\n");
1486 fformat (stdout, "K=set dhcpv6 relay agent params\n");
1487 fformat (stdout, "E=add l2 patch, e=del l2 patch\n");
1488 fformat (stdout, "V=ip6 set link-local address \n");
1489 fformat (stdout, "w=ip6 enable \n");
1490 fformat (stdout, "W=ip6 disable \n");
1491 fformat (stdout, "x=ip6 nd config \n");
1492 fformat (stdout, "X=no ip6 nd config\n");
1493 fformat (stdout, "y=ip6 nd prefix \n");
1494 fformat (stdout, "Y=no ip6 nd prefix\n");
1495 fformat (stdout, "@=l2 xconnect\n");
1496 fformat (stdout, "#=l2 bridge\n");
1506 if (tm->link_events_on)
1507 link_up_down_enable_disable (tm, 0 /* enable */ );
1509 stats_enable_disable (tm, 0 /* enable */ );
1510 if (tm->oam_events_on)
1511 oam_events_enable_disable (tm, 0 /* enable */ );
1513 disconnect_from_vpe ();
1517 #undef vl_api_version
1518 #define vl_api_version(n,v) static u32 vpe_api_version = v;
1519 #include <vpp/api/vpe.api.h>
1520 #undef vl_api_version
1523 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
1526 * Send the main API signature in slot 0. This bit of code must
1527 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
1529 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
1533 * fd.io coding-style-patch-verification: ON
1536 * eval: (c-set-style "gnu")