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/mheap.h>
39 #include <vppinfra/heap.h>
40 #include <vppinfra/pool.h>
41 #include <vppinfra/format.h>
42 #include <vppinfra/error.h>
44 #include <vnet/vnet.h>
45 #include <vlib/vlib.h>
46 #include <vlib/unix/unix.h>
47 #include <vlibapi/api.h>
48 #include <vlibmemory/api.h>
50 #include <vpp/api/vpe_msg_enum.h>
52 #include <vnet/ip/ip.h>
53 #include <vnet/interface.h>
56 #define f64_print(a,b)
58 #define vl_typedefs /* define message structures */
59 #include <vpp/api/vpe_all_api_h.h>
62 #define vl_endianfun /* define message structures */
63 #include <vpp/api/vpe_all_api_h.h>
66 /* instantiate all the print functions we know about */
67 #define vl_print(handle, ...)
69 #include <vpp/api/vpe_all_api_h.h>
72 vl_shmem_hdr_t *shmem_hdr;
81 unix_shared_memory_queue_t *vl_input_queue;
85 test_main_t test_main;
88 * Satisfy external references when -lvlib is not available.
90 vlib_main_t vlib_global_main;
91 vlib_main_t **vlib_mains;
94 vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...)
96 clib_warning ("vlib_cli_output callled...");
100 format_ethernet_address (u8 * s, va_list * args)
102 u8 *a = va_arg (*args, u8 *);
104 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
105 a[0], a[1], a[2], a[3], a[4], a[5]);
109 vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t * mp)
111 char *duplex, *speed;
113 switch (mp->link_duplex << VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT)
115 case VNET_HW_INTERFACE_FLAG_HALF_DUPLEX:
118 case VNET_HW_INTERFACE_FLAG_FULL_DUPLEX:
125 switch (mp->link_speed << VNET_HW_INTERFACE_FLAG_SPEED_SHIFT)
127 case VNET_HW_INTERFACE_FLAG_SPEED_10M:
130 case VNET_HW_INTERFACE_FLAG_SPEED_100M:
133 case VNET_HW_INTERFACE_FLAG_SPEED_1G:
136 case VNET_HW_INTERFACE_FLAG_SPEED_10G:
139 case VNET_HW_INTERFACE_FLAG_SPEED_40G:
142 case VNET_HW_INTERFACE_FLAG_SPEED_100G:
149 fformat (stdout, "details: %s sw_if_index %d sup_sw_if_index %d "
150 "link_duplex %s link_speed %s",
151 mp->interface_name, ntohl (mp->sw_if_index),
152 ntohl (mp->sup_sw_if_index), duplex, speed);
154 if (mp->l2_address_length)
155 fformat (stdout, " l2 address: %U\n",
156 format_ethernet_address, mp->l2_address);
158 fformat (stdout, "\n");
162 vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
164 fformat (stdout, "set flags: sw_if_index %d, admin %s link %s\n",
165 ntohl (mp->sw_if_index),
166 mp->admin_up_down ? "up" : "down",
167 mp->link_up_down ? "up" : "down");
171 vl_api_sw_interface_set_flags_reply_t_handler
172 (vl_api_sw_interface_set_flags_reply_t * mp)
174 fformat (stdout, "set flags reply: reply %d\n", ntohl (mp->retval));
178 vl_api_want_interface_events_reply_t_handler
179 (vl_api_want_interface_events_reply_t * mp)
184 vl_api_want_stats_reply_t_handler (vl_api_want_stats_reply_t * mp)
186 fformat (stdout, "want stats reply %d\n", ntohl (mp->retval));
190 vl_api_want_oam_events_reply_t_handler (vl_api_want_oam_events_reply_t * mp)
192 fformat (stdout, "want oam reply %d\n", ntohl (mp->retval));
196 vl_api_ip_add_del_route_reply_t_handler (vl_api_ip_add_del_route_reply_t * mp)
198 fformat (stdout, "add_route reply %d\n", ntohl (mp->retval));
202 vl_api_sw_interface_add_del_address_reply_t_handler
203 (vl_api_sw_interface_add_del_address_reply_t * mp)
205 fformat (stdout, "add_del_address reply %d\n", ntohl (mp->retval));
209 vl_api_sw_interface_set_table_reply_t_handler
210 (vl_api_sw_interface_set_table_reply_t * mp)
212 fformat (stdout, "set_table reply %d\n", ntohl (mp->retval));
216 vl_api_tap_connect_reply_t_handler (vl_api_tap_connect_reply_t * mp)
218 fformat (stdout, "tap connect reply %d, sw_if_index %d\n",
219 ntohl (mp->retval), ntohl (mp->sw_if_index));
223 vl_api_create_vlan_subif_reply_t_handler (vl_api_create_vlan_subif_reply_t *
226 fformat (stdout, "create vlan subif reply %d, sw_if_index %d\n",
227 ntohl (mp->retval), ntohl (mp->sw_if_index));
230 static void vl_api_proxy_arp_add_del_reply_t_handler
231 (vl_api_proxy_arp_add_del_reply_t * mp)
233 fformat (stdout, "add del proxy arp reply %d\n", ntohl (mp->retval));
236 static void vl_api_proxy_arp_intfc_enable_disable_reply_t_handler
237 (vl_api_proxy_arp_intfc_enable_disable_reply_t * mp)
239 fformat (stdout, "proxy arp intfc ena/dis reply %d\n", ntohl (mp->retval));
242 static void vl_api_ip_neighbor_add_del_reply_t_handler
243 (vl_api_ip_neighbor_add_del_reply_t * mp)
245 fformat (stdout, "ip neighbor add del reply %d\n", ntohl (mp->retval));
249 vl_api_vnet_interface_counters_t_handler (vl_api_vnet_interface_counters_t *
253 u32 count, sw_if_index;
256 count = ntohl (mp->count);
257 sw_if_index = ntohl (mp->first_sw_if_index);
258 if (mp->is_combined == 0)
261 vp = (u64 *) mp->data;
263 switch (mp->vnet_counter_type)
265 case VNET_INTERFACE_COUNTER_DROP:
266 counter_name = "drop";
268 case VNET_INTERFACE_COUNTER_PUNT:
269 counter_name = "punt";
271 case VNET_INTERFACE_COUNTER_IP4:
272 counter_name = "ip4";
274 case VNET_INTERFACE_COUNTER_IP6:
275 counter_name = "ip6";
277 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
278 counter_name = "rx-no-buf";
280 case VNET_INTERFACE_COUNTER_RX_MISS:
281 counter_name = "rx-miss";
283 case VNET_INTERFACE_COUNTER_RX_ERROR:
284 counter_name = "rx-error";
286 case VNET_INTERFACE_COUNTER_TX_ERROR:
287 counter_name = "tx-error (fifo-full)";
290 counter_name = "bogus";
293 for (i = 0; i < count; i++)
295 v = clib_mem_unaligned (vp, u64);
296 v = clib_net_to_host_u64 (v);
298 fformat (stdout, "%d.%s %lld\n", sw_if_index, counter_name, v);
306 vp = (vlib_counter_t *) mp->data;
308 switch (mp->vnet_counter_type)
310 case VNET_INTERFACE_COUNTER_RX:
313 case VNET_INTERFACE_COUNTER_TX:
317 counter_name = "bogus";
320 for (i = 0; i < count; i++)
322 packets = clib_mem_unaligned (&vp->packets, u64);
323 packets = clib_net_to_host_u64 (packets);
324 bytes = clib_mem_unaligned (&vp->bytes, u64);
325 bytes = clib_net_to_host_u64 (bytes);
327 fformat (stdout, "%d.%s.packets %lld\n",
328 sw_if_index, counter_name, packets);
329 fformat (stdout, "%d.%s.bytes %lld\n",
330 sw_if_index, counter_name, bytes);
336 /* Format an IP4 address. */
338 format_ip4_address (u8 * s, va_list * args)
340 u8 *a = va_arg (*args, u8 *);
341 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
344 /* Format an IP4 route destination and length. */
346 format_ip4_address_and_length (u8 * s, va_list * args)
348 u8 *a = va_arg (*args, u8 *);
349 u8 l = va_arg (*args, u32);
350 return format (s, "%U/%d", format_ip4_address, a, l);
354 vl_api_vnet_ip4_fib_counters_t_handler (vl_api_vnet_ip4_fib_counters_t * mp)
357 vl_api_ip4_fib_counter_t *ctrp;
360 count = ntohl (mp->count);
362 fformat (stdout, "fib id %d, count this msg %d\n",
363 ntohl (mp->vrf_id), count);
366 for (i = 0; i < count; i++)
368 fformat (stdout, "%U: %lld packets, %lld bytes\n",
369 format_ip4_address_and_length, &ctrp->address,
370 (u32) ctrp->address_length,
371 clib_net_to_host_u64 (ctrp->packets),
372 clib_net_to_host_u64 (ctrp->bytes));
377 /* Format an IP6 address. */
379 format_ip6_address (u8 * s, va_list * args)
381 ip6_address_t *a = va_arg (*args, ip6_address_t *);
382 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
384 i_max_n_zero = ARRAY_LEN (a->as_u16);
386 i_first_zero = i_max_n_zero;
388 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
390 u32 is_zero = a->as_u16[i] == 0;
391 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
397 if ((!is_zero && n_zeros > max_n_zeros)
398 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
400 i_max_n_zero = i_first_zero;
401 max_n_zeros = n_zeros;
402 i_first_zero = ARRAY_LEN (a->as_u16);
407 last_double_colon = 0;
408 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
410 if (i == i_max_n_zero && max_n_zeros > 1)
412 s = format (s, "::");
413 i += max_n_zeros - 1;
414 last_double_colon = 1;
418 s = format (s, "%s%x",
419 (last_double_colon || i == 0) ? "" : ":",
420 clib_net_to_host_u16 (a->as_u16[i]));
421 last_double_colon = 0;
428 /* Format an IP6 route destination and length. */
430 format_ip6_address_and_length (u8 * s, va_list * args)
432 ip6_address_t *a = va_arg (*args, ip6_address_t *);
433 u8 l = va_arg (*args, u32);
434 return format (s, "%U/%d", format_ip6_address, a, l);
438 vl_api_vnet_ip6_fib_counters_t_handler (vl_api_vnet_ip6_fib_counters_t * mp)
441 vl_api_ip6_fib_counter_t *ctrp;
444 count = ntohl (mp->count);
446 fformat (stdout, "fib id %d, count this msg %d\n",
447 ntohl (mp->vrf_id), count);
450 for (i = 0; i < count; i++)
452 fformat (stdout, "%U: %lld packets, %lld bytes\n",
453 format_ip6_address_and_length, &ctrp->address,
454 (u32) ctrp->address_length,
455 clib_net_to_host_u64 (ctrp->packets),
456 clib_net_to_host_u64 (ctrp->bytes));
462 vl_api_oam_event_t_handler (vl_api_oam_event_t * mp)
464 fformat (stdout, "OAM: %U now %s\n",
465 format_ip4_address, &mp->dst_address,
466 mp->state == 1 ? "alive" : "dead");
470 vl_api_oam_add_del_reply_t_handler (vl_api_oam_add_del_reply_t * mp)
472 fformat (stdout, "oam add del reply %d\n", ntohl (mp->retval));
476 vl_api_reset_fib_reply_t_handler (vl_api_reset_fib_reply_t * mp)
478 fformat (stdout, "fib reset reply %d\n", ntohl (mp->retval));
482 vl_api_dhcp_proxy_set_vss_reply_t_handler (vl_api_dhcp_proxy_set_vss_reply_t *
485 fformat (stdout, "dhcp proxy set vss reply %d\n", ntohl (mp->retval));
489 vl_api_dhcp_proxy_config_reply_t_handler (vl_api_dhcp_proxy_config_reply_t *
492 fformat (stdout, "dhcp proxy config reply %d\n", ntohl (mp->retval));
496 vl_api_set_ip_flow_hash_reply_t_handler (vl_api_set_ip_flow_hash_reply_t * mp)
498 fformat (stdout, "set ip flow hash reply %d\n", ntohl (mp->retval));
502 vl_api_sw_interface_ip6nd_ra_config_reply_t_handler
503 (vl_api_sw_interface_ip6nd_ra_config_reply_t * mp)
505 fformat (stdout, "ip6 nd ra-config reply %d\n", ntohl (mp->retval));
509 vl_api_sw_interface_ip6nd_ra_prefix_reply_t_handler
510 (vl_api_sw_interface_ip6nd_ra_prefix_reply_t * mp)
512 fformat (stdout, "ip6 nd ra-prefix reply %d\n", ntohl (mp->retval));
516 vl_api_sw_interface_ip6_enable_disable_reply_t_handler
517 (vl_api_sw_interface_ip6_enable_disable_reply_t * mp)
519 fformat (stdout, "ip6 enable/disable reply %d\n", ntohl (mp->retval));
523 vl_api_sw_interface_ip6_set_link_local_address_reply_t_handler
524 (vl_api_sw_interface_ip6_set_link_local_address_reply_t * mp)
526 fformat (stdout, "ip6 set link-local address reply %d\n",
530 static void vl_api_create_loopback_reply_t_handler
531 (vl_api_create_loopback_reply_t * mp)
533 fformat (stdout, "create loopback status %d, sw_if_index %d\n",
534 ntohl (mp->retval), ntohl (mp->sw_if_index));
537 static void vl_api_create_loopback_instance_reply_t_handler
538 (vl_api_create_loopback_instance_reply_t * mp)
540 fformat (stdout, "create loopback status %d, sw_if_index %d\n",
541 ntohl (mp->retval), ntohl (mp->sw_if_index));
545 vl_api_sr_tunnel_add_del_reply_t_handler (vl_api_sr_tunnel_add_del_reply_t *
548 fformat (stdout, "sr tunnel add/del reply %d\n", ntohl (mp->retval));
551 static void vl_api_l2_patch_add_del_reply_t_handler
552 (vl_api_l2_patch_add_del_reply_t * mp)
554 fformat (stdout, "l2 patch reply %d\n", ntohl (mp->retval));
557 static void vl_api_sw_interface_set_l2_xconnect_reply_t_handler
558 (vl_api_sw_interface_set_l2_xconnect_reply_t * mp)
560 fformat (stdout, "l2_xconnect reply %d\n", ntohl (mp->retval));
563 static void vl_api_sw_interface_set_l2_bridge_reply_t_handler
564 (vl_api_sw_interface_set_l2_bridge_reply_t * mp)
566 fformat (stdout, "l2_bridge reply %d\n", ntohl (mp->retval));
570 noop_handler (void *notused)
574 #define vl_api_vnet_ip4_fib_counters_t_endian noop_handler
575 #define vl_api_vnet_ip4_fib_counters_t_print noop_handler
576 #define vl_api_vnet_ip6_fib_counters_t_endian noop_handler
577 #define vl_api_vnet_ip6_fib_counters_t_print noop_handler
579 #define foreach_api_msg \
580 _(SW_INTERFACE_DETAILS, sw_interface_details) \
581 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
582 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
583 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
584 _(WANT_STATS_REPLY, want_stats_reply) \
585 _(WANT_OAM_EVENTS_REPLY, want_oam_events_reply) \
586 _(OAM_EVENT, oam_event) \
587 _(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
588 _(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
589 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
590 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
591 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
592 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, sw_interface_add_del_address_reply) \
593 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
594 _(TAP_CONNECT_REPLY, tap_connect_reply) \
595 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
596 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
597 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, proxy_arp_intfc_enable_disable_reply) \
598 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
599 _(RESET_FIB_REPLY, reset_fib_reply) \
600 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
601 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
602 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
603 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, sw_interface_ip6nd_ra_config_reply) \
604 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, sw_interface_ip6nd_ra_prefix_reply) \
605 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, sw_interface_ip6_enable_disable_reply) \
606 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, sw_interface_ip6_set_link_local_address_reply) \
607 _(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
608 _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
609 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
610 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, sw_interface_set_l2_xconnect_reply) \
611 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, sw_interface_set_l2_bridge_reply)
614 connect_to_vpe (char *name)
618 rv = vl_client_connect_to_vlib ("/vpe-api", name, 32);
621 vl_msg_api_set_handlers(VL_API_##N, #n, \
622 vl_api_##n##_t_handler, \
624 vl_api_##n##_t_endian, \
625 vl_api_##n##_t_print, \
626 sizeof(vl_api_##n##_t), 1);
630 shmem_hdr = api_main.shmem_hdr;
636 disconnect_from_vpe (void)
638 vl_client_disconnect_from_vlib ();
643 link_up_down_enable_disable (test_main_t * tm, int enable)
645 vl_api_want_interface_events_t *mp;
647 /* Request admin / link up down messages */
648 mp = vl_msg_api_alloc (sizeof (*mp));
649 memset (mp, 0, sizeof (*mp));
650 mp->_vl_msg_id = ntohs (VL_API_WANT_INTERFACE_EVENTS);
651 mp->client_index = tm->my_client_index;
652 mp->context = 0xdeadbeef;
653 mp->enable_disable = enable;
655 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
656 tm->link_events_on = enable;
660 stats_enable_disable (test_main_t * tm, int enable)
662 vl_api_want_stats_t *mp;
664 mp = vl_msg_api_alloc (sizeof (*mp));
665 memset (mp, 0, sizeof (*mp));
666 mp->_vl_msg_id = ntohs (VL_API_WANT_STATS);
667 mp->client_index = tm->my_client_index;
668 mp->context = 0xdeadbeef;
669 mp->enable_disable = enable;
671 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
672 tm->stats_on = enable;
676 oam_events_enable_disable (test_main_t * tm, int enable)
678 vl_api_want_oam_events_t *mp;
680 mp = vl_msg_api_alloc (sizeof (*mp));
681 memset (mp, 0, sizeof (*mp));
682 mp->_vl_msg_id = ntohs (VL_API_WANT_OAM_EVENTS);
683 mp->client_index = tm->my_client_index;
684 mp->context = 0xdeadbeef;
685 mp->enable_disable = enable;
687 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
688 tm->oam_events_on = enable;
692 oam_add_del (test_main_t * tm, int is_add)
694 vl_api_oam_add_del_t *mp;
697 mp = vl_msg_api_alloc (sizeof (*mp));
698 memset (mp, 0, sizeof (*mp));
699 mp->_vl_msg_id = ntohs (VL_API_OAM_ADD_DEL);
700 mp->client_index = tm->my_client_index;
701 mp->context = 0xdeadbeef;
704 tmp.as_u32 = ntohl (0xc0a80101); /* 192.168.1.1 */
705 clib_memcpy (mp->src_address, tmp.as_u8, 4);
707 tmp.as_u32 = ntohl (0xc0a80103); /* 192.168.1.3 */
708 clib_memcpy (mp->dst_address, tmp.as_u8, 4);
711 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
715 dump (test_main_t * tm)
717 vl_api_sw_interface_dump_t *mp;
719 mp = vl_msg_api_alloc (sizeof (*mp));
720 memset (mp, 0, sizeof (*mp));
721 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_DUMP);
722 mp->client_index = tm->my_client_index;
723 mp->name_filter_valid = 1;
724 strncpy ((char *) mp->name_filter, "eth", sizeof (mp->name_filter) - 1);
726 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
730 add_del_ip4_route (test_main_t * tm, int enable_disable)
732 vl_api_ip_add_del_route_t *mp;
735 mp = vl_msg_api_alloc (sizeof (*mp));
736 memset (mp, 0, sizeof (*mp));
737 mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
738 mp->client_index = tm->my_client_index;
739 mp->context = 0xdeadbeef;
740 mp->table_id = ntohl (0);
741 mp->create_vrf_if_needed = 1;
743 mp->next_hop_sw_if_index = ntohl (5);
744 mp->is_add = enable_disable;
745 mp->next_hop_weight = 1;
747 /* Next hop: 6.0.0.1 */
748 tmp = ntohl (0x06000001);
749 clib_memcpy (mp->next_hop_address, &tmp, sizeof (tmp));
751 /* Destination: 10.0.0.1/32 */
753 clib_memcpy (mp->dst_address, &tmp, sizeof (tmp));
754 mp->dst_address_length = 0;
756 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
760 add_del_ip6_route (test_main_t * tm, int enable_disable)
762 vl_api_ip_add_del_route_t *mp;
765 mp = vl_msg_api_alloc (sizeof (*mp));
766 memset (mp, 0, sizeof (*mp));
767 mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
768 mp->client_index = tm->my_client_index;
769 mp->context = 0xdeadbeef;
770 mp->next_hop_sw_if_index = ntohl (5);
771 mp->is_add = enable_disable;
773 mp->next_hop_weight = 1;
774 mp->dst_address_length = 64;
776 /* add/del dabe::/64 via db01::11 */
778 tmp[0] = clib_host_to_net_u64 (0xdabe000000000000ULL);
779 tmp[1] = clib_host_to_net_u64 (0x0ULL);
780 clib_memcpy (mp->dst_address, &tmp[0], 8);
781 clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
783 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
784 tmp[1] = clib_host_to_net_u64 (0x11ULL);
785 clib_memcpy (mp->next_hop_address, &tmp[0], 8);
786 clib_memcpy (&mp->next_hop_address[8], &tmp[1], 8);
788 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
792 add_del_interface_address (test_main_t * tm, int enable_disable)
794 vl_api_sw_interface_add_del_address_t *mp;
797 mp = vl_msg_api_alloc (sizeof (*mp));
798 memset (mp, 0, sizeof (*mp));
799 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
800 mp->client_index = tm->my_client_index;
801 mp->context = 0xdeadbeef;
802 mp->sw_if_index = ntohl (5);
803 mp->is_add = enable_disable;
804 mp->address_length = 8;
806 tmp = ntohl (0x01020304);
807 clib_memcpy (mp->address, &tmp, 4);
809 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
813 add_del_v6_interface_address (test_main_t * tm, int enable_disable)
815 vl_api_sw_interface_add_del_address_t *mp;
818 mp = vl_msg_api_alloc (sizeof (*mp));
819 memset (mp, 0, sizeof (*mp));
820 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
821 mp->client_index = tm->my_client_index;
822 mp->context = 0xdeadbeef;
824 mp->sw_if_index = ntohl (5);
825 mp->is_add = enable_disable;
826 mp->address_length = 64;
828 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
829 tmp[1] = clib_host_to_net_u64 (0x11ULL);
831 clib_memcpy (mp->address, &tmp[0], 8);
832 clib_memcpy (&mp->address[8], &tmp[1], 8);
834 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
838 del_all_interface_addresses (test_main_t * tm)
840 vl_api_sw_interface_add_del_address_t *mp;
842 mp = vl_msg_api_alloc (sizeof (*mp));
843 memset (mp, 0, sizeof (*mp));
844 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
845 mp->client_index = tm->my_client_index;
846 mp->context = 0xdeadbeef;
847 mp->sw_if_index = ntohl (5);
850 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
854 set_interface_table (test_main_t * tm, int is_ipv6, u32 vrf_id)
856 vl_api_sw_interface_set_table_t *mp;
858 mp = vl_msg_api_alloc (sizeof (*mp));
859 memset (mp, 0, sizeof (*mp));
860 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_TABLE);
861 mp->client_index = tm->my_client_index;
862 mp->context = 0xdeadbeef;
863 mp->sw_if_index = ntohl (5);
864 mp->is_ipv6 = is_ipv6;
865 mp->vrf_id = ntohl (vrf_id);
867 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
871 connect_unix_tap (test_main_t * tm, char *name)
873 vl_api_tap_connect_t *mp;
875 mp = vl_msg_api_alloc (sizeof (*mp));
876 memset (mp, 0, sizeof (*mp));
877 mp->_vl_msg_id = ntohs (VL_API_TAP_CONNECT);
878 mp->client_index = tm->my_client_index;
879 mp->context = 0xdeadbeef;
880 strncpy ((char *) mp->tap_name, name, sizeof (mp->tap_name) - 1);
881 mp->use_random_mac = 1;
882 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
886 create_vlan_subif (test_main_t * tm, u32 vlan_id)
888 vl_api_create_vlan_subif_t *mp;
890 mp = vl_msg_api_alloc (sizeof (*mp));
891 memset (mp, 0, sizeof (*mp));
892 mp->_vl_msg_id = ntohs (VL_API_CREATE_VLAN_SUBIF);
893 mp->client_index = tm->my_client_index;
894 mp->context = 0xdeadbeef;
895 mp->sw_if_index = ntohl (5);
896 mp->vlan_id = ntohl (vlan_id);
898 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
902 add_del_proxy_arp (test_main_t * tm, int is_add)
904 vl_api_proxy_arp_add_del_t *mp;
907 mp = vl_msg_api_alloc (sizeof (*mp));
908 memset (mp, 0, sizeof (*mp));
909 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_ADD_DEL);
910 mp->client_index = tm->my_client_index;
911 mp->context = 0xdeadbeef;
912 mp->vrf_id = ntohl (11);
915 /* proxy fib 11, 1.1.1.1 -> 1.1.1.10 */
916 tmp = ntohl (0x01010101);
917 clib_memcpy (mp->low_address, &tmp, 4);
919 tmp = ntohl (0x0101010a);
920 clib_memcpy (mp->hi_address, &tmp, 4);
922 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
926 proxy_arp_intfc_enable_disable (test_main_t * tm, int enable_disable)
928 vl_api_proxy_arp_intfc_enable_disable_t *mp;
930 mp = vl_msg_api_alloc (sizeof (*mp));
931 memset (mp, 0, sizeof (*mp));
932 mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE);
933 mp->client_index = tm->my_client_index;
934 mp->context = 0xdeadbeef;
935 mp->sw_if_index = ntohl (6);
936 mp->enable_disable = enable_disable;
938 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
942 add_ip4_neighbor (test_main_t * tm, int add_del)
944 vl_api_ip_neighbor_add_del_t *mp;
947 mp = vl_msg_api_alloc (sizeof (*mp));
948 memset (mp, 0, sizeof (*mp));
949 mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
950 mp->client_index = tm->my_client_index;
951 mp->context = 0xdeadbeef;
952 mp->vrf_id = ntohl (11);
953 mp->sw_if_index = ntohl (6);
954 mp->is_add = add_del;
956 memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
958 tmp = ntohl (0x0101010a);
959 clib_memcpy (mp->dst_address, &tmp, 4);
961 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
965 add_ip6_neighbor (test_main_t * tm, int add_del)
967 vl_api_ip_neighbor_add_del_t *mp;
970 mp = vl_msg_api_alloc (sizeof (*mp));
971 memset (mp, 0, sizeof (*mp));
972 mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
973 mp->client_index = tm->my_client_index;
974 mp->context = 0xdeadbeef;
975 mp->vrf_id = ntohl (11);
976 mp->sw_if_index = ntohl (6);
977 mp->is_add = add_del;
980 memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
982 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
983 tmp[1] = clib_host_to_net_u64 (0x11ULL);
985 clib_memcpy (mp->dst_address, &tmp[0], 8);
986 clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
988 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
992 reset_fib (test_main_t * tm, u8 is_ip6)
994 vl_api_reset_fib_t *mp;
996 mp = vl_msg_api_alloc (sizeof (*mp));
997 memset (mp, 0, sizeof (*mp));
998 mp->_vl_msg_id = ntohs (VL_API_RESET_FIB);
999 mp->client_index = tm->my_client_index;
1000 mp->context = 0xdeadbeef;
1001 mp->vrf_id = ntohl (11);
1002 mp->is_ipv6 = is_ip6;
1004 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1008 dhcpv6_set_vss (test_main_t * tm)
1010 vl_api_dhcp_proxy_set_vss_t *mp;
1012 mp = vl_msg_api_alloc (sizeof (*mp));
1013 memset (mp, 0, sizeof (*mp));
1014 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1015 mp->client_index = tm->my_client_index;
1016 mp->context = 0xdeadbeef;
1017 mp->oui = ntohl (6);
1018 mp->fib_id = ntohl (60);
1021 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1025 dhcpv4_set_vss (test_main_t * tm)
1027 vl_api_dhcp_proxy_set_vss_t *mp;
1029 mp = vl_msg_api_alloc (sizeof (*mp));
1030 memset (mp, 0, sizeof (*mp));
1031 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1032 mp->client_index = tm->my_client_index;
1033 mp->context = 0xdeadbeef;
1034 mp->oui = ntohl (4);
1035 mp->fib_id = ntohl (40);
1038 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1042 dhcp_set_vss (test_main_t * tm)
1044 dhcpv4_set_vss (tm);
1045 dhcpv6_set_vss (tm);
1049 dhcp_set_proxy (test_main_t * tm, int ipv6)
1051 vl_api_dhcp_proxy_config_t *mp;
1053 mp = vl_msg_api_alloc (sizeof (*mp));
1054 memset (mp, 0, sizeof (*mp));
1055 mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_CONFIG);
1056 mp->client_index = tm->my_client_index;
1057 mp->context = 0xdeadbeef;
1058 mp->vrf_id = ntohl (0);
1060 mp->insert_circuit_id = 1;
1062 mp->dhcp_server[0] = 0x20;
1063 mp->dhcp_server[1] = 0x01;
1064 mp->dhcp_server[2] = 0xab;
1065 mp->dhcp_server[3] = 0xcd;
1066 mp->dhcp_server[4] = 0x12;
1067 mp->dhcp_server[5] = 0x34;
1068 mp->dhcp_server[6] = 0xfe;
1069 mp->dhcp_server[7] = 0xdc;
1070 mp->dhcp_server[14] = 0;
1071 mp->dhcp_server[15] = 0x2;
1073 mp->dhcp_src_address[0] = 0x20;
1074 mp->dhcp_src_address[1] = 0x01;
1075 mp->dhcp_src_address[2] = 0xab;
1076 mp->dhcp_src_address[3] = 0xcd;
1077 mp->dhcp_src_address[4] = 0x12;
1078 mp->dhcp_src_address[5] = 0x34;
1079 mp->dhcp_src_address[6] = 0x56;
1080 mp->dhcp_src_address[7] = 0x78;
1081 mp->dhcp_src_address[14] = 0;
1082 mp->dhcp_src_address[15] = 0x2;
1084 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1088 set_ip_flow_hash (test_main_t * tm, u8 is_ip6)
1090 vl_api_set_ip_flow_hash_t *mp;
1092 mp = vl_msg_api_alloc (sizeof (*mp));
1093 memset (mp, 0, sizeof (*mp));
1094 mp->_vl_msg_id = ntohs (VL_API_SET_IP_FLOW_HASH);
1095 mp->client_index = tm->my_client_index;
1096 mp->context = 0xdeadbeef;
1098 mp->is_ipv6 = is_ip6;
1102 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1106 ip6nd_ra_config (test_main_t * tm, int is_no)
1108 vl_api_sw_interface_ip6nd_ra_config_t *mp;
1110 mp = vl_msg_api_alloc (sizeof (*mp));
1111 memset (mp, 0, sizeof (*mp));
1113 mp->client_index = tm->my_client_index;
1114 mp->context = 0xdeadbeef;
1115 mp->sw_if_index = ntohl (5);
1121 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_CONFIG);
1122 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1126 ip6nd_ra_prefix (test_main_t * tm, int is_no)
1128 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
1131 mp = vl_msg_api_alloc (sizeof (*mp));
1132 memset (mp, 0, sizeof (*mp));
1134 mp->client_index = tm->my_client_index;
1135 mp->context = 0xdeadbeef;
1136 mp->sw_if_index = ntohl (5);
1139 mp->use_default = 1;
1142 tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
1143 tmp[1] = clib_host_to_net_u64 (0x11ULL);
1146 clib_memcpy (mp->address, &tmp[0], 8);
1147 clib_memcpy (&mp->address[8], &tmp[1], 8);
1149 mp->address_length = 64;
1152 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_PREFIX);
1153 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1157 ip6_enable_disable (test_main_t * tm, int enable)
1159 vl_api_sw_interface_ip6_enable_disable_t *mp;
1161 mp = vl_msg_api_alloc (sizeof (*mp));
1162 memset (mp, 0, sizeof (*mp));
1164 mp->client_index = tm->my_client_index;
1165 mp->context = 0xdeadbeef;
1166 mp->sw_if_index = ntohl (5);
1167 mp->enable = (enable == 1);;
1169 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_ENABLE_DISABLE);
1170 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1174 loop_create (test_main_t * tm)
1176 vl_api_create_loopback_t *mp;
1178 mp = vl_msg_api_alloc (sizeof (*mp));
1179 memset (mp, 0, sizeof (*mp));
1181 mp->_vl_msg_id = ntohs (VL_API_CREATE_LOOPBACK);
1182 mp->client_index = tm->my_client_index;
1183 mp->context = 0xdeadbeef;
1184 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1188 ip6_set_link_local_address (test_main_t * tm)
1190 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
1193 mp = vl_msg_api_alloc (sizeof (*mp));
1194 memset (mp, 0, sizeof (*mp));
1196 mp->client_index = tm->my_client_index;
1197 mp->context = 0xdeadbeef;
1198 mp->sw_if_index = ntohl (5);
1200 tmp[0] = clib_host_to_net_u64 (0xfe80000000000000ULL);
1201 tmp[1] = clib_host_to_net_u64 (0x11ULL);
1203 clib_memcpy (mp->address, &tmp[0], 8);
1204 clib_memcpy (&mp->address[8], &tmp[1], 8);
1206 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS);
1208 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1213 set_flags (test_main_t * tm, int up_down)
1215 vl_api_sw_interface_set_flags_t *mp;
1217 mp = vl_msg_api_alloc (sizeof (*mp));
1218 memset (mp, 0, sizeof (*mp));
1220 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_FLAGS);
1221 mp->client_index = tm->my_client_index;
1222 mp->context = 0xdeadbeef;
1223 mp->sw_if_index = ntohl (5);
1224 mp->admin_up_down = up_down;
1225 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1230 l2_patch_add_del (test_main_t * tm, int is_add)
1232 vl_api_l2_patch_add_del_t *mp;
1234 mp = vl_msg_api_alloc (sizeof (*mp));
1235 memset (mp, 0, sizeof (*mp));
1236 mp->_vl_msg_id = ntohs (VL_API_L2_PATCH_ADD_DEL);
1237 mp->client_index = tm->my_client_index;
1238 mp->context = 0xdeadbeef;
1239 mp->is_add = is_add;
1240 mp->rx_sw_if_index = ntohl (1);
1241 mp->tx_sw_if_index = ntohl (2);
1243 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1247 l2_xconnect (test_main_t * tm)
1249 vl_api_sw_interface_set_l2_xconnect_t *mp;
1251 mp = vl_msg_api_alloc (sizeof (*mp));
1252 memset (mp, 0, sizeof (*mp));
1253 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_XCONNECT);
1254 mp->client_index = tm->my_client_index;
1255 mp->context = 0xdeadbeef;
1256 mp->rx_sw_if_index = ntohl (5);
1257 mp->tx_sw_if_index = ntohl (6);
1260 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1264 l2_bridge (test_main_t * tm)
1266 vl_api_sw_interface_set_l2_bridge_t *mp;
1268 mp = vl_msg_api_alloc (sizeof (*mp));
1269 memset (mp, 0, sizeof (*mp));
1270 mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_BRIDGE);
1271 mp->client_index = tm->my_client_index;
1272 mp->context = 0xdeadbeef;
1273 mp->rx_sw_if_index = ntohl (5);
1274 mp->bd_id = ntohl (6);
1275 mp->bvi = ntohl (1);
1276 mp->shg = ntohl (0);
1279 vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1283 main (int argc, char **argv)
1285 api_main_t *am = &api_main;
1286 test_main_t *tm = &test_main;
1289 connect_to_vpe ("test_client");
1291 tm->vl_input_queue = shmem_hdr->vl_input_queue;
1292 tm->my_client_index = am->my_client_index;
1294 fformat (stdout, "Type 'h' for help, 'q' to quit...\n");
1307 link_up_down_enable_disable (tm, 1 /* enable_disable */ );
1310 link_up_down_enable_disable (tm, 0 /* enable_disable */ );
1313 stats_enable_disable (tm, 1 /* enable_disable */ );
1316 stats_enable_disable (tm, 0 /* enable_disable */ );
1319 add_del_ip4_route (tm, 0 /* add */ );
1322 add_del_ip4_route (tm, 1 /* add */ );
1325 add_del_ip6_route (tm, 0 /* add */ );
1328 add_del_ip6_route (tm, 1 /* add */ );
1331 add_del_interface_address (tm, 1 /* add */ );
1334 add_del_interface_address (tm, 0 /* add */ );
1337 add_del_v6_interface_address (tm, 1 /* add */ );
1340 add_del_v6_interface_address (tm, 0 /* add */ );
1343 l2_patch_add_del (tm, 1 /* is_add */ );
1346 l2_patch_add_del (tm, 0 /* is_add */ );
1349 del_all_interface_addresses (tm);
1352 set_interface_table (tm, 0 /* is_ipv6 */ ,
1353 11 /* my amp goes to 11 */ );
1356 set_interface_table (tm, 1 /* is_ipv6 */ ,
1357 12 /* my amp goes to 12 */ );
1361 create_vlan_subif (tm, 123);
1365 connect_unix_tap (tm, "foo");
1369 add_ip4_neighbor (tm, 1 /* is_add */ );
1370 add_ip6_neighbor (tm, 1 /* is_add */ );
1374 add_ip4_neighbor (tm, 0 /* is_add */ );
1375 add_ip6_neighbor (tm, 0 /* is_add */ );
1379 add_del_proxy_arp (tm, 1 /* add */ );
1383 proxy_arp_intfc_enable_disable (tm, 1 /* enable */ );
1387 oam_events_enable_disable (tm, 0 /* enable */ );
1391 oam_events_enable_disable (tm, 1 /* enable */ );
1395 oam_add_del (tm, 0 /* is_add */ );
1399 oam_add_del (tm, 1 /* is_add */ );
1403 reset_fib (tm, 0 /* is_ip6 */ );
1407 reset_fib (tm, 1 /* is_ip6 */ );
1415 dhcp_set_proxy (tm, 0);
1419 dhcp_set_proxy (tm, 1 /*ipv6 */ );
1423 set_ip_flow_hash (tm, 0 /* is_ip6 */ );
1427 ip6_set_link_local_address (tm);
1431 ip6_enable_disable (tm, 1 /* enable */ );
1435 ip6_enable_disable (tm, 0 /* disable */ );
1439 ip6nd_ra_config (tm, 0 /* is_no */ );
1442 ip6nd_ra_config (tm, 1 /* is_no */ );
1445 ip6nd_ra_prefix (tm, 0 /* is_no */ );
1448 ip6nd_ra_prefix (tm, 1 /* is_no */ );
1456 set_flags (tm, 1 /* up_down */ );
1460 set_flags (tm, 0 /* up_down */ );
1472 fformat (stdout, "q=quit,d=dump,L=link evts on,l=link evts off\n");
1473 fformat (stdout, "S=stats on,s=stats off\n");
1474 fformat (stdout, "4=add v4 route, 3=del v4 route\n");
1475 fformat (stdout, "6=add v6 route, 5=del v6 route\n");
1476 fformat (stdout, "A=add v4 intfc route, a=del v4 intfc route\n");
1477 fformat (stdout, "B=add v6 intfc route, b=del v6 intfc route\n");
1478 fformat (stdout, "z=del all intfc routes\n");
1479 fformat (stdout, "t=set v4 intfc table, T=set v6 intfc table\n");
1480 fformat (stdout, "c=connect unix tap\n");
1482 "j=set dhcpv4 and v6 link-address/option-82 params\n");
1483 fformat (stdout, "k=set dhcpv4 relay agent params\n");
1484 fformat (stdout, "K=set dhcpv6 relay agent params\n");
1485 fformat (stdout, "E=add l2 patch, e=del l2 patch\n");
1486 fformat (stdout, "V=ip6 set link-local address \n");
1487 fformat (stdout, "w=ip6 enable \n");
1488 fformat (stdout, "W=ip6 disable \n");
1489 fformat (stdout, "x=ip6 nd config \n");
1490 fformat (stdout, "X=no ip6 nd config\n");
1491 fformat (stdout, "y=ip6 nd prefix \n");
1492 fformat (stdout, "Y=no ip6 nd prefix\n");
1493 fformat (stdout, "@=l2 xconnect\n");
1494 fformat (stdout, "#=l2 bridge\n");
1504 if (tm->link_events_on)
1505 link_up_down_enable_disable (tm, 0 /* enable */ );
1507 stats_enable_disable (tm, 0 /* enable */ );
1508 if (tm->oam_events_on)
1509 oam_events_enable_disable (tm, 0 /* enable */ );
1511 disconnect_from_vpe ();
1515 #undef vl_api_version
1516 #define vl_api_version(n,v) static u32 vpe_api_version = v;
1517 #include <vpp/api/vpe.api.h>
1518 #undef vl_api_version
1521 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
1524 * Send the main API signature in slot 0. This bit of code must
1525 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
1527 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
1531 * fd.io coding-style-patch-verification: ON
1534 * eval: (c-set-style "gnu")