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