Line data Source code
1 : /*
2 : * Copyright (c) 2016 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 : /**
16 : * @file
17 : * @brief LISP-GPE definitions.
18 : */
19 :
20 : #ifndef included_vnet_lisp_gpe_h
21 : #define included_vnet_lisp_gpe_h
22 :
23 : #include <vppinfra/error.h>
24 : #include <vppinfra/mhash.h>
25 : #include <vnet/vnet.h>
26 : #include <vnet/ip/ip.h>
27 : #include <vnet/l2/l2_input.h>
28 : #include <vnet/ethernet/ethernet.h>
29 : #include <vnet/ip/ip4_packet.h>
30 : #include <vnet/udp/udp_packet.h>
31 : #include <vnet/udp/udp_local.h>
32 : #include <lisp/lisp-cp/lisp_types.h>
33 : #include <lisp/lisp-gpe/lisp_gpe_packet.h>
34 : #include <vnet/adj/adj_types.h>
35 : #include <vppinfra/bihash_24_8.h>
36 : #include <vppinfra/bihash_template.h>
37 :
38 : /** IP4-UDP-LISP encap header */
39 : /* *INDENT-OFF* */
40 : typedef CLIB_PACKED (struct {
41 : ip4_header_t ip4; /* 20 bytes */
42 : udp_header_t udp; /* 8 bytes */
43 : lisp_gpe_header_t lisp; /* 8 bytes */
44 : }) ip4_udp_lisp_gpe_header_t;
45 : /* *INDENT-ON* */
46 :
47 : /** IP6-UDP-LISP encap header */
48 : /* *INDENT-OFF* */
49 : typedef CLIB_PACKED (struct {
50 : ip6_header_t ip6; /* 40 bytes */
51 : udp_header_t udp; /* 8 bytes */
52 : lisp_gpe_header_t lisp; /* 8 bytes */
53 : }) ip6_udp_lisp_gpe_header_t;
54 : /* *INDENT-ON* */
55 :
56 : #define foreach_lisp_gpe_ip_input_next \
57 : _(DROP, "error-drop") \
58 : _(IP4_INPUT, "ip4-input") \
59 : _(IP6_INPUT, "ip6-input") \
60 : _(L2_INPUT, "l2-input")
61 :
62 : /** Enum of possible next nodes post LISP-GPE decap */
63 : typedef enum
64 : {
65 : #define _(s,n) LISP_GPE_INPUT_NEXT_##s,
66 : foreach_lisp_gpe_ip_input_next
67 : #undef _
68 : LISP_GPE_INPUT_N_NEXT,
69 : } lisp_gpe_input_next_t;
70 :
71 : /* Arc to nsh-input added only if nsh-input exists */
72 : #define LISP_GPE_INPUT_NEXT_NSH_INPUT 4
73 :
74 : typedef enum
75 : {
76 : #define lisp_gpe_error(n,s) LISP_GPE_ERROR_##n,
77 : #include <lisp/lisp-gpe/lisp_gpe_error.def>
78 : #undef lisp_gpe_error
79 : LISP_GPE_N_ERROR,
80 : } lisp_gpe_error_t;
81 :
82 : typedef struct tunnel_lookup
83 : {
84 : /** Lookup lisp-gpe interfaces by dp table (eg. vrf/bridge index) */
85 : uword *hw_if_index_by_dp_table;
86 :
87 : /** lookup decap tunnel termination sw_if_index by vni and vice versa */
88 : uword *sw_if_index_by_vni;
89 :
90 : // FIXME - Need this?
91 : uword *vni_by_sw_if_index;
92 : } tunnel_lookup_t;
93 :
94 : typedef struct
95 : {
96 : u32 fwd_entry_index;
97 : u32 tunnel_index;
98 : } lisp_stats_key_t;
99 :
100 : typedef struct
101 : {
102 : u32 vni;
103 : dp_address_t deid;
104 : dp_address_t seid;
105 : ip_address_t loc_rloc;
106 : ip_address_t rmt_rloc;
107 :
108 : vlib_counter_t counters;
109 : } lisp_api_stats_t;
110 :
111 : typedef enum gpe_encap_mode_e
112 : {
113 : GPE_ENCAP_LISP,
114 : GPE_ENCAP_VXLAN,
115 : GPE_ENCAP_COUNT
116 : } gpe_encap_mode_t;
117 :
118 : /** LISP-GPE global state*/
119 : typedef struct lisp_gpe_main
120 : {
121 : /**
122 : * @brief DB of all forwarding entries. The Key is:{l-EID,r-EID,vni}
123 : * where the EID encodes L2 or L3
124 : */
125 : uword *lisp_gpe_fwd_entries;
126 :
127 : /**
128 : * @brief A Pool of all LISP forwarding entries
129 : */
130 : struct lisp_gpe_fwd_entry_t_ *lisp_fwd_entry_pool;
131 :
132 : /** Free vlib hw_if_indices */
133 : u32 *free_tunnel_hw_if_indices;
134 :
135 : u8 is_en;
136 :
137 : /* L3 data structures
138 : * ================== */
139 : tunnel_lookup_t l3_ifaces;
140 :
141 : /* L2 data structures
142 : * ================== */
143 :
144 : /** L2 LISP FIB */
145 : BVT (clib_bihash) l2_fib;
146 :
147 : tunnel_lookup_t l2_ifaces;
148 :
149 : /** Load-balance for a miss in the table */
150 : dpo_id_t l2_lb_cp_lkup;
151 :
152 : /* NSH data structures
153 : * ================== */
154 :
155 : BVT (clib_bihash) nsh_fib;
156 :
157 : tunnel_lookup_t nsh_ifaces;
158 :
159 : const dpo_id_t *nsh_cp_lkup;
160 :
161 : gpe_encap_mode_t encap_mode;
162 :
163 : u8 *placeholder_stats_pool;
164 : uword *lisp_stats_index_by_key;
165 : vlib_combined_counter_main_t counters;
166 :
167 : /** Native fwd data structures */
168 : fib_route_path_t *native_fwd_rpath[2];
169 : u32 *native_fwd_lfes[2];
170 :
171 : /** convenience */
172 : vlib_main_t *vlib_main;
173 : vnet_main_t *vnet_main;
174 : ip4_main_t *im4;
175 : ip6_main_t *im6;
176 : ip_lookup_main_t *lm4;
177 : ip_lookup_main_t *lm6;
178 : } lisp_gpe_main_t;
179 :
180 : /** LISP-GPE global state*/
181 : extern lisp_gpe_main_t lisp_gpe_main;
182 :
183 : always_inline lisp_gpe_main_t *
184 578 : vnet_lisp_gpe_get_main ()
185 : {
186 578 : return &lisp_gpe_main;
187 : }
188 :
189 :
190 : extern vlib_node_registration_t lisp_gpe_ip4_input_node;
191 : extern vlib_node_registration_t lisp_gpe_ip6_input_node;
192 : extern vnet_hw_interface_class_t lisp_gpe_hw_class;
193 :
194 : u8 *format_lisp_gpe_header_with_length (u8 * s, va_list * args);
195 :
196 : /** Read LISP-GPE status */
197 : u8 vnet_lisp_gpe_enable_disable_status (void);
198 :
199 : u32
200 : lisp_gpe_l3_iface_find_or_create (lisp_gpe_main_t * lgm,
201 : u32 overlay_table_id, u32 vni);
202 :
203 : /** Add/del LISP-GPE interface. */
204 : extern void lisp_gpe_del_l2_iface (lisp_gpe_main_t * lgm, u32 vni, u32 bd_id);
205 : extern u32 lisp_gpe_add_l2_iface (lisp_gpe_main_t * lgm, u32 vni, u32 bd_id);
206 : extern void lisp_gpe_del_l3_iface (lisp_gpe_main_t * lgm, u32 vni, u32 bd_id);
207 : extern u32 lisp_gpe_add_l3_iface (lisp_gpe_main_t * lgm, u32 vni, u32 bd_id,
208 : u8 with_default_route);
209 :
210 :
211 : typedef struct
212 : {
213 : u8 is_en;
214 : } vnet_lisp_gpe_enable_disable_args_t;
215 :
216 : clib_error_t
217 : * vnet_lisp_gpe_enable_disable (vnet_lisp_gpe_enable_disable_args_t * a);
218 :
219 : typedef enum
220 : {
221 : NO_ACTION,
222 : FORWARD_NATIVE,
223 : SEND_MAP_REQUEST,
224 : DROP
225 : } negative_fwd_actions_e;
226 :
227 : /** */
228 : typedef struct
229 : {
230 : /** forwarding entry index of */
231 : u32 fwd_entry_index;
232 :
233 : u8 is_src_dst;
234 :
235 : u8 is_add;
236 :
237 : /** type of mapping */
238 : u8 is_negative;
239 :
240 : /** action for negative mappings */
241 : negative_fwd_actions_e action;
242 :
243 : /** local eid */
244 : gid_address_t lcl_eid;
245 :
246 : /** remote eid */
247 : gid_address_t rmt_eid;
248 :
249 : /** vector of locator pairs */
250 : locator_pair_t *locator_pairs;
251 :
252 : /** FIB index to lookup remote locator at encap */
253 : u32 encap_fib_index;
254 :
255 : /** FIB index to lookup inner IP at decap */
256 : u32 decap_fib_index;
257 :
258 : /* TODO remove */
259 : u32 decap_next_index;
260 :
261 : /** VNI/tenant id in HOST byte order */
262 : u32 vni;
263 :
264 : /** vrf or bd where fwd entry should be inserted */
265 : union
266 : {
267 : /** table (vrf) id */
268 : u32 table_id;
269 :
270 : /** bridge domain id */
271 : u32 bd_id;
272 :
273 : /** generic access */
274 : u32 dp_table;
275 : };
276 : } vnet_lisp_gpe_add_del_fwd_entry_args_t;
277 :
278 : typedef struct
279 : {
280 : fib_route_path_t rpath;
281 : u8 is_add;
282 : } vnet_gpe_native_fwd_rpath_args_t;
283 :
284 : typedef struct
285 : {
286 : u32 fwd_entry_index;
287 : u32 dp_table;
288 : u32 vni;
289 : u8 action;
290 : dp_address_t leid;
291 : dp_address_t reid;
292 : } lisp_api_gpe_fwd_entry_t;
293 :
294 : #define foreach_lgpe_ip4_lookup_next \
295 : _(DROP, "error-drop") \
296 : _(LISP_CP_LOOKUP, "lisp-cp-lookup")
297 :
298 : typedef enum lgpe_ip4_lookup_next
299 : {
300 : #define _(sym,str) LGPE_IP4_LOOKUP_NEXT_##sym,
301 : foreach_lgpe_ip4_lookup_next
302 : #undef _
303 : LGPE_IP4_LOOKUP_N_NEXT,
304 : } lgpe_ip4_lookup_next_t;
305 :
306 : #define foreach_lgpe_ip6_lookup_next \
307 : _(DROP, "error-drop") \
308 : _(LISP_CP_LOOKUP, "lisp-cp-lookup")
309 :
310 : typedef enum lgpe_ip6_lookup_next
311 : {
312 : #define _(sym,str) LGPE_IP6_LOOKUP_NEXT_##sym,
313 : foreach_lgpe_ip6_lookup_next
314 : #undef _
315 : LGPE_IP6_LOOKUP_N_NEXT,
316 : } lgpe_ip6_lookup_next_t;
317 :
318 : u8 *format_vnet_lisp_gpe_status (u8 * s, va_list * args);
319 :
320 : lisp_api_gpe_fwd_entry_t *vnet_lisp_gpe_fwd_entries_get_by_vni (u32 vni);
321 : gpe_encap_mode_t vnet_gpe_get_encap_mode (void);
322 : int vnet_gpe_set_encap_mode (gpe_encap_mode_t mode);
323 :
324 : u8 vnet_lisp_stats_enable_disable_state (void);
325 : vnet_api_error_t vnet_lisp_stats_enable_disable (u8 enable);
326 : lisp_api_stats_t *vnet_lisp_get_stats (void);
327 : int vnet_lisp_flush_stats (void);
328 : int vnet_gpe_add_del_native_fwd_rpath (vnet_gpe_native_fwd_rpath_args_t * a);
329 : u32 vnet_lisp_gpe_add_nsh_iface (lisp_gpe_main_t * lgm);
330 : void vnet_lisp_gpe_del_nsh_iface (lisp_gpe_main_t * lgm);
331 :
332 : #endif /* included_vnet_lisp_gpe_h */
333 :
334 : /*
335 : * fd.io coding-style-patch-verification: ON
336 : *
337 : * Local Variables:
338 : * eval: (c-set-style "gnu")
339 : * End:
340 : */
|