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