FD.io VPP  v17.10-9-gd594711
Vector Packet Processing
gre.h
Go to the documentation of this file.
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/pg/pg.h>
25 #include <vnet/ip/format.h>
26 #include <vnet/adj/adj_types.h>
27 
29 
30 typedef enum {
31 #define gre_error(n,s) GRE_ERROR_##n,
32 #include <vnet/gre/error.def>
33 #undef gre_error
35 } gre_error_t;
36 
37 /**
38  * A GRE payload protocol registration
39  */
40 typedef struct {
41  /** Name (a c string). */
42  char * name;
43 
44  /** GRE protocol type in host byte order. */
46 
47  /** Node which handles this type. */
49 
50  /** Next index for this type. */
53 
54 /**
55  * @brief The GRE tunnel type
56  */
57 typedef enum gre_tunnel_tyoe_t_
58 {
59  /**
60  * L3 GRE (i.e. this tunnel is in L3 mode)
61  */
63  /**
64  * Transparent Ethernet Bridging - the tunnel is in L2 mode
65  */
68 
69 #define GRE_TUNNEL_TYPE_NAMES { \
70  [GRE_TUNNEL_TYPE_L3] = "L3", \
71  [GRE_TUNNEL_TYPE_TEB] = "TEB", \
72 }
73 
74 #define GRE_TUNNEL_N_TYPES ((gre_tunnel_type_t)GRE_TUNNEL_TYPE_TEB+1)
75 
76 /**
77  * @brief A representation of a GRE tunnel
78  */
79 typedef struct {
80  /**
81  * Linkage into the FIB object graph
82  */
84 
85  /**
86  * The tunnel's source/local address
87  */
88  ip46_address_t tunnel_src;
89  /**
90  * The tunnel's destination/remote address
91  */
93  /**
94  * The FIB in which the src.dst address are present
95  */
99  gre_tunnel_type_t type;
100 
101  /**
102  * The FIB entry sourced by the tunnel for its destination prefix
103  */
105 
106  /**
107  * The tunnel is a child of the FIB entry for its desintion. This is
108  * so it receives updates when the forwarding information for that entry
109  * changes.
110  * The tunnels sibling index on the FIB entry's dependency list.
111  */
113 
114  /**
115  * on a L2 tunnel this is the VLIB arc from the L2-tx to the l2-midchain
116  */
118 
119  /**
120  * an L2 tunnel always rquires an L2 midchain. cache here for DP.
121  */
123 } gre_tunnel_t;
124 
125 /**
126  * @brief GRE related global data
127  */
128 typedef struct {
129  /**
130  * pool of tunnel instances
131  */
133 
134  /**
135  * GRE payload protocol registrations
136  */
138 
139  /**
140  * Hash tables mapping name/protocol to protocol info index.
141  */
142  uword * protocol_info_by_name, * protocol_info_by_protocol;
143 
144  /**
145  * Hash mapping ipv4 src/dst addr pair to tunnel
146  */
148 
149  /**
150  * Hash mapping ipv6 src/dst addr pair to tunnel
151  */
153 
154  /**
155  * Free vlib hw_if_indices.
156  * A free list per-tunnel type since the interfaces ctreated are fo different
157  * types and we cannot change the type.
158  */
159  u32 * free_gre_tunnel_hw_if_indices[GRE_TUNNEL_N_TYPES];
160 
161  /**
162  * Mapping from sw_if_index to tunnel index
163  */
165 
166  /* Sparse vector mapping gre protocol in network byte order
167  to next index. */
169 
170  /* convenience */
173 } gre_main_t;
174 
175 /**
176  * @brief IPv4 and GRE header.
177  */
178 typedef CLIB_PACKED (struct {
179  ip4_header_t ip4;
180  gre_header_t gre;
181 }) ip4_and_gre_header_t;
182 
183 /**
184  * @brief IPv6 and GRE header.
185  */
186 typedef CLIB_PACKED (struct {
187  ip6_header_t ip6;
188  gre_header_t gre;
189 }) ip6_and_gre_header_t;
190 
193 {
194  uword * p = hash_get (em->protocol_info_by_protocol, protocol);
195  return p ? vec_elt_at_index (em->protocol_infos, p[0]) : 0;
196 }
197 
199 
200 /* Register given node index to take input for given gre type. */
201 void
203  gre_protocol_t protocol,
204  u32 node_index);
205 
207  u32 hw_if_index,
208  u32 flags);
209 
210 extern void gre_tunnel_stack (adj_index_t ai);
211 extern void gre_update_adj (vnet_main_t * vnm,
212  u32 sw_if_index,
213  adj_index_t ai);
214 
218 
223 
224 /* Parse gre protocol as 0xXXXX or protocol name.
225  In either host or network byte order. */
228 
229 /* Parse gre header. */
232 
233 void
235  gre_protocol_t protocol,
236  u32 node_index);
237 
238 /* manually added to the interface output node in gre.c */
239 #define GRE_OUTPUT_NEXT_LOOKUP 1
240 
241 typedef struct {
243 
244  ip46_address_t src, dst;
249 
251  (vnet_gre_add_del_tunnel_args_t *a, u32 * sw_if_indexp);
252 
253 #endif /* included_gre_h */
vnet_main_t * vnet_main
Definition: gre.h:172
uword( unformat_function_t)(unformat_input_t *input, va_list *args)
Definition: format.h:231
vlib_node_registration_t gre4_input_node
(constructor) VLIB_REGISTER_NODE (gre4_input_node)
Definition: node.c:570
uword * tunnel_by_key6
Hash mapping ipv6 src/dst addr pair to tunnel.
Definition: gre.h:152
GRE related global data.
Definition: gre.h:128
format_function_t format_gre_header_with_length
Definition: gre.h:217
fib_node_index_t fib_entry_index
The FIB entry sourced by the tunnel for its destination prefix.
Definition: gre.h:104
u32 hw_if_index
Definition: gre.h:97
gre_tunnel_tyoe_t_
The GRE tunnel type.
Definition: gre.h:57
typedef CLIB_PACKED(struct{ip4_header_t ip4;gre_header_t gre;}) ip4_and_gre_header_t
IPv4 and GRE header.
a
Definition: bitmap.h:516
uword * protocol_info_by_protocol
Definition: gre.h:142
gre_protocol_t protocol
GRE protocol type in host byte order.
Definition: gre.h:45
char * name
Name (a c string).
Definition: gre.h:42
A GRE payload protocol registration.
Definition: gre.h:40
u32 outer_fib_index
The FIB in which the src.dst address are present.
Definition: gre.h:96
#define GRE_TUNNEL_N_TYPES
Definition: gre.h:74
struct _vlib_node_registration vlib_node_registration_t
u8 *( format_function_t)(u8 *s, va_list *args)
Definition: format.h:48
struct _vnet_device_class vnet_device_class_t
u32 * tunnel_index_by_sw_if_index
Mapping from sw_if_index to tunnel index.
Definition: gre.h:164
u32 sibling_index
The tunnel is a child of the FIB entry for its desintion.
Definition: gre.h:112
L3 GRE (i.e.
Definition: gre.h:62
u32 sw_if_index
Definition: gre.h:98
#define always_inline
Definition: clib.h:84
void gre_tunnel_stack(adj_index_t ai)
gre_tunnel_stack
Definition: interface.c:169
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
Aggregrate type for a prefix.
Definition: fib_types.h:160
enum gre_tunnel_tyoe_t_ gre_tunnel_type_t
The GRE tunnel type.
adj_index_t l2_adj_index
an L2 tunnel always rquires an L2 midchain.
Definition: gre.h:122
unformat_function_t unformat_gre_header
Definition: gre.h:230
ip46_address_t tunnel_src
The tunnel&#39;s source/local address.
Definition: gre.h:88
#define hash_get(h, key)
Definition: hash.h:248
uword * tunnel_by_key4
Hash mapping ipv4 src/dst addr pair to tunnel.
Definition: gre.h:147
A representation of a GRE tunnel.
Definition: gre.h:79
unformat_function_t unformat_gre_protocol_net_byte_order
Definition: gre.h:227
u32 node_index
Node which handles this type.
Definition: gre.h:48
vnet_device_class_t gre_device_teb_class
An node in the FIB graph.
Definition: fib_node.h:279
gre_tunnel_type_t type
Definition: gre.h:99
vlib_main_t * vm
Definition: buffer.c:283
format_function_t format_gre_protocol
Definition: gre.h:215
gre_protocol_t
Definition: packet.h:29
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:28
u32 adj_index_t
An index for adjacencies.
Definition: adj_types.h:30
unsigned int u32
Definition: types.h:88
u16 * next_by_protocol
Definition: gre.h:168
u32 next_index
Next index for this type.
Definition: gre.h:51
void gre_update_adj(vnet_main_t *vnm, u32 sw_if_index, adj_index_t ai)
Definition: gre.c:286
gre_tunnel_t * tunnels
pool of tunnel instances
Definition: gre.h:132
gre_main_t gre_main
Definition: gre.h:198
vnet_hw_interface_class_t gre_hw_interface_class
u64 uword
Definition: types.h:112
u32 l2_tx_arc
on a L2 tunnel this is the VLIB arc from the L2-tx to the l2-midchain
Definition: gre.h:117
fib_node_t node
Linkage into the FIB object graph.
Definition: gre.h:83
vnet_device_class_t gre_device_class
clib_error_t * gre_interface_admin_up_down(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:504
unsigned short u16
Definition: types.h:57
int vnet_gre_add_del_tunnel(vnet_gre_add_del_tunnel_args_t *a, u32 *sw_if_indexp)
Definition: interface.c:494
struct _vnet_hw_interface_class vnet_hw_interface_class_t
unsigned char u8
Definition: types.h:56
Transparent Ethernet Bridging - the tunnel is in L2 mode.
Definition: gre.h:66
void gre_register_input_type(vlib_main_t *vm, gre_protocol_t protocol, u32 node_index)
unformat_function_t unformat_pg_gre_header
Definition: gre.h:231
void gre_register_input_protocol(vlib_main_t *vm, gre_protocol_t protocol, u32 node_index)
Definition: node.c:618
vlib_node_registration_t gre6_input_node
(constructor) VLIB_REGISTER_NODE (gre6_input_node)
Definition: node.c:591
unformat_function_t unformat_gre_protocol_host_byte_order
Definition: gre.h:226
fib_prefix_t tunnel_dst
The tunnel&#39;s destination/remote address.
Definition: gre.h:92
static gre_protocol_info_t * gre_get_protocol_info(gre_main_t *em, gre_protocol_t protocol)
Definition: gre.h:192
gre_protocol_info_t * protocol_infos
GRE payload protocol registrations.
Definition: gre.h:137
vlib_main_t * vlib_main
Definition: gre.h:171
format_function_t format_gre_header
Definition: gre.h:216
u32 flags
Definition: vhost-user.h:77
ip46_address_t src
Definition: gre.h:244
gre_error_t
Definition: gre.h:30