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