FD.io VPP  v19.01.3-6-g70449b9b9
Vector Packet Processing
fib_entry_src.h
Go to the documentation of this file.
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 #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  */
27 
28 #define FIB_ENTRY_DBG(_e, _fmt, _args...) \
29 { \
30  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); \
40 }
41 
42 /**
43  * Source initialisation Function
44  */
46 
47 /**
48  * Source deinitialisation Function
49  */
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  */
57  const fib_entry_t *fib_entry);
58 
59 /**
60  * Source re-activation. Called when the source is updated and remains
61  * the best source.
62  */
64  const fib_entry_t *fib_entry);
65 
66 /**
67  * Source Deactivate.
68  * Called when the source is no longer best source on the entry
69  */
71  const fib_entry_t *fib_entry);
72 
73 /**
74  * Source Add.
75  * Called when the source is added to the entry
76  */
78  const fib_entry_t *entry,
80  dpo_proto_t proto,
81  const dpo_id_t *dpo);
82 
83 /**
84  * Source Remove.
85  */
87 
88 /**
89  * Result from a cover update/change
90  */
95 
96 /**
97  * Cover changed. the source should re-evaluate its cover.
98  */
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  */
109  const fib_entry_t *fib_entry);
110 
111 /**
112  * 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  */
117  const fib_entry_t *fib_entry,
118  fib_source_t best_source);
119 
120 /**
121  * Installed. Notification that the source is now installed as
122  * the entry's forwarding source.
123  */
125  const fib_entry_t *fib_entry);
126 
127 /**
128  * format.
129  */
130 typedef 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  */
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  */
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  */
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  */
163  const fib_entry_t *fib_entry,
164  const void *data);
165 
166 /**
167  * Get source specific opaque data
168  */
169 typedef const void* (*fib_entry_src_get_data_t)(fib_entry_src_t *src,
170  const fib_entry_t *fib_entry);
171 
172 /**
173  * Contribute forwarding to interpose inthe chain
174  */
175 typedef 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  */
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  */
188 typedef 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 /**
193  * Virtual function table each FIB entry source will register
194  */
195 typedef struct fib_entry_src_vft_t_ {
217 
218 #define FOR_EACH_SRC_ADDED(_entry, _src, _source, action) \
219 { \
220  vec_foreach(_src, (_entry)->fe_srcs) \
221  { \
222  if (_src->fes_flags & FIB_ENTRY_SRC_FLAG_ADDED) { \
223  _source = (_src)->fes_src; \
224  action; \
225  } \
226  } \
227 }
228 
229 #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 
253  const fib_entry_src_t *esrc);
254 
255 extern u8* fib_entry_src_format(fib_entry_t *entry,
256  fib_source_t source,
257  u8* s);
258 
259 extern void fib_entry_src_register(fib_source_t source,
260  const fib_entry_src_vft_t *vft);
261 
263  fib_entry_t *entry,
264  fib_entry_src_t *esrc);
265 
267  fib_entry_t *fib_entry,
268  fib_entry_src_t *esrc);
269 
270 extern void fib_entry_src_action_activate(fib_entry_t *fib_entry,
271  fib_source_t source);
272 
273 extern void fib_entry_src_action_deactivate(fib_entry_t *fib_entry,
274  fib_source_t source);
275 extern void fib_entry_src_action_reactivate(fib_entry_t *fib_entry,
276  fib_source_t source);
277 
279  fib_source_t source,
281  const dpo_id_t *dpo);
283  fib_source_t source,
285  const dpo_id_t *dpo);
286 
288  fib_source_t source);
291  fib_source_t source);
292 
293 extern void fib_entry_src_action_install(fib_entry_t *fib_entry,
294  fib_source_t source);
295 
296 extern void fib_entry_src_action_uninstall(fib_entry_t *fib_entry);
297 
299  fib_source_t source,
301  const fib_route_path_t *path);
302 
304  fib_source_t source,
306  const fib_route_path_t *path);
307 
309  fib_source_t source,
310  const fib_route_path_t *path);
311 
312 extern void fib_entry_src_action_installed(const fib_entry_t *fib_entry,
313  fib_source_t source);
314 extern void fib_entry_src_inherit (const fib_entry_t *cover,
315  fib_entry_t *covered);
316 
318  const fib_entry_t *fib_entry);
319 extern fib_entry_flag_t fib_entry_get_flags_i(const fib_entry_t *fib_entry);
320 
322  fib_entry_flag_t eflags);
323 
326 
327 extern void fib_entry_src_mk_lb (fib_entry_t *fib_entry,
328  const fib_entry_src_t *esrc,
330  dpo_id_t *dpo_lb);
331 
332 extern fib_protocol_t fib_entry_get_proto(const fib_entry_t * fib_entry);
333 extern dpo_proto_t fib_entry_get_dpo_proto(const fib_entry_t * fib_entry);
334 
335 extern void fib_entry_source_change(fib_entry_t *fib_entry,
336  fib_source_t old_source,
337  fib_source_t new_source);
338 
339 /*
340  * Per-source registration. declared here so we save a separate .h file for each
341  */
342 extern void fib_entry_src_default_register(void);
343 extern void fib_entry_src_rr_register(void);
344 extern void fib_entry_src_interface_register(void);
345 extern void fib_entry_src_interpose_register(void);
346 extern void fib_entry_src_default_route_register(void);
347 extern void fib_entry_src_special_register(void);
348 extern void fib_entry_src_api_register(void);
349 extern void fib_entry_src_adj_register(void);
350 extern void fib_entry_src_mpls_register(void);
351 extern void fib_entry_src_lisp_register(void);
352 
353 extern void fib_entry_src_module_init(void);
354 
355 #endif
int(* fib_entry_src_activate_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Source activation.
Definition: fib_entry_src.h:56
void(* fib_entry_src_path_add_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry, fib_path_list_flags_t pl_flags, const fib_route_path_t *path)
Source path add the source is adding a new path.
void fib_entry_src_action_install(fib_entry_t *fib_entry, fib_source_t source)
fib_entry_src_init_t fesv_init
void(* fib_entry_src_deinit_t)(fib_entry_src_t *src)
Source deinitialisation Function.
Definition: fib_entry_src.h:50
void(* fib_entry_src_path_remove_t)(fib_entry_src_t *src, fib_path_list_flags_t pl_flags, const fib_route_path_t *path)
Source path remove the source is remoinvg a path.
u32 vlib_log_class_t
Definition: log.h:21
u32 flags
Definition: vhost_user.h:115
vl_api_address_t src
Definition: vxlan_gbp.api:32
An entry in a FIB table.
Definition: fib_entry.h:462
dpo_proto_t fib_entry_get_dpo_proto(const fib_entry_t *fib_entry)
Definition: fib_entry.c:74
fib_entry_src_set_data_t fesv_set_data
fib_node_bw_reason_flag_t bw_reason
Definition: fib_entry_src.h:93
fib_entry_src_copy_t fesv_copy
const fib_entry_src_vft_t * fib_entry_src_get_vft(const fib_entry_src_t *esrc)
Get the VFT for a given source.
Definition: fib_entry_src.c:37
A representation of a path as described by a route producer.
Definition: fib_types.h:470
fib_entry_src_cover_res_t fib_entry_src_action_cover_update(fib_entry_t *fib_entry, fib_entry_src_t *esrc)
Virtual function table each FIB entry source will register.
Information related to the source of a FIB entry.
Definition: fib_entry.h:354
fib_entry_src_cover_res_t(* fib_entry_src_cover_update_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Cover updated.
void fib_entry_src_action_installed(const fib_entry_t *fib_entry, fib_source_t source)
Result from a cover update/change.
Definition: fib_entry_src.h:91
fib_entry_src_contribute_interpose_t fesv_contribute_interpose
void fib_entry_src_action_deactivate(fib_entry_t *fib_entry, fib_source_t source)
fib_entry_t * fib_entry_src_action_add(fib_entry_t *fib_entry, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
vlib_log_class_t fib_entry_logger
Debug macro.
Definition: fib_entry.c:47
unsigned char u8
Definition: types.h:56
void fib_entry_src_mpls_register(void)
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
void fib_entry_src_adj_register(void)
void fib_entry_src_mk_lb(fib_entry_t *fib_entry, const fib_entry_src_t *esrc, fib_forward_chain_type_t fct, dpo_id_t *dpo_lb)
void fib_entry_src_lisp_register(void)
fib_entry_flag_t fib_entry_get_flags_i(const fib_entry_t *fib_entry)
fib_entry_src_cover_update_t fesv_cover_update
void(* fib_entry_src_init_t)(fib_entry_src_t *src)
Source initialisation Function.
Definition: fib_entry_src.h:45
fib_entry_src_cover_change_t fesv_cover_change
void(* fib_entry_src_remove_t)(fib_entry_src_t *src)
Source Remove.
Definition: fib_entry_src.h:86
void(* fib_entry_src_add_t)(fib_entry_src_t *src, const fib_entry_t *entry, fib_entry_flag_t flags, dpo_proto_t proto, const dpo_id_t *dpo)
Source Add.
Definition: fib_entry_src.h:77
u8 *(* fib_entry_src_format_t)(fib_entry_src_t *src, u8 *s)
format.
fib_entry_src_path_add_t fesv_path_add
const void *(* fib_entry_src_get_data_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Get source specific opaque data.
void(* fib_entry_src_installed_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Installed.
fib_entry_src_get_data_t fesv_get_data
void fib_entry_src_inherit(const fib_entry_t *cover, fib_entry_t *covered)
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
fib_protocol_t fib_entry_get_proto(const fib_entry_t *fib_entry)
Definition: fib_entry.c:68
void fib_entry_src_api_register(void)
u16 install
Definition: fib_entry_src.h:92
fib_entry_t * fib_entry_src_action_path_add(fib_entry_t *fib_entry, fib_source_t source, fib_entry_flag_t flags, const fib_route_path_t *path)
fib_entry_src_flag_t fib_entry_src_action_remove_or_update_inherit(fib_entry_t *fib_entry, fib_source_t source)
void fib_entry_src_action_uninstall(fib_entry_t *fib_entry)
void(* fib_entry_src_copy_t)(const fib_entry_src_t *orig_src, const fib_entry_t *fib_entry, fib_entry_src_t *copy_src)
The fib entry flags for this source are changing.
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:168
void(* fib_entry_src_deactivate_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Source Deactivate.
Definition: fib_entry_src.h:70
void fib_entry_src_default_route_register(void)
fib_entry_src_flag_t fib_entry_src_action_remove(fib_entry_t *fib_entry, fib_source_t source)
enum fib_source_t_ fib_source_t
The different sources that can create a route.
fib_entry_src_fwd_update_t fesv_fwd_update
fib_entry_src_deinit_t fesv_deinit
unsigned short u16
Definition: types.h:57
void fib_entry_src_interpose_register(void)
fib_entry_src_format_t fesv_format
fib_entry_src_cover_res_t(* fib_entry_src_cover_change_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Cover changed.
Definition: fib_entry_src.h:99
void fib_entry_src_default_register(void)
enum fib_node_bw_reason_flag_t_ fib_node_bw_reason_flag_t
Flags enum constructed from the reaons.
void fib_entry_src_register(fib_source_t source, const fib_entry_src_vft_t *vft)
Definition: fib_entry_src.c:56
fib_entry_t * fib_entry_src_action_update(fib_entry_t *fib_entry, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
void fib_entry_src_rr_register(void)
fib_entry_src_remove_t fesv_remove
fib_entry_src_deactivate_t fesv_deactivate
void fib_entry_src_action_activate(fib_entry_t *fib_entry, fib_source_t source)
struct fib_entry_src_vft_t_ fib_entry_src_vft_t
Virtual function table each FIB entry source will register.
fib_entry_src_flag_change_t fesv_flags_change
enum fib_entry_flag_t_ fib_entry_flag_t
void fib_entry_src_interface_register(void)
void fib_entry_src_module_init(void)
void(* fib_entry_src_flag_change_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry, fib_entry_flag_t new_flags)
The fib entry flags for this source are changing.
void fib_entry_src_special_register(void)
enum fib_forward_chain_type_t_ fib_forward_chain_type_t
FIB output chain type.
void(* fib_entry_src_set_data_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry, const void *data)
Set source specific opaque data.
enum fib_entry_src_flag_t_ fib_entry_src_flag_t
int(* fib_entry_src_reactivate_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry)
Source re-activation.
Definition: fib_entry_src.h:63
fib_entry_src_path_remove_t fesv_path_remove
fib_entry_src_path_swap_t fesv_path_swap
u8 * fib_entry_src_format(fib_entry_t *entry, fib_source_t source, u8 *s)
fib_entry_src_flag_t fib_entry_src_action_path_remove(fib_entry_t *fib_entry, fib_source_t source, const fib_route_path_t *path)
fib_forward_chain_type_t fib_entry_chain_type_fixup(const fib_entry_t *entry, fib_forward_chain_type_t fct)
Turn the chain type requested by the client into the one they really wanted.
fib_path_list_flags_t fib_entry_src_flags_2_path_list_flags(fib_entry_flag_t eflags)
fib_entry_src_activate_t fesv_activate
fib_entry_t * fib_entry_src_action_path_swap(fib_entry_t *fib_entry, fib_source_t source, fib_entry_flag_t flags, const fib_route_path_t *path)
struct fib_entry_src_cover_res_t_ fib_entry_src_cover_res_t
Result from a cover update/change.
const dpo_id_t *(* fib_entry_src_contribute_interpose_t)(const fib_entry_src_t *src, const fib_entry_t *fib_entry)
Contribute forwarding to interpose inthe chain.
fib_entry_src_add_t fesv_add
void(* fib_entry_src_fwd_update_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry, fib_source_t best_source)
Forwarding updated.
enum fib_path_list_flags_t_ fib_path_list_flags_t
void fib_entry_src_action_reactivate(fib_entry_t *fib_entry, fib_source_t source)
fib_entry_src_installed_t fesv_installed
fib_entry_src_reactivate_t fesv_reactivate
void fib_entry_source_change(fib_entry_t *fib_entry, fib_source_t old_source, fib_source_t new_source)
Definition: fib_entry.c:856
void(* fib_entry_src_path_swap_t)(fib_entry_src_t *src, const fib_entry_t *fib_entry, fib_path_list_flags_t pl_flags, const fib_route_path_t *path)
Source path replace/swap the source is providing a new set of paths.
fib_entry_src_cover_res_t fib_entry_src_action_cover_change(fib_entry_t *entry, fib_entry_src_t *esrc)
fib_forward_chain_type_t fib_entry_get_default_chain_type(const fib_entry_t *fib_entry)
Definition: fib_entry.c:80