blob: edeaaf980e8afa4d0774a7b429fed1c10525c2dc [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, \
Benoît Ganne99c358d2019-07-17 14:47:23 +020036 fib_entry_get_flags_i(_e), \
Neale Ranns710071b2018-09-24 12:36:26 +000037 format_fib_source, \
Benoît Ganne99c358d2019-07-17 14:47:23 +020038 fib_entry_get_source_i(_e), \
Neale Ranns710071b2018-09-24 12:36:26 +000039 ##_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 Ranns6ede5702020-02-13 09:12:36 +0000229#define FIB_ENTRY_SRC_VFT_INVOKE(_fe, esrc, func, args) \
Neale Ranns9db6ada2019-11-08 12:42:31 +0000230{ \
231 const fib_entry_src_vft_t *_vft; \
Neale Ranns6ede5702020-02-13 09:12:36 +0000232 fib_node_index_t _fei = fib_entry_get_index(_fe); \
Neale Ranns9db6ada2019-11-08 12:42:31 +0000233 _vft = fib_entry_src_get_vft(esrc); \
234 if (_vft->func) { \
235 (esrc)->fes_flags &= ~FIB_ENTRY_SRC_FLAG_STALE; \
236 _vft->func args; \
237 } \
Neale Ranns6ede5702020-02-13 09:12:36 +0000238 _fe = fib_entry_get(_fei); \
Neale Ranns2303cb12018-02-21 04:57:17 -0800239}
240
241#define FIB_ENTRY_SRC_VFT_INVOKE_AND_RETURN(esrc, func, args) \
Neale Ranns9db6ada2019-11-08 12:42:31 +0000242{ \
243 const fib_entry_src_vft_t *_vft; \
244 _vft = fib_entry_src_get_vft(esrc); \
245 if (_vft->func) { \
246 (esrc)->fes_flags &= ~FIB_ENTRY_SRC_FLAG_STALE; \
247 return (_vft->func args); \
248 } \
Neale Ranns2303cb12018-02-21 04:57:17 -0800249}
250
251#define FIB_ENTRY_SRC_VFT_EXISTS(esrc, func) \
252{ \
253 const fib_entry_src_vft_t *_vft; \
254 _vft = fib_entry_src_get_vft(esrc); \
255 (_vft->func); \
256}
257
258extern const fib_entry_src_vft_t*fib_entry_src_get_vft(
259 const fib_entry_src_t *esrc);
260
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100261extern u8* fib_entry_src_format(fib_entry_t *entry,
262 fib_source_t source,
263 u8* s);
264
Neale Ranns3bab8f92019-12-04 06:11:00 +0000265extern void fib_entry_src_behaviour_register (fib_source_behaviour_t source,
266 const fib_entry_src_vft_t *vft);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100267
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100268extern fib_entry_src_cover_res_t fib_entry_src_action_cover_change(
269 fib_entry_t *entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800270 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100271
272extern fib_entry_src_cover_res_t fib_entry_src_action_cover_update(
273 fib_entry_t *fib_entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800274 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100275
276extern void fib_entry_src_action_activate(fib_entry_t *fib_entry,
277 fib_source_t source);
278
279extern void fib_entry_src_action_deactivate(fib_entry_t *fib_entry,
280 fib_source_t source);
281extern void fib_entry_src_action_reactivate(fib_entry_t *fib_entry,
282 fib_source_t source);
283
284extern fib_entry_t* fib_entry_src_action_add(fib_entry_t *fib_entry,
285 fib_source_t source,
286 fib_entry_flag_t flags,
287 const dpo_id_t *dpo);
Neale Ranns948e00f2016-10-20 13:39:34 +0100288extern fib_entry_t* fib_entry_src_action_update(fib_entry_t *fib_entry,
289 fib_source_t source,
290 fib_entry_flag_t flags,
291 const dpo_id_t *dpo);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100292
293extern fib_entry_src_flag_t fib_entry_src_action_remove(fib_entry_t *fib_entry,
294 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700295extern fib_entry_src_flag_t
296fib_entry_src_action_remove_or_update_inherit(fib_entry_t *fib_entry,
297 fib_source_t source);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100298
299extern void fib_entry_src_action_install(fib_entry_t *fib_entry,
300 fib_source_t source);
301
302extern void fib_entry_src_action_uninstall(fib_entry_t *fib_entry);
303
304extern fib_entry_t* fib_entry_src_action_path_add(fib_entry_t *fib_entry,
305 fib_source_t source,
306 fib_entry_flag_t flags,
307 const fib_route_path_t *path);
308
309extern fib_entry_t* fib_entry_src_action_path_swap(fib_entry_t *fib_entry,
310 fib_source_t source,
311 fib_entry_flag_t flags,
312 const fib_route_path_t *path);
313
314extern fib_entry_src_flag_t fib_entry_src_action_path_remove(fib_entry_t *fib_entry,
315 fib_source_t source,
316 const fib_route_path_t *path);
317
Neale Ranns6ede5702020-02-13 09:12:36 +0000318extern fib_entry_t* fib_entry_src_action_installed(fib_entry_t *fib_entry,
319 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700320extern void fib_entry_src_inherit (const fib_entry_t *cover,
321 fib_entry_t *covered);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100322
323extern fib_forward_chain_type_t fib_entry_get_default_chain_type(
324 const fib_entry_t *fib_entry);
Benoît Ganne99c358d2019-07-17 14:47:23 +0200325extern fib_source_t fib_entry_get_source_i(const fib_entry_t *fib_entry);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100326extern fib_entry_flag_t fib_entry_get_flags_i(const fib_entry_t *fib_entry);
Neale Ranns89541992017-04-06 04:41:02 -0700327
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100328extern fib_path_list_flags_t fib_entry_src_flags_2_path_list_flags(
329 fib_entry_flag_t eflags);
330
Neale Rannsad422ed2016-11-02 14:20:04 +0000331extern fib_forward_chain_type_t fib_entry_chain_type_fixup(const fib_entry_t *entry,
332 fib_forward_chain_type_t fct);
333
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100334extern void fib_entry_src_mk_lb (fib_entry_t *fib_entry,
335 const fib_entry_src_t *esrc,
336 fib_forward_chain_type_t fct,
337 dpo_id_t *dpo_lb);
338
Neale Rannsda78f952017-05-24 09:15:43 -0700339extern fib_protocol_t fib_entry_get_proto(const fib_entry_t * fib_entry);
340extern dpo_proto_t fib_entry_get_dpo_proto(const fib_entry_t * fib_entry);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100341
Neale Ranns89541992017-04-06 04:41:02 -0700342extern void fib_entry_source_change(fib_entry_t *fib_entry,
343 fib_source_t old_source,
344 fib_source_t new_source);
345
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100346/*
347 * Per-source registration. declared here so we save a separate .h file for each
348 */
349extern void fib_entry_src_default_register(void);
350extern void fib_entry_src_rr_register(void);
351extern void fib_entry_src_interface_register(void);
Neale Ranns2303cb12018-02-21 04:57:17 -0800352extern void fib_entry_src_interpose_register(void);
Neale Ranns3bab8f92019-12-04 06:11:00 +0000353extern void fib_entry_src_drop_register(void);
354extern void fib_entry_src_simple_register(void);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100355extern void fib_entry_src_api_register(void);
356extern void fib_entry_src_adj_register(void);
357extern void fib_entry_src_mpls_register(void);
358extern void fib_entry_src_lisp_register(void);
359
360extern void fib_entry_src_module_init(void);
361
362#endif