FIB: encode the label stack in the FIB path during table dump
[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 Table-ID of the FIB from protocol and index
295  *
296  * @param fib_index
297  *  The FIB index
298  *
299  * @paran proto
300  *  The protocol of the FIB (and thus the entries therein)
301  *
302  * @return fib_index
303  *  The tableID of the FIB
304  */
305 extern u32 mfib_table_get_table_id(u32 fib_index, fib_protocol_t proto);
306
307 /**
308  * @brief
309  *  Get the index of the FIB for a Table-ID. This DOES NOT create the
310  * FIB if it does not exist.
311  *
312  * @paran proto
313  *  The protocol of the FIB (and thus the entries therein)
314  *
315  * @param table-id
316  *  The Table-ID
317  *
318  * @return fib_index
319  *  The index of the FIB, which may be INVALID.
320  */
321 extern u32 mfib_table_find(fib_protocol_t proto, u32 table_id);
322
323
324 /**
325  * @brief
326  *  Get the index of the FIB for a Table-ID. This DOES create the
327  * FIB if it does not exist.
328  *
329  * @paran proto
330  *  The protocol of the FIB (and thus the entries therein)
331  *
332  * @param table-id
333  *  The Table-ID
334  *
335  * @return fib_index
336  *  The index of the FIB
337  *
338  * @param source
339  *  The ID of the client/source.
340  */
341 extern u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto,
342                                               u32 table_id,
343                                               mfib_source_t source);
344
345 /**
346  * @brief
347  *  Get the index of the FIB for a Table-ID. This DOES create the
348  * FIB if it does not exist.
349  *
350  * @paran proto
351  *  The protocol of the FIB (and thus the entries therein)
352  *
353  * @param table-id
354  *  The Table-ID
355  *
356  * @return fib_index
357  *  The index of the FIB
358  *
359  * @param source
360  *  The ID of the client/source.
361  *
362  * @param name
363  *  The client is choosing the name they want the table to have
364  */
365 extern u32 mfib_table_find_or_create_and_lock_w_name(fib_protocol_t proto,
366                                                      u32 table_id,
367                                                      mfib_source_t source,
368                                                      const u8 *name);
369
370
371 /**
372  * @brief
373  * Take a reference counting lock on the table
374  *
375  * @param fib_index
376  *  The index of the FIB
377  *
378  * @paran proto
379  *  The protocol of the FIB (and thus the entries therein)
380  *
381  * @param source
382  *  The ID of the client/source.
383  */
384 extern void mfib_table_unlock(u32 fib_index,
385                               fib_protocol_t proto,
386                               mfib_source_t source);
387
388 /**
389  * @brief
390  * Release a reference counting lock on the table. When the last lock
391  * has gone. the FIB is deleted.
392  *
393  * @param fib_index
394  *  The index of the FIB
395  *
396  * @paran proto
397  *  The protocol of the FIB (and thus the entries therein)
398  *
399  * @param source
400  *  The ID of the client/source.
401  */
402 extern void mfib_table_lock(u32 fib_index,
403                             fib_protocol_t proto,
404                             mfib_source_t source);
405
406 /**
407  * @brief
408  * Return the number of entries in the FIB added by a given source.
409  *
410  * @param fib_index
411  *  The index of the FIB
412  *
413  * @paran proto
414  *  The protocol of the FIB (and thus the entries therein)
415  *
416  * @return number of sourced entries.
417  */
418 extern u32 mfib_table_get_num_entries(u32 fib_index,
419                                       fib_protocol_t proto);
420
421 /**
422  * @brief
423  *  Get the less specific (covering) prefix
424  *
425  * @param fib_index
426  *  The index of the FIB
427  *
428  * @param prefix
429  *  The prefix to lookup
430  *
431  * @return
432  *  The index of the less specific fib_entry_t.
433  */
434 extern fib_node_index_t mfib_table_get_less_specific(u32 fib_index,
435                                                     const mfib_prefix_t *prefix);
436
437 /**
438  * @brief
439  * Get a pointer to a FIB table
440  */
441 extern mfib_table_t *mfib_table_get(fib_node_index_t index,
442                                     fib_protocol_t proto);
443
444 /**
445  * @brief Call back function when walking entries in a FIB table
446  */
447 typedef int (*mfib_table_walk_fn_t)(fib_node_index_t fei,
448                                     void *ctx);
449
450 /**
451  * @brief Walk all entries in a FIB table
452  * N.B: This is NOT safe to deletes. If you need to delete, walk the whole
453  * table and store elements in a vector, then delete the elements
454  */
455 extern void mfib_table_walk(u32 fib_index,
456                             fib_protocol_t proto,
457                             mfib_table_walk_fn_t fn,
458                             void *ctx);
459 /**
460  * @brief format (display) the memory usage for mfibs
461  */
462 extern u8 * format_mfib_table_memory(u8 * s, va_list * args);
463
464 /**
465  * To assit UT
466  */
467 extern u32 mfib_table_get_n_routes(fib_node_index_t index,
468                                    fib_protocol_t proto);
469
470
471 #endif