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