FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
bier_hdr_inlines.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 The BIER inline functions acting on the bier header
17  */
18 
19 #ifndef __BIER_HDR_INLINES_H__
20 #define __BIER_HDR_INLINES_H__
21 
22 #include <vppinfra/byte_order.h>
23 #include <vppinfra/string.h>
24 
25 #include <vnet/bier/bier_types.h>
27 #include <vnet/ip/ip6_packet.h>
28 
29 /**
30  * Mask and shift values for the fields incorporated
31  * into the header's first word
32  */
33 #define BIER_HDR_1ST_NIBBLE_MASK 0xf0000000
34 #define BIER_HDR_VERSION_FIELD_MASK 0x0f000000
35 #define BIER_HDR_LEN_FIELD_MASK 0x00f00000
36 #define BIER_HDR_ENTROPY_FIELD_MASK 0x000fffff
37 
38 #define BIER_HDR_1ST_NIBBLE_SHIFT 28
39 #define BIER_HDR_VERSION_FIELD_SHIFT 24
40 #define BIER_HDR_LEN_FIELD_SHIFT 20
41 #define BIER_HDR_ENTROPY_FIELD_SHIFT 0
42 
43 #define BIER_HDR_1ST_NIBBLE_VALUE 0x5
44 
45 /**
46  * Mask and shift values for fields in the headers trainling word
47  */
48 #define BIER_HDR_PROTO_FIELD_MASK 0x003f
49 #define BIER_HDR_OAM_FIELD_MASK 0xc000
50 #define BIER_HDR_DSCP_FIELD_MASK 0x0fc0
51 #define BIER_HDR_DSCP_FIELD_SHIFT 6
52 #define BIER_HDR_PROTO_FIELD_SHIFT 0
53 #define BIER_HDR_OAM_FIELD_SHIFT 14
54 
55 static inline bier_hdr_version_t
57 {
58  return ((bier_hdr->bh_first_word &
61 }
62 
63 static inline bier_hdr_len_id_t
65 {
66  return ((bier_hdr->bh_first_word &
69 }
70 
71 static inline bier_hdr_entropy_t
73 {
74  return ((bier_hdr->bh_first_word &
77 }
78 
79 static inline void
81 {
85 }
86 
87 static inline u8
89 {
90  return ((hdr->bh_first_word & BIER_HDR_1ST_NIBBLE_MASK) >>
92 }
93 
94 static inline void
96  bier_hdr_version_t version)
97 {
99  hdr->bh_first_word |= (version << BIER_HDR_VERSION_FIELD_SHIFT);
100 }
101 
102 static inline void
104  bier_hdr_len_id_t len)
105 {
107  hdr->bh_first_word |= (len << BIER_HDR_LEN_FIELD_SHIFT);
108 }
109 
110 static inline void
112  bier_hdr_entropy_t entropy)
113 {
114  entropy = entropy & BIER_HDR_ENTROPY_FIELD_MASK;
116  hdr->bh_first_word |= (entropy << BIER_HDR_ENTROPY_FIELD_SHIFT);
117 }
118 
119 #define BIER_HDR_FIRST_WORD(version, len, entropy) \
120  ((BIER_HDR_1ST_NIBBLE_VALUE << \
121  BIER_HDR_1ST_NIBBLE_SHIFT) | \
122  (version << BIER_HDR_VERSION_FIELD_SHIFT) | \
123  (len << BIER_HDR_LEN_FIELD_SHIFT) | \
124  ((entropy & BIER_HDR_ENTROPY_FIELD_MASK) \
125  << BIER_HDR_ENTROPY_FIELD_SHIFT))
126 
127 static inline void
129 {
130  bier_hdr->bh_first_word = clib_net_to_host_u32(bier_hdr->bh_first_word);
131  bier_hdr->bh_oam_dscp_proto = clib_net_to_host_u16(bier_hdr->bh_oam_dscp_proto);
132  bier_hdr->bh_bfr_id = clib_net_to_host_u16(bier_hdr->bh_bfr_id);
133 }
134 
135 static inline void
137 {
138  bier_hdr->bh_first_word = clib_host_to_net_u32(bier_hdr->bh_first_word);
139  bier_hdr->bh_oam_dscp_proto = clib_host_to_net_u16(bier_hdr->bh_oam_dscp_proto);
140  bier_hdr->bh_bfr_id = clib_host_to_net_u16(bier_hdr->bh_bfr_id);
141 }
142 
143 static inline bier_hdr_src_id_t
145 {
146  return (bier_hdr->bh_bfr_id);
147 }
148 
149 static inline void
151  bier_hdr_src_id_t src_id)
152 {
153  bier_hdr->bh_bfr_id = src_id;
154 }
155 static inline void
157  bier_hdr_proto_id_t proto)
158 {
160  bier_hdr->bh_oam_dscp_proto |= (proto << BIER_HDR_PROTO_FIELD_SHIFT);
161 }
162 
163 static inline bier_hdr_proto_id_t
165 {
166  return ((bier_hdr->bh_oam_dscp_proto & BIER_HDR_PROTO_FIELD_MASK) >>
168 }
169 
170 static inline void
172 {
173  memset(&bier_hdr->bh_bit_string, 0,
175  bier_hdr_get_len_id(bier_hdr)));
176 }
177 
178 static inline void
180  bier_hdr_version_t version,
181  bier_hdr_proto_id_t proto,
182  bier_hdr_len_id_t len,
183  bier_hdr_entropy_t entropy,
184  bier_bp_t src)
185 {
186  bier_hdr_1st_nibble(bier_hdr);
187  bier_hdr_set_version(bier_hdr, version);
188  bier_hdr_set_len_id(bier_hdr, len);
189  bier_hdr_set_entropy(bier_hdr, entropy);
190  bier_hdr_set_proto_id(bier_hdr, proto);
191  bier_hdr_set_src_id(bier_hdr, src);
192  bier_hdr_clear(bier_hdr);
193 }
194 
195 static inline size_t
197 {
199  bier_hdr_get_len_id(bier_hdr)));
200 }
201 
202 static inline size_t
204 {
205  return (sizeof(bier_hdr_t) +
206  bier_hdr_str_num_bytes(bier_hdr));
207 }
208 
209 static inline void
211  bier_bit_string_t *bit_string)
212 {
213  bit_string->bbs_len = bier_hdr_str_num_bytes(bier_hdr);
214  bit_string->bbs_buckets = bier_hdr->bh_bit_string;
215 }
216 
217 #endif
static void bier_hdr_set_len_id(bier_hdr_t *hdr, bier_hdr_len_id_t len)
u32 bh_first_word
The first nibble is always set to 0101 to ensure that when carried over MPLS, the BIER packet is not ...
Definition: bier_types.h:391
static bier_hdr_len_id_t bier_hdr_get_len_id(const bier_hdr_t *bier_hdr)
static void bier_hdr_clear(bier_hdr_t *bier_hdr)
u32 bier_hdr_len_id_to_num_bytes(bier_hdr_len_id_t id)
Definition: bier_types.c:66
static void bier_hdr_set_version(bier_hdr_t *hdr, bier_hdr_version_t version)
u16 bbs_len
The length of the string in BYTES.
Definition: bier_types.h:327
#define BIER_HDR_VERSION_FIELD_MASK
A Variable length BitString.
Definition: bier_types.h:323
static void bier_hdr_set_entropy(bier_hdr_t *hdr, bier_hdr_entropy_t entropy)
#define BIER_HDR_ENTROPY_FIELD_MASK
static void bier_hdr_1st_nibble(bier_hdr_t *hdr)
#define BIER_HDR_ENTROPY_FIELD_SHIFT
u32 bier_bp_t
A bit positon as assigned to egress PEs.
Definition: bier_types.h:346
u16 bh_oam_dscp_proto
The second word comprises: 2 bits of OAM for passive perf measurement 2 reserved bits; 6 bits of DSCP...
Definition: bier_types.h:401
static void bier_hdr_hton(bier_hdr_t *bier_hdr)
#define BIER_HDR_VERSION_FIELD_SHIFT
static bier_hdr_src_id_t bier_hdr_get_src_id(const bier_hdr_t *bier_hdr)
#define BIER_HDR_LEN_FIELD_MASK
u16 bier_hdr_src_id_t
An identifier of the sender of BIER packets this is the source of the &#39;tree&#39; - the BFIR...
Definition: bier_types.h:359
u32 bier_hdr_entropy_t
An entropy value in a BIER header.
Definition: bier_types.h:364
#define BIER_HDR_1ST_NIBBLE_VALUE
static bier_hdr_entropy_t bier_hdr_get_entropy(const bier_hdr_t *bier_hdr)
static void bier_hdr_set_src_id(bier_hdr_t *bier_hdr, bier_hdr_src_id_t src_id)
#define BIER_HDR_LEN_FIELD_SHIFT
u32 bier_hdr_len_id_to_num_buckets(bier_hdr_len_id_t id)
Conversion functions for the enumerated bit-string length values, to bit and bytes.
Definition: bier_types.c:60
enum bier_hdr_len_id_t_ bier_hdr_len_id_t
bier_hdr_len_id_t enumerator
enum bier_hdr_proto_id_t_ bier_hdr_proto_id_t
BIER header protocol payload types.
static size_t bier_hdr_str_num_bytes(const bier_hdr_t *bier_hdr)
enum bier_hdr_version_t_ bier_hdr_version_t
BIER header versions.
bier_bit_mask_bucket_t * bbs_buckets
The buckets in the string.
Definition: bier_types.h:332
static bier_hdr_proto_id_t bier_hdr_get_proto_id(const bier_hdr_t *bier_hdr)
bier_bit_mask_bucket_t bh_bit_string[0]
The variable length bit-string.
Definition: bier_types.h:411
A BIER header of variable length The encoding follows: https://tools.ietf.org/html/draft-ietf-bier-mp...
Definition: bier_types.h:373
unsigned char u8
Definition: types.h:56
#define BIER_HDR_1ST_NIBBLE_SHIFT
static void bier_hdr_set_proto_id(bier_hdr_t *bier_hdr, bier_hdr_proto_id_t proto)
static bier_hdr_version_t bier_hdr_get_version(const bier_hdr_t *bier_hdr)
#define BIER_HDR_1ST_NIBBLE_MASK
The BIER inline functions acting on the bier header.
static u8 bier_hdr_get_1st_nibble(bier_hdr_t *hdr)
#define BIER_HDR_PROTO_FIELD_SHIFT
#define BIER_HDR_PROTO_FIELD_MASK
Mask and shift values for fields in the headers trainling word.
static size_t bier_hdr_num_bytes(const bier_hdr_t *bier_hdr)
static void bier_bit_string_init_from_hdr(bier_hdr_t *bier_hdr, bier_bit_string_t *bit_string)
static void bier_hdr_ntoh(bier_hdr_t *bier_hdr)
static void bier_hdr_init(bier_hdr_t *bier_hdr, bier_hdr_version_t version, bier_hdr_proto_id_t proto, bier_hdr_len_id_t len, bier_hdr_entropy_t entropy, bier_bp_t src)
u16 bh_bfr_id
The BFR-ID of the sender.
Definition: bier_types.h:406