844b97020969d01bc4094a5dbd0e3e99fc3d605d
[vpp.git] / src / vpp / api / test_client.c
1 /*
2  *------------------------------------------------------------------
3  * api.c - message handler registration
4  *
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:
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
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  *------------------------------------------------------------------
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <sys/types.h>
23 #include <sys/mman.h>
24 #include <sys/stat.h>
25 #include <netinet/in.h>
26 #include <signal.h>
27 #include <pthread.h>
28 #include <unistd.h>
29 #include <time.h>
30 #include <fcntl.h>
31 #include <string.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>
43
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>
49
50 #include <vpp/api/vpe_msg_enum.h>
51
52 #include <vnet/ip/ip.h>
53 #include <vnet/interface.h>
54
55 #define f64_endian(a)
56 #define f64_print(a,b)
57
58 #define vl_typedefs             /* define message structures */
59 #include <vpp/api/vpe_all_api_h.h>
60 #undef vl_typedefs
61
62 #define vl_endianfun            /* define message structures */
63 #include <vpp/api/vpe_all_api_h.h>
64 #undef vl_endianfun
65
66 /* instantiate all the print functions we know about */
67 #define vl_print(handle, ...)
68 #define vl_printfun
69 #include <vpp/api/vpe_all_api_h.h>
70 #undef vl_printfun
71
72 vl_shmem_hdr_t *shmem_hdr;
73
74 typedef struct
75 {
76   int link_events_on;
77   int stats_on;
78   int oam_events_on;
79
80   /* convenience */
81   unix_shared_memory_queue_t *vl_input_queue;
82   u32 my_client_index;
83 } test_main_t;
84
85 test_main_t test_main;
86
87 /*
88  * Satisfy external references when -lvlib is not available.
89  */
90 vlib_main_t vlib_global_main;
91 vlib_main_t **vlib_mains;
92
93 void
94 vlib_cli_output (struct vlib_main_t *vm, char *fmt, ...)
95 {
96   clib_warning ("vlib_cli_output callled...");
97 }
98
99 u8 *
100 format_ethernet_address (u8 * s, va_list * args)
101 {
102   u8 *a = va_arg (*args, u8 *);
103
104   return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
105                  a[0], a[1], a[2], a[3], a[4], a[5]);
106 }
107
108 static void
109 vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t * mp)
110 {
111   char *duplex, *speed;
112
113   switch (mp->link_duplex << VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT)
114     {
115     case VNET_HW_INTERFACE_FLAG_HALF_DUPLEX:
116       duplex = "half";
117       break;
118     case VNET_HW_INTERFACE_FLAG_FULL_DUPLEX:
119       duplex = "full";
120       break;
121     default:
122       duplex = "bogus";
123       break;
124     }
125   switch (mp->link_speed << VNET_HW_INTERFACE_FLAG_SPEED_SHIFT)
126     {
127     case VNET_HW_INTERFACE_FLAG_SPEED_10M:
128       speed = "10Mbps";
129       break;
130     case VNET_HW_INTERFACE_FLAG_SPEED_100M:
131       speed = "100Mbps";
132       break;
133     case VNET_HW_INTERFACE_FLAG_SPEED_1G:
134       speed = "1Gbps";
135       break;
136     case VNET_HW_INTERFACE_FLAG_SPEED_10G:
137       speed = "10Gbps";
138       break;
139     case VNET_HW_INTERFACE_FLAG_SPEED_40G:
140       speed = "40Gbps";
141       break;
142     case VNET_HW_INTERFACE_FLAG_SPEED_100G:
143       speed = "100Gbps";
144       break;
145     default:
146       speed = "bogus";
147       break;
148     }
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);
153
154   if (mp->l2_address_length)
155     fformat (stdout, "  l2 address: %U\n",
156              format_ethernet_address, mp->l2_address);
157   else
158     fformat (stdout, "\n");
159 }
160
161 static void
162 vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
163 {
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");
168 }
169
170 static void
171   vl_api_sw_interface_set_flags_reply_t_handler
172   (vl_api_sw_interface_set_flags_reply_t * mp)
173 {
174   fformat (stdout, "set flags reply: reply %d\n", ntohl (mp->retval));
175 }
176
177 static void
178   vl_api_want_interface_events_reply_t_handler
179   (vl_api_want_interface_events_reply_t * mp)
180 {
181 }
182
183 static void
184 vl_api_want_stats_reply_t_handler (vl_api_want_stats_reply_t * mp)
185 {
186   fformat (stdout, "want stats reply %d\n", ntohl (mp->retval));
187 }
188
189 static void
190 vl_api_want_oam_events_reply_t_handler (vl_api_want_oam_events_reply_t * mp)
191 {
192   fformat (stdout, "want oam reply %d\n", ntohl (mp->retval));
193 }
194
195 static void
196 vl_api_ip_add_del_route_reply_t_handler (vl_api_ip_add_del_route_reply_t * mp)
197 {
198   fformat (stdout, "add_route reply %d\n", ntohl (mp->retval));
199 }
200
201 static void
202   vl_api_sw_interface_add_del_address_reply_t_handler
203   (vl_api_sw_interface_add_del_address_reply_t * mp)
204 {
205   fformat (stdout, "add_del_address reply %d\n", ntohl (mp->retval));
206 }
207
208 static void
209   vl_api_sw_interface_set_table_reply_t_handler
210   (vl_api_sw_interface_set_table_reply_t * mp)
211 {
212   fformat (stdout, "set_table reply %d\n", ntohl (mp->retval));
213 }
214
215 static void
216 vl_api_tap_connect_reply_t_handler (vl_api_tap_connect_reply_t * mp)
217 {
218   fformat (stdout, "tap connect reply %d, sw_if_index %d\n",
219            ntohl (mp->retval), ntohl (mp->sw_if_index));
220 }
221
222 static void
223 vl_api_create_vlan_subif_reply_t_handler (vl_api_create_vlan_subif_reply_t *
224                                           mp)
225 {
226   fformat (stdout, "create vlan subif reply %d, sw_if_index %d\n",
227            ntohl (mp->retval), ntohl (mp->sw_if_index));
228 }
229
230 static void vl_api_proxy_arp_add_del_reply_t_handler
231   (vl_api_proxy_arp_add_del_reply_t * mp)
232 {
233   fformat (stdout, "add del proxy arp reply %d\n", ntohl (mp->retval));
234 }
235
236 static void vl_api_proxy_arp_intfc_enable_disable_reply_t_handler
237   (vl_api_proxy_arp_intfc_enable_disable_reply_t * mp)
238 {
239   fformat (stdout, "proxy arp intfc ena/dis reply %d\n", ntohl (mp->retval));
240 }
241
242 static void vl_api_ip_neighbor_add_del_reply_t_handler
243   (vl_api_ip_neighbor_add_del_reply_t * mp)
244 {
245   fformat (stdout, "ip neighbor add del reply %d\n", ntohl (mp->retval));
246 }
247
248 #if 0
249 static void
250 vl_api_vnet_interface_counters_t_handler (vl_api_vnet_interface_counters_t *
251                                           mp)
252 {
253   char *counter_name;
254   u32 count, sw_if_index;
255   int i;
256
257   count = ntohl (mp->count);
258   sw_if_index = ntohl (mp->first_sw_if_index);
259   if (mp->is_combined == 0)
260     {
261       u64 *vp, v;
262       vp = (u64 *) mp->data;
263
264       switch (mp->vnet_counter_type)
265         {
266         case VNET_INTERFACE_COUNTER_DROP:
267           counter_name = "drop";
268           break;
269         case VNET_INTERFACE_COUNTER_PUNT:
270           counter_name = "punt";
271           break;
272         case VNET_INTERFACE_COUNTER_IP4:
273           counter_name = "ip4";
274           break;
275         case VNET_INTERFACE_COUNTER_IP6:
276           counter_name = "ip6";
277           break;
278         case VNET_INTERFACE_COUNTER_RX_NO_BUF:
279           counter_name = "rx-no-buf";
280           break;
281         case VNET_INTERFACE_COUNTER_RX_MISS:
282           counter_name = "rx-miss";
283           break;
284         case VNET_INTERFACE_COUNTER_RX_ERROR:
285           counter_name = "rx-error";
286           break;
287         case VNET_INTERFACE_COUNTER_TX_ERROR:
288           counter_name = "tx-error (fifo-full)";
289           break;
290         default:
291           counter_name = "bogus";
292           break;
293         }
294       for (i = 0; i < count; i++)
295         {
296           v = clib_mem_unaligned (vp, u64);
297           v = clib_net_to_host_u64 (v);
298           vp++;
299           fformat (stdout, "%d.%s %lld\n", sw_if_index, counter_name, v);
300           sw_if_index++;
301         }
302     }
303   else
304     {
305       vlib_counter_t *vp;
306       u64 packets, bytes;
307       vp = (vlib_counter_t *) mp->data;
308
309       switch (mp->vnet_counter_type)
310         {
311         case VNET_INTERFACE_COUNTER_RX:
312           counter_name = "rx";
313           break;
314         case VNET_INTERFACE_COUNTER_TX:
315           counter_name = "tx";
316           break;
317         default:
318           counter_name = "bogus";
319           break;
320         }
321       for (i = 0; i < count; i++)
322         {
323           packets = clib_mem_unaligned (&vp->packets, u64);
324           packets = clib_net_to_host_u64 (packets);
325           bytes = clib_mem_unaligned (&vp->bytes, u64);
326           bytes = clib_net_to_host_u64 (bytes);
327           vp++;
328           fformat (stdout, "%d.%s.packets %lld\n",
329                    sw_if_index, counter_name, packets);
330           fformat (stdout, "%d.%s.bytes %lld\n",
331                    sw_if_index, counter_name, bytes);
332           sw_if_index++;
333         }
334     }
335 }
336 #endif
337
338 /* Format an IP4 address. */
339 u8 *
340 format_ip4_address (u8 * s, va_list * args)
341 {
342   u8 *a = va_arg (*args, u8 *);
343   return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
344 }
345
346 /* Format an IP4 route destination and length. */
347 u8 *
348 format_ip4_address_and_length (u8 * s, va_list * args)
349 {
350   u8 *a = va_arg (*args, u8 *);
351   u8 l = va_arg (*args, u32);
352   return format (s, "%U/%d", format_ip4_address, a, l);
353 }
354
355 static void
356 vl_api_vnet_ip4_fib_counters_t_handler (vl_api_vnet_ip4_fib_counters_t * mp)
357 {
358   int i;
359   vl_api_ip4_fib_counter_t *ctrp;
360   u32 count;
361
362   count = ntohl (mp->count);
363
364   fformat (stdout, "fib id %d, count this msg %d\n",
365            ntohl (mp->vrf_id), count);
366
367   ctrp = mp->c;
368   for (i = 0; i < count; i++)
369     {
370       fformat (stdout, "%U: %lld packets, %lld bytes\n",
371                format_ip4_address_and_length, &ctrp->address,
372                (u32) ctrp->address_length,
373                clib_net_to_host_u64 (ctrp->packets),
374                clib_net_to_host_u64 (ctrp->bytes));
375       ctrp++;
376     }
377 }
378
379 /* Format an IP6 address. */
380 u8 *
381 format_ip6_address (u8 * s, va_list * args)
382 {
383   ip6_address_t *a = va_arg (*args, ip6_address_t *);
384   u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
385
386   i_max_n_zero = ARRAY_LEN (a->as_u16);
387   max_n_zeros = 0;
388   i_first_zero = i_max_n_zero;
389   n_zeros = 0;
390   for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
391     {
392       u32 is_zero = a->as_u16[i] == 0;
393       if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
394         {
395           i_first_zero = i;
396           n_zeros = 0;
397         }
398       n_zeros += is_zero;
399       if ((!is_zero && n_zeros > max_n_zeros)
400           || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
401         {
402           i_max_n_zero = i_first_zero;
403           max_n_zeros = n_zeros;
404           i_first_zero = ARRAY_LEN (a->as_u16);
405           n_zeros = 0;
406         }
407     }
408
409   last_double_colon = 0;
410   for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
411     {
412       if (i == i_max_n_zero && max_n_zeros > 1)
413         {
414           s = format (s, "::");
415           i += max_n_zeros - 1;
416           last_double_colon = 1;
417         }
418       else
419         {
420           s = format (s, "%s%x",
421                       (last_double_colon || i == 0) ? "" : ":",
422                       clib_net_to_host_u16 (a->as_u16[i]));
423           last_double_colon = 0;
424         }
425     }
426
427   return s;
428 }
429
430 /* Format an IP6 route destination and length. */
431 u8 *
432 format_ip6_address_and_length (u8 * s, va_list * args)
433 {
434   ip6_address_t *a = va_arg (*args, ip6_address_t *);
435   u8 l = va_arg (*args, u32);
436   return format (s, "%U/%d", format_ip6_address, a, l);
437 }
438
439 static void
440 vl_api_vnet_ip6_fib_counters_t_handler (vl_api_vnet_ip6_fib_counters_t * mp)
441 {
442   int i;
443   vl_api_ip6_fib_counter_t *ctrp;
444   u32 count;
445
446   count = ntohl (mp->count);
447
448   fformat (stdout, "fib id %d, count this msg %d\n",
449            ntohl (mp->vrf_id), count);
450
451   ctrp = mp->c;
452   for (i = 0; i < count; i++)
453     {
454       fformat (stdout, "%U: %lld packets, %lld bytes\n",
455                format_ip6_address_and_length, &ctrp->address,
456                (u32) ctrp->address_length,
457                clib_net_to_host_u64 (ctrp->packets),
458                clib_net_to_host_u64 (ctrp->bytes));
459       ctrp++;
460     }
461 }
462
463 static void
464 vl_api_oam_event_t_handler (vl_api_oam_event_t * mp)
465 {
466   fformat (stdout, "OAM: %U now %s\n",
467            format_ip4_address, &mp->dst_address,
468            mp->state == 1 ? "alive" : "dead");
469 }
470
471 static void
472 vl_api_oam_add_del_reply_t_handler (vl_api_oam_add_del_reply_t * mp)
473 {
474   fformat (stdout, "oam add del reply %d\n", ntohl (mp->retval));
475 }
476
477 static void
478 vl_api_reset_fib_reply_t_handler (vl_api_reset_fib_reply_t * mp)
479 {
480   fformat (stdout, "fib reset reply %d\n", ntohl (mp->retval));
481 }
482
483 static void
484 vl_api_dhcp_proxy_set_vss_reply_t_handler (vl_api_dhcp_proxy_set_vss_reply_t *
485                                            mp)
486 {
487   fformat (stdout, "dhcp proxy set vss reply %d\n", ntohl (mp->retval));
488 }
489
490 static void
491 vl_api_dhcp_proxy_config_reply_t_handler (vl_api_dhcp_proxy_config_reply_t *
492                                           mp)
493 {
494   fformat (stdout, "dhcp proxy config reply %d\n", ntohl (mp->retval));
495 }
496
497 static void
498 vl_api_set_ip_flow_hash_reply_t_handler (vl_api_set_ip_flow_hash_reply_t * mp)
499 {
500   fformat (stdout, "set ip flow hash reply %d\n", ntohl (mp->retval));
501 }
502
503 static void
504   vl_api_sw_interface_ip6nd_ra_config_reply_t_handler
505   (vl_api_sw_interface_ip6nd_ra_config_reply_t * mp)
506 {
507   fformat (stdout, "ip6 nd ra-config  reply %d\n", ntohl (mp->retval));
508 }
509
510 static void
511   vl_api_sw_interface_ip6nd_ra_prefix_reply_t_handler
512   (vl_api_sw_interface_ip6nd_ra_prefix_reply_t * mp)
513 {
514   fformat (stdout, "ip6 nd ra-prefix  reply %d\n", ntohl (mp->retval));
515 }
516
517 static void
518   vl_api_sw_interface_ip6_enable_disable_reply_t_handler
519   (vl_api_sw_interface_ip6_enable_disable_reply_t * mp)
520 {
521   fformat (stdout, "ip6 enable/disable reply %d\n", ntohl (mp->retval));
522 }
523
524 static void
525   vl_api_sw_interface_ip6_set_link_local_address_reply_t_handler
526   (vl_api_sw_interface_ip6_set_link_local_address_reply_t * mp)
527 {
528   fformat (stdout, "ip6 set link-local address reply %d\n",
529            ntohl (mp->retval));
530 }
531
532 static void vl_api_create_loopback_reply_t_handler
533   (vl_api_create_loopback_reply_t * mp)
534 {
535   fformat (stdout, "create loopback status %d, sw_if_index %d\n",
536            ntohl (mp->retval), ntohl (mp->sw_if_index));
537 }
538
539 static void vl_api_create_loopback_instance_reply_t_handler
540   (vl_api_create_loopback_instance_reply_t * mp)
541 {
542   fformat (stdout, "create loopback status %d, sw_if_index %d\n",
543            ntohl (mp->retval), ntohl (mp->sw_if_index));
544 }
545
546 static void vl_api_l2_patch_add_del_reply_t_handler
547   (vl_api_l2_patch_add_del_reply_t * mp)
548 {
549   fformat (stdout, "l2 patch reply %d\n", ntohl (mp->retval));
550 }
551
552 static void vl_api_sw_interface_set_l2_xconnect_reply_t_handler
553   (vl_api_sw_interface_set_l2_xconnect_reply_t * mp)
554 {
555   fformat (stdout, "l2_xconnect reply %d\n", ntohl (mp->retval));
556 }
557
558 static void vl_api_sw_interface_set_l2_bridge_reply_t_handler
559   (vl_api_sw_interface_set_l2_bridge_reply_t * mp)
560 {
561   fformat (stdout, "l2_bridge reply %d\n", ntohl (mp->retval));
562 }
563
564 static void
565 noop_handler (void *notused)
566 {
567 }
568
569 #define vl_api_vnet_ip4_fib_counters_t_endian noop_handler
570 #define vl_api_vnet_ip4_fib_counters_t_print noop_handler
571 #define vl_api_vnet_ip6_fib_counters_t_endian noop_handler
572 #define vl_api_vnet_ip6_fib_counters_t_print noop_handler
573
574 #define foreach_api_msg                                                 \
575 _(SW_INTERFACE_DETAILS, sw_interface_details)                           \
576 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags)                       \
577 _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply)           \
578 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply)             \
579 _(WANT_STATS_REPLY, want_stats_reply)                                   \
580 _(WANT_OAM_EVENTS_REPLY, want_oam_events_reply)                         \
581 _(OAM_EVENT, oam_event)                                                 \
582 _(OAM_ADD_DEL_REPLY, oam_add_del_reply)                                 \
583 _(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters)                         \
584 _(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters)                         \
585 _(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply)                       \
586 _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, sw_interface_add_del_address_reply) \
587 _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply)           \
588 _(TAP_CONNECT_REPLY, tap_connect_reply)                                 \
589 _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply)                     \
590 _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply)                     \
591 _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, proxy_arp_intfc_enable_disable_reply) \
592 _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply)                 \
593 _(RESET_FIB_REPLY, reset_fib_reply)                                     \
594 _(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply)                     \
595 _(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply)                   \
596 _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply)                       \
597 _(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, sw_interface_ip6nd_ra_config_reply) \
598 _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, sw_interface_ip6nd_ra_prefix_reply) \
599 _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, sw_interface_ip6_enable_disable_reply) \
600 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, sw_interface_ip6_set_link_local_address_reply) \
601  _(CREATE_LOOPBACK_REPLY, create_loopback_reply)                        \
602  _(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply)      \
603 _(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply)                       \
604 _(SW_INTERFACE_SET_L2_XCONNECT_REPLY, sw_interface_set_l2_xconnect_reply) \
605 _(SW_INTERFACE_SET_L2_BRIDGE_REPLY, sw_interface_set_l2_bridge_reply)
606
607 int
608 connect_to_vpe (char *name)
609 {
610   int rv = 0;
611
612   rv = vl_client_connect_to_vlib ("/vpe-api", name, 32);
613
614 #define _(N,n)                                                  \
615     vl_msg_api_set_handlers(VL_API_##N, #n,                     \
616                            vl_api_##n##_t_handler,              \
617                            noop_handler,                        \
618                            vl_api_##n##_t_endian,               \
619                            vl_api_##n##_t_print,                \
620                            sizeof(vl_api_##n##_t), 1);
621   foreach_api_msg;
622 #undef _
623
624   shmem_hdr = api_main.shmem_hdr;
625
626   return rv;
627 }
628
629 int
630 disconnect_from_vpe (void)
631 {
632   vl_client_disconnect_from_vlib ();
633   return 0;
634 }
635
636 void
637 link_up_down_enable_disable (test_main_t * tm, int enable)
638 {
639   vl_api_want_interface_events_t *mp;
640
641   /* Request admin / link up down messages */
642   mp = vl_msg_api_alloc (sizeof (*mp));
643   memset (mp, 0, sizeof (*mp));
644   mp->_vl_msg_id = ntohs (VL_API_WANT_INTERFACE_EVENTS);
645   mp->client_index = tm->my_client_index;
646   mp->context = 0xdeadbeef;
647   mp->enable_disable = enable;
648   mp->pid = getpid ();
649   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
650   tm->link_events_on = enable;
651 }
652
653 void
654 stats_enable_disable (test_main_t * tm, int enable)
655 {
656   vl_api_want_stats_t *mp;
657
658   mp = vl_msg_api_alloc (sizeof (*mp));
659   memset (mp, 0, sizeof (*mp));
660   mp->_vl_msg_id = ntohs (VL_API_WANT_STATS);
661   mp->client_index = tm->my_client_index;
662   mp->context = 0xdeadbeef;
663   mp->enable_disable = enable;
664   mp->pid = getpid ();
665   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
666   tm->stats_on = enable;
667 }
668
669 void
670 oam_events_enable_disable (test_main_t * tm, int enable)
671 {
672   vl_api_want_oam_events_t *mp;
673
674   mp = vl_msg_api_alloc (sizeof (*mp));
675   memset (mp, 0, sizeof (*mp));
676   mp->_vl_msg_id = ntohs (VL_API_WANT_OAM_EVENTS);
677   mp->client_index = tm->my_client_index;
678   mp->context = 0xdeadbeef;
679   mp->enable_disable = enable;
680   mp->pid = getpid ();
681   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
682   tm->oam_events_on = enable;
683 }
684
685 void
686 oam_add_del (test_main_t * tm, int is_add)
687 {
688   vl_api_oam_add_del_t *mp;
689   ip4_address_t tmp;
690
691   mp = vl_msg_api_alloc (sizeof (*mp));
692   memset (mp, 0, sizeof (*mp));
693   mp->_vl_msg_id = ntohs (VL_API_OAM_ADD_DEL);
694   mp->client_index = tm->my_client_index;
695   mp->context = 0xdeadbeef;
696   mp->is_add = is_add;
697
698   tmp.as_u32 = ntohl (0xc0a80101);      /* 192.168.1.1 */
699   clib_memcpy (mp->src_address, tmp.as_u8, 4);
700
701   tmp.as_u32 = ntohl (0xc0a80103);      /* 192.168.1.3 */
702   clib_memcpy (mp->dst_address, tmp.as_u8, 4);
703
704   mp->vrf_id = 0;
705   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
706 }
707
708 void
709 dump (test_main_t * tm)
710 {
711   vl_api_sw_interface_dump_t *mp;
712
713   mp = vl_msg_api_alloc (sizeof (*mp));
714   memset (mp, 0, sizeof (*mp));
715   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_DUMP);
716   mp->client_index = tm->my_client_index;
717   mp->name_filter_valid = 1;
718   strncpy ((char *) mp->name_filter, "eth", sizeof (mp->name_filter) - 1);
719
720   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
721 }
722
723 void
724 add_del_ip4_route (test_main_t * tm, int enable_disable)
725 {
726   vl_api_ip_add_del_route_t *mp;
727   u32 tmp;
728
729   mp = vl_msg_api_alloc (sizeof (*mp));
730   memset (mp, 0, sizeof (*mp));
731   mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
732   mp->client_index = tm->my_client_index;
733   mp->context = 0xdeadbeef;
734   mp->table_id = ntohl (0);
735   mp->create_vrf_if_needed = 1;
736
737   mp->next_hop_sw_if_index = ntohl (5);
738   mp->is_add = enable_disable;
739   mp->next_hop_weight = 1;
740
741   /* Next hop: 6.0.0.1 */
742   tmp = ntohl (0x06000001);
743   clib_memcpy (mp->next_hop_address, &tmp, sizeof (tmp));
744
745   /* Destination: 10.0.0.1/32 */
746   tmp = ntohl (0x0);
747   clib_memcpy (mp->dst_address, &tmp, sizeof (tmp));
748   mp->dst_address_length = 0;
749
750   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
751 }
752
753 void
754 add_del_ip6_route (test_main_t * tm, int enable_disable)
755 {
756   vl_api_ip_add_del_route_t *mp;
757   u64 tmp[2];
758
759   mp = vl_msg_api_alloc (sizeof (*mp));
760   memset (mp, 0, sizeof (*mp));
761   mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
762   mp->client_index = tm->my_client_index;
763   mp->context = 0xdeadbeef;
764   mp->next_hop_sw_if_index = ntohl (5);
765   mp->is_add = enable_disable;
766   mp->is_ipv6 = 1;
767   mp->next_hop_weight = 1;
768   mp->dst_address_length = 64;
769
770   /* add/del dabe::/64 via db01::11 */
771
772   tmp[0] = clib_host_to_net_u64 (0xdabe000000000000ULL);
773   tmp[1] = clib_host_to_net_u64 (0x0ULL);
774   clib_memcpy (mp->dst_address, &tmp[0], 8);
775   clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
776
777   tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
778   tmp[1] = clib_host_to_net_u64 (0x11ULL);
779   clib_memcpy (mp->next_hop_address, &tmp[0], 8);
780   clib_memcpy (&mp->next_hop_address[8], &tmp[1], 8);
781
782   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
783 }
784
785 void
786 add_del_interface_address (test_main_t * tm, int enable_disable)
787 {
788   vl_api_sw_interface_add_del_address_t *mp;
789   u32 tmp;
790
791   mp = vl_msg_api_alloc (sizeof (*mp));
792   memset (mp, 0, sizeof (*mp));
793   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
794   mp->client_index = tm->my_client_index;
795   mp->context = 0xdeadbeef;
796   mp->sw_if_index = ntohl (5);
797   mp->is_add = enable_disable;
798   mp->address_length = 8;
799
800   tmp = ntohl (0x01020304);
801   clib_memcpy (mp->address, &tmp, 4);
802
803   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
804 }
805
806 void
807 add_del_v6_interface_address (test_main_t * tm, int enable_disable)
808 {
809   vl_api_sw_interface_add_del_address_t *mp;
810   u64 tmp[2];
811
812   mp = vl_msg_api_alloc (sizeof (*mp));
813   memset (mp, 0, sizeof (*mp));
814   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
815   mp->client_index = tm->my_client_index;
816   mp->context = 0xdeadbeef;
817   mp->is_ipv6 = 1;
818   mp->sw_if_index = ntohl (5);
819   mp->is_add = enable_disable;
820   mp->address_length = 64;
821
822   tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
823   tmp[1] = clib_host_to_net_u64 (0x11ULL);
824
825   clib_memcpy (mp->address, &tmp[0], 8);
826   clib_memcpy (&mp->address[8], &tmp[1], 8);
827
828   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
829 }
830
831 void
832 del_all_interface_addresses (test_main_t * tm)
833 {
834   vl_api_sw_interface_add_del_address_t *mp;
835
836   mp = vl_msg_api_alloc (sizeof (*mp));
837   memset (mp, 0, sizeof (*mp));
838   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_ADD_DEL_ADDRESS);
839   mp->client_index = tm->my_client_index;
840   mp->context = 0xdeadbeef;
841   mp->sw_if_index = ntohl (5);
842   mp->del_all = 1;
843
844   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
845 }
846
847 void
848 set_interface_table (test_main_t * tm, int is_ipv6, u32 vrf_id)
849 {
850   vl_api_sw_interface_set_table_t *mp;
851
852   mp = vl_msg_api_alloc (sizeof (*mp));
853   memset (mp, 0, sizeof (*mp));
854   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_TABLE);
855   mp->client_index = tm->my_client_index;
856   mp->context = 0xdeadbeef;
857   mp->sw_if_index = ntohl (5);
858   mp->is_ipv6 = is_ipv6;
859   mp->vrf_id = ntohl (vrf_id);
860
861   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
862 }
863
864 void
865 connect_unix_tap (test_main_t * tm, char *name)
866 {
867   vl_api_tap_connect_t *mp;
868
869   mp = vl_msg_api_alloc (sizeof (*mp));
870   memset (mp, 0, sizeof (*mp));
871   mp->_vl_msg_id = ntohs (VL_API_TAP_CONNECT);
872   mp->client_index = tm->my_client_index;
873   mp->context = 0xdeadbeef;
874   strncpy ((char *) mp->tap_name, name, sizeof (mp->tap_name) - 1);
875   mp->use_random_mac = 1;
876   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
877 }
878
879 void
880 create_vlan_subif (test_main_t * tm, u32 vlan_id)
881 {
882   vl_api_create_vlan_subif_t *mp;
883
884   mp = vl_msg_api_alloc (sizeof (*mp));
885   memset (mp, 0, sizeof (*mp));
886   mp->_vl_msg_id = ntohs (VL_API_CREATE_VLAN_SUBIF);
887   mp->client_index = tm->my_client_index;
888   mp->context = 0xdeadbeef;
889   mp->sw_if_index = ntohl (5);
890   mp->vlan_id = ntohl (vlan_id);
891
892   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
893 }
894
895 void
896 add_del_proxy_arp (test_main_t * tm, int is_add)
897 {
898   vl_api_proxy_arp_add_del_t *mp;
899   u32 tmp;
900
901   mp = vl_msg_api_alloc (sizeof (*mp));
902   memset (mp, 0, sizeof (*mp));
903   mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_ADD_DEL);
904   mp->client_index = tm->my_client_index;
905   mp->context = 0xdeadbeef;
906   mp->vrf_id = ntohl (11);
907   mp->is_add = is_add;
908
909   /* proxy fib 11, 1.1.1.1 -> 1.1.1.10 */
910   tmp = ntohl (0x01010101);
911   clib_memcpy (mp->low_address, &tmp, 4);
912
913   tmp = ntohl (0x0101010a);
914   clib_memcpy (mp->hi_address, &tmp, 4);
915
916   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
917 }
918
919 void
920 proxy_arp_intfc_enable_disable (test_main_t * tm, int enable_disable)
921 {
922   vl_api_proxy_arp_intfc_enable_disable_t *mp;
923
924   mp = vl_msg_api_alloc (sizeof (*mp));
925   memset (mp, 0, sizeof (*mp));
926   mp->_vl_msg_id = ntohs (VL_API_PROXY_ARP_INTFC_ENABLE_DISABLE);
927   mp->client_index = tm->my_client_index;
928   mp->context = 0xdeadbeef;
929   mp->sw_if_index = ntohl (6);
930   mp->enable_disable = enable_disable;
931
932   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
933 }
934
935 void
936 add_ip4_neighbor (test_main_t * tm, int add_del)
937 {
938   vl_api_ip_neighbor_add_del_t *mp;
939   u32 tmp;
940
941   mp = vl_msg_api_alloc (sizeof (*mp));
942   memset (mp, 0, sizeof (*mp));
943   mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
944   mp->client_index = tm->my_client_index;
945   mp->context = 0xdeadbeef;
946   mp->sw_if_index = ntohl (6);
947   mp->is_add = add_del;
948
949   memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
950
951   tmp = ntohl (0x0101010a);
952   clib_memcpy (mp->dst_address, &tmp, 4);
953
954   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
955 }
956
957 void
958 add_ip6_neighbor (test_main_t * tm, int add_del)
959 {
960   vl_api_ip_neighbor_add_del_t *mp;
961   u64 tmp[2];
962
963   mp = vl_msg_api_alloc (sizeof (*mp));
964   memset (mp, 0, sizeof (*mp));
965   mp->_vl_msg_id = ntohs (VL_API_IP_NEIGHBOR_ADD_DEL);
966   mp->client_index = tm->my_client_index;
967   mp->context = 0xdeadbeef;
968   mp->sw_if_index = ntohl (6);
969   mp->is_add = add_del;
970   mp->is_ipv6 = 1;
971
972   memset (mp->mac_address, 0xbe, sizeof (mp->mac_address));
973
974   tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
975   tmp[1] = clib_host_to_net_u64 (0x11ULL);
976
977   clib_memcpy (mp->dst_address, &tmp[0], 8);
978   clib_memcpy (&mp->dst_address[8], &tmp[1], 8);
979
980   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
981 }
982
983 void
984 reset_fib (test_main_t * tm, u8 is_ip6)
985 {
986   vl_api_reset_fib_t *mp;
987
988   mp = vl_msg_api_alloc (sizeof (*mp));
989   memset (mp, 0, sizeof (*mp));
990   mp->_vl_msg_id = ntohs (VL_API_RESET_FIB);
991   mp->client_index = tm->my_client_index;
992   mp->context = 0xdeadbeef;
993   mp->vrf_id = ntohl (11);
994   mp->is_ipv6 = is_ip6;
995
996   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
997 }
998
999 void
1000 dhcpv6_set_vss (test_main_t * tm)
1001 {
1002   vl_api_dhcp_proxy_set_vss_t *mp;
1003
1004   mp = vl_msg_api_alloc (sizeof (*mp));
1005   memset (mp, 0, sizeof (*mp));
1006   mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1007   mp->client_index = tm->my_client_index;
1008   mp->context = 0xdeadbeef;
1009   mp->oui = ntohl (6);
1010   mp->fib_id = ntohl (60);
1011   mp->is_add = 1;
1012   mp->is_ipv6 = 1;
1013   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1014 }
1015
1016 void
1017 dhcpv4_set_vss (test_main_t * tm)
1018 {
1019   vl_api_dhcp_proxy_set_vss_t *mp;
1020
1021   mp = vl_msg_api_alloc (sizeof (*mp));
1022   memset (mp, 0, sizeof (*mp));
1023   mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_SET_VSS);
1024   mp->client_index = tm->my_client_index;
1025   mp->context = 0xdeadbeef;
1026   mp->oui = ntohl (4);
1027   mp->fib_id = ntohl (40);
1028   mp->is_add = 1;
1029   mp->is_ipv6 = 0;
1030   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1031 }
1032
1033 void
1034 dhcp_set_vss (test_main_t * tm)
1035 {
1036   dhcpv4_set_vss (tm);
1037   dhcpv6_set_vss (tm);
1038 }
1039
1040 void
1041 dhcp_set_proxy (test_main_t * tm, int ipv6)
1042 {
1043   vl_api_dhcp_proxy_config_t *mp;
1044
1045   mp = vl_msg_api_alloc (sizeof (*mp));
1046   memset (mp, 0, sizeof (*mp));
1047   mp->_vl_msg_id = ntohs (VL_API_DHCP_PROXY_CONFIG);
1048   mp->client_index = tm->my_client_index;
1049   mp->context = 0xdeadbeef;
1050   mp->is_ipv6 = ipv6;
1051   mp->is_add = 1;
1052   mp->dhcp_server[0] = 0x20;
1053   mp->dhcp_server[1] = 0x01;
1054   mp->dhcp_server[2] = 0xab;
1055   mp->dhcp_server[3] = 0xcd;
1056   mp->dhcp_server[4] = 0x12;
1057   mp->dhcp_server[5] = 0x34;
1058   mp->dhcp_server[6] = 0xfe;
1059   mp->dhcp_server[7] = 0xdc;
1060   mp->dhcp_server[14] = 0;
1061   mp->dhcp_server[15] = 0x2;
1062
1063   mp->dhcp_src_address[0] = 0x20;
1064   mp->dhcp_src_address[1] = 0x01;
1065   mp->dhcp_src_address[2] = 0xab;
1066   mp->dhcp_src_address[3] = 0xcd;
1067   mp->dhcp_src_address[4] = 0x12;
1068   mp->dhcp_src_address[5] = 0x34;
1069   mp->dhcp_src_address[6] = 0x56;
1070   mp->dhcp_src_address[7] = 0x78;
1071   mp->dhcp_src_address[14] = 0;
1072   mp->dhcp_src_address[15] = 0x2;
1073
1074   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1075 }
1076
1077 void
1078 set_ip_flow_hash (test_main_t * tm, u8 is_ip6)
1079 {
1080   vl_api_set_ip_flow_hash_t *mp;
1081
1082   mp = vl_msg_api_alloc (sizeof (*mp));
1083   memset (mp, 0, sizeof (*mp));
1084   mp->_vl_msg_id = ntohs (VL_API_SET_IP_FLOW_HASH);
1085   mp->client_index = tm->my_client_index;
1086   mp->context = 0xdeadbeef;
1087   mp->vrf_id = 0;
1088   mp->is_ipv6 = is_ip6;
1089   mp->dst = 1;
1090   mp->reverse = 1;
1091
1092   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1093 }
1094
1095 void
1096 ip6nd_ra_config (test_main_t * tm, int is_no)
1097 {
1098   vl_api_sw_interface_ip6nd_ra_config_t *mp;
1099
1100   mp = vl_msg_api_alloc (sizeof (*mp));
1101   memset (mp, 0, sizeof (*mp));
1102
1103   mp->client_index = tm->my_client_index;
1104   mp->context = 0xdeadbeef;
1105   mp->sw_if_index = ntohl (5);
1106   mp->is_no = is_no;
1107
1108   mp->suppress = 1;
1109
1110
1111   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_CONFIG);
1112   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1113 }
1114
1115 void
1116 ip6nd_ra_prefix (test_main_t * tm, int is_no)
1117 {
1118   vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
1119   u64 tmp[2];
1120
1121   mp = vl_msg_api_alloc (sizeof (*mp));
1122   memset (mp, 0, sizeof (*mp));
1123
1124   mp->client_index = tm->my_client_index;
1125   mp->context = 0xdeadbeef;
1126   mp->sw_if_index = ntohl (5);
1127   mp->is_no = is_no;
1128
1129   mp->use_default = 1;
1130
1131
1132   tmp[0] = clib_host_to_net_u64 (0xdb01000000000000ULL);
1133   tmp[1] = clib_host_to_net_u64 (0x11ULL);
1134
1135
1136   clib_memcpy (mp->address, &tmp[0], 8);
1137   clib_memcpy (&mp->address[8], &tmp[1], 8);
1138
1139   mp->address_length = 64;
1140
1141
1142   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6ND_RA_PREFIX);
1143   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1144 }
1145
1146 void
1147 ip6_enable_disable (test_main_t * tm, int enable)
1148 {
1149   vl_api_sw_interface_ip6_enable_disable_t *mp;
1150
1151   mp = vl_msg_api_alloc (sizeof (*mp));
1152   memset (mp, 0, sizeof (*mp));
1153
1154   mp->client_index = tm->my_client_index;
1155   mp->context = 0xdeadbeef;
1156   mp->sw_if_index = ntohl (5);
1157   mp->enable = (enable == 1);;
1158
1159   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_ENABLE_DISABLE);
1160   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1161 }
1162
1163 void
1164 loop_create (test_main_t * tm)
1165 {
1166   vl_api_create_loopback_t *mp;
1167
1168   mp = vl_msg_api_alloc (sizeof (*mp));
1169   memset (mp, 0, sizeof (*mp));
1170
1171   mp->_vl_msg_id = ntohs (VL_API_CREATE_LOOPBACK);
1172   mp->client_index = tm->my_client_index;
1173   mp->context = 0xdeadbeef;
1174   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1175 }
1176
1177 void
1178 ip6_set_link_local_address (test_main_t * tm)
1179 {
1180   vl_api_sw_interface_ip6_set_link_local_address_t *mp;
1181   u64 tmp[2];
1182
1183   mp = vl_msg_api_alloc (sizeof (*mp));
1184   memset (mp, 0, sizeof (*mp));
1185
1186   mp->client_index = tm->my_client_index;
1187   mp->context = 0xdeadbeef;
1188   mp->sw_if_index = ntohl (5);
1189
1190   tmp[0] = clib_host_to_net_u64 (0xfe80000000000000ULL);
1191   tmp[1] = clib_host_to_net_u64 (0x11ULL);
1192
1193   clib_memcpy (mp->address, &tmp[0], 8);
1194   clib_memcpy (&mp->address[8], &tmp[1], 8);
1195
1196   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS);
1197
1198   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1199 }
1200
1201
1202 void
1203 set_flags (test_main_t * tm, int up_down)
1204 {
1205   vl_api_sw_interface_set_flags_t *mp;
1206
1207   mp = vl_msg_api_alloc (sizeof (*mp));
1208   memset (mp, 0, sizeof (*mp));
1209
1210   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_FLAGS);
1211   mp->client_index = tm->my_client_index;
1212   mp->context = 0xdeadbeef;
1213   mp->sw_if_index = ntohl (5);
1214   mp->admin_up_down = up_down;
1215   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1216
1217 }
1218
1219 void
1220 l2_patch_add_del (test_main_t * tm, int is_add)
1221 {
1222   vl_api_l2_patch_add_del_t *mp;
1223
1224   mp = vl_msg_api_alloc (sizeof (*mp));
1225   memset (mp, 0, sizeof (*mp));
1226   mp->_vl_msg_id = ntohs (VL_API_L2_PATCH_ADD_DEL);
1227   mp->client_index = tm->my_client_index;
1228   mp->context = 0xdeadbeef;
1229   mp->is_add = is_add;
1230   mp->rx_sw_if_index = ntohl (1);
1231   mp->tx_sw_if_index = ntohl (2);
1232
1233   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1234 }
1235
1236 void
1237 l2_xconnect (test_main_t * tm)
1238 {
1239   vl_api_sw_interface_set_l2_xconnect_t *mp;
1240
1241   mp = vl_msg_api_alloc (sizeof (*mp));
1242   memset (mp, 0, sizeof (*mp));
1243   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_XCONNECT);
1244   mp->client_index = tm->my_client_index;
1245   mp->context = 0xdeadbeef;
1246   mp->rx_sw_if_index = ntohl (5);
1247   mp->tx_sw_if_index = ntohl (6);
1248   mp->enable = 1;
1249
1250   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1251 }
1252
1253 void
1254 l2_bridge (test_main_t * tm)
1255 {
1256   vl_api_sw_interface_set_l2_bridge_t *mp;
1257
1258   mp = vl_msg_api_alloc (sizeof (*mp));
1259   memset (mp, 0, sizeof (*mp));
1260   mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SET_L2_BRIDGE);
1261   mp->client_index = tm->my_client_index;
1262   mp->context = 0xdeadbeef;
1263   mp->rx_sw_if_index = ntohl (5);
1264   mp->bd_id = ntohl (6);
1265   mp->bvi = ntohl (1);
1266   mp->shg = ntohl (0);
1267   mp->enable = 1;
1268
1269   vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
1270 }
1271
1272 int
1273 main (int argc, char **argv)
1274 {
1275   api_main_t *am = &api_main;
1276   test_main_t *tm = &test_main;
1277   int ch;
1278
1279   connect_to_vpe ("test_client");
1280
1281   tm->vl_input_queue = shmem_hdr->vl_input_queue;
1282   tm->my_client_index = am->my_client_index;
1283
1284   fformat (stdout, "Type 'h' for help, 'q' to quit...\n");
1285
1286   while (1)
1287     {
1288       ch = getchar ();
1289       switch (ch)
1290         {
1291         case 'q':
1292           goto done;
1293         case 'd':
1294           dump (tm);
1295           break;
1296         case 'L':
1297           link_up_down_enable_disable (tm, 1 /* enable_disable */ );
1298           break;
1299         case 'l':
1300           link_up_down_enable_disable (tm, 0 /* enable_disable */ );
1301           break;
1302         case 'S':
1303           stats_enable_disable (tm, 1 /* enable_disable */ );
1304           break;
1305         case 's':
1306           stats_enable_disable (tm, 0 /* enable_disable */ );
1307           break;
1308         case '3':
1309           add_del_ip4_route (tm, 0 /* add */ );
1310           break;
1311         case '4':
1312           add_del_ip4_route (tm, 1 /* add */ );
1313           break;
1314         case '5':
1315           add_del_ip6_route (tm, 0 /* add */ );
1316           break;
1317         case '6':
1318           add_del_ip6_route (tm, 1 /* add */ );
1319           break;
1320         case 'A':
1321           add_del_interface_address (tm, 1 /* add */ );
1322           break;
1323         case 'a':
1324           add_del_interface_address (tm, 0 /* add */ );
1325           break;
1326         case 'B':
1327           add_del_v6_interface_address (tm, 1 /* add */ );
1328           break;
1329         case 'b':
1330           add_del_v6_interface_address (tm, 0 /* add */ );
1331           break;
1332         case 'E':
1333           l2_patch_add_del (tm, 1 /* is_add */ );
1334           break;
1335         case 'e':
1336           l2_patch_add_del (tm, 0 /* is_add */ );
1337           break;
1338         case 'z':
1339           del_all_interface_addresses (tm);
1340           break;
1341         case 't':
1342           set_interface_table (tm, 0 /* is_ipv6 */ ,
1343                                11 /* my amp goes to 11 */ );
1344           break;
1345         case 'T':
1346           set_interface_table (tm, 1 /* is_ipv6 */ ,
1347                                12 /* my amp goes to 12 */ );
1348           break;
1349
1350         case 'u':
1351           create_vlan_subif (tm, 123);
1352           break;
1353
1354         case 'c':
1355           connect_unix_tap (tm, "foo");
1356           break;
1357
1358         case 'n':
1359           add_ip4_neighbor (tm, 1 /* is_add */ );
1360           add_ip6_neighbor (tm, 1 /* is_add */ );
1361           break;
1362
1363         case 'N':
1364           add_ip4_neighbor (tm, 0 /* is_add */ );
1365           add_ip6_neighbor (tm, 0 /* is_add */ );
1366           break;
1367
1368         case 'p':
1369           add_del_proxy_arp (tm, 1 /* add */ );
1370           break;
1371
1372         case 'i':
1373           proxy_arp_intfc_enable_disable (tm, 1 /* enable */ );
1374           break;
1375
1376         case 'O':
1377           oam_events_enable_disable (tm, 0 /* enable */ );
1378           break;
1379
1380         case 'o':
1381           oam_events_enable_disable (tm, 1 /* enable */ );
1382           break;
1383
1384         case '0':
1385           oam_add_del (tm, 0 /* is_add */ );
1386           break;
1387
1388         case '1':
1389           oam_add_del (tm, 1 /* is_add */ );
1390           break;
1391
1392         case 'r':
1393           reset_fib (tm, 0 /* is_ip6 */ );
1394           break;
1395
1396         case 'R':
1397           reset_fib (tm, 1 /* is_ip6 */ );
1398           break;
1399
1400         case 'j':
1401           dhcp_set_vss (tm);
1402           break;
1403
1404         case 'k':
1405           dhcp_set_proxy (tm, 0);
1406           break;
1407
1408         case 'K':
1409           dhcp_set_proxy (tm, 1 /*ipv6 */ );
1410           break;
1411
1412         case 'v':
1413           set_ip_flow_hash (tm, 0 /* is_ip6 */ );
1414           break;
1415
1416         case 'V':
1417           ip6_set_link_local_address (tm);
1418           break;
1419
1420         case 'w':
1421           ip6_enable_disable (tm, 1 /* enable */ );
1422           break;
1423
1424         case 'W':
1425           ip6_enable_disable (tm, 0 /* disable */ );
1426           break;
1427
1428         case 'x':
1429           ip6nd_ra_config (tm, 0 /* is_no */ );
1430           break;
1431         case 'X':
1432           ip6nd_ra_config (tm, 1 /* is_no */ );
1433           break;
1434         case 'y':
1435           ip6nd_ra_prefix (tm, 0 /* is_no */ );
1436           break;
1437         case 'Y':
1438           ip6nd_ra_prefix (tm, 1 /* is_no */ );
1439           break;
1440
1441         case '7':
1442           loop_create (tm);
1443           break;
1444
1445         case 'F':
1446           set_flags (tm, 1 /* up_down */ );
1447           break;
1448
1449         case 'f':
1450           set_flags (tm, 0 /* up_down */ );
1451           break;
1452
1453         case '@':
1454           l2_xconnect (tm);
1455           break;
1456
1457         case '#':
1458           l2_bridge (tm);
1459           break;
1460
1461         case 'h':
1462           fformat (stdout, "q=quit,d=dump,L=link evts on,l=link evts off\n");
1463           fformat (stdout, "S=stats on,s=stats off\n");
1464           fformat (stdout, "4=add v4 route, 3=del v4 route\n");
1465           fformat (stdout, "6=add v6 route, 5=del v6 route\n");
1466           fformat (stdout, "A=add v4 intfc route, a=del v4 intfc route\n");
1467           fformat (stdout, "B=add v6 intfc route, b=del v6 intfc route\n");
1468           fformat (stdout, "z=del all intfc routes\n");
1469           fformat (stdout, "t=set v4 intfc table, T=set v6 intfc table\n");
1470           fformat (stdout, "c=connect unix tap\n");
1471           fformat (stdout,
1472                    "j=set dhcpv4 and v6 link-address/option-82 params\n");
1473           fformat (stdout, "k=set dhcpv4 relay agent params\n");
1474           fformat (stdout, "K=set dhcpv6 relay agent params\n");
1475           fformat (stdout, "E=add l2 patch, e=del l2 patch\n");
1476           fformat (stdout, "V=ip6 set link-local address \n");
1477           fformat (stdout, "w=ip6 enable \n");
1478           fformat (stdout, "W=ip6 disable \n");
1479           fformat (stdout, "x=ip6 nd config \n");
1480           fformat (stdout, "X=no ip6 nd config\n");
1481           fformat (stdout, "y=ip6 nd prefix \n");
1482           fformat (stdout, "Y=no ip6 nd prefix\n");
1483           fformat (stdout, "@=l2 xconnect\n");
1484           fformat (stdout, "#=l2 bridge\n");
1485
1486         default:
1487           break;
1488         }
1489
1490     }
1491
1492 done:
1493
1494   if (tm->link_events_on)
1495     link_up_down_enable_disable (tm, 0 /* enable */ );
1496   if (tm->stats_on)
1497     stats_enable_disable (tm, 0 /* enable */ );
1498   if (tm->oam_events_on)
1499     oam_events_enable_disable (tm, 0 /* enable */ );
1500
1501   disconnect_from_vpe ();
1502   exit (0);
1503 }
1504
1505 #undef vl_api_version
1506 #define vl_api_version(n,v) static u32 vpe_api_version = v;
1507 #include <vpp/api/vpe.api.h>
1508 #undef vl_api_version
1509
1510 void
1511 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
1512 {
1513   /*
1514    * Send the main API signature in slot 0. This bit of code must
1515    * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
1516    */
1517   mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
1518 }
1519
1520 /*
1521  * fd.io coding-style-patch-verification: ON
1522  *
1523  * Local Variables:
1524  * eval: (c-set-style "gnu")
1525  * End:
1526  */