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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #ifndef __BIER_TABLE_H__
17 #define __BIER_TABLE_H__
19 #include <vlib/vlib.h>
20 #include <vnet/fib/fib_types.h>
21 #include <vnet/bier/bier_types.h>
22 #include <vnet/bier/bier_entry.h>
24 #include <vnet/dpo/dpo.h>
27 * Forward declarations
29 struct bier_route_update_t_;
32 * A BIER Table is the bit-indexed forwarding table.
33 * Each entry (bit-position) represents one destination, and its reachability
35 * The number of entries in a table is thus the maximum supported
36 * bit-position. Since this is smal <4096, the table is a flat arry
38 typedef struct bier_table_t_ {
40 * Save the MPLS local label associated with the table
45 * The path-list used for the ECMP-tables
47 fib_node_index_t bt_pl;
50 * The index of the lfib entry created for this table.
51 * Only the EOS is required.
53 fib_node_index_t bt_lfei;
56 * Number of locks on the table
61 * Entries in the table
62 * This is a vector sized to the appropriate number of entries
63 * given the table's supported Bit-string length
68 * Everything before this declaration is unused in the switch path
70 CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
73 * The identity/key or the table. we need the hdr_len in the data-path
75 bier_table_id_t bt_id;
78 * f-masks in the ECMP table
79 * This is a vector sized to the appropriate number of entries
80 * given the table's supported Bit-string length.
81 * In the ECMP table the LB choice has been pre-resolved, so each entry
82 * links to just one f-mask, i.e. there is a 1:1 mapping of bit-position to
83 * fmask. For efficient forwarding we collapse the fmasks up to the table.
88 STATIC_ASSERT((sizeof(bier_table_t) <= 2*CLIB_CACHE_LINE_BYTES),
89 "BIER table fits on 2 cache lines");
91 extern index_t bier_table_add_or_lock(const bier_table_id_t *id,
93 extern void bier_table_unlock(const bier_table_id_t *id);
95 extern void bier_table_route_add(const bier_table_id_t *bti,
97 fib_route_path_t *brp);
98 extern void bier_table_route_remove(const bier_table_id_t *bti,
100 fib_route_path_t *brp);
102 extern void bier_table_show_all(vlib_main_t * vm,
103 bier_show_flags_t flags);
105 extern const bier_table_id_t *bier_table_get_id(index_t bti);
107 extern u8 *format_bier_table (u8 *s, va_list *args);
108 extern u8 *format_bier_table_entry (u8 *s, va_list *args);
110 extern index_t bier_table_ecmp_create_and_lock(const bier_table_id_t *id);
111 extern void bier_table_ecmp_unlock(index_t bti);
112 extern void bier_table_ecmp_set_fmask(index_t bti,
116 extern void bier_table_contribute_forwarding(index_t bti,
120 * Types and functions to walk the ECMP tables of a main table
122 typedef void (*bier_table_ecmp_walk_fn_t)(index_t btei,
124 extern void bier_table_ecmp_walk(index_t bti,
125 bier_table_ecmp_walk_fn_t fn,
127 extern int bier_table_is_main (const bier_table_t *bt);
130 * Types and functions to walk all the BIER Tables
132 typedef void (*bier_tables_walk_fn_t)(const bier_table_t *bt,
134 extern void bier_tables_walk(bier_tables_walk_fn_t fn,
138 * Types and functions to walk all the entries in one BIER Table
140 typedef void (*bier_table_walk_fn_t)(const bier_table_t *bt,
141 const bier_entry_t *be,
143 extern void bier_table_walk(const bier_table_id_t *id,
144 bier_table_walk_fn_t fn,
148 * provided for fast data plane access.
150 extern bier_table_t *bier_table_pool;
152 static inline bier_table_t *
153 bier_table_get (index_t bti)
155 return (pool_elt_at_index(bier_table_pool, bti));
158 static inline const index_t
159 bier_table_lookup (const bier_table_t *bt,
162 return (bt->bt_entries[BIER_BP_TO_INDEX(bp)]);
165 static inline const index_t
166 bier_table_fwd_lookup (const bier_table_t *bt,
169 return (bt->bt_fmasks[BIER_BP_TO_INDEX(bp)]);