0bae23c017d60652d03e3c9025207cc35477d11f
[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   int jump_buf_set;
151   volatile int do_exit;
152
153   /* temporary parse buffer */
154   unformat_input_t *input;
155
156   /* input buffer */
157   u8 *inbuf;
158
159   /* stdio input / output FILEs */
160   FILE *ifp, *ofp;
161   u8 *current_file;
162   u32 input_line_number;
163
164   /* exec mode toggle */
165   int exec_mode;
166
167   /* Regenerate the interface table */
168   volatile int regenerate_interface_table;
169
170   /* flag for JSON output format */
171   u8 json_output;
172
173   /* flag for interface event display */
174   u8 interface_event_display;
175
176   /* JSON tree used in composing dump api call results */
177   vat_json_node_t json_tree;
178
179   /* counters */
180   u64 **simple_interface_counters;
181   interface_counter_t **combined_interface_counters;
182   ip4_fib_counter_t **ip4_fib_counters;
183   u32 *ip4_fib_counters_vrf_id_by_index;
184   ip6_fib_counter_t **ip6_fib_counters;
185   u32 *ip6_fib_counters_vrf_id_by_index;
186 } vat_main_t;
187
188 vat_main_t vat_main;
189
190 static inline f64
191 vat_time_now (vat_main_t * vam)
192 {
193   return clib_time_now (&vam->clib_time);
194 }
195
196 #define errmsg(fmt,args...)                             \
197 do {                                                    \
198     if(vam->ifp != stdin)                               \
199         fformat(vam->ofp,"%s(%d): ", vam->current_file, \
200                 vam->input_line_number);                \
201     fformat(vam->ofp, fmt, ##args);                     \
202     fflush(vam->ofp);                                   \
203 } while(0);
204
205 void vat_api_hookup (vat_main_t * vam);
206 int api_sw_interface_dump (vat_main_t * vam);
207 void do_one_file (vat_main_t * vam);
208 int exec (vat_main_t * vam);
209
210 /* Plugin API library functions */
211 char *vat_plugin_path;
212 char *vat_plugin_name_filter;
213 void vat_plugin_api_reference (void);
214 uword unformat_sw_if_index (unformat_input_t * input, va_list * args);
215 uword unformat_ip4_address (unformat_input_t * input, va_list * args);
216 uword unformat_ethernet_address (unformat_input_t * input, va_list * args);
217 uword unformat_ethernet_type_host_byte_order (unformat_input_t * input,
218                                               va_list * args);
219 uword unformat_ip6_address (unformat_input_t * input, va_list * args);
220 u8 *format_ip4_address (u8 * s, va_list * args);
221 u8 *format_ethernet_address (u8 * s, va_list * args);
222
223
224 #endif /* __included_vat_h__ */
225
226 /*
227  * fd.io coding-style-patch-verification: ON
228  *
229  * Local Variables:
230  * eval: (c-set-style "gnu")
231  * End:
232  */