b0ab883764b5d01123f3817cfa715c6eb94d892f
[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   u8 *locator_set_name;
99   u32 locator_set_index;
100 } locator_set_msg_t;
101
102 typedef struct
103 {
104   u8 local;
105   u32 sw_if_index;
106   u8 is_ipv6;
107   u8 ip_address[16];
108   u8 priority;
109   u8 weight;
110 } locator_msg_t;
111
112 typedef struct
113 {
114   u32 locator_set_index;
115   u8 is_local;
116   u8 eid_type;
117   u32 vni;
118   u8 eid[16];
119   u8 eid_prefix_len;
120   u32 ttl;
121   u8 authoritative;
122 } eid_table_t;
123
124 typedef struct
125 {
126   /* vpe input queue */
127   unix_shared_memory_queue_t *vl_input_queue;
128
129   /* interface name table */
130   uword *sw_if_index_by_interface_name;
131
132   /* subinterface table */
133   sw_interface_subif_t *sw_if_subif_table;
134
135   /* Graph node table */
136   uword *graph_node_index_by_name;
137   vlib_node_t **graph_nodes;
138
139   /* ip tables */
140   ip_details_t *ip_details_by_sw_if_index[2];
141
142   /* sw_if_index of currently processed interface */
143   u32 current_sw_if_index;
144
145   /* remember that we are dumping ipv6 */
146   u8 is_ipv6;
147
148   /* function table */
149   uword *function_by_name;
150
151   /* help strings */
152   uword *help_by_name;
153
154   /* macro table */
155   macro_main_t macro_main;
156
157   /* Errors by number */
158   uword *error_string_by_error_number;
159
160
161   /* Main thread can spin (w/ timeout) here if needed */
162   u32 async_mode;
163   u32 async_errors;
164   volatile u32 result_ready;
165   volatile i32 retval;
166   volatile u32 sw_if_index;
167   volatile u8 *shmem_result;
168
169   /* our client index */
170   u32 my_client_index;
171
172   /* Time is of the essence... */
173   clib_time_t clib_time;
174
175   /* Unwind (so we can quit) */
176   jmp_buf jump_buf;
177
178   /* temporary parse buffer */
179   unformat_input_t *input;
180
181   /* input buffer */
182   u8 *inbuf;
183
184   /* stdio input / output FILEs */
185   FILE *ifp, *ofp;
186   u8 *current_file;
187   u32 input_line_number;
188
189   /* exec mode toggle */
190   int exec_mode;
191
192   /* Regenerate the interface table */
193   volatile int regenerate_interface_table;
194
195   /* flag for JSON output format */
196   u8 json_output;
197
198   /* flag for interface event display */
199   u8 interface_event_display;
200
201   /* JSON tree used in composing dump api call results */
202   vat_json_node_t json_tree;
203
204   /* counters */
205   u64 **simple_interface_counters;
206   interface_counter_t **combined_interface_counters;
207   ip4_fib_counter_t **ip4_fib_counters;
208   u32 *ip4_fib_counters_vrf_id_by_index;
209   ip6_fib_counter_t **ip6_fib_counters;
210   u32 *ip6_fib_counters_vrf_id_by_index;
211
212   /* Lisp */
213   u8 noprint_msg;
214   locator_set_msg_t *locator_set_msg;
215   locator_msg_t *locator_msg;
216   eid_table_t *eid_tables;
217
218 } vat_main_t;
219
220 vat_main_t vat_main;
221
222 static inline f64
223 vat_time_now (vat_main_t * vam)
224 {
225   return clib_time_now (&vam->clib_time);
226 }
227
228 #define errmsg(fmt,args...)                             \
229 do {                                                    \
230     if(vam->ifp != stdin)                               \
231         fformat(vam->ofp,"%s(%d): ", vam->current_file, \
232                 vam->input_line_number);                \
233     fformat(vam->ofp, fmt, ##args);                     \
234     fflush(vam->ofp);                                   \
235 } while(0);
236
237 void vat_api_hookup (vat_main_t * vam);
238 int api_sw_interface_dump (vat_main_t * vam);
239 void do_one_file (vat_main_t * vam);
240 int exec (vat_main_t * vam);
241
242 /* Plugin API library functions */
243 char *vat_plugin_path;
244 char *vat_plugin_name_filter;
245 void vat_plugin_api_reference (void);
246 uword unformat_sw_if_index (unformat_input_t * input, va_list * args);
247 uword unformat_ip4_address (unformat_input_t * input, va_list * args);
248 uword unformat_ethernet_address (unformat_input_t * input, va_list * args);
249 uword unformat_ethernet_type_host_byte_order (unformat_input_t * input,
250                                               va_list * args);
251 uword unformat_ip6_address (unformat_input_t * input, va_list * args);
252 u8 *format_ip4_address (u8 * s, va_list * args);
253 u8 *format_ethernet_address (u8 * s, va_list * args);
254
255
256 #endif /* __included_vat_h__ */
257
258 /*
259  * fd.io coding-style-patch-verification: ON
260  *
261  * Local Variables:
262  * eval: (c-set-style "gnu")
263  * End:
264  */