test/vpp_ip.py: Correct usage of 'is'
[vpp.git] / src / vnet / mfib / mfib_table.h
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 {
49         ip4_mfib_t v4;
50         ip6_mfib_t v6;
51     };
52
53     /**
54      * Which protocol this table serves. Used to switch on the union above.
55      */
56     fib_protocol_t mft_proto;
57
58     /**
59      * number of locks on the table
60      */
61     u16 mft_locks[MFIB_TABLE_N_LOCKS];
62
63     /**
64      * Table ID (hash key) for this FIB.
65      */
66     u32 mft_table_id;
67
68     /**
69      * Index into FIB vector.
70      */
71     fib_node_index_t mft_index;
72
73     /**
74      * Total route counters
75      */
76     u32 mft_total_route_counts;
77
78     /**
79      * Table description
80      */
81     u8* mft_desc;
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  */
120 extern fib_node_index_t mfib_table_lookup_exact_match(u32 fib_index,
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  */
133 extern fib_node_index_t mfib_table_entry_update(u32 fib_index,
134                                                 const mfib_prefix_t *prefix,
135                                                 mfib_source_t source,
136                                                 fib_rpf_id_t rpf_id,
137                                                 mfib_entry_flags_t flags);
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  */
164 extern fib_node_index_t mfib_table_entry_path_update(u32 fib_index,
165                                                      const mfib_prefix_t *prefix,
166                                                      mfib_source_t source,
167                                                      const fib_route_path_t *rpath,
168                                                      mfib_itf_flags_t flags);
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  */
253 extern fib_node_index_t mfib_table_entry_special_add(u32 fib_index,
254                                                      const mfib_prefix_t *prefix,
255                                                      mfib_source_t source,
256                                                      mfib_entry_flags_t flags,
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  */
289 extern u32 mfib_table_get_index_for_sw_if_index(fib_protocol_t proto,
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  */
326 extern u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto,
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  */
350 extern u32 mfib_table_find_or_create_and_lock_w_name(fib_protocol_t proto,
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 the less specific (covering) prefix
409  *
410  * @param fib_index
411  *  The index of the FIB
412  *
413  * @param prefix
414  *  The prefix to lookup
415  *
416  * @return
417  *  The index of the less specific fib_entry_t.
418  */
419 extern fib_node_index_t mfib_table_get_less_specific(u32 fib_index,
420                                                     const mfib_prefix_t *prefix);
421
422 /**
423  * @brief
424  * Get a pointer to a FIB table
425  */
426 extern mfib_table_t *mfib_table_get(fib_node_index_t index,
427                                     fib_protocol_t proto);
428
429 /**
430  * @brief Call back function when walking entries in a FIB table
431  */
432 typedef int (*mfib_table_walk_fn_t)(fib_node_index_t fei,
433                                     void *ctx);
434
435 /**
436  * @brief Walk all entries in a FIB table
437  * N.B: This is NOT safe to deletes. If you need to delete, walk the whole
438  * table and store elements in a vector, then delete the elements
439  */
440 extern void mfib_table_walk(u32 fib_index,
441                             fib_protocol_t proto,
442                             mfib_table_walk_fn_t fn,
443                             void *ctx);
444 /**
445  * @brief format (display) the memory usage for mfibs
446  */
447 extern u8 * format_mfib_table_memory(u8 * s, va_list * args);
448
449 /**
450  * To assit UT
451  */
452 extern u32 mfib_table_get_n_routes(fib_node_index_t index,
453                                    fib_protocol_t proto);
454
455
456 #endif