VPP-108 : API calls to read classify table and sessions
[vpp.git] / vpp / api / custom_dump.c
1 /*
2  *------------------------------------------------------------------
3  * custom_dump.c - pretty-print API messages for replay
4  * 
5  * Copyright (c) 2014 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 <vnet/vnet.h>
21 #include <vnet/ip/ip.h>
22 #include <vnet/unix/tuntap.h>
23 #include <vnet/mpls-gre/mpls.h>
24 #include <vnet/dhcp/proxy.h>
25 #include <vnet/dhcpv6/proxy.h>
26 #include <vnet/l2tp/l2tp.h>
27 #include <vnet/l2/l2_input.h>
28 #include <vnet/sr/sr_packet.h>
29 #include <vnet/vxlan-gpe/vxlan_gpe.h>
30 #include <vlib/vlib.h>
31 #include <vlib/unix/unix.h>
32 #include <vlibapi/api.h>
33 #include <vlibmemory/api.h>
34
35 #include <stats/stats.h>
36 #include <oam/oam.h>
37
38 #include <vnet/ethernet/ethernet.h>
39 #include <vnet/l2/l2_vtr.h>
40
41 #include <api/vpe_msg_enum.h>
42
43 #define vl_typedefs             /* define message structures */
44 #include <api/vpe_all_api_h.h> 
45 #undef vl_typedefs
46
47 #define vl_endianfun             /* define message structures */
48 #include <api/vpe_all_api_h.h> 
49 #undef vl_endianfun
50
51 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
52
53 #define FINISH                                  \
54     vec_add1 (s, 0);                            \
55     vl_print (handle, (char *)s);               \
56     vec_free (s);                               \
57     return handle;
58
59
60 static void *vl_api_create_loopback_t_print
61 (vl_api_create_loopback_t *mp, void *handle)
62 {
63    u8 * s;
64
65    s = format (0, "SCRIPT: create_loopback ");
66    s = format (s, "mac %U ", format_ethernet_address, &mp->mac_address);
67
68    FINISH;
69 }
70
71 static void *vl_api_delete_loopback_t_print
72 (vl_api_delete_loopback_t *mp, void *handle)
73 {
74    u8 * s;
75
76    s = format (0, "SCRIPT: delete_loopback ");
77    s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
78
79    FINISH;
80 }
81
82 static void *vl_api_sw_interface_set_flags_t_print
83 (vl_api_sw_interface_set_flags_t * mp, void *handle)
84 {
85     u8 * s;
86     s = format (0, "SCRIPT: sw_interface_set_flags ");
87     
88     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
89
90     if (mp->admin_up_down)
91         s = format (s, "admin-up ");
92     else
93         s = format (s, "admin-down ");
94
95     if (mp->link_up_down)
96         s = format (s, "link-up");
97     else
98         s = format (s, "link-down");
99         
100     FINISH;
101 }
102
103 static void *vl_api_sw_interface_add_del_address_t_print
104 (vl_api_sw_interface_add_del_address_t * mp, void *handle)
105 {
106     u8 * s;
107
108     s = format (0, "SCRIPT: sw_interface_add_del_address ");
109
110     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
111
112     if (mp->is_ipv6)
113         s = format (s, "%U/%d ", format_ip6_address, 
114                     (ip6_address_t *) mp->address, mp->address_length);
115     else
116         s = format (s, "%U/%d ", format_ip4_address, 
117                     (ip4_address_t *) mp->address, mp->address_length);
118     
119     if (mp->is_add == 0)
120         s = format (s, "del ");
121     if (mp->del_all)
122         s = format (s, "del-all ");
123     
124     FINISH;
125 }
126
127 static void *vl_api_sw_interface_set_table_t_print
128 (vl_api_sw_interface_set_table_t * mp, void * handle)
129 {
130     u8 * s;
131
132     s = format (0, "SCRIPT: sw_interface_set_table ");
133
134     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
135
136     if (mp->vrf_id)
137         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
138
139     if (mp->is_ipv6)
140         s = format (s, "ipv6 ");
141
142     FINISH;
143 }
144
145 static void *vl_api_sw_interface_set_vpath_t_print
146 (vl_api_sw_interface_set_vpath_t * mp, void * handle)
147 {
148     u8 * s;
149
150     s = format (0, "SCRIPT: sw_interface_set_vpath ");
151
152     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
153
154     if (mp->enable)
155         s = format (s, "vPath enable ");
156     else
157         s = format (s, "vPath disable ");
158
159     FINISH;
160 }
161
162 static void *vl_api_sw_interface_set_l2_xconnect_t_print
163 (vl_api_sw_interface_set_l2_xconnect_t * mp, void *handle)
164 {
165     u8 * s;
166
167     s = format (0, "SCRIPT: sw_interface_set_l2_xconnect ");
168
169     s = format (s, "sw_if_index %d ", ntohl(mp->rx_sw_if_index));
170
171     if (mp->enable) {
172         s = format (s, "tx_sw_if_index %d ", ntohl(mp->tx_sw_if_index));
173     } else s = format (s, "delete ");
174     
175     FINISH;
176 }
177
178 static void *vl_api_sw_interface_set_l2_bridge_t_print
179 (vl_api_sw_interface_set_l2_bridge_t * mp, void *handle)
180 {
181     u8 * s;
182
183     s = format (0, "SCRIPT: sw_interface_set_l2_bridge ");
184
185     s = format (s, "sw_if_index %d ", ntohl(mp->rx_sw_if_index));
186
187     if (mp->enable) {
188         s = format (s, "bd_id %d shg %d %senable ", ntohl(mp->bd_id), 
189                     mp->shg, ((mp->bvi)?"bvi ":" "));
190     } else s = format (s, "disable ");
191     
192     FINISH;
193 }
194
195 static void * vl_api_bridge_domain_add_del_t_print
196 (vl_api_bridge_domain_add_del_t * mp, void *handle)
197 {
198     u8 * s;
199
200     s = format (0, "SCRIPT: bridge_domain_add_del ");
201
202     s = format (s, "bd_id %d ", ntohl(mp->bd_id));
203
204     if (mp->is_add) {
205         s = format (s, "flood %d uu-flood %d forward %d learn %d arp-term %d",
206                     mp->flood, mp->uu_flood, mp->forward, mp->learn, 
207                     mp->arp_term);
208     } else s = format (s, "del ");
209
210     FINISH;
211 }
212
213 static void *vl_api_bridge_domain_dump_t_print
214 (vl_api_bridge_domain_dump_t * mp, void *handle)
215 {
216     u8 * s;
217     u32 bd_id = ntohl (mp->bd_id);
218
219     s = format (0, "SCRIPT: bridge_domain_dump ");
220
221     if (bd_id != ~0)
222         s = format (s, "bd_id %d ", bd_id);
223     
224     FINISH;
225 }
226
227 static void *vl_api_l2fib_add_del_t_print
228 (vl_api_l2fib_add_del_t * mp, void *handle)
229 {
230     u8 * s;
231
232     s = format (0, "SCRIPT: l2fib_add_del ");
233
234     s = format (s, "mac %U ", format_ethernet_address, &mp->mac);
235
236     s = format (s, "bd_id %d ", ntohl(mp->bd_id));
237
238
239     if (mp->is_add) {
240         s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
241         if (mp->static_mac) s = format (s, "%s", "static ");
242         if (mp->filter_mac) s = format (s, "%s", "filter ");
243     } else {
244         s = format (s, "del ");
245     }
246     
247     FINISH;
248 }
249
250 static void *vl_api_l2_flags_t_print
251 (vl_api_l2_flags_t * mp, void *handle)
252 {
253     u8 * s;
254     u32 flags = ntohl(mp->feature_bitmap);
255
256     s = format (0, "SCRIPT: l2_flags ");
257
258     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
259
260 #define _(a,b) \
261     if (flags & L2INPUT_FEAT_ ## a) s = format (s, #a " ");
262     foreach_l2input_feat;
263 #undef _
264     
265     FINISH;
266 }
267
268 static void *vl_api_bridge_flags_t_print
269 (vl_api_bridge_flags_t * mp, void *handle)
270 {
271     u8 * s;
272     u32 flags = ntohl(mp->feature_bitmap);
273
274     s = format (0, "SCRIPT: bridge_flags ");
275
276     s = format (s, "bd_id %d ", ntohl(mp->bd_id));
277
278     if (flags & L2_LEARN) s = format (s, "learn ");
279     if (flags & L2_FWD)   s = format (s, "forward ");
280     if (flags & L2_FLOOD) s = format (s, "flood ");
281     if (flags & L2_UU_FLOOD) s = format (s, "uu-flood ");
282     if (flags & L2_ARP_TERM) s = format (s, "arp-term ");
283
284     if (mp->is_set == 0) s = format (s, "clear ");
285     
286     FINISH;
287 }
288
289 static void *vl_api_bd_ip_mac_add_del_t_print
290 (vl_api_bd_ip_mac_add_del_t * mp, void *handle)
291 {
292     u8 * s;
293
294     s = format (0, "SCRIPT: bd_ip_mac_add_del ");
295     s = format (s, "bd_id %d ", ntohl(mp->bd_id));
296
297     if (mp->is_ipv6) 
298          s = format (s, "%U ", format_ip6_address, 
299                      (ip6_address_t *) mp->ip_address);
300     else s = format (s, "%U ", format_ip4_address, 
301                      (ip4_address_t *) mp->ip_address);
302
303     s = format (s, "%U ", format_ethernet_address, mp->mac_address);
304     if (mp->is_add == 0) s = format (s, "del ");
305     
306     FINISH;
307 }
308
309 static void *vl_api_tap_connect_t_print
310 (vl_api_tap_connect_t * mp, void *handle)
311 {
312     u8 * s;
313     u8 null_mac[6];
314
315     memset(null_mac, 0, sizeof (null_mac));
316
317     s = format (0, "SCRIPT: tap_connect ");
318     s = format (s, "tapname %s ", mp->tap_name);
319     if (mp->use_random_mac)
320         s = format (s, "random-mac ");
321
322     if (memcmp (mp->mac_address, null_mac, 6))
323         s = format (s, "mac %U ", format_ethernet_address, mp->mac_address);
324     
325     FINISH;
326 }
327
328 static void *vl_api_tap_modify_t_print
329 (vl_api_tap_modify_t * mp, void *handle)
330 {
331     u8 * s;
332     u8 null_mac[6];
333
334     memset(null_mac, 0, sizeof (null_mac));
335
336     s = format (0, "SCRIPT: tap_modify ");
337     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
338     s = format (s, "tapname %s ", mp->tap_name);
339     if (mp->use_random_mac)
340         s = format (s, "random-mac ");
341
342     if (memcmp (mp->mac_address, null_mac, 6))
343         s = format (s, "mac %U ", format_ethernet_address, mp->mac_address);
344     
345     FINISH;
346 }
347
348 static void *vl_api_tap_delete_t_print
349 (vl_api_tap_delete_t * mp, void *handle)
350 {
351     u8 * s;
352
353     s = format (0, "SCRIPT: tap_delete ");
354     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
355
356     FINISH;
357 }
358
359 static void *vl_api_sw_interface_tap_dump_t_print
360 (vl_api_sw_interface_tap_dump_t * mp, void *handle)
361 {
362     u8 * s;
363
364     s = format (0, "SCRIPT: sw_interface_tap_dump ");
365
366     FINISH;
367 }
368
369
370 static void *vl_api_ip_add_del_route_t_print
371 (vl_api_ip_add_del_route_t * mp, void *handle)
372 {
373     u8 * s;
374
375     s = format (0, "SCRIPT: ip_add_del_route ");
376     if (mp->is_add == 0)
377         s = format (s, "del ");
378
379     if (mp->next_hop_sw_if_index)
380         s = format (s, "sw_if_index %d ", ntohl(mp->next_hop_sw_if_index));
381
382     if (mp->is_ipv6)
383         s = format (s, "%U/%d ", format_ip6_address, mp->dst_address,
384                     mp->dst_address_length);
385     else
386         s = format (s, "%U/%d ", format_ip4_address, mp->dst_address,
387                     mp->dst_address_length);
388     if (mp->is_local)
389         s = format (s, "local ");
390     else if (mp->is_drop)
391         s = format (s, "drop ");
392     else if (mp->is_classify)
393         s = format (s, "classify %d", ntohl (mp->classify_table_index));
394     else {
395         if (mp->is_ipv6)
396             s = format (s, "via %U ", format_ip6_address,
397                         mp->next_hop_address);
398         else
399             s = format (s, "via %U ", format_ip4_address,
400                         mp->next_hop_address);
401     }
402
403     if (mp->vrf_id != 0)
404         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
405     
406     if (mp->create_vrf_if_needed)
407         s = format (s, "create-vrf ");
408
409     if (mp->resolve_attempts != 0)                
410         s = format (s, "resolve-attempts %d ", ntohl(mp->resolve_attempts));
411
412     if (mp->next_hop_weight != 1)
413         s = format (s, "weight %d ", mp->next_hop_weight);
414
415     if (mp->not_last)
416         s = format (s, "not-last ");
417
418     if (mp->is_multipath)
419         s = format (s, "multipath ");
420             
421     if (mp->is_multipath)
422         s = format (s, "multipath ");
423
424     if (mp->lookup_in_vrf)
425         s = format (s, "lookup-in-vrf %d ", ntohl (mp->lookup_in_vrf));
426
427     FINISH;
428 }
429
430 static void *vl_api_proxy_arp_add_del_t_print
431 (vl_api_proxy_arp_add_del_t * mp, void * handle)
432 {
433     u8 * s;
434
435     s = format (0, "SCRIPT: proxy_arp_add_del ");
436
437     s = format (s, "%U - %U ", format_ip4_address, mp->low_address,
438                 format_ip4_address, mp->hi_address);
439
440     if (mp->vrf_id)
441         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
442
443     if (mp->is_add == 0)
444         s = format (s, "del ");
445
446     FINISH;
447 }
448
449 static void *vl_api_proxy_arp_intfc_enable_disable_t_print
450 (vl_api_proxy_arp_intfc_enable_disable_t * mp, void * handle)
451 {
452     u8 * s;
453
454     s = format (0, "SCRIPT: proxy_arp_intfc_enable_disable ");
455
456     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
457
458     s = format (s, "enable %d ", mp->enable_disable);
459
460     FINISH;
461 }
462
463 static void *vl_api_mpls_add_del_decap_t_print
464 (vl_api_mpls_add_del_decap_t * mp, void * handle)
465 {
466     u8 * s;
467
468     s = format (0, "SCRIPT: mpls_add_del_decap ");
469
470     s = format (s, "rx_vrf_id %d ", ntohl(mp->rx_vrf_id));
471
472     s = format (s, "tx_vrf_id %d ", ntohl(mp->tx_vrf_id));
473
474     s = format (s, "label %d ", ntohl(mp->label));
475
476     s = format (s, "next-index %d ", ntohl(mp->next_index));
477
478     if (mp->s_bit == 0)
479         s = format (s, "s-bit-clear ");
480
481     if (mp->is_add == 0)
482         s = format (s, "del ");
483
484     FINISH;
485 }
486
487 static void *vl_api_mpls_add_del_encap_t_print
488 (vl_api_mpls_add_del_encap_t * mp, void * handle)
489 {
490     u8 * s;
491     int i;
492
493     s = format (0, "SCRIPT: mpls_add_del_encap ");
494
495     s = format (s, "vrf_id %d ", ntohl(mp->vrf_id));
496
497     s = format (s, "dst %U ", format_ip4_address, mp->dst_address);
498
499     for (i = 0; i < mp->nlabels; i++) 
500         s = format (s, "label %d ", ntohl(mp->labels[i]));
501
502     if (mp->is_add == 0)
503         s = format (s, "del ");
504
505     FINISH;
506 }
507
508 static void *vl_api_mpls_gre_add_del_tunnel_t_print
509 (vl_api_mpls_gre_add_del_tunnel_t * mp, void * handle)
510 {
511     u8 * s;
512
513     s = format (0, "SCRIPT: mpls_gre_add_del_tunnel ");
514
515     s = format (s, "src %U ", format_ip4_address, mp->src_address);
516
517     s = format (s, "dst %U ", format_ip4_address, mp->dst_address);
518
519     s = format (s, "adj %U/%d ", format_ip4_address, 
520                 (ip4_address_t *) mp->intfc_address, mp->intfc_address_length);
521     
522     s = format (s, "inner-vrf_id %d ", ntohl(mp->inner_vrf_id));
523
524     s = format (s, "outer-vrf_id %d ", ntohl(mp->outer_vrf_id));
525
526     if (mp->is_add == 0)
527         s = format (s, "del ");
528
529     if (mp->l2_only)
530         s = format (s, "l2-only ");
531
532     FINISH;
533 }
534
535 static void *vl_api_mpls_ethernet_add_del_tunnel_t_print
536 (vl_api_mpls_ethernet_add_del_tunnel_t * mp, void * handle)
537 {
538     u8 * s;
539
540     s = format (0, "SCRIPT: mpls_ethernet_add_del_tunnel ");
541
542     s = format (s, "tx_sw_if_index %d ", ntohl(mp->tx_sw_if_index));
543
544     s = format (s, "dst %U", format_ethernet_address, mp->dst_mac_address);
545     
546     s = format (s, "adj %U/%d ", format_ip4_address, 
547                 (ip4_address_t *) mp->adj_address, mp->adj_address_length);
548     
549     s = format (s, "vrf_id %d ", ntohl(mp->vrf_id));
550
551     if (mp->l2_only)
552         s = format (s, "l2-only ");
553
554     if (mp->is_add == 0)
555         s = format (s, "del ");
556
557     FINISH;
558 }
559
560 static void *vl_api_mpls_ethernet_add_del_tunnel_2_t_print
561 (vl_api_mpls_ethernet_add_del_tunnel_2_t * mp, void * handle)
562 {
563     u8 * s;
564
565     s = format (0, "SCRIPT: mpls_ethernet_add_del_tunnel_2 ");
566     
567     s = format (s, "adj %U/%d ", format_ip4_address, 
568                 (ip4_address_t *) mp->adj_address, mp->adj_address_length);
569     
570     s = format (s, "next-hop %U ", format_ip4_address, 
571                 (ip4_address_t *) mp->next_hop_ip4_address_in_outer_vrf);
572
573     s = format (s, "inner_vrf_id %d ", ntohl(mp->inner_vrf_id));
574
575     s = format (s, "outer_vrf_id %d ", ntohl(mp->outer_vrf_id));
576
577     s = format (s, "resolve-if-needed %d ", mp->resolve_if_needed);
578     
579     s = format (s, "resolve-attempts %d ", ntohl(mp->resolve_attempts));
580
581     if (mp->l2_only)
582         s = format (s, "l2-only ");
583
584     if (mp->is_add == 0)
585         s = format (s, "del ");
586
587     FINISH;
588 }
589
590 static void *vl_api_sw_interface_set_unnumbered_t_print
591 (vl_api_sw_interface_set_unnumbered_t * mp, void * handle)
592 {
593     u8 * s;
594
595     s = format (0, "SCRIPT: sw_interface_set_unnumbered ");
596
597     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
598
599     s = format (s, "unnum_if_index %d ", ntohl(mp->unnumbered_sw_if_index));
600
601     if (mp->is_add == 0)
602         s = format (s, "del ");
603
604     FINISH;
605 }
606
607 static void *vl_api_ip_neighbor_add_del_t_print
608 (vl_api_ip_neighbor_add_del_t * mp, void *handle)
609 {
610     u8 * s;
611     u8 null_mac[6];
612
613     memset(null_mac, 0, sizeof (null_mac));
614
615     s = format (0, "SCRIPT: ip_neighbor_add_del ");
616
617     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
618
619     if (mp->is_static)
620         s = format (s, "is_static ");
621
622     s = format (s, "vrf_id %d ", ntohl(mp->vrf_id));
623
624     if (memcmp (mp->mac_address, null_mac, 6))
625         s = format (s, "mac %U ", format_ethernet_address, mp->mac_address);
626
627     if (mp->is_ipv6)
628         s = format (s, "dst %U ", format_ip6_address, (ip6_address_t *) mp->dst_address);
629     else
630         s = format (s, "dst %U ", format_ip4_address, (ip4_address_t *) mp->dst_address);
631     
632     if (mp->is_add == 0)
633         s = format (s, "del ");
634     
635     FINISH;
636 }
637
638 static void *vl_api_reset_vrf_t_print
639 (vl_api_reset_vrf_t * mp, void * handle)
640 {
641     u8 * s;
642
643     s = format (0, "SCRIPT: reset_vrf ");
644
645     if (mp->vrf_id)
646         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
647
648     if (mp->is_ipv6 != 0)
649         s = format (s, "ipv6 ");
650
651     FINISH;
652 }
653
654 static void *vl_api_create_vlan_subif_t_print
655 (vl_api_create_vlan_subif_t * mp, void * handle)
656 {
657     u8 * s;
658
659     s = format (0, "SCRIPT: create_vlan_subif ");
660
661     if (mp->sw_if_index)
662         s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
663
664     if (mp->vlan_id)
665         s = format (s, "vlan_id %d ", ntohl(mp->vlan_id));
666
667     FINISH;
668 }
669
670 #define foreach_create_subif_bit                \
671 _(no_tags)                                      \
672 _(one_tag)                                      \
673 _(two_tags)                                     \
674 _(dot1ad)                                       \
675 _(exact_match)                                  \
676 _(default_sub)                                  \
677 _(outer_vlan_id_any)                            \
678 _(inner_vlan_id_any)
679
680 static void *vl_api_create_subif_t_print
681 (vl_api_create_subif_t * mp, void * handle)
682 {
683     u8 * s;
684
685     s = format (0, "SCRIPT: create_subif ");
686
687     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
688
689     s = format (s, "sub_id %d ", ntohl(mp->sub_id));
690
691     if (mp->outer_vlan_id)
692         s = format (s, "outer_vlan_id %d ", ntohs (mp->outer_vlan_id));
693
694     if (mp->outer_vlan_id)
695         s = format (s, "inner_vlan_id %d ", ntohs (mp->inner_vlan_id));
696
697 #define _(a) if (mp->a) s = format (s, "%s ", #a);
698     foreach_create_subif_bit;
699 #undef _
700
701
702     FINISH;
703 }
704
705 static void *vl_api_oam_add_del_t_print
706 (vl_api_oam_add_del_t * mp, void * handle)
707 {
708     u8 * s;
709
710     s = format (0, "SCRIPT: oam_add_del ");
711
712     if (mp->vrf_id)
713         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
714
715     s = format (s, "src %U ", format_ip4_address, mp->src_address);
716
717     s = format (s, "dst %U ", format_ip4_address, mp->dst_address);
718
719     if (mp->is_add == 0)
720         s = format (s, "del ");
721     
722     FINISH;
723 }
724
725 static void *vl_api_reset_fib_t_print
726 (vl_api_reset_fib_t * mp, void * handle)
727 {
728     u8 * s;
729
730     s = format (0, "SCRIPT: reset_fib ");
731
732     if (mp->vrf_id)
733         s = format (s, "vrf %d ", ntohl(mp->vrf_id));
734
735     if (mp->is_ipv6 != 0)
736         s = format (s, "ipv6 ");
737
738     FINISH;
739 }
740
741 static void *vl_api_dhcp_proxy_config_t_print
742 (vl_api_dhcp_proxy_config_t * mp, void *handle)
743 {
744     u8 * s;
745
746     s = format (0, "SCRIPT: dhcp_proxy_config ");
747
748     s = format (s, "vrf_id %d ", ntohl(mp->vrf_id));
749
750     if (mp->is_ipv6) {
751         s = format (s, "svr %U ", format_ip6_address, 
752                     (ip6_address_t *) mp->dhcp_server);
753         s = format (s, "src %U ", format_ip6_address,
754                     (ip6_address_t *) mp->dhcp_src_address);
755     } else {
756         s = format (s, "svr %U ", format_ip4_address, 
757                     (ip4_address_t *) mp->dhcp_server);
758         s = format (s, "src %U ", format_ip4_address,
759                     (ip4_address_t *) mp->dhcp_src_address);
760     }
761     if (mp->is_add == 0)
762         s = format (s, "del ");
763
764     s = format (s, "insert-cid %d ", mp->insert_circuit_id);
765
766     FINISH;
767 }
768
769 static void *vl_api_dhcp_proxy_config_2_t_print
770 (vl_api_dhcp_proxy_config_2_t * mp, void *handle)
771 {
772     u8 * s;
773
774     s = format (0, "SCRIPT: dhcp_proxy_config_2 ");
775
776     s = format (s, "rx_vrf_id %d ", ntohl(mp->rx_vrf_id));
777     s = format (s, "server_vrf_id %d ", ntohl(mp->server_vrf_id));
778
779     if (mp->is_ipv6) {
780         s = format (s, "svr %U ", format_ip6_address, 
781                     (ip6_address_t *) mp->dhcp_server);
782         s = format (s, "src %U ", format_ip6_address,
783                     (ip6_address_t *) mp->dhcp_src_address);
784     } else {
785         s = format (s, "svr %U ", format_ip4_address, 
786                     (ip4_address_t *) mp->dhcp_server);
787         s = format (s, "src %U ", format_ip4_address,
788                     (ip4_address_t *) mp->dhcp_src_address);
789     }
790     if (mp->is_add == 0)
791         s = format (s, "del ");
792
793     s = format (s, "insert-cid %d ", mp->insert_circuit_id);
794
795     FINISH;
796 }
797
798 static void *vl_api_dhcp_proxy_set_vss_t_print
799 (vl_api_dhcp_proxy_set_vss_t * mp, void * handle)
800 {
801     u8 * s;
802
803     s = format (0, "SCRIPT: dhcp_proxy_set_vss ");
804
805     s = format (s, "tbl_id %d ", ntohl(mp->tbl_id));
806
807     s = format (s, "fib_id %d ", ntohl(mp->fib_id));
808
809     s = format (s, "oui %d ", ntohl(mp->oui));
810
811     if (mp->is_ipv6 != 0)
812         s = format (s, "ipv6 ");
813
814     if (mp->is_add == 0)
815         s = format (s, "del ");
816
817     FINISH;
818 }
819
820 static void *vl_api_dhcp_client_config_t_print
821 (vl_api_dhcp_client_config_t * mp, void *handle)
822 {
823     u8 * s;
824
825     s = format (0, "SCRIPT: dhcp_client_config ");
826
827     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
828
829     s = format (s, "hostname %s ", mp->hostname);
830
831     s = format (s, "want_dhcp_event %d ", mp->want_dhcp_event);
832
833     s = format (s, "pid %d ", mp->pid);
834
835     if (mp->is_add == 0)
836         s = format (s, "del ");
837
838     FINISH;
839 }
840
841
842 static void *vl_api_set_ip_flow_hash_t_print
843 (vl_api_set_ip_flow_hash_t * mp, void * handle)
844 {
845     u8 * s;
846
847     s = format (0, "SCRIPT: set_ip_flow_hash ");
848
849     s = format (s, "vrf_id %d ", ntohl(mp->vrf_id));
850
851     if (mp->src)
852         s = format (s, "src ");
853
854     if (mp->dst)
855         s = format (s, "dst ");
856
857     if (mp->sport)
858         s = format (s, "sport ");
859
860     if (mp->dport)
861         s = format (s, "dport ");
862
863     if (mp->proto)
864         s = format (s, "proto ");
865
866     if (mp->reverse)
867         s = format (s, "reverse ");
868
869     if (mp->is_ipv6 != 0)
870         s = format (s, "ipv6 ");
871
872     FINISH;
873 }
874
875 static void *vl_api_sw_interface_ip6_set_link_local_address_t_print
876 (vl_api_sw_interface_ip6_set_link_local_address_t * mp, void *handle)
877 {
878     u8 * s;
879
880     s = format (0, "SCRIPT: sw_interface_ip6_set_link_local_address ");
881
882     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
883
884     s = format (s, "%U/%d ", format_ip6_address, mp->address,
885                 mp->address_length);
886
887     FINISH;
888 }
889
890 static void *vl_api_sw_interface_ip6nd_ra_prefix_t_print
891 (vl_api_sw_interface_ip6nd_ra_prefix_t * mp, void *handle)
892 {
893     u8 * s;
894
895     s = format (0, "SCRIPT: sw_interface_ip6nd_ra_prefix ");
896
897     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
898
899     s = format (s, "%U/%d ", format_ip6_address, mp->address,
900                 mp->address_length);
901
902     s = format (s, "val_life %d ", ntohl(mp->val_lifetime));
903
904     s = format (s, "pref_life %d ", ntohl(mp->pref_lifetime));
905
906     if (mp->use_default)
907         s = format (s, "def ");
908
909     if (mp->no_advertise)
910         s = format (s, "noadv ");
911
912     if (mp->off_link)
913         s = format (s, "offl ");
914
915     if (mp->no_autoconfig)
916         s = format (s, "noauto ");
917
918     if (mp->no_onlink)
919         s = format (s, "nolink ");
920
921     if (mp->is_no)
922         s = format (s, "isno ");
923
924     FINISH;
925 }
926
927 static void *vl_api_sw_interface_ip6nd_ra_config_t_print
928 (vl_api_sw_interface_ip6nd_ra_config_t * mp, void *handle)
929 {
930     u8 * s;
931
932     s = format (0, "SCRIPT: sw_interface_ip6nd_ra_config ");
933
934     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
935
936     s = format (s, "maxint %d ", ntohl(mp->max_interval));
937
938     s = format (s, "minint %d ", ntohl(mp->min_interval));
939
940     s = format (s, "life %d ", ntohl(mp->lifetime));
941
942     s = format (s, "count %d ", ntohl(mp->initial_count));
943
944     s = format (s, "interval %d ", ntohl(mp->initial_interval));
945
946     if (mp->surpress)
947         s = format (s, "surpress ");
948
949     if (mp->managed)
950         s = format (s, "managed ");
951
952     if (mp->other)
953         s = format (s, "other ");
954
955     if (mp->ll_option)
956         s = format (s, "ll ");
957
958     if (mp->send_unicast)
959         s = format (s, "send ");
960
961     if (mp->cease)
962         s = format (s, "cease ");
963
964     if (mp->is_no)
965         s = format (s, "isno ");
966
967     if (mp->default_router)
968         s = format (s, "def ");
969
970     FINISH;
971 }
972
973 static void *vl_api_set_arp_neighbor_limit_t_print
974 (vl_api_set_arp_neighbor_limit_t * mp, void * handle)
975 {
976     u8 * s;
977
978     s = format (0, "SCRIPT: set_arp_neighbor_limit ");
979
980     s = format (s, "arp_nbr_limit %d ", ntohl(mp->arp_neighbor_limit));
981
982     if (mp->is_ipv6 != 0)
983         s = format (s, "ipv6 ");
984
985     FINISH;
986 }
987
988 static void *vl_api_l2_patch_add_del_t_print
989 (vl_api_l2_patch_add_del_t * mp, void *handle)
990 {
991     u8 * s;
992
993     s = format (0, "SCRIPT: l2_patch_add_del ");
994
995     s = format (s, "rx_sw_if_index %d ", ntohl(mp->rx_sw_if_index));
996
997     s = format (s, "tx_sw_if_index %d ", ntohl(mp->tx_sw_if_index));
998
999     if (mp->is_add == 0)
1000         s = format (s, "del ");
1001     
1002     FINISH;
1003 }
1004
1005 static void *vl_api_sr_tunnel_add_del_t_print
1006 (vl_api_sr_tunnel_add_del_t * mp, void *handle)
1007 {
1008     u8 * s;
1009     ip6_address_t * this_address;
1010     int i;
1011     u16 flags_host_byte_order;
1012     u8 pl_flag;
1013
1014     s = format (0, "SCRIPT: sr_tunnel_add_del ");
1015
1016     if (mp->name[0])
1017       s = format (s, "name %s ", mp->name);
1018
1019     s = format (s, "src %U dst %U/%d ", format_ip6_address, 
1020                 (ip6_address_t *) mp->src_address,
1021                 format_ip6_address,
1022                 (ip6_address_t *) mp->dst_address, mp->dst_mask_width);
1023     
1024     this_address = (ip6_address_t *)mp->segs_and_tags;
1025     for (i = 0; i < mp->n_segments; i++) {
1026         s = format (s, "next %U ", format_ip6_address, this_address);
1027         this_address++;
1028     }
1029     for (i = 0; i < mp->n_tags; i++) {
1030         s = format (s, "tag %U ", format_ip6_address, this_address);
1031         this_address++;
1032     }
1033                 
1034     flags_host_byte_order = clib_net_to_host_u16 (mp->flags_net_byte_order);
1035
1036     if (flags_host_byte_order & IP6_SR_HEADER_FLAG_CLEANUP)
1037         s = format (s, " clean ");
1038
1039     if (flags_host_byte_order & IP6_SR_HEADER_FLAG_PROTECTED)
1040         s = format (s, "protected ");
1041
1042     for (i = 1; i <= 4; i++) {
1043         pl_flag = ip6_sr_policy_list_flags (flags_host_byte_order, i);
1044         
1045         switch (pl_flag) {
1046         case IP6_SR_HEADER_FLAG_PL_ELT_NOT_PRESENT:
1047             continue;
1048
1049         case IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE:
1050             s = format (s, "InPE %d ", i);
1051             break;
1052
1053         case IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE:
1054             s = format (s, "EgPE %d ", i);
1055             break;
1056             
1057         case IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR:
1058             s = format (s, "OrgSrc %d ", i);
1059             break;
1060
1061         default:
1062             clib_warning ("BUG: pl elt %d value %d", i, pl_flag);
1063             break;
1064         }
1065     }
1066
1067     if (mp->policy_name[0])
1068       s = format (s, "policy_name %s ", mp->policy_name);
1069
1070     if (mp->is_add == 0)
1071         s = format (s, "del ");
1072     
1073     FINISH;
1074 }
1075
1076 static void *vl_api_sr_policy_add_del_t_print
1077 (vl_api_sr_policy_add_del_t * mp, void *handle)
1078 {
1079   u8 * s;
1080   int i;
1081
1082   s = format (0, "SCRIPT: sr_policy_add_del ");
1083
1084   if (mp->name[0])
1085     s = format (s, "name %s ", mp->name);
1086
1087
1088   if (mp->tunnel_names[0])
1089     {
1090     // start deserializing tunnel_names
1091     int num_tunnels = mp->tunnel_names[0]; //number of tunnels
1092     u8 * deser_tun_names = mp->tunnel_names;
1093     deser_tun_names += 1; //moving along
1094
1095     u8 * tun_name = 0;
1096     int tun_name_len = 0;
1097
1098     for (i=0; i < num_tunnels; i++)
1099       {
1100         tun_name_len= *deser_tun_names;
1101         deser_tun_names += 1;
1102         vec_resize (tun_name, tun_name_len);
1103         memcpy(tun_name, deser_tun_names, tun_name_len);
1104         s = format (s, "tunnel %s ", tun_name);
1105         deser_tun_names += tun_name_len;
1106         tun_name = 0;
1107       }
1108     }
1109
1110   if (mp->is_add == 0)
1111     s = format (s, "del ");
1112
1113   FINISH;
1114 }
1115
1116 static void *vl_api_sr_multicast_map_add_del_t_print
1117 (vl_api_sr_multicast_map_add_del_t * mp, void *handle)
1118 {
1119
1120   u8 * s = 0;
1121   /* int i; */
1122
1123   s = format (0, "SCRIPT: sr_multicast_map_add_del ");
1124
1125   if (mp->multicast_address[0])
1126     s = format (s, "address %U ", format_ip6_address, &mp->multicast_address);
1127
1128   if (mp->policy_name[0])
1129     s = format (s, "sr-policy %s ", &mp->policy_name);
1130
1131
1132   if (mp->is_add == 0)
1133     s = format (s, "del ");
1134
1135   FINISH;
1136 }
1137
1138
1139 static void *vl_api_classify_add_del_table_t_print
1140 (vl_api_classify_add_del_table_t * mp, void *handle)
1141 {
1142     u8 * s;
1143     int i;
1144
1145     s = format (0, "SCRIPT: classify_add_del_table ");
1146
1147     if (mp->is_add == 0) {
1148         s = format (s, "table %d ", ntohl(mp->table_index));
1149         s = format (s, "del ");
1150     } else {
1151         s = format (s, "nbuckets %d ", ntohl(mp->nbuckets));
1152         s = format (s, "memory_size %d ", ntohl(mp->memory_size));
1153         s = format (s, "skip %d ", ntohl(mp->skip_n_vectors));
1154         s = format (s, "match %d ", ntohl(mp->match_n_vectors));
1155         s = format (s, "next-table %d ", ntohl(mp->next_table_index));
1156         s = format (s, "miss-next %d ", ntohl(mp->miss_next_index));
1157         s = format (s, "mask hex ");
1158         for (i = 0; i < ntohl(mp->match_n_vectors) * sizeof (u32x4); i++)
1159             s = format (s, "%02x", mp->mask[i]);
1160         vec_add1 (s, ' ');
1161     }
1162     
1163     FINISH;
1164 }
1165
1166 static void *vl_api_classify_add_del_session_t_print
1167 (vl_api_classify_add_del_session_t * mp, void *handle)
1168 {
1169     u8 * s;
1170     int i, limit=0;
1171
1172     s = format (0, "SCRIPT: classify_add_del_session ");
1173
1174     s = format (s, "table_index %d ", ntohl (mp->table_index));
1175     s = format (s, "hit_next_index %d ", ntohl (mp->hit_next_index));
1176     s = format (s, "opaque_index %d ", ntohl (mp->opaque_index));
1177     s = format (s, "advance %d ", ntohl (mp->advance));
1178     if (mp->is_add == 0)
1179         s = format (s, "del ");
1180     
1181     s = format (s, "match hex ");
1182     for (i = 5 * sizeof(u32x4)-1; i > 0; i--) {
1183         if (mp->match[i] != 0) {
1184             limit = i + 1;
1185             break;
1186         }
1187     }
1188
1189     for (i = 0; i < limit; i++)
1190         s = format (s, "%02x", mp->match[i]);
1191     
1192     FINISH;
1193 }
1194
1195 static void *vl_api_classify_set_interface_ip_table_t_print
1196 (vl_api_classify_set_interface_ip_table_t * mp, void *handle)
1197 {
1198     u8 * s;
1199
1200     s = format (0, "SCRIPT: classify_set_interface_ip_table ");
1201
1202     if (mp->is_ipv6) 
1203         s = format (s, "ipv6 ");
1204         
1205     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1206     s = format (s, "table %d ", ntohl(mp->table_index));
1207
1208     FINISH;
1209 }
1210
1211 static void *vl_api_classify_set_interface_l2_tables_t_print
1212 (vl_api_classify_set_interface_l2_tables_t * mp, void *handle)
1213 {
1214     u8 * s;
1215
1216     s = format (0, "SCRIPT: classify_set_interface_l2_tables ");
1217
1218     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1219     s = format (s, "ip4-table %d ", ntohl(mp->ip4_table_index));
1220     s = format (s, "ip6-table %d ", ntohl(mp->ip6_table_index));
1221     s = format (s, "other-table %d ", ntohl(mp->other_table_index));
1222
1223     FINISH;
1224 }
1225
1226 static void *vl_api_add_node_next_t_print
1227 (vl_api_add_node_next_t * mp, void *handle)
1228 {
1229     u8 * s;
1230
1231     s = format (0, "SCRIPT: add_node_next ");
1232
1233     s = format (0, "node %s next %s ", mp->node_name, mp->next_name);
1234
1235     FINISH;
1236 }
1237
1238 static void *vl_api_l2tpv3_create_tunnel_t_print
1239 (vl_api_l2tpv3_create_tunnel_t * mp, void *handle)
1240 {
1241     u8 * s;
1242
1243     s = format (0, "SCRIPT: l2tpv3_create_tunnel ");
1244
1245     s = format (s, "client_address %U our_address %U ",
1246                 format_ip6_address, (ip6_address_t *)(mp->client_address),
1247                 format_ip6_address, (ip6_address_t *)(mp->our_address));
1248     s = format (s, "local_session_id %d ", ntohl(mp->local_session_id));
1249     s = format (s, "remote_session_id %d ", ntohl(mp->remote_session_id));
1250     s = format (s, "local_cookie %lld ", 
1251                 clib_net_to_host_u64 (mp->local_cookie));
1252     s = format (s, "remote_cookie %lld ", 
1253                 clib_net_to_host_u64 (mp->remote_cookie));
1254     if (mp->l2_sublayer_present)
1255         s = format (s, "l2-sublayer-present ");
1256
1257     FINISH;
1258 }
1259
1260 static void *vl_api_l2tpv3_set_tunnel_cookies_t_print 
1261 (vl_api_l2tpv3_set_tunnel_cookies_t * mp, void *handle)
1262 {
1263     u8 * s;
1264
1265     s = format (0, "SCRIPT: l2tpv3_set_tunnel_cookies ");
1266
1267     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1268
1269     s = format (s, "new_local_cookie %llu ", 
1270                 clib_net_to_host_u64 (mp->new_local_cookie));
1271     
1272     s = format (s, "new_remote_cookie %llu ", 
1273                 clib_net_to_host_u64 (mp->new_remote_cookie));
1274
1275     FINISH;
1276 }
1277
1278 static void *vl_api_l2tpv3_interface_enable_disable_t_print
1279 (vl_api_l2tpv3_interface_enable_disable_t *mp, void *handle)
1280 {
1281     u8 * s;
1282
1283     s = format (0, "SCRIPT: l2tpv3_interface_enable_disable ");
1284
1285     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1286
1287     if (mp->enable_disable == 0)
1288         s = format (s, "del ");
1289
1290     FINISH;
1291 }
1292
1293 static void * vl_api_l2tpv3_set_lookup_key_t_print
1294 (vl_api_l2tpv3_set_lookup_key_t * mp, void *handle)
1295 {
1296     u8 * s;
1297     char * str = "unknown";
1298
1299     s = format (0, "SCRIPT: l2tpv3_set_lookup_key ");
1300
1301     switch (mp->key) {
1302     case L2T_LOOKUP_SRC_ADDRESS:
1303         str = "lookup_v6_src";
1304         break;
1305     case L2T_LOOKUP_DST_ADDRESS:
1306         str = "lookup_v6_dst";
1307         break;
1308     case L2T_LOOKUP_SESSION_ID:
1309         str = "lookup_session_id";
1310         break;
1311     default:
1312         break;
1313     }
1314
1315     s = format (s, "%s ", str);
1316
1317     FINISH;
1318 }
1319
1320 static void * vl_api_sw_if_l2tpv3_tunnel_dump_t_print
1321 (vl_api_sw_if_l2tpv3_tunnel_dump_t * mp, void *handle)
1322 {
1323     u8 * s;
1324
1325     s = format (0, "SCRIPT: sw_if_l2tpv3_tunnel_dump ");
1326
1327     FINISH;
1328 }
1329
1330 static void * vl_api_vxlan_add_del_tunnel_t_print
1331 (vl_api_vxlan_add_del_tunnel_t * mp, void *handle)
1332 {
1333     u8 * s;
1334
1335     s = format (0, "SCRIPT: vxlan_add_del_tunnel ");
1336
1337     s = format (s, "dst %U ", format_ip46_address,
1338                 (ip46_address_t *)&(mp->dst_address),
1339                 mp->is_ipv6 ? IP46_TYPE_IP6 : IP46_TYPE_IP4);
1340
1341     s = format (s, "src %U ", format_ip46_address,
1342                 (ip46_address_t *)&(mp->src_address),
1343                 mp->is_ipv6 ? IP46_TYPE_IP6 : IP46_TYPE_IP4);
1344
1345     if (mp->encap_vrf_id)
1346         s = format (s, "encap-vrf-id %d ", ntohl(mp->encap_vrf_id));
1347
1348     s = format (s, "decap-next %d ", ntohl(mp->decap_next_index));
1349
1350     s = format (s, "vni %d ", ntohl(mp->vni));
1351
1352     if (mp->is_add == 0)
1353         s = format (s, "del ");
1354
1355     FINISH;
1356 }
1357
1358 static void * vl_api_vxlan_tunnel_dump_t_print
1359 (vl_api_vxlan_tunnel_dump_t * mp, void *handle)
1360 {
1361     u8 * s;
1362
1363     s = format (0, "SCRIPT: vxlan_tunnel_dump ");
1364
1365     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1366
1367     FINISH;
1368 }
1369
1370 static void * vl_api_gre_add_del_tunnel_t_print
1371 (vl_api_gre_add_del_tunnel_t * mp, void *handle)
1372 {
1373     u8 * s;
1374
1375     s = format (0, "SCRIPT: gre_add_del_tunnel ");
1376
1377     s = format (s, "dst %U ", format_ip4_address,
1378                 (ip4_address_t *)&(mp->dst_address));
1379
1380     s = format (s, "src %U ", format_ip4_address,
1381                 (ip4_address_t *)&(mp->src_address));
1382
1383     if (mp->outer_table_id)
1384         s = format (s, "outer-fib-id %d ", ntohl(mp->outer_table_id));
1385
1386     if (mp->is_add == 0)
1387         s = format (s, "del ");
1388
1389     FINISH;
1390 }
1391
1392 static void * vl_api_gre_tunnel_dump_t_print
1393 (vl_api_gre_tunnel_dump_t * mp, void *handle)
1394 {
1395     u8 * s;
1396
1397     s = format (0, "SCRIPT: gre_tunnel_dump ");
1398
1399     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1400
1401     FINISH;
1402 }
1403
1404 static void *vl_api_l2_fib_clear_table_t_print
1405 (vl_api_l2_fib_clear_table_t * mp, void *handle)
1406 {
1407     u8 * s;
1408
1409     s = format (0, "SCRIPT: l2_fib_clear_table ");
1410
1411     FINISH;
1412 }
1413
1414 static void *vl_api_l2_interface_efp_filter_t_print
1415 (vl_api_l2_interface_efp_filter_t * mp, void *handle)
1416 {
1417     u8 * s;
1418
1419     s = format (0, "SCRIPT: l2_interface_efp_filter ");
1420
1421     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1422     if (mp->enable_disable)
1423         s = format (s, "enable ");
1424     else
1425         s = format (s, "disable ");
1426
1427     FINISH;
1428 }
1429
1430 static void *vl_api_l2_interface_vlan_tag_rewrite_t_print
1431 (vl_api_l2_interface_vlan_tag_rewrite_t * mp, void *handle)
1432 {
1433     u8 * s;
1434
1435     s = format (0, "SCRIPT: l2_interface_vlan_tag_rewrite ");
1436
1437     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1438     s = format (s, "vtr_op %d ", ntohl(mp->vtr_op));
1439     s = format (s, "push_dot1q %d ", ntohl(mp->push_dot1q));
1440     s = format (s, "tag1 %d ", ntohl(mp->tag1));
1441     s = format (s, "tag2 %d ", ntohl(mp->tag2));
1442
1443     FINISH;
1444 }
1445
1446 static void *vl_api_create_vhost_user_if_t_print
1447 (vl_api_create_vhost_user_if_t * mp, void *handle)
1448 {
1449     u8 * s;
1450
1451     s = format (0, "SCRIPT: create_vhost_user_if ");
1452
1453     s = format (s, "socket %s ", mp->sock_filename);
1454     if (mp->is_server)
1455         s = format (s, "server ");
1456     if (mp->renumber)
1457         s = format (s, "renumber %d ", ntohl(mp->custom_dev_instance));
1458
1459     FINISH;
1460 }
1461
1462 static void *vl_api_modify_vhost_user_if_t_print
1463 (vl_api_modify_vhost_user_if_t * mp, void *handle)
1464 {
1465     u8 * s;
1466
1467     s = format (0, "SCRIPT: modify_vhost_user_if ");
1468
1469     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1470     s = format (s, "socket %s ", mp->sock_filename);
1471     if (mp->is_server)
1472         s = format (s, "server ");
1473     if (mp->renumber)
1474         s = format (s, "renumber %d ", ntohl(mp->custom_dev_instance));
1475
1476     FINISH;
1477 }
1478
1479 static void *vl_api_delete_vhost_user_if_t_print
1480 (vl_api_delete_vhost_user_if_t * mp, void *handle)
1481 {
1482     u8 * s;
1483
1484     s = format (0, "SCRIPT: delete_vhost_user_if ");
1485     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1486
1487     FINISH;
1488 }
1489
1490 static void *vl_api_sw_interface_vhost_user_dump_t_print
1491 (vl_api_sw_interface_vhost_user_dump_t * mp, void *handle)
1492 {
1493     u8 * s;
1494
1495     s = format (0, "SCRIPT: sw_interface_vhost_user_dump ");
1496
1497     FINISH;
1498 }
1499
1500 static void *vl_api_sw_interface_dump_t_print
1501 (vl_api_sw_interface_dump_t * mp, void *handle)
1502 {
1503     u8 * s;
1504
1505     s = format (0, "SCRIPT: sw_interface_dump ");
1506
1507     if (mp->name_filter_valid)
1508         s = format (s, "name_filter %s ", mp->name_filter);
1509     else
1510         s = format (s, "all ");
1511
1512     FINISH;
1513 }
1514
1515 static void *vl_api_l2_fib_table_dump_t_print
1516 (vl_api_l2_fib_table_dump_t * mp, void *handle)
1517 {
1518     u8 * s;
1519
1520     s = format (0, "SCRIPT: l2_fib_table_dump ");
1521
1522     s = format (s, "bd_id %d ", ntohl(mp->bd_id));
1523
1524     FINISH;
1525 }
1526
1527 static void *vl_api_control_ping_t_print
1528 (vl_api_control_ping_t * mp, void *handle)
1529 {
1530     u8 * s;
1531
1532     s = format (0, "SCRIPT: control_ping ");
1533
1534     FINISH;
1535 }
1536
1537 static void *vl_api_want_interface_events_t_print
1538 (vl_api_want_interface_events_t * mp, void *handle)
1539 {
1540     u8 * s;
1541
1542     s = format (0, "SCRIPT: want_interface_events pid %d enable %d ",
1543                 ntohl(mp->pid), ntohl(mp->enable_disable));
1544
1545     FINISH;
1546 }
1547
1548 static void *vl_api_cli_request_t_print
1549 (vl_api_cli_request_t * mp, void *handle)
1550 {
1551     u8 * s;
1552
1553     s = format (0, "SCRIPT: cli_request ");
1554
1555     FINISH;
1556 }
1557
1558 static void *vl_api_memclnt_create_t_print
1559 (vl_api_memclnt_create_t * mp, void *handle)
1560 {
1561     u8 * s;
1562
1563     s = format (0, "SCRIPT: memclnt_create name %s ", mp->name);
1564
1565     FINISH;
1566 }
1567
1568 static void *vl_api_show_version_t_print
1569 (vl_api_show_version_t * mp, void *handle)
1570 {
1571     u8 * s;
1572
1573     s = format (0, "SCRIPT: show_version ");
1574
1575     FINISH;
1576 }
1577
1578 static void *vl_api_vxlan_gpe_add_del_tunnel_t_print
1579 (vl_api_vxlan_gpe_add_del_tunnel_t * mp, void *handle)
1580 {
1581     u8 * s;
1582
1583     s = format (0, "SCRIPT: vxlan_gpe_add_del_tunnel ");
1584
1585     s = format (s, "local %U ", format_ip46_address, &mp->local, mp->is_ipv6);
1586
1587     s = format (s, "remote %U ", format_ip46_address, &mp->remote, mp->is_ipv6);
1588
1589     s = format (s, "protocol %d ", ntohl(mp->protocol));
1590
1591     s = format (s, "vni %d ", ntohl(mp->vni));
1592
1593     if (mp->is_add == 0)
1594         s = format (s, "del ");
1595
1596     if (mp->encap_vrf_id)
1597         s = format (s, "encap-vrf-id %d ", ntohl(mp->encap_vrf_id));
1598     
1599     if (mp->decap_vrf_id)
1600         s = format (s, "decap-vrf-id %d ", ntohl(mp->decap_vrf_id));
1601
1602     FINISH;
1603 }
1604
1605 static void * vl_api_vxlan_gpe_tunnel_dump_t_print
1606 (vl_api_vxlan_gpe_tunnel_dump_t * mp, void *handle)
1607 {
1608     u8 * s;
1609
1610     s = format (0, "SCRIPT: vxlan_gpe_tunnel_dump ");
1611
1612     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1613
1614     FINISH;
1615 }
1616
1617 static void *vl_api_interface_name_renumber_t_print 
1618 (vl_api_interface_name_renumber_t * mp, void * handle)
1619 {
1620     u8 * s;
1621
1622     s = format (0, "SCRIPT: interface_renumber ");
1623
1624     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1625
1626     s = format (s, "new_show_dev_instance %d ", 
1627                 ntohl(mp->new_show_dev_instance));
1628     
1629     FINISH;
1630 }
1631
1632 static void *vl_api_want_ip4_arp_events_t_print
1633 (vl_api_want_ip4_arp_events_t * mp, void * handle)
1634 {
1635     u8 * s;
1636  
1637     s = format (0, "SCRIPT: want_ip4_arp_events ");
1638     s = format (s, "pid %d address %U ", mp->pid, 
1639                 format_ip4_address, &mp->address);
1640     if (mp->enable_disable == 0)
1641         s = format (s, "del ");
1642
1643     FINISH;
1644 }
1645
1646 static void *vl_api_input_acl_set_interface_t_print
1647 (vl_api_input_acl_set_interface_t * mp, void *handle)
1648 {
1649     u8 * s;
1650
1651     s = format (0, "SCRIPT: input_acl_set_interface ");
1652
1653     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1654     s = format (s, "ip4-table %d ", ntohl(mp->ip4_table_index));
1655     s = format (s, "ip6-table %d ", ntohl(mp->ip6_table_index));
1656     s = format (s, "l2-table %d ", ntohl(mp->l2_table_index));
1657
1658     if (mp->is_add == 0)
1659         s = format (s, "del ");
1660
1661     FINISH;
1662 }
1663
1664 static void * vl_api_ip_address_dump_t_print
1665 (vl_api_ip_address_dump_t * mp, void *handle)
1666 {
1667     u8 * s;
1668
1669     s = format (0, "SCRIPT: ip6_address_dump ");
1670     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1671     s = format (s, "is_ipv6 %d ", mp->is_ipv6 != 0);
1672
1673     FINISH;
1674 }
1675
1676 static void * vl_api_ip_dump_t_print
1677 (vl_api_ip_dump_t * mp, void *handle)
1678 {
1679     u8 * s;
1680
1681     s = format (0, "SCRIPT: ip_dump ");
1682     s = format (s, "is_ipv6 %d ", mp->is_ipv6 != 0);
1683
1684     FINISH;
1685 }
1686
1687 static void * vl_api_cop_interface_enable_disable_t_print
1688 (vl_api_cop_interface_enable_disable_t * mp, void *handle)
1689 {
1690     u8 * s;
1691
1692     s = format (0, "SCRIPT: cop_interface_enable_disable ");
1693     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1694     if (mp->enable_disable)
1695         s = format (s, "enable ");
1696     else
1697         s = format (s, "disable ");
1698
1699     FINISH;
1700 }
1701
1702 static void * vl_api_cop_whitelist_enable_disable_t_print
1703 (vl_api_cop_whitelist_enable_disable_t * mp, void *handle)
1704 {
1705     u8 * s;
1706
1707     s = format (0, "SCRIPT: cop_whitelist_enable_disable ");
1708     s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1709     s = format (s, "fib-id %d ", ntohl(mp->fib_id));
1710     if (mp->ip4)
1711         s = format (s, "ip4 ");
1712     if (mp->ip6)
1713         s = format (s, "ip6 ");
1714     if (mp->default_cop)
1715         s = format (s, "default ");
1716
1717     FINISH;
1718 }
1719
1720 static void * vl_api_af_packet_create_t_print 
1721 (vl_api_af_packet_create_t * mp, void *handle)
1722 {
1723     u8 * s;
1724
1725     s = format (0, "SCRIPT: af_packet_create ");
1726     s = format (s, "host_if_name %s ", mp->host_if_name);
1727     if ( mp->use_random_hw_addr)
1728       s = format (s, "hw_addr random ");
1729     else
1730       s = format (s, "hw_addr %U ", format_ethernet_address, mp->hw_addr);
1731
1732     FINISH;
1733 }
1734
1735 static void * vl_api_af_packet_delete_t_print 
1736 (vl_api_af_packet_delete_t * mp, void *handle)
1737 {
1738     u8 * s;
1739
1740     s = format (0, "SCRIPT: af_packet_delete ");
1741     s = format (s, "host_if_name %s ", mp->host_if_name);
1742
1743     FINISH;
1744 }
1745
1746 static void *vl_api_sw_interface_clear_stats_t_print
1747 (vl_api_sw_interface_clear_stats_t * mp, void *handle)
1748 {
1749     u8 * s;
1750
1751     s = format (0, "SCRIPT: sw_interface_clear_stats ");
1752     if (mp->sw_if_index != ~0)
1753       s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1754
1755     FINISH;
1756 }
1757
1758 static void *vl_api_mpls_gre_tunnel_dump_t_print
1759 (vl_api_mpls_gre_tunnel_dump_t * mp, void *handle)
1760 {
1761     u8 * s;
1762
1763     s = format (0, "SCRIPT: mpls_gre_tunnel_dump ");
1764
1765     s = format (s, "tunnel_index %d ", ntohl(mp->tunnel_index));
1766
1767     FINISH;
1768 }
1769
1770 static void *vl_api_mpls_eth_tunnel_dump_t_print
1771 (vl_api_mpls_eth_tunnel_dump_t * mp, void *handle)
1772 {
1773     u8 * s;
1774
1775     s = format (0, "SCRIPT: mpls_eth_tunnel_dump ");
1776
1777     s = format (s, "tunnel_index %d ", ntohl(mp->tunnel_index));
1778
1779     FINISH;
1780 }
1781
1782 static void *vl_api_mpls_fib_encap_dump_t_print
1783 (vl_api_mpls_fib_encap_dump_t * mp, void *handle)
1784 {
1785     u8 * s;
1786
1787     s = format (0, "SCRIPT: mpls_fib_encap_dump ");
1788
1789     FINISH;
1790 }
1791
1792 static void *vl_api_mpls_fib_decap_dump_t_print
1793 (vl_api_mpls_fib_decap_dump_t * mp, void *handle)
1794 {
1795     u8 * s;
1796
1797     s = format (0, "SCRIPT: mpls_fib_decap_dump ");
1798
1799     FINISH;
1800 }
1801
1802 static void *vl_api_classify_table_ids_t_print
1803 (vl_api_classify_table_ids_t * mp, void *handle)
1804 {
1805     u8 * s;
1806
1807     s = format (0, "SCRIPT: classify_table_ids ");
1808
1809     FINISH;
1810 }
1811
1812 static void *vl_api_classify_table_by_interface_t_print
1813 (vl_api_classify_table_by_interface_t * mp, void *handle)
1814 {
1815     u8 * s;
1816
1817     s = format (0, "SCRIPT: classify_table_by_interface ");
1818     if (mp->sw_if_index != ~0)
1819       s = format (s, "sw_if_index %d ", ntohl(mp->sw_if_index));
1820
1821     FINISH;
1822 }
1823
1824 static void *vl_api_classify_table_info_t_print
1825 (vl_api_classify_table_info_t * mp, void *handle)
1826 {
1827     u8 * s;
1828
1829     s = format (0, "SCRIPT: classify_table_info ");
1830     if (mp->table_id != ~0)
1831       s = format (s, "table_id %d ", ntohl(mp->table_id));
1832
1833     FINISH;
1834 }
1835
1836 static void *vl_api_classify_session_dump_t_print
1837 (vl_api_classify_session_dump_t * mp, void *handle)
1838 {
1839     u8 * s;
1840
1841     s = format (0, "SCRIPT: classify_session_dump ");
1842     if (mp->table_id != ~0)
1843       s = format (s, "table_id %d ", ntohl(mp->table_id));
1844
1845     FINISH;
1846 }
1847
1848 #define foreach_custom_print_function                                   \
1849 _(CREATE_LOOPBACK, create_loopback)                                     \
1850 _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags)                       \
1851 _(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address)           \
1852 _(SW_INTERFACE_SET_TABLE, sw_interface_set_table)                       \
1853 _(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath)                       \
1854 _(TAP_CONNECT, tap_connect)                                             \
1855 _(TAP_MODIFY, tap_modify)                                               \
1856 _(TAP_DELETE, tap_delete)                                               \
1857 _(SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump)                         \
1858 _(IP_ADD_DEL_ROUTE, ip_add_del_route)                                   \
1859 _(PROXY_ARP_ADD_DEL, proxy_arp_add_del)                                 \
1860 _(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable)       \
1861 _(MPLS_ADD_DEL_DECAP, mpls_add_del_decap)                               \
1862 _(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap)                               \
1863 _(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel)                     \
1864 _(MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel)           \
1865 _(MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2)       \
1866 _(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered)             \
1867 _(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del)                             \
1868 _(RESET_VRF, reset_vrf)                                                 \
1869 _(CREATE_VLAN_SUBIF, create_vlan_subif)                                 \
1870 _(CREATE_SUBIF, create_subif)                                           \
1871 _(OAM_ADD_DEL, oam_add_del)                                             \
1872 _(RESET_FIB, reset_fib)                                                 \
1873 _(DHCP_PROXY_CONFIG, dhcp_proxy_config)                                 \
1874 _(DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss)                               \
1875 _(SET_IP_FLOW_HASH, set_ip_flow_hash)                                   \
1876 _(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,                              \
1877   sw_interface_ip6_set_link_local_address)                              \
1878 _(SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix)           \
1879 _(SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config)           \
1880 _(SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit)                       \
1881 _(L2_PATCH_ADD_DEL, l2_patch_add_del)                                   \
1882 _(SR_TUNNEL_ADD_DEL, sr_tunnel_add_del)                                 \
1883 _(SR_POLICY_ADD_DEL, sr_policy_add_del)                                 \
1884 _(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del)                   \
1885 _(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect)           \
1886 _(L2FIB_ADD_DEL, l2fib_add_del)                                         \
1887 _(L2_FLAGS, l2_flags)                                                   \
1888 _(BRIDGE_FLAGS, bridge_flags)                                           \
1889 _(CLASSIFY_ADD_DEL_TABLE, classify_add_del_table)                       \
1890 _(CLASSIFY_ADD_DEL_SESSION, classify_add_del_session)                   \
1891 _(SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge)               \
1892 _(BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del)                         \
1893 _(BRIDGE_DOMAIN_DUMP, bridge_domain_dump)                               \
1894 _(CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table)     \
1895 _(CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables)   \
1896 _(ADD_NODE_NEXT, add_node_next)                                         \
1897 _(DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2)                             \
1898 _(DHCP_CLIENT_CONFIG, dhcp_client_config)                               \
1899 _(L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel)                           \
1900 _(L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies)                 \
1901 _(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable)     \
1902 _(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key)                         \
1903 _(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump)                   \
1904 _(VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel)                           \
1905 _(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump)                                 \
1906 _(GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel)                               \
1907 _(GRE_TUNNEL_DUMP, gre_tunnel_dump)                                     \
1908 _(L2_FIB_CLEAR_TABLE, l2_fib_clear_table)                               \
1909 _(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter)                     \
1910 _(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)         \
1911 _(CREATE_VHOST_USER_IF, create_vhost_user_if)                           \
1912 _(MODIFY_VHOST_USER_IF, modify_vhost_user_if)                           \
1913 _(DELETE_VHOST_USER_IF, delete_vhost_user_if)                           \
1914 _(SW_INTERFACE_DUMP, sw_interface_dump)                                 \
1915 _(CONTROL_PING, control_ping)                                           \
1916 _(WANT_INTERFACE_EVENTS, want_interface_events)                         \
1917 _(CLI_REQUEST, cli_request)                                             \
1918 _(MEMCLNT_CREATE, memclnt_create)                                       \
1919 _(SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump)           \
1920 _(SHOW_VERSION, show_version)                                           \
1921 _(L2_FIB_TABLE_DUMP, l2_fib_table_dump)                                 \
1922 _(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel)                           \
1923 _(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump)                         \
1924 _(INTERFACE_NAME_RENUMBER, interface_name_renumber)                     \
1925 _(WANT_IP4_ARP_EVENTS, want_ip4_arp_events)                             \
1926 _(INPUT_ACL_SET_INTERFACE, input_acl_set_interface)                     \
1927 _(IP_ADDRESS_DUMP, ip_address_dump)                                     \
1928 _(IP_DUMP, ip_dump)                                                     \
1929 _(DELETE_LOOPBACK, delete_loopback)                                     \
1930 _(BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del)                                 \
1931 _(COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable)           \
1932 _(COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable)           \
1933 _(AF_PACKET_CREATE, af_packet_create)                                   \
1934 _(AF_PACKET_DELETE, af_packet_delete)                                   \
1935 _(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats)                   \
1936 _(MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump)                           \
1937 _(MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump)                           \
1938 _(MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump)                             \
1939 _(MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump)                             \
1940 _(CLASSIFY_TABLE_IDS,classify_table_ids)                                \
1941 _(CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface)             \
1942 _(CLASSIFY_TABLE_INFO,classify_table_info)                              \
1943 _(CLASSIFY_SESSION_DUMP,classify_session_dump)
1944
1945 void vl_msg_api_custom_dump_configure (api_main_t *am) 
1946 {
1947 #define _(n,f) am->msg_print_handlers[VL_API_##n]       \
1948     = (void *) vl_api_##f##_t_print;
1949     foreach_custom_print_function;
1950 #undef _
1951 }