FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
bier_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 __BIER_TABLE_H__
17 #define __BIER_TABLE_H__
18 
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>
23 
24 #include <vnet/dpo/dpo.h>
25 
26 /**
27  * Forward declarations
28  */
29 struct bier_route_update_t_;
30 
31 /**
32  * A BIER Table is the bit-indexed forwarding table.
33  * Each entry (bit-position) represents one destination, and its reachability
34  *
35  * The number of entries in a table is thus the maximum supported
36  * bit-position. Since this is small <4096, the table is a flat array
37  */
38 typedef struct bier_table_t_ {
39  /**
40  * required for pool_get_aligned.
41  * memebers used in the switch path come first!
42  */
43  CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
44 
45  /**
46  * Save the MPLS local label associated with the table
47  */
49 
50  /**
51  * The path-list used for the ECMP-tables
52  */
54 
55  /**
56  * The index of the lfib entry created for this table.
57  * Only the EOS is required.
58  */
60 
61  /**
62  * Number of locks on the table
63  */
65 
66  /**
67  * Entries in the table
68  * This is a vector sized to the appropriate number of entries
69  * given the table's supported Bit-string length
70  */
72 
73  /**
74  * The identity/key or the table. we need the hdr_len in the data-path
75  */
77 
78  /**
79  * f-masks in the ECMP table
80  * This is a vector sized to the appropriate number of entries
81  * given the table's supported Bit-string length.
82  * In the ECMP table the LB choice has been pre-resolved, so each entry
83  * links to just one f-mask, i.e. there is a 1:1 mapping of bit-position to
84  * fmask. For efficient forwarding we collapse the fmasks up to the table.
85  */
87 } bier_table_t;
88 
90  "BIER table fits on 2 cache lines");
91 
93  mpls_label_t ll);
94 extern index_t bier_table_lock(const bier_table_id_t *id);
95 extern void bier_table_unlock(const bier_table_id_t *id);
96 
97 extern void bier_table_route_path_add(const bier_table_id_t *bti,
98  bier_bp_t bp,
99  fib_route_path_t *brp);
100 extern void bier_table_route_path_remove(const bier_table_id_t *bti,
101  bier_bp_t bp,
102  fib_route_path_t *brp);
103 extern void bier_table_route_path_update(const bier_table_id_t *bti,
104  bier_bp_t bp,
105  fib_route_path_t *brp);
106 extern void bier_table_route_delete(const bier_table_id_t *bti,
107  bier_bp_t b);
108 
109 extern void bier_table_show_all(vlib_main_t * vm,
111 
112 extern const bier_table_id_t *bier_table_get_id(index_t bti);
113 
114 extern u8 *format_bier_table (u8 *s, va_list *args);
115 extern u8 *format_bier_table_entry (u8 *s, va_list *args);
116 
118 extern void bier_table_ecmp_unlock(index_t bti);
119 extern void bier_table_ecmp_set_fmask(index_t bti,
120  bier_bp_t bp,
121  index_t bfmi);
122 
124  dpo_id_t *dpo);
125 
126 /**
127  * Types and functions to walk the ECMP tables of a main table
128  */
129 typedef void (*bier_table_ecmp_walk_fn_t)(index_t btei,
130  void *ctx);
131 extern void bier_table_ecmp_walk(index_t bti,
133  void *ctx);
134 extern int bier_table_is_main (const bier_table_t *bt);
135 
136 /**
137  * Types and functions to walk all the BIER Tables
138  */
139 typedef void (*bier_tables_walk_fn_t)(const bier_table_t *bt,
140  void *ctx);
142  void *ctx);
143 
144 /**
145  * Types and functions to walk all the entries in one BIER Table
146  */
147 typedef void (*bier_table_walk_fn_t)(const bier_table_t *bt,
148  const bier_entry_t *be,
149  void *ctx);
150 extern void bier_table_walk(const bier_table_id_t *id,
152  void *ctx);
153 
154 /*
155  * provided for fast data plane access.
156  */
158 
159 static inline bier_table_t *
161 {
162  return (pool_elt_at_index(bier_table_pool, bti));
163 }
164 
165 static inline const index_t
167  bier_bp_t bp)
168 {
169  return (bt->bt_entries[BIER_BP_TO_INDEX(bp)]);
170 }
171 
172 static inline const index_t
174  bier_bp_t bp)
175 {
176  return (bt->bt_fmasks[BIER_BP_TO_INDEX(bp)]);
177 }
178 
179 #endif
vlib.h
bier_table_t_::bt_locks
u16 bt_locks
Number of locks on the table.
Definition: bier_table.h:64
bier_table_t_::bt_fmasks
index_t * bt_fmasks
f-masks in the ECMP table This is a vector sized to the appropriate number of entries given the table...
Definition: bier_table.h:86
bier_tables_walk_fn_t
void(* bier_tables_walk_fn_t)(const bier_table_t *bt, void *ctx)
Types and functions to walk all the BIER Tables.
Definition: bier_table.h:139
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:553
bier_table_get_id
const bier_table_id_t * bier_table_get_id(index_t bti)
Definition: bier_table.c:524
bier_table_id_t_
The ID of a table.
Definition: bier_types.h:394
bier_table_route_path_add
void bier_table_route_path_add(const bier_table_id_t *bti, bier_bp_t bp, fib_route_path_t *brp)
Definition: bier_table.c:625
u16
unsigned short u16
Definition: types.h:57
format_bier_table_entry
u8 * format_bier_table_entry(u8 *s, va_list *args)
Definition: bier_table.c:809
bier_table_pool
bier_table_t * bier_table_pool
Memory pool of all the allocated tables.
Definition: bier_table.c:32
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
bier_table_add_or_lock
index_t bier_table_add_or_lock(const bier_table_id_t *id, mpls_label_t ll)
Definition: bier_table.c:397
bier_bp_t
u32 bier_bp_t
A bit positon as assigned to egress PEs.
Definition: bier_types.h:294
bier_table_lock
index_t bier_table_lock(const bier_table_id_t *id)
Definition: bier_table.c:374
STATIC_ASSERT
STATIC_ASSERT((sizeof(bier_table_t)<=2 *CLIB_CACHE_LINE_BYTES), "BIER table fits on 2 cache lines")
bier_tables_walk
void bier_tables_walk(bier_tables_walk_fn_t fn, void *ctx)
Definition: bier_table.c:920
format_bier_table
u8 * format_bier_table(u8 *s, va_list *args)
Definition: bier_table.c:844
dpo.h
fib_types.h
bier_table_is_main
int bier_table_is_main(const bier_table_t *bt)
Definition: bier_table.c:53
index_t
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:43
bier_table_t_::bt_ll
mpls_label_t bt_ll
Save the MPLS local label associated with the table.
Definition: bier_table.h:48
fib_node_index_t
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:29
bier_table_get
static bier_table_t * bier_table_get(index_t bti)
Definition: bier_table.h:160
bier_table_route_delete
void bier_table_route_delete(const bier_table_id_t *bti, bier_bp_t b)
Definition: bier_table.c:633
bier_show_flags_t
enum bier_show_flags_t_ bier_show_flags_t
Flags to control show output.
bier_table_ecmp_set_fmask
void bier_table_ecmp_set_fmask(index_t bti, bier_bp_t bp, index_t bfmi)
Definition: bier_table.c:791
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:59
bier_table_t_::bt_lfei
fib_node_index_t bt_lfei
The index of the lfib entry created for this table.
Definition: bier_table.h:59
bier_entry_t_
The BIER entry.
Definition: bier_entry.h:46
bier_table_t_::bt_pl
fib_node_index_t bt_pl
The path-list used for the ECMP-tables.
Definition: bier_table.h:53
bier_table_t_::bt_entries
index_t * bt_entries
Entries in the table This is a vector sized to the appropriate number of entries given the table's su...
Definition: bier_table.h:71
bier_table_lookup
static const index_t bier_table_lookup(const bier_table_t *bt, bier_bp_t bp)
Definition: bier_table.h:166
bier_table_t
struct bier_table_t_ bier_table_t
A BIER Table is the bit-indexed forwarding table.
bier_entry.h
fib_route_path_t_
A representation of a path as described by a route producer.
Definition: fib_types.h:500
bier_table_ecmp_create_and_lock
index_t bier_table_ecmp_create_and_lock(const bier_table_id_t *id)
Definition: bier_table.c:456
ctx
long ctx[MAX_CONNS]
Definition: main.c:144
bier_table_route_path_remove
void bier_table_route_path_remove(const bier_table_id_t *bti, bier_bp_t bp, fib_route_path_t *brp)
Definition: bier_table.c:658
bier_table_walk
void bier_table_walk(const bier_table_id_t *id, bier_table_walk_fn_t fn, void *ctx)
Definition: bier_table.c:928
bier_table_unlock
void bier_table_unlock(const bier_table_id_t *id)
Definition: bier_table.c:218
BIER_BP_TO_INDEX
#define BIER_BP_TO_INDEX(bp)
Definition: bier_types.h:296
bier_table_ecmp_unlock
void bier_table_ecmp_unlock(index_t bti)
Definition: bier_table.c:462
bier_types.h
bier_table_t_::bt_id
bier_table_id_t bt_id
The identity/key or the table.
Definition: bier_table.h:76
vlib_main_t
Definition: main.h:102
b
vlib_buffer_t ** b
Definition: nat44_ei_out2in.c:717
u8
unsigned char u8
Definition: types.h:56
bier_table_ecmp_walk_fn_t
void(* bier_table_ecmp_walk_fn_t)(index_t btei, void *ctx)
Types and functions to walk the ECMP tables of a main table.
Definition: bier_table.h:129
dpo_id_t_
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:172
bier_table_t_
A BIER Table is the bit-indexed forwarding table.
Definition: bier_table.h:38
mpls_label_t
u32 mpls_label_t
A label value only, i.e.
Definition: packet.h:26
bier_table_t_::CLIB_CACHE_LINE_ALIGN_MARK
CLIB_CACHE_LINE_ALIGN_MARK(cacheline0)
required for pool_get_aligned.
bier_table_route_path_update
void bier_table_route_path_update(const bier_table_id_t *bti, bier_bp_t bp, fib_route_path_t *brp)
Definition: bier_table.c:618
bier_table_ecmp_walk
void bier_table_ecmp_walk(index_t bti, bier_table_ecmp_walk_fn_t fn, void *ctx)
Definition: bier_table.c:770
bier_table_contribute_forwarding
void bier_table_contribute_forwarding(index_t bti, dpo_id_t *dpo)
Definition: bier_table.c:728
bier_table_walk_fn_t
void(* bier_table_walk_fn_t)(const bier_table_t *bt, const bier_entry_t *be, void *ctx)
Types and functions to walk all the entries in one BIER Table.
Definition: bier_table.h:147
bier_table_fwd_lookup
static const index_t bier_table_fwd_lookup(const bier_table_t *bt, bier_bp_t bp)
Definition: bier_table.h:173
bier_table_show_all
void bier_table_show_all(vlib_main_t *vm, bier_show_flags_t flags)
Definition: bier_table.c:901
flags
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105