blob: 1d5f252eb87a7bcde894e12a7ee91364fd53d7d7 [file] [log] [blame]
Neale Ranns0bfe5d82016-08-25 15:29:12 +01001/*
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#ifndef __FIB_ENTRY_SRC_H__
17#define __FIB_ENTRY_SRC_H__
18
19#include "fib_entry.h"
20#include "fib_path_list.h"
21#include "fib_internal.h"
22
23/**
24 * Debug macro
25 */
Neale Ranns710071b2018-09-24 12:36:26 +000026extern vlib_log_class_t fib_entry_logger;
27
Neale Ranns0bfe5d82016-08-25 15:29:12 +010028#define FIB_ENTRY_DBG(_e, _fmt, _args...) \
29{ \
Neale Ranns710071b2018-09-24 12:36:26 +000030 vlib_log_debug(fib_entry_logger, \
31 "[@%d:[%U]:%U:%U]: " _fmt, \
32 fib_entry_get_index(_e), \
33 format_fib_prefix, \
34 &_e->fe_prefix, \
35 format_fib_entry_flags, \
36 _e->fe_srcs[0].fes_entry_flags, \
37 format_fib_source, \
38 _e->fe_srcs[0].fes_src, \
39 ##_args); \
Neale Ranns0bfe5d82016-08-25 15:29:12 +010040}
Neale Ranns0bfe5d82016-08-25 15:29:12 +010041
42/**
43 * Source initialisation Function
44 */
45typedef void (*fib_entry_src_init_t)(fib_entry_src_t *src);
46
47/**
48 * Source deinitialisation Function
49 */
50typedef void (*fib_entry_src_deinit_t)(fib_entry_src_t *src);
51
52/**
53 * Source activation. Called when the source is the new best source on the entry.
54 * Return non-zero if the entry can now install, 0 otherwise
55 */
56typedef int (*fib_entry_src_activate_t)(fib_entry_src_t *src,
57 const fib_entry_t *fib_entry);
58
59/**
Neale Ranns89541992017-04-06 04:41:02 -070060 * Source re-activation. Called when the source is updated and remains
61 * the best source.
62 */
63typedef int (*fib_entry_src_reactivate_t)(fib_entry_src_t *src,
64 const fib_entry_t *fib_entry);
65
66/**
Neale Ranns0bfe5d82016-08-25 15:29:12 +010067 * Source Deactivate.
68 * Called when the source is no longer best source on the entry
69 */
70typedef void (*fib_entry_src_deactivate_t)(fib_entry_src_t *src,
71 const fib_entry_t *fib_entry);
72
73/**
74 * Source Add.
75 * Called when the source is added to the entry
76 */
77typedef void (*fib_entry_src_add_t)(fib_entry_src_t *src,
78 const fib_entry_t *entry,
79 fib_entry_flag_t flags,
Neale Rannsda78f952017-05-24 09:15:43 -070080 dpo_proto_t proto,
Neale Ranns0bfe5d82016-08-25 15:29:12 +010081 const dpo_id_t *dpo);
82
83/**
84 * Source Remove.
85 */
86typedef void (*fib_entry_src_remove_t)(fib_entry_src_t *src);
87
88/**
89 * Result from a cover update/change
90 */
91typedef struct fib_entry_src_cover_res_t_ {
92 u16 install;
93 fib_node_bw_reason_flag_t bw_reason;
94} fib_entry_src_cover_res_t;
95
96/**
97 * Cover changed. the source should re-evaluate its cover.
98 */
99typedef fib_entry_src_cover_res_t (*fib_entry_src_cover_change_t)(
100 fib_entry_src_t *src,
101 const fib_entry_t *fib_entry);
102
103/**
104 * Cover updated. The cover the source has, has updated (i.e. its forwarding)
105 * the source may need to re-evaluate.
106 */
107typedef fib_entry_src_cover_res_t (*fib_entry_src_cover_update_t)(
108 fib_entry_src_t *src,
109 const fib_entry_t *fib_entry);
110
111/**
Neale Rannsa4e77662017-12-04 20:00:30 +0000112 * Forwarding updated. Notification that the forwarding information for the
113 * entry has been updated. This notification is sent to all sources, not just
114 * the active best.
115 */
116typedef void (*fib_entry_src_fwd_update_t)(fib_entry_src_t *src,
117 const fib_entry_t *fib_entry,
118 fib_source_t best_source);
119
120/**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100121 * Installed. Notification that the source is now installed as
122 * the entry's forwarding source.
123 */
124typedef void (*fib_entry_src_installed_t)(fib_entry_src_t *src,
125 const fib_entry_t *fib_entry);
126
127/**
128 * format.
129 */
130typedef u8* (*fib_entry_src_format_t)(fib_entry_src_t *src,
131 u8* s);
132
133/**
134 * Source path add
135 * the source is adding a new path
136 */
137typedef void (*fib_entry_src_path_add_t)(fib_entry_src_t *src,
138 const fib_entry_t *fib_entry,
139 fib_path_list_flags_t pl_flags,
140 const fib_route_path_t *path);
141
142/**
143 * Source path remove
144 * the source is remoinvg a path
145 */
146typedef void (*fib_entry_src_path_remove_t)(fib_entry_src_t *src,
147 fib_path_list_flags_t pl_flags,
148 const fib_route_path_t *path);
149
150/**
151 * Source path replace/swap
152 * the source is providing a new set of paths
153 */
154typedef void (*fib_entry_src_path_swap_t)(fib_entry_src_t *src,
155 const fib_entry_t *fib_entry,
156 fib_path_list_flags_t pl_flags,
157 const fib_route_path_t *path);
158
159/**
160 * Set source specific opaque data
161 */
162typedef void (*fib_entry_src_set_data_t)(fib_entry_src_t *src,
163 const fib_entry_t *fib_entry,
164 const void *data);
165
166/**
167 * Get source specific opaque data
168 */
169typedef const void* (*fib_entry_src_get_data_t)(fib_entry_src_t *src,
170 const fib_entry_t *fib_entry);
171
172/**
Neale Ranns2303cb12018-02-21 04:57:17 -0800173 * Contribute forwarding to interpose inthe chain
174 */
175typedef const dpo_id_t* (*fib_entry_src_contribute_interpose_t)(const fib_entry_src_t *src,
176 const fib_entry_t *fib_entry);
177
178/**
179 * The fib entry flags for this source are changing
180 */
181typedef void (*fib_entry_src_flag_change_t)(fib_entry_src_t *src,
182 const fib_entry_t *fib_entry,
183 fib_entry_flag_t new_flags);
184
185/**
186 * The fib entry flags for this source are changing
187 */
188typedef void (*fib_entry_src_copy_t)(const fib_entry_src_t *orig_src,
189 const fib_entry_t *fib_entry,
190 fib_entry_src_t *copy_src);
191
192/**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100193 * Virtual function table each FIB entry source will register
194 */
195typedef struct fib_entry_src_vft_t_ {
196 fib_entry_src_init_t fesv_init;
197 fib_entry_src_deinit_t fesv_deinit;
198 fib_entry_src_activate_t fesv_activate;
199 fib_entry_src_deactivate_t fesv_deactivate;
Neale Ranns89541992017-04-06 04:41:02 -0700200 fib_entry_src_reactivate_t fesv_reactivate;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100201 fib_entry_src_add_t fesv_add;
202 fib_entry_src_remove_t fesv_remove;
203 fib_entry_src_path_swap_t fesv_path_swap;
204 fib_entry_src_path_add_t fesv_path_add;
205 fib_entry_src_path_remove_t fesv_path_remove;
206 fib_entry_src_cover_change_t fesv_cover_change;
207 fib_entry_src_cover_update_t fesv_cover_update;
208 fib_entry_src_format_t fesv_format;
209 fib_entry_src_installed_t fesv_installed;
Neale Rannsa4e77662017-12-04 20:00:30 +0000210 fib_entry_src_fwd_update_t fesv_fwd_update;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100211 fib_entry_src_get_data_t fesv_get_data;
212 fib_entry_src_set_data_t fesv_set_data;
Neale Ranns2303cb12018-02-21 04:57:17 -0800213 fib_entry_src_contribute_interpose_t fesv_contribute_interpose;
214 fib_entry_src_flag_change_t fesv_flags_change;
215 fib_entry_src_copy_t fesv_copy;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100216} fib_entry_src_vft_t;
217
Neale Rannsa4e77662017-12-04 20:00:30 +0000218#define FOR_EACH_SRC_ADDED(_entry, _src, _source, action) \
219{ \
Neale Ranns2303cb12018-02-21 04:57:17 -0800220 vec_foreach(_src, (_entry)->fe_srcs) \
Neale Rannsa4e77662017-12-04 20:00:30 +0000221 { \
222 if (_src->fes_flags & FIB_ENTRY_SRC_FLAG_ADDED) { \
Neale Ranns2303cb12018-02-21 04:57:17 -0800223 _source = (_src)->fes_src; \
224 action; \
Neale Rannsa4e77662017-12-04 20:00:30 +0000225 } \
226 } \
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100227}
228
Neale Ranns2303cb12018-02-21 04:57:17 -0800229#define FIB_ENTRY_SRC_VFT_INVOKE(esrc, func, args) \
230{ \
231 const fib_entry_src_vft_t *_vft; \
232 _vft = fib_entry_src_get_vft(esrc); \
233 if (_vft->func) \
234 _vft->func args; \
235}
236
237#define FIB_ENTRY_SRC_VFT_INVOKE_AND_RETURN(esrc, func, args) \
238{ \
239 const fib_entry_src_vft_t *_vft; \
240 _vft = fib_entry_src_get_vft(esrc); \
241 if (_vft->func) \
242 return (_vft->func args); \
243}
244
245#define FIB_ENTRY_SRC_VFT_EXISTS(esrc, func) \
246{ \
247 const fib_entry_src_vft_t *_vft; \
248 _vft = fib_entry_src_get_vft(esrc); \
249 (_vft->func); \
250}
251
252extern const fib_entry_src_vft_t*fib_entry_src_get_vft(
253 const fib_entry_src_t *esrc);
254
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100255extern u8* fib_entry_src_format(fib_entry_t *entry,
256 fib_source_t source,
257 u8* s);
258
259extern void fib_entry_src_register(fib_source_t source,
260 const fib_entry_src_vft_t *vft);
261
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100262extern fib_entry_src_cover_res_t fib_entry_src_action_cover_change(
263 fib_entry_t *entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800264 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100265
266extern fib_entry_src_cover_res_t fib_entry_src_action_cover_update(
267 fib_entry_t *fib_entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800268 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100269
270extern void fib_entry_src_action_activate(fib_entry_t *fib_entry,
271 fib_source_t source);
272
273extern void fib_entry_src_action_deactivate(fib_entry_t *fib_entry,
274 fib_source_t source);
275extern void fib_entry_src_action_reactivate(fib_entry_t *fib_entry,
276 fib_source_t source);
277
278extern fib_entry_t* fib_entry_src_action_add(fib_entry_t *fib_entry,
279 fib_source_t source,
280 fib_entry_flag_t flags,
281 const dpo_id_t *dpo);
Neale Ranns948e00f2016-10-20 13:39:34 +0100282extern fib_entry_t* fib_entry_src_action_update(fib_entry_t *fib_entry,
283 fib_source_t source,
284 fib_entry_flag_t flags,
285 const dpo_id_t *dpo);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100286
287extern fib_entry_src_flag_t fib_entry_src_action_remove(fib_entry_t *fib_entry,
288 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700289extern fib_entry_src_flag_t
290fib_entry_src_action_remove_or_update_inherit(fib_entry_t *fib_entry,
291 fib_source_t source);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100292
293extern void fib_entry_src_action_install(fib_entry_t *fib_entry,
294 fib_source_t source);
295
296extern void fib_entry_src_action_uninstall(fib_entry_t *fib_entry);
297
298extern fib_entry_t* fib_entry_src_action_path_add(fib_entry_t *fib_entry,
299 fib_source_t source,
300 fib_entry_flag_t flags,
301 const fib_route_path_t *path);
302
303extern fib_entry_t* fib_entry_src_action_path_swap(fib_entry_t *fib_entry,
304 fib_source_t source,
305 fib_entry_flag_t flags,
306 const fib_route_path_t *path);
307
308extern fib_entry_src_flag_t fib_entry_src_action_path_remove(fib_entry_t *fib_entry,
309 fib_source_t source,
310 const fib_route_path_t *path);
311
Neale Rannsa4e77662017-12-04 20:00:30 +0000312extern void fib_entry_src_action_installed(const fib_entry_t *fib_entry,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100313 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700314extern void fib_entry_src_inherit (const fib_entry_t *cover,
315 fib_entry_t *covered);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100316
317extern fib_forward_chain_type_t fib_entry_get_default_chain_type(
318 const fib_entry_t *fib_entry);
319extern fib_entry_flag_t fib_entry_get_flags_i(const fib_entry_t *fib_entry);
Neale Ranns89541992017-04-06 04:41:02 -0700320
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100321extern fib_path_list_flags_t fib_entry_src_flags_2_path_list_flags(
322 fib_entry_flag_t eflags);
323
Neale Rannsad422ed2016-11-02 14:20:04 +0000324extern fib_forward_chain_type_t fib_entry_chain_type_fixup(const fib_entry_t *entry,
325 fib_forward_chain_type_t fct);
326
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100327extern void fib_entry_src_mk_lb (fib_entry_t *fib_entry,
328 const fib_entry_src_t *esrc,
329 fib_forward_chain_type_t fct,
330 dpo_id_t *dpo_lb);
331
Neale Rannsda78f952017-05-24 09:15:43 -0700332extern fib_protocol_t fib_entry_get_proto(const fib_entry_t * fib_entry);
333extern dpo_proto_t fib_entry_get_dpo_proto(const fib_entry_t * fib_entry);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100334
Neale Ranns89541992017-04-06 04:41:02 -0700335extern void fib_entry_source_change(fib_entry_t *fib_entry,
336 fib_source_t old_source,
337 fib_source_t new_source);
338
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100339/*
340 * Per-source registration. declared here so we save a separate .h file for each
341 */
342extern void fib_entry_src_default_register(void);
343extern void fib_entry_src_rr_register(void);
344extern void fib_entry_src_interface_register(void);
Neale Ranns2303cb12018-02-21 04:57:17 -0800345extern void fib_entry_src_interpose_register(void);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100346extern void fib_entry_src_default_route_register(void);
347extern void fib_entry_src_special_register(void);
348extern void fib_entry_src_api_register(void);
349extern void fib_entry_src_adj_register(void);
350extern void fib_entry_src_mpls_register(void);
351extern void fib_entry_src_lisp_register(void);
352
353extern void fib_entry_src_module_init(void);
354
355#endif