FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
bier_fmask.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  * @brief bier_fmask : The BIER fmask
17  *
18  * The BIER fmask contains the bitString that is applied to packets that
19  * egress towards the next-hop. As such the fmask is part of the rewrite
20  * (adj) for that next-hop. It it thus an extension of the next-hop and in
21  * no way associated with the bit-position(s) that are reachable through it.
22  * Fmasks are thus shared by bit-positions that egress throught the same
23  * nh (BFR-NBR).
24  * Deag fmasks are also shread in the event that a router has local
25  * bit-positions. This is necessary to prevent the router recieving two copies
26  * of each packet. Consequently it also means that they share the same
27  * disposition data for the global data.
28  */
29 
30 #ifndef __BIER_FMASK_H__
31 #define __BIER_FMASK_H__
32 
33 #include <vlib/vlib.h>
34 
35 #include <vnet/fib/fib_node.h>
36 #include <vnet/mpls/packet.h>
37 #include <vnet/dpo/dpo.h>
38 
39 #include <vnet/bier/bier_types.h>
41 
42 /**
43  * A struct that represents the reference counting of the bits
44  */
45 typedef struct bier_fmask_bits_t_ {
46  /**
47  * each bit in the mask needs to be reference counted
48  * and set/cleared on the 0->1 and 1->0 transitions.
49  */
52 
53  /**
54  * The total number of references to bits set on this mask
55  * in effect a count of the number of children.
56  */
59 
60 /**
61  * Flags on fmask
62  */
64 {
71 
72 #define BIER_FMASK_ATTR_NAMES { \
73  [BIER_FMASK_ATTR_FORWARDING] = "forwarding", \
74  [BIER_FMASK_ATTR_DISP] = "disposition", \
75  [BIER_FMASK_ATTR_MPLS] = "mpls", \
76 }
77 
78 #define FOR_EACH_BIER_FMASK_ATTR(_item) \
79  for (_item = BIER_FMASK_ATTR_FIRST; \
80  _item <= BIER_FMASK_ATTR_LAST; \
81  _item++)
82 
83 typedef enum bier_fmask_flags_t_
84 {
89 
90 /**
91  * An outgoing BIER mask. aka forwarding bit mask (in the RFCs)
92  *
93  * This mask's function is two-fold
94  * 1 - it is logical-AND with the input packet header to produce the
95  * output packet header
96  * 2 - it is logical NAND with the input packet header to modify the bit-mask
97  * for the next lookup
98  */
99 typedef struct bier_fmask_t_ {
100  /**
101  * The BIER fmask is a child of a FIB entry in the FIB graph.
102  */
104 
105  /**
106  * operational/state flags on the fmask
107  */
109 
110  /**
111  * The bits, and their ref counts, that are set on this mask
112  * This mask changes as BIER entries link to and from this fmask
113  */
115 
116  /**
117  * The key to this fmask - used for store/lookup in the DB
118  */
120 
121  /**
122  * The MPLS label to paint on the header during forwarding
123  */
125 
126  /**
127  * The path-list
128  */
130 
131  /**
132  * the index of this fmask in the parent's child list.
133  */
135 
136  /**
137  * The index into the adj table for the adj that
138  * this fmask resolves via
139  */
141 } bier_fmask_t;
142 
143 extern void bier_fmask_link(index_t bfmi, bier_bp_t bp);
144 extern void bier_fmask_unlink(index_t bfmi, bier_bp_t bp);
145 extern void bier_fmask_unlock(index_t bfmi);
146 extern void bier_fmask_lock(index_t bfmi);
147 
149  const fib_route_path_t *rpath);
150 
151 extern u8* format_bier_fmask(u8 *s, va_list *ap);
152 
154  dpo_id_t *dpo);
155 
156 extern u32 bier_fmask_child_add (fib_node_index_t fib_entry_index,
157  fib_node_type_t child_type,
158  fib_node_index_t child_index);
159 extern void bier_fmask_child_remove (fib_node_index_t fib_entry_index,
160  u32 sibling_index);
161 
162 /*
163  * provided for fast data-path access
164  */
166 
167 static inline bier_fmask_t *
169 {
170  return (pool_elt_at_index(bier_fmask_pool, index));
171 }
172 
173 #endif
void bier_fmask_lock(index_t bfmi)
Definition: bier_fmask.c:253
u32 bfmb_count
The total number of references to bits set on this mask in effect a count of the number of children...
Definition: bier_fmask.h:57
A representation of a path as described by a route producer.
Definition: fib_types.h:377
u8 * format_bier_fmask(u8 *s, va_list *ap)
Definition: bier_fmask.c:329
struct bier_fmask_t_ bier_fmask_t
An outgoing BIER mask.
bier_fmask_id_t * bfm_id
The key to this fmask - used for store/lookup in the DB.
Definition: bier_fmask.h:119
static bier_fmask_t * bier_fmask_get(u32 index)
Definition: bier_fmask.h:168
bier_fmask_t * bier_fmask_pool
Definition: bier_fmask.h:165
u32 mpls_label_t
A label value only, i.e.
Definition: packet.h:24
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
bier_fmask : The BIER fmask
Definition: bier_fmask.h:45
bier_fmask_bits_t bfm_bits
The bits, and their ref counts, that are set on this mask This mask changes as BIER entries link to a...
Definition: bier_fmask.h:114
index_t bier_fmask_create_and_lock(const bier_fmask_id_t *fmid, const fib_route_path_t *rpath)
Definition: bier_fmask.c:268
fib_node_index_t bfm_pl
The path-list.
Definition: bier_fmask.h:129
A Variable length BitString.
Definition: bier_types.h:323
void bier_fmask_unlink(index_t bfmi, bier_bp_t bp)
Definition: bier_fmask.c:309
u32 bier_bp_t
A bit positon as assigned to egress PEs.
Definition: bier_types.h:346
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:166
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:459
void bier_fmask_child_remove(fib_node_index_t fib_entry_index, u32 sibling_index)
Definition: bier_fmask.c:147
struct bier_fmask_bits_t_ bier_fmask_bits_t
bier_fmask : The BIER fmask
An node in the FIB graph.
Definition: fib_node.h:286
void bier_fmask_contribute_forwarding(index_t bfmi, dpo_id_t *dpo)
Definition: bier_fmask.c:115
bier_fmask_flags_t_
Definition: bier_fmask.h:83
An outgoing BIER mask.
Definition: bier_fmask.h:99
mpls_label_t bfm_label
The MPLS label to paint on the header during forwarding.
Definition: bier_fmask.h:124
u32 bier_fmask_child_add(fib_node_index_t fib_entry_index, fib_node_type_t child_type, fib_node_index_t child_index)
Definition: bier_fmask.c:136
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:29
bier_fmask_flags_t bfm_flags
operational/state flags on the fmask
Definition: bier_fmask.h:108
void bier_fmask_link(index_t bfmi, bier_bp_t bp)
Definition: bier_fmask.c:289
fib_node_t bfm_node
The BIER fmask is a child of a FIB entry in the FIB graph.
Definition: bier_fmask.h:103
A key/ID for a BIER forwarding Mas (FMask).
Definition: bier_fmask_db.h:45
enum bier_fmask_flags_t_ bier_fmask_flags_t
unsigned int u32
Definition: types.h:88
unsigned char u8
Definition: types.h:56
bier_fmask_attributes_t_
Flags on fmask.
Definition: bier_fmask.h:63
bier_bit_string_t bfmb_input_reset_string
each bit in the mask needs to be reference counted and set/cleared on the 0->1 and 1->0 transitions...
Definition: bier_fmask.h:50
enum fib_node_type_t_ fib_node_type_t
The types of nodes in a FIB graph.
dpo_id_t bfm_dpo
The index into the adj table for the adj that this fmask resolves via.
Definition: bier_fmask.h:140
enum bier_fmask_attributes_t_ bier_fmask_attributes_t
Flags on fmask.
void bier_fmask_unlock(index_t bfmi)
Definition: bier_fmask.c:238
u32 bfm_sibling
the index of this fmask in the parent&#39;s child list.
Definition: bier_fmask.h:134