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