blob: 1f348baeacb07eff2452538e8f48a9df2dd3df58 [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
Damjan Mariond22f1902021-04-14 18:48:22 +0200251#define FIB_ENTRY_SRC_VFT_EXISTS(esrc, func) \
252 (fib_entry_src_get_vft(esrc)->func != 0)
Neale Ranns2303cb12018-02-21 04:57:17 -0800253
254extern const fib_entry_src_vft_t*fib_entry_src_get_vft(
255 const fib_entry_src_t *esrc);
256
Neale Rannse2fe0972020-11-26 08:37:27 +0000257extern fib_entry_src_t * fib_entry_src_find (const fib_entry_t *fib_entry,
258 fib_source_t source);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100259extern u8* fib_entry_src_format(fib_entry_t *entry,
260 fib_source_t source,
261 u8* s);
262
Neale Ranns3bab8f92019-12-04 06:11:00 +0000263extern void fib_entry_src_behaviour_register (fib_source_behaviour_t source,
264 const fib_entry_src_vft_t *vft);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100265
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100266extern fib_entry_src_cover_res_t fib_entry_src_action_cover_change(
267 fib_entry_t *entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800268 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100269
270extern fib_entry_src_cover_res_t fib_entry_src_action_cover_update(
271 fib_entry_t *fib_entry,
Neale Ranns2303cb12018-02-21 04:57:17 -0800272 fib_entry_src_t *esrc);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100273
274extern void fib_entry_src_action_activate(fib_entry_t *fib_entry,
275 fib_source_t source);
276
277extern void fib_entry_src_action_deactivate(fib_entry_t *fib_entry,
278 fib_source_t source);
279extern void fib_entry_src_action_reactivate(fib_entry_t *fib_entry,
280 fib_source_t source);
281
282extern fib_entry_t* fib_entry_src_action_add(fib_entry_t *fib_entry,
283 fib_source_t source,
284 fib_entry_flag_t flags,
285 const dpo_id_t *dpo);
Neale Ranns948e00f2016-10-20 13:39:34 +0100286extern fib_entry_t* fib_entry_src_action_update(fib_entry_t *fib_entry,
287 fib_source_t source,
288 fib_entry_flag_t flags,
289 const dpo_id_t *dpo);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100290
291extern fib_entry_src_flag_t fib_entry_src_action_remove(fib_entry_t *fib_entry,
292 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700293extern fib_entry_src_flag_t
294fib_entry_src_action_remove_or_update_inherit(fib_entry_t *fib_entry,
295 fib_source_t source);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100296
297extern void fib_entry_src_action_install(fib_entry_t *fib_entry,
298 fib_source_t source);
299
300extern void fib_entry_src_action_uninstall(fib_entry_t *fib_entry);
301
302extern fib_entry_t* fib_entry_src_action_path_add(fib_entry_t *fib_entry,
303 fib_source_t source,
304 fib_entry_flag_t flags,
305 const fib_route_path_t *path);
306
307extern fib_entry_t* fib_entry_src_action_path_swap(fib_entry_t *fib_entry,
308 fib_source_t source,
309 fib_entry_flag_t flags,
310 const fib_route_path_t *path);
311
312extern fib_entry_src_flag_t fib_entry_src_action_path_remove(fib_entry_t *fib_entry,
313 fib_source_t source,
314 const fib_route_path_t *path);
315
Neale Ranns6ede5702020-02-13 09:12:36 +0000316extern fib_entry_t* fib_entry_src_action_installed(fib_entry_t *fib_entry,
317 fib_source_t source);
Neale Ranns89541992017-04-06 04:41:02 -0700318extern void fib_entry_src_inherit (const fib_entry_t *cover,
319 fib_entry_t *covered);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100320
321extern fib_forward_chain_type_t fib_entry_get_default_chain_type(
322 const fib_entry_t *fib_entry);
Benoît Ganne99c358d2019-07-17 14:47:23 +0200323extern fib_source_t fib_entry_get_source_i(const fib_entry_t *fib_entry);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100324extern fib_entry_flag_t fib_entry_get_flags_i(const fib_entry_t *fib_entry);
Neale Ranns89541992017-04-06 04:41:02 -0700325
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100326extern fib_path_list_flags_t fib_entry_src_flags_2_path_list_flags(
327 fib_entry_flag_t eflags);
328
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100329extern void fib_entry_src_mk_lb (fib_entry_t *fib_entry,
Neale Ranns1c59df72021-01-26 12:08:25 +0000330 fib_source_t source,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100331 fib_forward_chain_type_t fct,
332 dpo_id_t *dpo_lb);
333
Neale Rannsda78f952017-05-24 09:15:43 -0700334extern fib_protocol_t fib_entry_get_proto(const fib_entry_t * fib_entry);
335extern dpo_proto_t fib_entry_get_dpo_proto(const fib_entry_t * fib_entry);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100336
Neale Ranns89541992017-04-06 04:41:02 -0700337extern void fib_entry_source_change(fib_entry_t *fib_entry,
338 fib_source_t old_source,
339 fib_source_t new_source);
340
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100341/*
342 * Per-source registration. declared here so we save a separate .h file for each
343 */
344extern void fib_entry_src_default_register(void);
345extern void fib_entry_src_rr_register(void);
346extern void fib_entry_src_interface_register(void);
Neale Ranns2303cb12018-02-21 04:57:17 -0800347extern void fib_entry_src_interpose_register(void);
Neale Ranns3bab8f92019-12-04 06:11:00 +0000348extern void fib_entry_src_drop_register(void);
349extern void fib_entry_src_simple_register(void);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100350extern void fib_entry_src_api_register(void);
351extern void fib_entry_src_adj_register(void);
352extern void fib_entry_src_mpls_register(void);
353extern void fib_entry_src_lisp_register(void);
354
355extern void fib_entry_src_module_init(void);
356
357#endif