FD.io VPP  v19.01.3-6-g70449b9b9
Vector Packet Processing
gbp_itf.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 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 #include <plugins/gbp/gbp_itf.h>
17 
18 /**
19  * Attributes and configurations attached to interfaces by GBP
20  */
21 typedef struct gbp_itf_t_
22 {
23  /**
24  * Number of references to this interface
25  */
27 
30 
31  /**
32  * L2/L3 Features configured by each user
33  */
38 } gbp_itf_t;
39 
41 
42 static gbp_itf_t *
44 {
45  vec_validate (gbp_itfs, gii);
46 
47  return (&gbp_itfs[gii]);
48 }
49 
50 static index_t
52 {
53  return (sw_if_index);
54 }
55 
56 index_t
58 {
59  gbp_itf_t *gi;
60 
61  gi = gbp_itf_get (gbp_itf_get_itf (sw_if_index));
62 
63  if (0 == gi->gi_locks)
64  {
66  gi->gi_bd_index = bd_index;
67 
68  if (~0 != gi->gi_bd_index)
70  MODE_L2_BRIDGE, sw_if_index, bd_index,
72 
73  }
74 
75  gi->gi_locks++;
76 
77  return (sw_if_index);
78 }
79 
80 void
82 {
83  gbp_itf_t *gi;
84 
85  gi = gbp_itf_get (gii);
86  ASSERT (gi->gi_locks > 0);
87  gi->gi_locks--;
88 
89  if (0 == gi->gi_locks)
90  {
91  if (~0 != gi->gi_bd_index)
96 
97  memset (gi, 0, sizeof (*gi));
98  }
99 }
100 
101 void
103  index_t useri, l2input_feat_masks_t feats)
104 {
105  u32 diff_fb, new_fb, *fb, feat;
106  gbp_itf_t *gi;
107 
108  gi = gbp_itf_get (gii);
109 
110  if (gi->gi_bd_index == ~0)
111  return;
112 
113  vec_validate (gi->gi_l2_input_fbs, useri);
114  gi->gi_l2_input_fbs[useri] = feats;
115 
116  new_fb = 0;
117  vec_foreach (fb, gi->gi_l2_input_fbs)
118  {
119  new_fb |= *fb;
120  }
121 
122  /* add new features */
123  diff_fb = (gi->gi_l2_input_fb ^ new_fb) & new_fb;
124 
125  /* *INDENT-OFF* */
126  foreach_set_bit (feat, diff_fb,
127  ({
128  l2input_intf_bitmap_enable (gi->gi_sw_if_index, (1 << feat), 1);
129  }));
130  /* *INDENT-ON* */
131 
132  /* remove unneeded features */
133  diff_fb = (gi->gi_l2_input_fb ^ new_fb) & gi->gi_l2_input_fb;
134 
135  /* *INDENT-OFF* */
136  foreach_set_bit (feat, diff_fb,
137  ({
138  l2input_intf_bitmap_enable (gi->gi_sw_if_index, (1 << feat), 0);
139  }));
140  /* *INDENT-ON* */
141 
142  gi->gi_l2_input_fb = new_fb;
143 }
144 
145 void
147  index_t useri, l2output_feat_masks_t feats)
148 {
149  u32 diff_fb, new_fb, *fb, feat;
150  gbp_itf_t *gi;
151 
152  gi = gbp_itf_get (gii);
153 
154  if (gi->gi_bd_index == ~0)
155  return;
156 
157  vec_validate (gi->gi_l2_output_fbs, useri);
158  gi->gi_l2_output_fbs[useri] = feats;
159 
160  new_fb = 0;
161  vec_foreach (fb, gi->gi_l2_output_fbs)
162  {
163  new_fb |= *fb;
164  }
165 
166  /* add new features */
167  diff_fb = (gi->gi_l2_output_fb ^ new_fb) & new_fb;
168 
169  /* *INDENT-OFF* */
170  foreach_set_bit (feat, diff_fb,
171  ({
172  l2output_intf_bitmap_enable (gi->gi_sw_if_index, (1 << feat), 1);
173  }));
174  /* *INDENT-ON* */
175 
176  /* remove unneeded features */
177  diff_fb = (gi->gi_l2_output_fb ^ new_fb) & gi->gi_l2_output_fb;
178 
179  /* *INDENT-OFF* */
180  foreach_set_bit (feat, diff_fb,
181  ({
182  l2output_intf_bitmap_enable (gi->gi_sw_if_index, (1 << feat), 0);
183  }));
184  /* *INDENT-ON* */
185 
186  gi->gi_l2_output_fb = new_fb;
187 }
188 
189 u8 *
190 format_gbp_itf (u8 * s, va_list * args)
191 {
192  index_t gii = va_arg (*args, index_t);
193  gbp_itf_t *gi;
194 
195  gi = gbp_itf_get (gii);
196 
197  s = format (s, "%U locks:%d input-feats:%U output-feats:%U",
199  gi->gi_sw_if_index, gi->gi_locks,
202 
203  return (s);
204 }
205 
206 /*
207  * fd.io coding-style-patch-verification: ON
208  *
209  * Local Variables:
210  * eval: (c-set-style "gnu")
211  * End:
212  */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:439
u8 * format_l2_input_features(u8 *s, va_list *args)
Definition: l2_input.c:66
void gbp_itf_set_l2_input_feature(index_t gii, index_t useri, l2input_feat_masks_t feats)
Definition: gbp_itf.c:102
vnet_main_t * vnet_get_main(void)
Definition: misc.c:47
u8 * format_l2_output_features(u8 *s, va_list *args)
Definition: l2_output.c:45
u32 * gi_l2_input_fbs
L2/L3 Features configured by each user.
Definition: gbp_itf.c:34
u32 gi_sw_if_index
Definition: gbp_itf.c:28
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
static gbp_itf_t * gbp_itfs
Definition: gbp_itf.c:40
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:419
format_function_t format_vnet_sw_if_index_name
unsigned char u8
Definition: types.h:56
void gbp_itf_unlock(index_t gii)
Definition: gbp_itf.c:81
#define foreach_set_bit(var, mask, body)
Definition: bitops.h:166
struct gbp_itf_t_ gbp_itf_t
Attributes and configurations attached to interfaces by GBP.
u32 sw_if_index
Definition: vxlan_gbp.api:37
#define MODE_L2_BRIDGE
Definition: l2_input.h:211
u32 gi_bd_index
Definition: gbp_itf.c:29
u8 * format_gbp_itf(u8 *s, va_list *args)
Definition: gbp_itf.c:190
unsigned int u32
Definition: types.h:88
static index_t gbp_itf_get_itf(u32 sw_if_index)
Definition: gbp_itf.c:51
u32 gi_locks
Number of references to this interface.
Definition: gbp_itf.c:26
u32 gi_l2_output_fb
Definition: gbp_itf.c:37
static gbp_itf_t * gbp_itf_get(index_t gii)
Definition: gbp_itf.c:43
void gbp_itf_set_l2_output_feature(index_t gii, index_t useri, l2output_feat_masks_t feats)
Definition: gbp_itf.c:146
l2input_feat_masks_t
Definition: l2_input.h:138
void l2output_intf_bitmap_enable(u32 sw_if_index, l2output_feat_masks_t feature_bitmap, u32 enable)
Enable (or disable) the feature in the bitmap for the given interface.
Definition: l2_output.c:626
Attributes and configurations attached to interfaces by GBP.
Definition: gbp_itf.c:21
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:341
#define ASSERT(truth)
l2output_feat_masks_t
Definition: l2_output.h:110
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:583
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:530
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
u32 gi_l2_input_fb
Definition: gbp_itf.c:35
#define vec_foreach(var, vec)
Vector iterator.
index_t gbp_itf_add_and_lock(u32 sw_if_index, u32 bd_index)
Definition: gbp_itf.c:57
u32 * gi_l2_output_fbs
Definition: gbp_itf.c:36
#define MODE_L3
Definition: l2_input.h:210