VPP-376: Refactor LISP dump API + VAT
[vpp.git] / vpp-api-test / vat / vat.h
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __included_vat_h__
16 #define __included_vat_h__
17
18 #include <stdio.h>
19 #include <setjmp.h>
20 #include <vppinfra/clib.h>
21 #include <vppinfra/format.h>
22 #include <vppinfra/error.h>
23 #include <vppinfra/time.h>
24 #include <vppinfra/macros.h>
25 #include <vnet/vnet.h>
26 #include <vlib/vlib.h>
27 #include <vlib/unix/unix.h>
28 #include <vlibapi/api.h>
29 #include <vlibmemory/api.h>
30
31 #include "vat/json_format.h"
32
33 typedef struct
34 {
35   u8 *interface_name;
36   u32 sw_if_index;
37   /*
38    * Subinterface ID. A number 0-N to uniquely identify this
39    * subinterface under the super interface
40    */
41   u32 sub_id;
42
43   /* 0 = dot1q, 1=dot1ad */
44   u8 sub_dot1ad;
45
46   /* Number of tags 0-2 */
47   u8 sub_number_of_tags;
48   u16 sub_outer_vlan_id;
49   u16 sub_inner_vlan_id;
50   u8 sub_exact_match;
51   u8 sub_default;
52   u8 sub_outer_vlan_id_any;
53   u8 sub_inner_vlan_id_any;
54
55   /* vlan tag rewrite */
56   u32 vtr_op;
57   u32 vtr_push_dot1q;
58   u32 vtr_tag1;
59   u32 vtr_tag2;
60 } sw_interface_subif_t;
61
62 typedef struct
63 {
64   u8 ip[16];
65   u8 prefix_length;
66 } ip_address_details_t;
67
68 typedef struct
69 {
70   u8 present;
71   ip_address_details_t *addr;
72 } ip_details_t;
73
74 typedef struct
75 {
76   u64 packets;
77   u64 bytes;
78 } interface_counter_t;
79
80 typedef struct
81 {
82   struct in_addr address;
83   u8 address_length;
84   u64 packets;
85   u64 bytes;
86 } ip4_fib_counter_t;
87
88 typedef struct
89 {
90   struct in6_addr address;
91   u8 address_length;
92   u64 packets;
93   u64 bytes;
94 } ip6_fib_counter_t;
95
96 typedef struct
97 {
98   /* vpe input queue */
99   unix_shared_memory_queue_t *vl_input_queue;
100
101   /* interface name table */
102   uword *sw_if_index_by_interface_name;
103
104   /* subinterface table */
105   sw_interface_subif_t *sw_if_subif_table;
106
107   /* Graph node table */
108   uword *graph_node_index_by_name;
109   vlib_node_t **graph_nodes;
110
111   /* ip tables */
112   ip_details_t *ip_details_by_sw_if_index[2];
113
114   /* sw_if_index of currently processed interface */
115   u32 current_sw_if_index;
116
117   /* remember that we are dumping ipv6 */
118   u8 is_ipv6;
119
120   /* function table */
121   uword *function_by_name;
122
123   /* help strings */
124   uword *help_by_name;
125
126   /* macro table */
127   macro_main_t macro_main;
128
129   /* Errors by number */
130   uword *error_string_by_error_number;
131
132
133   /* Main thread can spin (w/ timeout) here if needed */
134   u32 async_mode;
135   u32 async_errors;
136   volatile u32 result_ready;
137   volatile i32 retval;
138   volatile u32 sw_if_index;
139   volatile u8 *shmem_result;
140   volatile u8 *cmd_reply;
141
142   /* our client index */
143   u32 my_client_index;
144
145   /* Time is of the essence... */
146   clib_time_t clib_time;
147
148   /* Unwind (so we can quit) */
149   jmp_buf jump_buf;
150
151   /* temporary parse buffer */
152   unformat_input_t *input;
153
154   /* input buffer */
155   u8 *inbuf;
156
157   /* stdio input / output FILEs */
158   FILE *ifp, *ofp;
159   u8 *current_file;
160   u32 input_line_number;
161
162   /* exec mode toggle */
163   int exec_mode;
164
165   /* Regenerate the interface table */
166   volatile int regenerate_interface_table;
167
168   /* flag for JSON output format */
169   u8 json_output;
170
171   /* flag for interface event display */
172   u8 interface_event_display;
173
174   /* JSON tree used in composing dump api call results */
175   vat_json_node_t json_tree;
176
177   /* counters */
178   u64 **simple_interface_counters;
179   interface_counter_t **combined_interface_counters;
180   ip4_fib_counter_t **ip4_fib_counters;
181   u32 *ip4_fib_counters_vrf_id_by_index;
182   ip6_fib_counter_t **ip6_fib_counters;
183   u32 *ip6_fib_counters_vrf_id_by_index;
184 } vat_main_t;
185
186 vat_main_t vat_main;
187
188 static inline f64
189 vat_time_now (vat_main_t * vam)
190 {
191   return clib_time_now (&vam->clib_time);
192 }
193
194 #define errmsg(fmt,args...)                             \
195 do {                                                    \
196     if(vam->ifp != stdin)                               \
197         fformat(vam->ofp,"%s(%d): ", vam->current_file, \
198                 vam->input_line_number);                \
199     fformat(vam->ofp, fmt, ##args);                     \
200     fflush(vam->ofp);                                   \
201 } while(0);
202
203 void vat_api_hookup (vat_main_t * vam);
204 int api_sw_interface_dump (vat_main_t * vam);
205 void do_one_file (vat_main_t * vam);
206 int exec (vat_main_t * vam);
207
208 /* Plugin API library functions */
209 char *vat_plugin_path;
210 char *vat_plugin_name_filter;
211 void vat_plugin_api_reference (void);
212 uword unformat_sw_if_index (unformat_input_t * input, va_list * args);
213 uword unformat_ip4_address (unformat_input_t * input, va_list * args);
214 uword unformat_ethernet_address (unformat_input_t * input, va_list * args);
215 uword unformat_ethernet_type_host_byte_order (unformat_input_t * input,
216                                               va_list * args);
217 uword unformat_ip6_address (unformat_input_t * input, va_list * args);
218 u8 *format_ip4_address (u8 * s, va_list * args);
219 u8 *format_ethernet_address (u8 * s, va_list * args);
220
221
222 #endif /* __included_vat_h__ */
223
224 /*
225  * fd.io coding-style-patch-verification: ON
226  *
227  * Local Variables:
228  * eval: (c-set-style "gnu")
229  * End:
230  */