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