dpdk: Add support for Mellanox ConnectX-4 devices
[vpp.git] / vnet / vnet / gre / gre.h
1 /*
2  * gre.h: types/functions for gre.
3  *
4  * Copyright (c) 2012 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #ifndef included_gre_h
19 #define included_gre_h
20
21 #include <vnet/vnet.h>
22 #include <vnet/gre/packet.h>
23 #include <vnet/ip/ip.h>
24 #include <vnet/ip/ip4.h>
25 #include <vnet/ip/ip4_packet.h>
26 #include <vnet/pg/pg.h>
27 #include <vnet/ip/format.h>
28 #include <vnet/adj/adj_types.h>
29
30 extern vnet_hw_interface_class_t gre_hw_interface_class;
31
32 typedef enum {
33 #define gre_error(n,s) GRE_ERROR_##n,
34 #include <vnet/gre/error.def>
35 #undef gre_error
36   GRE_N_ERROR,
37 } gre_error_t;
38
39 /**
40  * A GRE payload protocol registration
41  */
42 typedef struct {
43   /** Name (a c string). */
44   char * name;
45
46   /** GRE protocol type in host byte order. */
47   gre_protocol_t protocol;
48
49   /** Node which handles this type. */
50   u32 node_index;
51
52   /** Next index for this type. */
53   u32 next_index;
54 } gre_protocol_info_t;
55
56 /**
57  * @brief The GRE tunnel type
58  */
59 typedef enum gre_tunnel_tyoe_t_
60 {
61   /**
62    * L3 GRE (i.e. this tunnel is in L3 mode)
63    */
64   GRE_TUNNEL_TYPE_L3,
65   /**
66    * Transparent Ethernet Bridging - the tunnel is in L2 mode
67    */
68   GRE_TUNNEL_TYPE_TEB,
69 } gre_tunnel_type_t;
70
71 #define GRE_TUNNEL_TYPE_NAMES {    \
72     [GRE_TUNNEL_TYPE_L3] = "L3",   \
73     [GRE_TUNNEL_TYPE_TEB] = "TEB", \
74 }
75
76 #define GRE_TUNNEL_N_TYPES ((gre_tunnel_type_t)GRE_TUNNEL_TYPE_TEB+1)
77
78 /**
79  * @brief A representation of a GRE tunnel
80  */
81 typedef struct {
82   /**
83    * Linkage into the FIB object graph
84    */
85   fib_node_t node;
86
87   /**
88    * The tunnel's source/local address
89    */
90   ip4_address_t tunnel_src;
91   /**
92    * The tunnel's destination/remote address
93    */
94   ip4_address_t tunnel_dst;
95   /**
96    * The FIB in which the src.dst address are present
97    */
98   u32 outer_fib_index;
99   u32 hw_if_index;
100   u32 sw_if_index;
101   gre_tunnel_type_t type;
102
103   /**
104    * The FIB entry sourced by the tunnel for its destination prefix
105    */
106   fib_node_index_t fib_entry_index;
107
108   /**
109    * The tunnel is a child of the FIB entry for its desintion. This is
110    * so it receives updates when the forwarding information for that entry
111    * changes.
112    * The tunnels sibling index on the FIB entry's dependency list.
113    */
114   u32 sibling_index;
115
116   /**
117    * on a L2 tunnel this is the VLIB arc from the L2-tx to the l2-midchain
118    */
119   u32 l2_tx_arc;
120
121   /**
122    * an L2 tunnel always rquires an L2 midchain. cache here for DP.
123    */
124   adj_index_t l2_adj_index;
125 } gre_tunnel_t;
126
127 /**
128  * @brief GRE related global data
129  */
130 typedef struct {
131   /**
132    * pool of tunnel instances
133    */
134   gre_tunnel_t *tunnels;
135
136   /**
137    * GRE payload protocol registrations
138    */
139   gre_protocol_info_t * protocol_infos;
140
141   /**
142    *  Hash tables mapping name/protocol to protocol info index.
143    */
144   uword * protocol_info_by_name, * protocol_info_by_protocol;
145   /**
146    * Hash mapping src/dst addr pair to tunnel
147    */
148   uword * tunnel_by_key;
149
150   /**
151    * Free vlib hw_if_indices.
152    * A free list per-tunnel type since the interfaces ctreated are fo different
153    * types and we cannot change the type.
154    */
155   u32 * free_gre_tunnel_hw_if_indices[GRE_TUNNEL_N_TYPES];
156
157   /**
158    * Mapping from sw_if_index to tunnel index
159    */
160   u32 * tunnel_index_by_sw_if_index;
161
162   /* convenience */
163   vlib_main_t * vlib_main;
164   vnet_main_t * vnet_main;
165 } gre_main_t;
166
167 /**
168  * @brief IPv4 and GRE header.
169  */
170 typedef CLIB_PACKED (struct {
171   ip4_header_t ip4;
172   gre_header_t gre;
173 }) ip4_and_gre_header_t;
174
175 always_inline gre_protocol_info_t *
176 gre_get_protocol_info (gre_main_t * em, gre_protocol_t protocol)
177 {
178   uword * p = hash_get (em->protocol_info_by_protocol, protocol);
179   return p ? vec_elt_at_index (em->protocol_infos, p[0]) : 0;
180 }
181
182 gre_main_t gre_main;
183
184 /* Register given node index to take input for given gre type. */
185 void
186 gre_register_input_type (vlib_main_t * vm,
187                          gre_protocol_t protocol,
188                          u32 node_index);
189
190 extern  clib_error_t * gre_interface_admin_up_down (vnet_main_t * vnm,
191                                                     u32 hw_if_index,
192                                                     u32 flags);
193
194 extern void gre_tunnel_stack (adj_index_t ai);
195 extern void gre_update_adj (vnet_main_t * vnm,
196                             u32 sw_if_index,
197                             adj_index_t ai);
198
199 format_function_t format_gre_protocol;
200 format_function_t format_gre_header;
201 format_function_t format_gre_header_with_length;
202
203 extern vlib_node_registration_t gre_input_node;
204 extern vnet_device_class_t gre_device_class;
205 extern vnet_device_class_t gre_device_teb_class;
206
207 /* Parse gre protocol as 0xXXXX or protocol name.
208    In either host or network byte order. */
209 unformat_function_t unformat_gre_protocol_host_byte_order;
210 unformat_function_t unformat_gre_protocol_net_byte_order;
211
212 /* Parse gre header. */
213 unformat_function_t unformat_gre_header;
214 unformat_function_t unformat_pg_gre_header;
215
216 void
217 gre_register_input_protocol (vlib_main_t * vm,
218                              gre_protocol_t protocol,
219                              u32 node_index);
220
221 /* manually added to the interface output node in gre.c */
222 #define GRE_OUTPUT_NEXT_LOOKUP  1
223
224 typedef struct {
225   u8 is_add;
226
227   ip4_address_t src, dst;
228   u32 outer_fib_id;
229   u8 teb;
230 } vnet_gre_add_del_tunnel_args_t;
231
232 int vnet_gre_add_del_tunnel
233   (vnet_gre_add_del_tunnel_args_t *a, u32 * sw_if_indexp);
234
235 #endif /* included_gre_h */