Line data Source code
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/format.h>
25 : #include <vnet/adj/adj_types.h>
26 : #include <vnet/tunnel/tunnel.h>
27 : #include <vnet/teib/teib.h>
28 :
29 : extern vnet_hw_interface_class_t gre_hw_interface_class;
30 : extern vnet_hw_interface_class_t mgre_hw_interface_class;
31 :
32 : typedef enum
33 : {
34 : #define gre_error(n,s) GRE_ERROR_##n,
35 : #include <gre/error.def>
36 : #undef gre_error
37 : GRE_N_ERROR,
38 : } gre_error_t;
39 :
40 : /**
41 : * L3: GRE (i.e. this tunnel is in L3 mode)
42 : * TEB: Transparent Ethernet Bridging - the tunnel is in L2 mode
43 : * ERSPAN: type 2 - the tunnel is for port mirror SPAN output. Each tunnel is
44 : * associated with a session ID and expected to be used for encap
45 : * and output of mirrored packet from a L2 network only. There is
46 : * no support for receiving ERSPAN packets from a GRE ERSPAN tunnel
47 : */
48 : #define foreach_gre_tunnel_type \
49 : _(L3, "L3") \
50 : _(TEB, "TEB") \
51 : _(ERSPAN, "ERSPAN") \
52 :
53 : /**
54 : * @brief The GRE tunnel type
55 : */
56 : typedef enum gre_tunnel_type_t_
57 : {
58 : #define _(n, s) GRE_TUNNEL_TYPE_##n,
59 : foreach_gre_tunnel_type
60 : #undef _
61 : } __clib_packed gre_tunnel_type_t;
62 :
63 : extern u8 *format_gre_tunnel_type (u8 * s, va_list * args);
64 :
65 :
66 : /**
67 : * A GRE payload protocol registration
68 : */
69 : typedef struct
70 : {
71 : /** Name (a c string). */
72 : char *name;
73 :
74 : /** GRE protocol type in host byte order. */
75 : gre_protocol_t protocol;
76 :
77 : /** GRE tunnel type */
78 : gre_tunnel_type_t tunnel_type;
79 :
80 : /** Node which handles this type. */
81 : u32 node_index;
82 :
83 : /** Next index for this type. */
84 : u32 next_index;
85 : } gre_protocol_info_t;
86 :
87 : /**
88 : * Elements of the GRE key that are common for v6 and v6 addresses
89 : */
90 : typedef struct gre_tunnel_key_common_t_
91 : {
92 : union
93 : {
94 : struct
95 : {
96 : u32 fib_index;
97 : u16 session_id;
98 : gre_tunnel_type_t type;
99 : tunnel_mode_t mode;
100 : };
101 : u64 as_u64;
102 : };
103 : } gre_tunnel_key_common_t;
104 :
105 : STATIC_ASSERT_SIZEOF (gre_tunnel_key_common_t, sizeof (u64));
106 :
107 : /**
108 : * @brief Key for a IPv4 GRE Tunnel
109 : */
110 : typedef struct gre_tunnel_key4_t_
111 : {
112 : /**
113 : * Source and destination IP addresses
114 : */
115 : union
116 : {
117 : struct
118 : {
119 : ip4_address_t gtk_src;
120 : ip4_address_t gtk_dst;
121 : };
122 : u64 gtk_as_u64;
123 : };
124 :
125 : /** address independent attributes */
126 : gre_tunnel_key_common_t gtk_common;
127 : } __attribute__ ((packed)) gre_tunnel_key4_t;
128 :
129 : STATIC_ASSERT_SIZEOF (gre_tunnel_key4_t, 2 * sizeof (u64));
130 :
131 : /**
132 : * @brief Key for a IPv6 GRE Tunnel
133 : * We use a different type so that the V4 key hash is as small as possible
134 : */
135 : typedef struct gre_tunnel_key6_t_
136 : {
137 : /**
138 : * Source and destination IP addresses
139 : */
140 : ip6_address_t gtk_src;
141 : ip6_address_t gtk_dst;
142 :
143 : /** address independent attributes */
144 : gre_tunnel_key_common_t gtk_common;
145 : } __attribute__ ((packed)) gre_tunnel_key6_t;
146 :
147 : STATIC_ASSERT_SIZEOF (gre_tunnel_key6_t, 5 * sizeof (u64));
148 :
149 : /**
150 : * Union of the two possible key types
151 : */
152 : typedef union gre_tunnel_key_t_
153 : {
154 : gre_tunnel_key4_t gtk_v4;
155 : gre_tunnel_key6_t gtk_v6;
156 : } gre_tunnel_key_t;
157 :
158 : /**
159 : * The session ID is only a 10 bit value
160 : */
161 : #define GTK_SESSION_ID_MAX (0x3ff)
162 :
163 : /**
164 : * Used for GRE header seq number generation for ERSPAN encap
165 : */
166 : typedef struct
167 : {
168 : u32 seq_num;
169 : u32 ref_count;
170 : } gre_sn_t;
171 :
172 : /**
173 : * Hash key for GRE header seq number generation for ERSPAN encap
174 : */
175 : typedef struct
176 : {
177 : ip46_address_t src;
178 : ip46_address_t dst;
179 : u32 fib_index;
180 : } gre_sn_key_t;
181 :
182 : /**
183 : * @brief A representation of a GRE tunnel
184 : */
185 : typedef struct
186 : {
187 : /**
188 : * Required for pool_get_aligned
189 : */
190 : CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
191 :
192 : /**
193 : * The tunnel's source/local address
194 : */
195 : ip46_address_t tunnel_src;
196 : /**
197 : * The tunnel's destination/remote address
198 : */
199 : fib_prefix_t tunnel_dst;
200 : /**
201 : * The FIB in which the src.dst address are present
202 : */
203 : u32 outer_fib_index;
204 : u32 hw_if_index;
205 : u32 sw_if_index;
206 : gre_tunnel_type_t type;
207 : tunnel_mode_t mode;
208 : tunnel_encap_decap_flags_t flags;
209 :
210 : /**
211 : * an L2 tunnel always rquires an L2 midchain. cache here for DP.
212 : */
213 : adj_index_t l2_adj_index;
214 :
215 : /**
216 : * ERSPAN type 2 session ID, least significant 10 bits of u16
217 : */
218 : u16 session_id;
219 :
220 : /**
221 : * GRE header sequence number (SN) used for ERSPAN type 2 header, must be
222 : * bumped automically to be thread safe. As multiple GRE tunnels are created
223 : * for the same fib-idx/DIP/SIP with different ERSPAN session number, they all
224 : * share the same SN which is kept per FIB/DIP/SIP, as specified by RFC2890.
225 : */
226 : gre_sn_t *gre_sn;
227 :
228 :
229 : u32 dev_instance; /* Real device instance in tunnel vector */
230 : u32 user_instance; /* Instance name being shown to user */
231 : } gre_tunnel_t;
232 :
233 : typedef struct
234 : {
235 : u8 next_index;
236 : u8 tunnel_type;
237 : } next_info_t;
238 :
239 : /**
240 : * @brief GRE related global data
241 : */
242 : typedef struct
243 : {
244 : /**
245 : * pool of tunnel instances
246 : */
247 : gre_tunnel_t *tunnels;
248 :
249 : /**
250 : * GRE payload protocol registrations
251 : */
252 : gre_protocol_info_t *protocol_infos;
253 :
254 : /**
255 : * Hash tables mapping name/protocol to protocol info index.
256 : */
257 : uword *protocol_info_by_name, *protocol_info_by_protocol;
258 :
259 : /**
260 : * Hash mapping to tunnels with ipv4 src/dst addr
261 : */
262 : uword *tunnel_by_key4;
263 :
264 : /**
265 : * Hash mapping to tunnels with ipv6 src/dst addr
266 : */
267 : uword *tunnel_by_key6;
268 :
269 : /**
270 : * Hash mapping tunnel src/dst addr and fib-idx to sequence number
271 : */
272 : uword *seq_num_by_key;
273 :
274 : /**
275 : * Mapping from sw_if_index to tunnel index
276 : */
277 : u32 *tunnel_index_by_sw_if_index;
278 :
279 : /* Sparse vector mapping gre protocol in network byte order
280 : to next index. */
281 : next_info_t *next_by_protocol;
282 :
283 : /* convenience */
284 : vlib_main_t *vlib_main;
285 : vnet_main_t *vnet_main;
286 :
287 : /* Record used instances */
288 : uword *instance_used;
289 :
290 : u16 msg_id_base;
291 : } gre_main_t;
292 :
293 : /**
294 : * @brief IPv4 and GRE header.
295 : */
296 : /* *INDENT-OFF* */
297 : typedef CLIB_PACKED (struct {
298 : ip4_header_t ip4;
299 : gre_header_t gre;
300 : }) ip4_and_gre_header_t;
301 : /* *INDENT-ON* */
302 :
303 : /**
304 : * @brief IPv6 and GRE header.
305 : */
306 : /* *INDENT-OFF* */
307 : typedef CLIB_PACKED (struct {
308 : ip6_header_t ip6;
309 : gre_header_t gre;
310 : }) ip6_and_gre_header_t;
311 : /* *INDENT-ON* */
312 :
313 : always_inline gre_protocol_info_t *
314 18763 : gre_get_protocol_info (gre_main_t * em, gre_protocol_t protocol)
315 : {
316 18763 : uword *p = hash_get (em->protocol_info_by_protocol, protocol);
317 18763 : return p ? vec_elt_at_index (em->protocol_infos, p[0]) : 0;
318 : }
319 :
320 : extern gre_main_t gre_main;
321 :
322 : extern clib_error_t *gre_interface_admin_up_down (vnet_main_t * vnm,
323 : u32 hw_if_index, u32 flags);
324 :
325 : extern void gre_tunnel_stack (adj_index_t ai);
326 : extern void gre_update_adj (vnet_main_t * vnm,
327 : u32 sw_if_index, adj_index_t ai);
328 :
329 : typedef struct mgre_walk_ctx_t_
330 : {
331 : const gre_tunnel_t *t;
332 : const teib_entry_t *ne;
333 : } mgre_walk_ctx_t;
334 :
335 : adj_walk_rc_t mgre_mk_complete_walk (adj_index_t ai, void *data);
336 : adj_walk_rc_t mgre_mk_incomplete_walk (adj_index_t ai, void *data);
337 :
338 : format_function_t format_gre_protocol;
339 : format_function_t format_gre_header;
340 : format_function_t format_gre_header_with_length;
341 :
342 : extern vlib_node_registration_t gre4_input_node;
343 : extern vlib_node_registration_t gre6_input_node;
344 : extern vlib_node_registration_t gre_erspan_encap_node;
345 : extern vlib_node_registration_t gre_teb_encap_node;
346 : extern vnet_device_class_t gre_device_class;
347 :
348 : /* Parse gre protocol as 0xXXXX or protocol name.
349 : In either host or network byte order. */
350 : unformat_function_t unformat_gre_protocol_host_byte_order;
351 : unformat_function_t unformat_gre_protocol_net_byte_order;
352 :
353 : /* Parse gre header. */
354 : unformat_function_t unformat_gre_header;
355 : unformat_function_t unformat_pg_gre_header;
356 :
357 : void
358 : gre_register_input_protocol (vlib_main_t * vm, gre_protocol_t protocol,
359 : u32 node_index, gre_tunnel_type_t tunnel_type);
360 :
361 : /* manually added to the interface output node in gre.c */
362 : #define GRE_OUTPUT_NEXT_LOOKUP 1
363 :
364 : typedef struct
365 : {
366 : u8 is_add;
367 : gre_tunnel_type_t type;
368 : tunnel_mode_t mode;
369 : u8 is_ipv6;
370 : u32 instance;
371 : ip46_address_t src, dst;
372 : u32 outer_table_id;
373 : u16 session_id;
374 : tunnel_encap_decap_flags_t flags;
375 : } vnet_gre_tunnel_add_del_args_t;
376 :
377 : extern int vnet_gre_tunnel_add_del (vnet_gre_tunnel_add_del_args_t * a,
378 : u32 * sw_if_indexp);
379 :
380 : static inline void
381 9165 : gre_mk_key4 (ip4_address_t src,
382 : ip4_address_t dst,
383 : u32 fib_index,
384 : gre_tunnel_type_t ttype,
385 : tunnel_mode_t tmode, u16 session_id, gre_tunnel_key4_t * key)
386 : {
387 9165 : key->gtk_src = src;
388 9165 : key->gtk_dst = dst;
389 9165 : key->gtk_common.type = ttype;
390 9165 : key->gtk_common.mode = tmode;
391 9165 : key->gtk_common.fib_index = fib_index;
392 9165 : key->gtk_common.session_id = session_id;
393 9165 : }
394 :
395 : static inline int
396 8996 : gre_match_key4 (const gre_tunnel_key4_t * key1,
397 : const gre_tunnel_key4_t * key2)
398 : {
399 16343 : return ((key1->gtk_as_u64 == key2->gtk_as_u64) &&
400 7347 : (key1->gtk_common.as_u64 == key2->gtk_common.as_u64));
401 : }
402 :
403 : static inline void
404 3689 : gre_mk_key6 (const ip6_address_t * src,
405 : const ip6_address_t * dst,
406 : u32 fib_index,
407 : gre_tunnel_type_t ttype,
408 : tunnel_mode_t tmode, u16 session_id, gre_tunnel_key6_t * key)
409 : {
410 3689 : key->gtk_src = *src;
411 3689 : key->gtk_dst = *dst;
412 3689 : key->gtk_common.type = ttype;
413 3689 : key->gtk_common.mode = tmode;
414 3689 : key->gtk_common.fib_index = fib_index;
415 3689 : key->gtk_common.session_id = session_id;
416 3689 : }
417 :
418 : static inline int
419 3617 : gre_match_key6 (const gre_tunnel_key6_t * key1,
420 : const gre_tunnel_key6_t * key2)
421 : {
422 7187 : return (ip6_address_is_equal (&key1->gtk_src, &key2->gtk_src) &&
423 7187 : ip6_address_is_equal (&key1->gtk_dst, &key2->gtk_dst) &&
424 3570 : (key1->gtk_common.as_u64 == key2->gtk_common.as_u64));
425 : }
426 :
427 : static inline void
428 2 : gre_mk_sn_key (const gre_tunnel_t * gt, gre_sn_key_t * key)
429 : {
430 2 : key->src = gt->tunnel_src;
431 2 : key->dst = gt->tunnel_dst.fp_addr;
432 2 : key->fib_index = gt->outer_fib_index;
433 2 : }
434 :
435 : #endif /* included_gre_h */
436 :
437 : /*
438 : * fd.io coding-style-patch-verification: ON
439 : *
440 : * Local Variables:
441 : * eval: (c-set-style "gnu")
442 : * End:
443 : */
|