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