FD.io VPP  v18.10-34-gcce845e
Vector Packet Processing
mfib_table.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 __MFIB_TABLE_H__
17 #define __MFIB_TABLE_H__
18 
19 #include <vnet/ip/ip.h>
20 #include <vnet/adj/adj.h>
21 #include <vnet/dpo/replicate_dpo.h>
22 
23 #include <vnet/mfib/mfib_types.h>
24 
25 /**
26  * Keep a lock per-source and a total
27  */
28 #define MFIB_TABLE_N_LOCKS (MFIB_N_SOURCES+1)
29 #define MFIB_TABLE_TOTAL_LOCKS MFIB_N_SOURCES
30 
31 /**
32  * @brief
33  * A protocol Independent IP multicast FIB table
34  */
35 typedef struct mfib_table_t_
36 {
37  /**
38  * Required for pool_get_aligned
39  */
40  CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
41 
42  /**
43  * A union of the protocol specific FIBs that provide the
44  * underlying LPM mechanism.
45  * This element is first in the struct so that it is in the
46  * first cache line.
47  */
48  union {
51  };
52 
53  /**
54  * Which protocol this table serves. Used to switch on the union above.
55  */
57 
58  /**
59  * number of locks on the table
60  */
62 
63  /**
64  * Table ID (hash key) for this FIB.
65  */
67 
68  /**
69  * Index into FIB vector.
70  */
72 
73  /**
74  * Total route counters
75  */
77 
78  /**
79  * Table description
80  */
82 } mfib_table_t;
83 
84 /**
85  * @brief
86  * Format the description/name of the table
87  */
88 extern u8* format_mfib_table_name(u8* s, va_list *ap);
89 
90 /**
91  * @brief
92  * Perfom a longest prefix match in the non-forwarding table
93  *
94  * @param fib_index
95  * The index of the FIB
96  *
97  * @param prefix
98  * The prefix to lookup
99  *
100  * @return
101  * The index of the fib_entry_t for the best match, which may be the default route
102  */
103 extern fib_node_index_t mfib_table_lookup(u32 fib_index,
104  const mfib_prefix_t *prefix);
105 
106 /**
107  * @brief
108  * Perfom an exact match in the non-forwarding table
109  *
110  * @param fib_index
111  * The index of the FIB
112  *
113  * @param prefix
114  * The prefix to lookup
115  *
116  * @return
117  * The index of the fib_entry_t for the exact match, or INVALID
118  * is there is no match.
119  */
121  const mfib_prefix_t *prefix);
122 
123 /**
124  * @brief
125  * Add a new (with no replication) or lock an existing entry
126  *
127  * @param prefix
128  * The prefix for the entry to add
129  *
130  * @return
131  * the index of the fib_entry_t that is created (or existed already).
132  */
134  const mfib_prefix_t *prefix,
135  mfib_source_t source,
136  fib_rpf_id_t rpf_id,
138 
139 /**
140  * @brief
141  * Add n paths to an entry (aka route) in the FIB. If the entry does not
142  * exist, it will be created.
143  * See the documentation for fib_route_path_t for more descirptions of
144  * the path parameters.
145  *
146  * @param fib_index
147  * The index of the FIB
148  *
149  * @param prefix
150  * The prefix for the entry to add
151  *
152  * @param source
153  * The ID of the client/source adding the entry.
154  *
155  * @param flags
156  * Flags for the entry.
157  *
158  * @param rpaths
159  * A vector of paths.
160  *
161  * @return
162  * the index of the fib_entry_t that is created (or existed already).
163  */
165  const mfib_prefix_t *prefix,
166  mfib_source_t source,
167  const fib_route_path_t *rpath,
169 
170 /**
171  * @brief
172  * Remove n paths to an entry (aka route) in the FIB. If this is the entry's
173  * last path, then the entry will be removed, unless it has other sources.
174  * See the documentation for fib_route_path_t for more descirptions of
175  * the path parameters.
176  *
177  * @param fib_index
178  * The index of the FIB
179  *
180  * @param prefix
181  * The prefix for the entry to add
182  *
183  * @param source
184  * The ID of the client/source adding the entry.
185  *
186  * @param rpaths
187  * A vector of paths.
188  */
189 extern void mfib_table_entry_path_remove(u32 fib_index,
190  const mfib_prefix_t *prefix,
191  mfib_source_t source,
192  const fib_route_path_t *paths);
193 
194 
195 
196 /**
197  * @brief
198  * Delete a FIB entry. If the entry has no more sources, then it is
199  * removed from the table.
200  *
201  * @param fib_index
202  * The index of the FIB
203  *
204  * @param prefix
205  * The prefix for the entry to remove
206  *
207  * @param source
208  * The ID of the client/source adding the entry.
209  */
210 extern void mfib_table_entry_delete(u32 fib_index,
211  const mfib_prefix_t *prefix,
212  mfib_source_t source);
213 
214 /**
215  * @brief
216  * Delete a FIB entry. If the entry has no more sources, then it is
217  * removed from the table.
218  *
219  * @param entry_index
220  * The index of the FIB entry
221  *
222  * @param source
223  * The ID of the client/source adding the entry.
224  */
225 extern void mfib_table_entry_delete_index(fib_node_index_t entry_index,
226  mfib_source_t source);
227 
228 /**
229  * @brief
230  * Add a 'special' entry to the mFIB that links to the DPO passed
231  * A special entry is an entry that the FIB is not expect to resolve
232  * via the usual mechanisms (i.e. recurisve or neighbour adj DB lookup).
233  * Instead the client/source provides the index of a replicate DPO to link to.
234  *
235  * @param fib_index
236  * The index of the FIB
237  *
238  * @param prefix
239  * The prefix to add
240  *
241  * @param source
242  * The ID of the client/source adding the entry.
243  *
244  * @param flags
245  * Flags for the entry.
246  *
247  * @param rep_dpo
248  * The replicate DPO index to link to.
249  *
250  * @return
251  * the index of the fib_entry_t that is created (or existed already).
252  */
254  const mfib_prefix_t *prefix,
255  mfib_source_t source,
257  index_t rep_dpo);
258 
259 /**
260  * @brief
261  * Flush all entries from a table for the source
262  *
263  * @param fib_index
264  * The index of the FIB
265  *
266  * @paran proto
267  * The protocol of the entries in the table
268  *
269  * @param source
270  * the source to flush
271  */
272 extern void mfib_table_flush(u32 fib_index,
273  fib_protocol_t proto,
274  mfib_source_t source);
275 
276 /**
277  * @brief
278  * Get the index of the FIB bound to the interface
279  *
280  * @paran proto
281  * The protocol of the FIB (and thus the entries therein)
282  *
283  * @param sw_if_index
284  * The interface index
285  *
286  * @return fib_index
287  * The index of the FIB
288  */
290  u32 sw_if_index);
291 
292 /**
293  * @brief
294  * Get the index of the FIB for a Table-ID. This DOES NOT create the
295  * FIB if it does not exist.
296  *
297  * @paran proto
298  * The protocol of the FIB (and thus the entries therein)
299  *
300  * @param table-id
301  * The Table-ID
302  *
303  * @return fib_index
304  * The index of the FIB, which may be INVALID.
305  */
306 extern u32 mfib_table_find(fib_protocol_t proto, u32 table_id);
307 
308 
309 /**
310  * @brief
311  * Get the index of the FIB for a Table-ID. This DOES create the
312  * FIB if it does not exist.
313  *
314  * @paran proto
315  * The protocol of the FIB (and thus the entries therein)
316  *
317  * @param table-id
318  * The Table-ID
319  *
320  * @return fib_index
321  * The index of the FIB
322  *
323  * @param source
324  * The ID of the client/source.
325  */
327  u32 table_id,
328  mfib_source_t source);
329 
330 /**
331  * @brief
332  * Get the index of the FIB for a Table-ID. This DOES create the
333  * FIB if it does not exist.
334  *
335  * @paran proto
336  * The protocol of the FIB (and thus the entries therein)
337  *
338  * @param table-id
339  * The Table-ID
340  *
341  * @return fib_index
342  * The index of the FIB
343  *
344  * @param source
345  * The ID of the client/source.
346  *
347  * @param name
348  * The client is choosing the name they want the table to have
349  */
351  u32 table_id,
352  mfib_source_t source,
353  const u8 *name);
354 
355 
356 /**
357  * @brief
358  * Take a reference counting lock on the table
359  *
360  * @param fib_index
361  * The index of the FIB
362  *
363  * @paran proto
364  * The protocol of the FIB (and thus the entries therein)
365  *
366  * @param source
367  * The ID of the client/source.
368  */
369 extern void mfib_table_unlock(u32 fib_index,
370  fib_protocol_t proto,
371  mfib_source_t source);
372 
373 /**
374  * @brief
375  * Release a reference counting lock on the table. When the last lock
376  * has gone. the FIB is deleted.
377  *
378  * @param fib_index
379  * The index of the FIB
380  *
381  * @paran proto
382  * The protocol of the FIB (and thus the entries therein)
383  *
384  * @param source
385  * The ID of the client/source.
386  */
387 extern void mfib_table_lock(u32 fib_index,
388  fib_protocol_t proto,
389  mfib_source_t source);
390 
391 /**
392  * @brief
393  * Return the number of entries in the FIB added by a given source.
394  *
395  * @param fib_index
396  * The index of the FIB
397  *
398  * @paran proto
399  * The protocol of the FIB (and thus the entries therein)
400  *
401  * @return number of sourced entries.
402  */
403 extern u32 mfib_table_get_num_entries(u32 fib_index,
404  fib_protocol_t proto);
405 
406 /**
407  * @brief
408  * Get a pointer to a FIB table
409  */
411  fib_protocol_t proto);
412 
413 /**
414  * @brief Call back function when walking entries in a FIB table
415  */
417  void *ctx);
418 
419 /**
420  * @brief Walk all entries in a FIB table
421  * N.B: This is NOT safe to deletes. If you need to delete, walk the whole
422  * table and store elements in a vector, then delete the elements
423  */
424 extern void mfib_table_walk(u32 fib_index,
425  fib_protocol_t proto,
427  void *ctx);
428 /**
429  * @brief format (display) the memory usage for mfibs
430  */
431 extern u8 * format_mfib_table_memory(u8 * s, va_list * args);
432 
433 #endif
CLIB_CACHE_LINE_ALIGN_MARK(cacheline0)
Required for pool_get_aligned.
void mfib_table_unlock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Take a reference counting lock on the table.
Definition: mfib_table.c:558
u32 mfib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:409
u32 mfib_table_get_num_entries(u32 fib_index, fib_protocol_t proto)
Return the number of entries in the FIB added by a given source.
enum mfib_entry_flags_t_ mfib_entry_flags_t
A representation of a path as described by a route producer.
Definition: fib_types.h:470
ip6_mfib_t v6
Definition: mfib_table.h:50
void mfib_table_entry_path_remove(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *paths)
Remove n paths to an entry (aka route) in the FIB.
Definition: mfib_table.c:251
void mfib_table_flush(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Flush all entries from a table for the source.
Definition: mfib_table.c:516
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:41
u16 mft_locks[MFIB_TABLE_N_LOCKS]
number of locks on the table
Definition: mfib_table.h:61
u32 mft_total_route_counts
Total route counters.
Definition: mfib_table.h:76
u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, mfib_source_t source)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:467
mfib_table_t * mfib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
Definition: mfib_table.c:26
struct mfib_table_t_ mfib_table_t
A protocol Independent IP multicast FIB table.
fib_node_index_t mfib_table_lookup_exact_match(u32 fib_index, const mfib_prefix_t *prefix)
Perfom an exact match in the non-forwarding table.
Definition: mfib_table.c:94
unsigned char u8
Definition: types.h:56
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath, mfib_itf_flags_t flags)
Add n paths to an entry (aka route) in the FIB.
Definition: mfib_table.c:219
fib_node_index_t mfib_table_lookup(u32 fib_index, const mfib_prefix_t *prefix)
Perfom a longest prefix match in the non-forwarding table.
Definition: mfib_table.c:65
void mfib_table_lock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Release a reference counting lock on the table.
Definition: mfib_table.c:587
enum mfib_source_t_ mfib_source_t
Possible [control plane] sources of MFIB entries.
u32 sw_if_index
Definition: vxlan_gbp.api:39
fib_node_index_t mft_index
Index into FIB vector.
Definition: mfib_table.h:71
unsigned int u32
Definition: types.h:88
void mfib_table_entry_delete(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source)
Delete a FIB entry.
Definition: mfib_table.c:356
long ctx[MAX_CONNS]
Definition: main.c:144
unsigned short u16
Definition: types.h:57
Definition: ip4.h:50
u8 * mft_desc
Table description.
Definition: mfib_table.h:81
fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t flags)
Add a new (with no replication) or lock an existing entry.
Definition: mfib_table.c:165
u8 name[64]
Definition: memclnt.api:151
Definition: ip6.h:79
u32 flags
Definition: vhost_user.h:115
#define MFIB_TABLE_N_LOCKS
Keep a lock per-source and a total.
Definition: mfib_table.h:28
u8 * format_mfib_table_name(u8 *s, va_list *ap)
Format the description/name of the table.
Definition: mfib_table.c:618
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:30
Aggregrate type for a prefix.
Definition: mfib_types.h:24
u32 fib_rpf_id_t
An RPF-ID is numerical value that is used RPF validate.
Definition: fib_types.h:391
u32 mfib_table_get_index_for_sw_if_index(fib_protocol_t proto, u32 sw_if_index)
Get the index of the FIB bound to the interface.
Definition: mfib_table.c:392
fib_protocol_t mft_proto
Which protocol this table serves.
Definition: mfib_table.h:56
u32 mft_table_id
Table ID (hash key) for this FIB.
Definition: mfib_table.h:66
void mfib_table_walk(u32 fib_index, fib_protocol_t proto, mfib_table_walk_fn_t fn, void *ctx)
Walk all entries in a FIB table N.B: This is NOT safe to deletes.
Definition: mfib_table.c:599
u8 * format_mfib_table_memory(u8 *s, va_list *args)
format (display) the memory usage for mfibs
Definition: mfib_table.c:632
enum mfib_itf_flags_t_ mfib_itf_flags_t
typedef prefix
Definition: ip_types.api:40
fib_node_index_t mfib_table_entry_special_add(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, mfib_entry_flags_t flags, index_t rep_dpo)
Add a &#39;special&#39; entry to the mFIB that links to the DPO passed A special entry is an entry that the F...
Definition: mfib_table.c:294
int(* mfib_table_walk_fn_t)(fib_node_index_t fei, void *ctx)
Call back function when walking entries in a FIB table.
Definition: mfib_table.h:416
ip4_mfib_t v4
Definition: mfib_table.h:49
A protocol Independent IP multicast FIB table.
Definition: mfib_table.h:35
void mfib_table_entry_delete_index(fib_node_index_t entry_index, mfib_source_t source)
Delete a FIB entry.
Definition: mfib_table.c:380
u32 mfib_table_find_or_create_and_lock_w_name(fib_protocol_t proto, u32 table_id, mfib_source_t source, const u8 *name)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:476