FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
l2_input.h
Go to the documentation of this file.
1 /*
2  * l2_input.h : layer 2 input packet processing
3  *
4  * Copyright (c) 2013 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef included_vnet_l2_input_h
19 #define included_vnet_l2_input_h
20 
21 #include <stdbool.h>
22 
23 #include <vlib/vlib.h>
24 #include <vnet/vnet.h>
25 #include <vnet/l2/l2_bd.h>
26 #include <vnet/ethernet/ethernet.h>
27 #include <vnet/ethernet/packet.h>
28 #include <vnet/ip/ip4_inlines.h>
29 #include <vnet/ip/ip6_inlines.h>
30 
31 /* l2 connection type */
32 typedef enum l2_input_flags_t_
33 {
34  /* NONE imples L3 mode. */
38  L2_INPUT_FLAG_BVI = (1 << 2),
39 } __clib_packed l2_input_flags_t;
40 
41 /* Per-subinterface L2 feature configuration */
42 typedef struct
43 {
44  u8 __force_u64_alignement[0] __attribute__ ((aligned (8)));
45 
46  union
47  {
48  /* bridge domain id and values cached from the BD */
49  struct
50  {
54  };
55  /* for xconnect */
57  };
58 
59  /* config for which input features are configured on this interface */
61 
62  /* config for which input features are configured on this interface's
63  * BD - this is cahced from the BD struct*/
65 
66  /* split horizon group */
68 
69  /* Interface sequence number */
71 
72  /* Flags describing this interface */
74 
75  /* A wee bit of spare space */
76  u8 __pad;
78 
79 /* Ensure a struct is an even multiple of 8 bytes,
80  * so they do not stradle cache lines */
82 
83 typedef struct
84 {
85 
86  /* Next nodes for the feature bitmap */
87  u32 feat_next_node_index[32];
88 
89  /* config vector indexed by sw_if_index */
91 
92  /* bridge domain config vector indexed by bd_index */
94 
95  /* convenience variables */
98 
101 
103 
105 
108 {
109  l2_bridge_domain_t *bd_config;
110 
111  bd_config = vec_elt_at_index (l2im->bd_configs, bd_index);
112  return bd_is_valid (bd_config) ? bd_config : NULL;
113 }
114 
117 {
119  l2_bridge_domain_t *bd_config;
120 
121  vec_validate (mp->bd_configs, bd_index);
122  bd_config = vec_elt_at_index (mp->bd_configs, bd_index);
123  return bd_config;
124 }
125 
126 /* L2 input indication packet is from BVI, using -2 */
127 #define L2INPUT_BVI ((u32) (~0-1))
128 
129 /* L2 input features */
130 
131 /* Mappings from feature ID to graph node name in reverse order */
132 #define foreach_l2input_feat \
133  _(DROP, "feature-bitmap-drop") \
134  _(XCONNECT, "l2-output") \
135  _(FLOOD, "l2-flood") \
136  _(ARP_UFWD, "l2-uu-fwd") \
137  _(ARP_TERM, "arp-term-l2bd") \
138  _(UU_FLOOD, "l2-flood") \
139  _(GBP_FWD, "gbp-fwd") \
140  _(UU_FWD, "l2-uu-fwd") \
141  _(FWD, "l2-fwd") \
142  _(RW, "l2-rw") \
143  _(LEARN, "l2-learn") \
144  _(L2_EMULATION, "l2-emulation") \
145  _(GBP_LEARN, "gbp-learn-l2") \
146  _(GBP_LPM_ANON_CLASSIFY, "l2-gbp-lpm-anon-classify") \
147  _(GBP_NULL_CLASSIFY, "gbp-null-classify") \
148  _(GBP_SRC_CLASSIFY, "gbp-src-classify") \
149  _(GBP_LPM_CLASSIFY, "l2-gbp-lpm-classify") \
150  _(VTR, "l2-input-vtr") \
151  _(L2_IP_QOS_RECORD, "l2-ip-qos-record") \
152  _(VPATH, "vpath-input-l2") \
153  _(ACL, "l2-input-acl") \
154  _(POLICER_CLAS, "l2-policer-classify") \
155  _(INPUT_FEAT_ARC, "l2-input-feat-arc") \
156  _(INPUT_CLASSIFY, "l2-input-classify") \
157  _(SPAN, "span-l2-input")
158 
159 /* Feature bitmap positions */
160 typedef enum
161 {
162 #define _(sym,str) L2INPUT_FEAT_##sym##_BIT,
164 #undef _
167 
168 STATIC_ASSERT (L2INPUT_N_FEAT <= 32, "too many l2 input features");
169 
170 /* Feature bit masks */
171 typedef enum
172 {
174 #define _(sym,str) L2INPUT_FEAT_##sym = (1<<L2INPUT_FEAT_##sym##_BIT),
176 #undef _
178 #define _(sym,str) L2INPUT_FEAT_##sym |
180 #undef _
181  0
183 
184 STATIC_ASSERT ((u64) L2INPUT_VALID_MASK == (1ull << L2INPUT_N_FEAT) - 1, "");
185 
186 /** Return an array of strings containing graph node names of each feature */
187 char **l2input_get_feat_names (void);
188 
189 /* arg0 - u32 feature_bitmap, arg1 - u32 verbose */
190 u8 *format_l2_input_feature_bitmap (u8 * s, va_list * args);
191 u8 *format_l2_input_features (u8 * s, va_list * args);
192 u8 *format_l2_input (u8 * s, va_list * args);
193 
196 {
197  return ((bd_config->feature_bitmap & L2INPUT_FEAT_FLOOD) ==
198  L2INPUT_FEAT_FLOOD);
199 }
200 
203 {
204  return ((bd_config->feature_bitmap & L2INPUT_FEAT_UU_FLOOD) ==
205  L2INPUT_FEAT_UU_FLOOD);
206 }
207 
210 {
211  return ((bd_config->feature_bitmap & L2INPUT_FEAT_FWD) == L2INPUT_FEAT_FWD);
212 }
213 
216 {
217  return ((bd_config->feature_bitmap & L2INPUT_FEAT_LEARN) ==
218  L2INPUT_FEAT_LEARN);
219 }
220 
223 {
224  return ((bd_config->feature_bitmap & L2INPUT_FEAT_ARP_TERM) ==
225  L2INPUT_FEAT_ARP_TERM);
226 }
227 
230 {
231  return ((bd_config->feature_bitmap & L2INPUT_FEAT_ARP_UFWD) ==
232  L2INPUT_FEAT_ARP_UFWD);
233 }
234 
235 static inline bool
237 {
238  return (input->flags & L2_INPUT_FLAG_BRIDGE);
239 }
240 
241 static inline bool
243 {
244  return (input->flags & L2_INPUT_FLAG_XCONNECT);
245 }
246 
247 static inline bool
249 {
250  return (input->flags & L2_INPUT_FLAG_BVI);
251 }
252 
255 {
256  l2_input_config_t *input;
257 
259 
260  return input->seq_num;
261 }
262 
263 
264 /** Masks for eliminating features that do not apply to a packet */
265 
266 /** Get a pointer to the config for the given interface */
268 
269 /* Enable (or disable) the feature in the bitmap for the given interface */
271  l2input_feat_masks_t feature_bitmap,
272  u32 enable);
273 
274 /* Sets modifies flags from a bridge domain */
275 u32 l2input_set_bridge_features (u32 bd_index, u32 feat_mask, u32 feat_value);
276 
278  const u8 * old_address,
279  const u8 * new_address);
280 
283 
284 #define MODE_L3 0
285 #define MODE_L2_BRIDGE 1
286 #define MODE_L2_XC 2
287 #define MODE_L2_CLASSIFY 3
288 
289 #define MODE_ERROR_ETH 1
290 #define MODE_ERROR_BVI_DEF 2
291 
294  u32 mode,
296  u32 bd_index, l2_bd_port_type_t port_type,
297  u32 shg, u32 xc_sw_if_index);
298 
299 static inline u16
301 {
302  ethernet_header_t *eth;
303  u16 ethertype;
304  u8 vlan_count = 0;
305 
306  /* point at current l2 hdr */
307  eth = vlib_buffer_get_current (b);
308 
309  /*
310  * l2-output pays no attention to this
311  * but the tag push/pop code on an l2 subif needs it.
312  *
313  * Determine l2 header len, check for up to 2 vlans
314  */
315  vnet_buffer (b)->l2.l2_len = sizeof (ethernet_header_t);
316  ethertype = clib_net_to_host_u16 (eth->type);
317  if (ethernet_frame_is_tagged (ethertype))
318  {
320  vnet_buffer (b)->l2.l2_len += sizeof (*vlan);
321  vlan_count = 1;
322  vlan = (void *) (eth + 1);
323  ethertype = clib_net_to_host_u16 (vlan->type);
324  if (ethertype == ETHERNET_TYPE_VLAN)
325  {
326  vnet_buffer (b)->l2.l2_len += sizeof (*vlan);
327  vlan_count = 2;
328  }
329  }
330  ethernet_buffer_set_vlan_count (b, vlan_count);
331 
332  return (ethertype);
333 }
334 
335 /*
336  * Compute flow hash of an ethernet packet, use 5-tuple hash if L3 packet
337  * is ip4 or ip6. Otherwise hash on smac/dmac/etype.
338  * The vlib buffer current pointer is expected to be at ethernet header
339  * and vnet l2.l2_len is expected to be setup already.
340  */
341 static inline u32
343 {
345  u8 *l3h = (u8 *) eh + vnet_buffer (b)->l2.l2_len;
346  u16 ethertype = clib_net_to_host_u16 (*(u16 *) (l3h - 2));
347 
348  if (ethertype == ETHERNET_TYPE_IP4)
350  else if (ethertype == ETHERNET_TYPE_IP6)
352  else
353  {
354  u32 a, b, c;
355  u32 *ap = (u32 *) & eh->dst_address[2];
356  u32 *bp = (u32 *) & eh->src_address[2];
357  a = *ap;
358  b = *bp;
359  c = ethertype;
360  hash_v3_mix32 (a, b, c);
361  hash_v3_finalize32 (a, b, c);
362  return c;
363  }
364 }
365 
366 #endif
367 
368 
369 /*
370  * fd.io coding-style-patch-verification: ON
371  *
372  * Local Variables:
373  * eval: (c-set-style "gnu")
374  * End:
375  */
vlib.h
l2input_feat_t
l2input_feat_t
Definition: l2_input.h:160
l2_bridge_domain_t
Definition: l2_bd.h:63
L2INPUT_VALID_MASK
@ L2INPUT_VALID_MASK
Definition: l2_input.h:177
l2_input_config_t
Definition: l2_input.h:42
format_l2_input_features
u8 * format_l2_input_features(u8 *s, va_list *args)
Definition: l2_input.c:98
l2input_main
l2input_main_t l2input_main
Definition: l2_input_node.c:78
l2input_bd_config
static_always_inline l2_bridge_domain_t * l2input_bd_config(u32 bd_index)
Definition: l2_input.h:116
l2input_main_t
Definition: l2_input.h:83
l2_input_config_t::bd_index
u16 bd_index
Definition: l2_input.h:51
ethernet_vlan_header_t
Definition: packet.h:128
ethernet_frame_is_tagged
static_always_inline int ethernet_frame_is_tagged(u16 type)
Definition: ethernet.h:77
ip4_inlines.h
bd_feature_flood
static_always_inline u8 bd_feature_flood(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:195
l2input_main_t::vlib_main
vlib_main_t * vlib_main
Definition: l2_input.h:96
ethernet_header_t::dst_address
u8 dst_address[6]
Definition: packet.h:55
ethernet_header_t::src_address
u8 src_address[6]
Definition: packet.h:56
l2_input_is_xconnect
static bool l2_input_is_xconnect(const l2_input_config_t *input)
Definition: l2_input.h:242
l2_input_config_t::flags
l2_input_flags_t flags
Definition: l2_input.h:73
u16
unsigned short u16
Definition: types.h:57
STATIC_ASSERT_SIZEOF
STATIC_ASSERT_SIZEOF(l2_input_config_t, 2 *sizeof(u64))
mode
vl_api_tunnel_mode_t mode
Definition: gre.api:48
L2_INPUT_FLAG_BVI
@ L2_INPUT_FLAG_BVI
Definition: l2_input.h:38
l2_input_config_t::output_sw_if_index
u32 output_sw_if_index
Definition: l2_input.h:56
ethernet_header_t::type
u16 type
Definition: packet.h:59
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
bd_feature_learn
static_always_inline u8 bd_feature_learn(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:215
l2_input_seq_num_inc
void l2_input_seq_num_inc(u32 sw_if_index)
Definition: l2_input.c:238
STATIC_ASSERT
STATIC_ASSERT(L2INPUT_N_FEAT<=32, "too many l2 input features")
l2input_bd_config_from_index
static_always_inline l2_bridge_domain_t * l2input_bd_config_from_index(l2input_main_t *l2im, u32 bd_index)
Definition: l2_input.h:107
ip4_header_t
Definition: ip4_packet.h:87
ethernet.h
hash_v3_finalize32
#define hash_v3_finalize32(a, b, c)
Definition: hash.h:563
format_l2_input_feature_bitmap
u8 * format_l2_input_feature_bitmap(u8 *s, va_list *args)
Definition: l2_input.c:65
l2input_interface_mac_change
void l2input_interface_mac_change(u32 sw_if_index, const u8 *old_address, const u8 *new_address)
Definition: l2_input.c:201
l2input_set_bridge_features
u32 l2input_set_bridge_features(u32 bd_index, u32 feat_mask, u32 feat_value)
Definition: l2_input.c:191
l2_input_is_bvi
static bool l2_input_is_bvi(const l2_input_config_t *input)
Definition: l2_input.h:248
L2_INPUT_FLAG_BRIDGE
@ L2_INPUT_FLAG_BRIDGE
Definition: l2_input.h:37
l2_input_config_t::bd_seq_num
u8 bd_seq_num
Definition: l2_input.h:52
packet.h
l2_input_flags_t
enum l2_input_flags_t_ l2_input_flags_t
ip6_compute_flow_hash
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
Definition: ip6_inlines.h:49
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:441
l2input_main_t::vnet_main
vnet_main_t * vnet_main
Definition: l2_input.h:97
shg
u8 shg
Definition: l2.api:360
vec_elt_at_index
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
Definition: vec_bootstrap.h:203
c
svmdb_client_t * c
Definition: vpp_get_metrics.c:48
static_always_inline
#define static_always_inline
Definition: clib.h:112
IP_FLOW_HASH_DEFAULT
#define IP_FLOW_HASH_DEFAULT
Default: 5-tuple + flowlabel without the "reverse" bit.
Definition: ip_flow_hash.h:22
ethernet_header_t
Definition: packet.h:52
bd_feature_uu_flood
static_always_inline u8 bd_feature_uu_flood(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:202
l2input_recache
walk_rc_t l2input_recache(u32 bd_index, u32 sw_if_index)
Definition: l2_input.c:222
foreach_l2input_feat
#define foreach_l2input_feat
Definition: l2_input.h:132
l2_input_config_t::bd_mac_age
u8 bd_mac_age
Definition: l2_input.h:53
l2_input_config_t::seq_num
u8 seq_num
Definition: l2_input.h:70
l2_input_config_t::shg
u8 shg
Definition: l2_input.h:67
vec_validate
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
Definition: vec.h:523
l2_input_is_bridge
static bool l2_input_is_bridge(const l2_input_config_t *input)
Definition: l2_input.h:236
bd_feature_arp_ufwd
static_always_inline u8 bd_feature_arp_ufwd(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:229
l2_input_seq_num
static_always_inline u8 l2_input_seq_num(u32 sw_if_index)
Definition: l2_input.h:254
L2INPUT_N_FEAT
@ L2INPUT_N_FEAT
Definition: l2_input.h:165
l2_bridge_domain_t::feature_bitmap
u32 feature_bitmap
Definition: l2_bd.h:69
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
ip6_inlines.h
L2INPUT_FEAT_NONE
@ L2INPUT_FEAT_NONE
Definition: l2_input.h:173
l2input_node
vlib_node_registration_t l2input_node
(constructor) VLIB_REGISTER_NODE (l2input_node)
Definition: l2_input_node.c:370
vnet_main_t
Definition: vnet.h:76
vnet_update_l2_len
static u16 vnet_update_l2_len(vlib_buffer_t *b)
Definition: l2_input.h:300
bd_is_valid
static u32 bd_is_valid(l2_bridge_domain_t *bd_config)
Definition: l2_bd.h:140
l2input_intf_config
l2_input_config_t * l2input_intf_config(u32 sw_if_index)
Masks for eliminating features that do not apply to a packet.
Definition: l2_input.c:167
u64
unsigned long u64
Definition: types.h:89
u32
unsigned int u32
Definition: types.h:88
l2_input_config_t::feature_bitmap
u32 feature_bitmap
Definition: l2_input.h:60
L2_INPUT_FLAG_NONE
@ L2_INPUT_FLAG_NONE
Definition: l2_input.h:35
ethernet_buffer_set_vlan_count
#define ethernet_buffer_set_vlan_count(b, v)
Sets the number of VLAN headers in the current Ethernet frame in the buffer.
Definition: ethernet.h:426
bd_feature_forward
static_always_inline u8 bd_feature_forward(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:209
ip4_compute_flow_hash
static u32 ip4_compute_flow_hash(const ip4_header_t *ip, flow_hash_config_t flow_hash_config)
Definition: ip4_inlines.h:51
ip6_header_t
Definition: ip6_packet.h:294
l2input_main_t::msg_id_base
u16 msg_id_base
Definition: l2_input.h:99
vnet_main
vnet_main_t vnet_main
Definition: misc.c:43
bd_feature_arp_term
static_always_inline u8 bd_feature_arp_term(l2_bridge_domain_t *bd_config)
Definition: l2_input.h:222
l2input_get_feat_names
char ** l2input_get_feat_names(void)
Return an array of strings containing graph node names of each feature.
Definition: l2_input.c:59
vlib_main_t
Definition: main.h:102
L2_INPUT_FLAG_XCONNECT
@ L2_INPUT_FLAG_XCONNECT
Definition: l2_input.h:36
l2input_intf_bitmap_enable
u32 l2input_intf_bitmap_enable(u32 sw_if_index, l2input_feat_masks_t feature_bitmap, u32 enable)
Enable (or disable) the feature in the bitmap for the given interface.
Definition: l2_input.c:177
b
vlib_buffer_t ** b
Definition: nat44_ei_out2in.c:717
u8
unsigned char u8
Definition: types.h:56
a
a
Definition: bitmap.h:525
vlib_buffer_get_current
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
Definition: buffer.h:257
ethernet_vlan_header_t::type
u16 type
Definition: packet.h:136
l2_bd_port_type_t
enum l2_bd_port_type_t_ l2_bd_port_type_t
vnet.h
l2input_feat_masks_t
l2input_feat_masks_t
Definition: l2_input.h:171
l2input_main_t::configs
l2_input_config_t * configs
Definition: l2_input.h:90
set_int_l2_mode
u32 set_int_l2_mode(vlib_main_t *vm, vnet_main_t *vnet_main, u32 mode, u32 sw_if_index, u32 bd_index, l2_bd_port_type_t port_type, u32 shg, u32 xc_sw_if_index)
Set the subinterface to run in l2 or l3 mode.
Definition: l2_input.c:256
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
l2_input_flags_t_
l2_input_flags_t_
Definition: l2_input.h:32
l2_bd.h
walk_rc_t
enum walk_rc_t_ walk_rc_t
Walk return code.
l2_input_config_t::bd_feature_bitmap
u32 bd_feature_bitmap
Definition: l2_input.h:64
format_l2_input
u8 * format_l2_input(u8 *s, va_list *args)
Definition: l2_input.c:118
l2input_main_t::bd_configs
l2_bridge_domain_t * bd_configs
Definition: l2_input.h:93
vnet_l2_compute_flow_hash
static u32 vnet_l2_compute_flow_hash(vlib_buffer_t *b)
Definition: l2_input.h:342
hash_v3_mix32
#define hash_v3_mix32(a, b, c)
Definition: hash.h:553
vlib_buffer_t
VLIB buffer representation.
Definition: buffer.h:111